Oui, il l'est
[edit] Voici mon script en python. ATTENTION il n'est pas finalisé ! Pour le tester il faudra changer 3 variables dans le codes qui se trouvent au début du programme principal (suivre les commentaires)
Code : Tout sélectionner
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# jeu. 28 nov. 2012
# Depend of python-yaml
import urllib.request
import json, sys, os, time, copy, yaml
# Todo :
# - Faire le help
# - Renvoyer sur le help si aucun fichier de configuration n'existe
# - Corriger le souci avec les icônes pour un export vers conky
# - Corriger le souci avec le vent pour un export vers conky
######
# Classe
############
class Condition:
def __init__(self, name):
self.name = name
######
# Début du programme principal
############
#error_file = "/var/log/weather/error.lorg"
#conf_file = "/etc/weather.yaml"
#icons_wind_dir = "/usr/share/weather/Icons/Wind/"
#icons_weather_dir = "/usr/share/weather/Icons/Weather/"
error_file = "/home/julien/weather_error.log"
conf_file = "/home/julien/Python/Weather/weather-0.1/weather.conf"
icons_wind_dir = "/home/julien/Python/Weather/weather-0.1/Icons/Wind/"
icons_weather_dir = "/home/julien/Python/Weather/weather-0.1/Icons/Weather/"
# On découpe les fichiers pour obtenir le path et le fichier
(path, f) = os.path.split(error_file)
if path == "":
# Si path est vide on le remplace par ~
path = os.path.expanduser('~')
error_file = os.path.join(path, f)
# On vérifie les droits d'écriture dans le fichier log
if not os.access(path, os.W_OK):
sys.stderr.write("Vous n'avez pas les droits d'écriture sur \"" + error_file + "\"\n")
sys.exit(2)
# Pareil que précédemment
(path, f) = os.path.split(conf_file)
if path == "":
path = os.path.expanduser('~')
conf_file = os.path.join(path, f)
if not os.access(path, os.R_OK):
sys.stderr.write("Vous n'avez pas les droits de lecture sur \"" + conf_file + "\"\n")
with open(error_file, 'w') as err:
err.write("Vous n'avez pas les droits de lecture sur \"" + conf_file + "\"\n")
sys.exit(2)
if not os.path.isfile(conf_file):
sys.stderr.write("Le fichier \"" + conf_file + "\" n'existe pas !\n")
with open(error_file, 'w') as err:
err.write("Le fichier \"" + conf_file + "\" n'existe pas !\n")
sys.exit(2)
# Chargement du fichier de configuration
source = open(conf_file, 'r')
data = yaml.load(source.read())
source.close()
# On vérifie que l'emplacement du fichier pour enregistrer les données existe
(path, f) = os.path.split(data['file'])
if path == "":
path = os.path.expanduser('~')
data['file'] = os.path.join(path, f)
# On vérifie qu'on a les droits d'écritures
if not os.access(path, os.W_OK):
sys.stderr.write("Vous n'avez pas les droits d'écriture sur \"" + data['file'] + "\"\n")
with open(error_file, 'w') as err:
err.write("Vous n'avez pas les droits d'écriture sur \"" + data['file'] + "\"\n")
sys.exit(2)
# On vérifie qu'on a les droits de lecture sur les icons du vent
if not os.access(icons_wind_dir, os.R_OK):
sys.stderr.write("Vous n'avez pas les droits de lecture sur \"" + icons_wind_dir + "\"\n")
with open(error_file, 'w') as err:
err.write("Vous n'avez pas les droits de lecture sur \"" + icons_wind_dir + "\"\n")
sys.exit(2)
# On vérifie qu'on a les droits de lecture sur les icons du temps
if not os.access(icons_weather_dir, os.R_OK):
sys.stderr.write("Vous n'avez pas les droits de lecture sur \"" + icons_weather_dir + "\"\n")
with open(error_file, 'w') as err:
err.write("Vous n'avez pas les droits de lecture sur \"" + icons_weather_dir + "\"\n")
sys.exit(2)
# On démarre la boucle infinie
while 1:
# On récupère la page json
page_json = urllib.request.urlopen(data['url'])
# On charge le code json
parsed_json = json.loads(page_json.read().decode("utf-8", "ignore"))
# On ferme la page
page_json.close()
# Définition des variables
now = Condition('now')
today = tomorrow = after_tomorrow = latest = tmp = Condition('nothing')
# On récupère la ville
now.city = parsed_json['location']['city']
# On récupère l'heure actuelle
now.hour = time.strftime('%H:%M', time.localtime(int(parsed_json['current_observation']['observation_epoch'])))
# On récupère la température actuelle en °C
now.current_temp = parsed_json['current_observation']['temp_c']
# On récupère le temps actuel
now.current_weather = parsed_json['current_observation']['weather']
# On récupère l'humidité
now.humidity = parsed_json['current_observation']['relative_humidity']
# On récupère la vitesse du vent
now.wind_kph = parsed_json['current_observation']['wind_kph']
# On récupère l'orientation du vent
now.wind_dir = parsed_json['current_observation']['wind_dir']
# On récupère l'orientation du vent en °C
now.wind_degrees = parsed_json['current_observation']['wind_degrees']
# On récupère la pression
now.pressure_mb = parsed_json['current_observation']['pressure_mb']
# On récupère le point de rosée
now.dewpoint_c = parsed_json['current_observation']['dewpoint_c']
# On récupère la température ressentie
now.feelslike_c = parsed_json['current_observation']['feelslike_c']
# On récupère la visibilité
now.visibility = parsed_json['current_observation']['visibility_km']
# On récupère l'indice UV
now.UV = parsed_json['current_observation']['UV']
# On récupère l'icône
now.icon = parsed_json['current_observation']['icon']
# On récupère la hauteur de la pluie
now.precip = parsed_json['current_observation']['precip_today_metric']
# On récupère les prévisions à 4 jours
forecast = parsed_json['forecast']['simpleforecast']['forecastday']
for i in forecast:
tmp.temp_max = i['high']['celsius'] # Température max
tmp.temp_min = i['low']['celsius'] # Température min
tmp.conditions = i['conditions'] # Conditions météo
tmp.icon = i['icon'] # Icône du temps
tmp.wind_max = i['maxwind']['kph'] # Vitesse du vent max
tmp.wind_max_dir = i['maxwind']['dir'] # Direction du vent
tmp.wind_max_deg = i['maxwind']['degrees'] # Direction du vent en °
tmp.wind_ave = i['avewind']['kph'] # Vitesse moyenne du vent
tmp.wind_ave_dir = i['avewind']['dir'] # Direction moyenne du vent
tmp.wind_ave_deg = i['avewind']['degrees'] # Direction moyenne du vent en °
tmp.humidity_ave = i['avehumidity'] # Humidité moyenne
tmp.humidity_max = i['maxhumidity'] # Humidité max
tmp.humidity_min = i['minhumidity'] # Humidité min
tmp.day = i['date']['day'] # Numéro du jour
tmp.month = i['date']['month'] # Numéro du mois
tmp.pop = i['pop'] # Pourcentage de chance que ça arrive
tmp.qpf_allday = i['qpf_allday']['mm'] # Précipitations totales en mm
tmp.snow_day = i['snow_day']['cm'] # Neige totale en cm
if i['period'] == 1:
tmp.name = 'today'
today = copy.copy(tmp)
elif i['period'] == 2:
tmp.name = 'tomorrow'
tomorrow = copy.copy(tmp)
elif i['period'] == 3:
tmp.name = 'after_tomorrow'
after_tomorrow = copy.copy(tmp)
elif i['period'] == 4:
tmp.name = 'latest'
latest = copy.copy(tmp)
else:
sys.stderr.write("Il y a un jour inconnu : \"period = " + i['period'] + "\"\n")
with open(error_file, 'w') as err:
err.write("Il y a un jour inconnu : \"period = " + i['period'] + "\"\n")
sys.exit(2)
# Partie écriture
with open(data['file'], 'w') as c:
c.write("Weather = " + now.current_weather + "\n")
c.write("City = " + now.city + "\n")
c.write("Hour = " + now.hour + "\n")
c.write("Temperature = " + str(now.current_temp) + "\n")
c.write("Feelslike_c = " + now.feelslike_c + "°C\n")
c.write("Humidity = " + now.humidity + "\n")
c.write("Wind = " + str(now.wind_kph) + "Km/h\n")
c.write("Wind_dir = " + now.wind_dir + "\n")
c.write("Pressure = " + now.pressure_mb + "mb\n")
c.write("Dewpoint = " + str(now.dewpoint_c) + "°C\n")
c.write("Visibility = " + now.visibility + "Km\n")
c.write("UV = " + now.UV + "\n")
c.write("Precipitation = " + now.precip + "mm\n")
c.write("Icon = " + now.icon + "\n")
for var in [today, tomorrow, after_tomorrow, latest]:
c.write(var.name + "_temp_max = " + var.temp_max + "\n")
c.write(var.name + "_temp_min = " + var.temp_min + "\n")
c.write(var.name + "_conditions = " + var.conditions + "\n")
c.write(var.name + "_icon = " + var.icon +"\n")
c.write(var.name + "_wind_max = " + str(var.wind_max) + "\n")
c.write(var.name + "_wind_max_dir = " + var.wind_max_dir + "\n")
c.write(var.name + "_wind_max_deg = " + str(var.wind_max_deg) + "\n")
c.write(var.name + "_wind_ave = " + str(var.wind_ave) + "\n")
c.write(var.name + "_wind_ave_dir = " + var.wind_ave_dir + "\n")
c.write(var.name + "_wind_ave_deg = " + str(var.wind_ave_deg) + "\n")
c.write(var.name + "_humidity_max = " + str(var.humidity_max) + "\n")
c.write(var.name + "_humidity_min = " + str(var.humidity_min) + "\n")
c.write(var.name + "_humidity_ave = " + str(var.humidity_ave) + "\n")
c.write(var.name + "_pop = " + str(var.pop) + "%\n")
c.write(var.name + "_qpf_allday = " + str(var.qpf_allday) + "mm\n")
c.write(var.name + "_day = " + str(var.day) + "\n")
c.write(var.name + "_month = " + str(var.month) + "\n")
time.sleep(data['sleep'])
weather.conf :
Code : Tout sélectionner
file: /tmp/weather
# For sleep, becarefull of the limit
sleep: 1800
url: http://api.wunderground.com/api/xxxx_your_key_xxxx/forecast/geolookup/conditions/lang:FR/q/France/Saint-etienne.json
La sortie dans le fichier /tmp/weather :
Code : Tout sélectionner
Weather = Couvert
City = Saint-Etienne
Hour = 22:30
Temperature = 6
Feelslike_c = 5°C
Humidity = 87%
Wind = 6Km/h
Wind_dir = Variable
Pressure = 1004mb
Dewpoint = 4°C
Visibility = 10.0Km
UV = 0
Precipitation = 0.0mm
Icon = cloudy
today_temp_max = 9
today_temp_min = 3
today_conditions = Pluie
today_icon = rain
today_wind_max = 6
today_wind_max_dir = SSO
today_wind_max_deg = 195
today_wind_ave = 5
today_wind_ave_dir = Est
today_wind_ave_deg = 92
today_humidity_max = 83
today_humidity_min = 69
today_humidity_ave = 76
today_pop = 60%
today_qpf_allday = 9.1mm
today_day = 27
today_month = 11
tomorrow_temp_max = 4
tomorrow_temp_min = 0
tomorrow_conditions = Pluie
tomorrow_icon = rain
tomorrow_wind_max = 26
tomorrow_wind_max_dir = NO
tomorrow_wind_max_deg = 325
tomorrow_wind_ave = 22
tomorrow_wind_ave_dir = NNO
tomorrow_wind_ave_deg = 327
tomorrow_humidity_max = 90
tomorrow_humidity_min = 76
tomorrow_humidity_ave = 77
tomorrow_pop = 90%
tomorrow_qpf_allday = 32.8mm
tomorrow_day = 28
tomorrow_month = 11
after_tomorrow_temp_max = 4
after_tomorrow_temp_min = -3
after_tomorrow_conditions = Risque de neige
after_tomorrow_icon = chancesnow
after_tomorrow_wind_max = 27
after_tomorrow_wind_max_dir = NNO
after_tomorrow_wind_max_deg = 329
after_tomorrow_wind_ave = 24
after_tomorrow_wind_ave_dir = NNO
after_tomorrow_wind_ave_deg = 335
after_tomorrow_humidity_max = 99
after_tomorrow_humidity_min = 70
after_tomorrow_humidity_ave = 84
after_tomorrow_pop = 70%
after_tomorrow_qpf_allday = 12.7mm
after_tomorrow_day = 29
after_tomorrow_month = 11
latest_temp_max = 3
latest_temp_min = -6
latest_conditions = Brouillard
latest_icon = mostlycloudy
latest_wind_max = 18
latest_wind_max_dir = NNO
latest_wind_max_deg = 344
latest_wind_ave = 13
latest_wind_ave_dir = NNO
latest_wind_ave_deg = 345
latest_humidity_max = 100
latest_humidity_min = 70
latest_humidity_ave = 91
latest_pop = 0%
latest_qpf_allday = 0.5mm
latest_day = 30
latest_month = 11