Je voudrais maintenant expliquer ici, comment récupérer les prévisions météo pour les 6h, 12H et 24H à venir depuis ce même service.
Cet article est une traduction libre de l’article http://www.domoticz.com/wiki/Weather_forecast_from_forecast.io_in_Domoticz
Généralités
Le service forecast.io gratuit que nous utilisons répond au maximun à 1000 requêtes par jour, ne l’interrogez pas toutes les 10 secondes !!
Ce service fournit les paramètres météo suivants
- Temperature
- Humidité
- Vitesse du vent
- Direction du vent
- Pluie
- Pression de l’air
Nous créerons dans Domoticz autant de virtual sensors que de couples paramètre-delai désiré.
Temperature6H, Temperature12H, Pluie6H, Pluie12H,Pluie24H …
Prérequis
- Obtention d’une clé forecast.io, lecture dans cet article
- Vérifiez si php et curl sont installés (phpinfo()) sinon :
sudo apt-get install php5
sudo apt-get install php5-curl
Paramétrage Domoticz
Création des virtual sensors
Dans « Configuration », « Matériel » il faut ajouter des virtual sensors. (Matérialisé en jaune dans la copie d’écran ci-dessous), preciser le type du paramètre (température, précipitations).
En créer suffisamment pour toutes les périodes souhaitées (6H,12H,24H)
N.B on peut créer un Température+Humidité+ Baromètre pour afficher les 3 comme ici.
Si cette option de virtual sensors n’apparaît pas il faut d’abord ajouter un type « dummy », le nommer (indiqué en orange ci-dessous) puis reprendre ci dessus.
La partie programmation PHP
Voici le code php à recopier puis modifier suivant vos besoins
#!/usr/bin/php <?php /** -------------------------------------------------- recuperation de previsions meteo depuis "forecast.io" Changer API key, Latitude and Longtitude Si le parametre unit vaut "ca" affiche la vitesse du vent en km/h , ...si donne les vitesses du vent en m/s et... ...UK in mile/hour il en faut pour tout le monde ca par defaut -------------------------------------------------- $offset est le delai de temps en heure pour lequel vous souhaitez voir la prevision Ainsi si il est 17:37 et que $offset = 3, alors vous aurez la meteo de 20:00 Vous pouvez lancer ce script depuis le shell linux avec une valeur d'offset de 3 en tapant ./weather-previ.php 3 si vous avez nomme ce script weather-previ le maximum autorisé est de 48 (=48h) les valeurs s'affichent dans le shell Si vous souhaitez toujours utiliser une même valeur de prevision ; on peut supprimer les 3 lignes ci dessous puis supprimer le // devant $offset et placer votre valeur ainsi $offset = 12 donnera les previsions pour 12h. Dans ce cas lancez le script par ./weather-previ.php */ */ supprimer ici les 3 lignes pour une valeur fixe $offset = $argv[1]; echo $offset; echo "\n"; //-------------------------------------------------- //definissez vos valeurs ici --------------------------- $API = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; $LAT = "yy.xxxxxx"; LON = "Y.xxxxxx"; //$offset = 12; //-------------------------------------------------- //----------------------------------------------- A plusieurs reprises dans le script vous trouverez des lignes comme cela (ce type de bloc par type de capteur : thermonetre,pluie,vent) //send forecast values to Domoticz virtual devices // exchange the "idx=xyz" with your idx values // exchange the $offset value with your value here-> 12h and any else h if ($offset == 12) { $idx = 18; } else { $idx = 23; } Il faut bien entendu mettre vos valeurs d'idx a vous en fonction du capteur (thermonetre, rain, wind) Cherchez dans le script les thermonetres,rainrain2 eet wind pour modifier vos idx Cela permet d'alimenter le virtual device 18 dans l'exemple si offset =12 sinon on alimente le virtual device 23 // -------------------------------------- $json_string = file_get_contents("https://api.forecast.io/forecast/$API/$LAT,$LON?units=ca&exclude=currently,minutely,daily,alerts,flags"); $parsed_json = json_decode($json_string, true); //-------------------------------------------------- //---for debugging and development of a own forecast "combination" //---this file will show the complete array of a weather forecast for the next 48h delivered with the above URL request /** $wetterdatei = "/home/pi/domoticz/scripts/forecast.txt"; $wd = fopen ($wetterdatei, "w+"); fwrite ($wd, print_R($parsed_json, TRUE)); fclose ($wd); */ //following lines are just for debugging ------------------------------------- //start the script in Putty to see date & time & data responses //read present date $present_date = date("d.m.y - H:i:s"); echo $present_date; echo " "; //shwo Unix time with minutes and seconds of the present date echo strtotime("now"); echo "\n"; //end of debugging line ----------------------------------------------------- //add "3" for a 3h forecast //can be changed to any value until 48h in the future (max = 47) $h = date('H')+$offset; echo $h; echo "\n"; //create a Unix time with minutes & seconds = 0 $day=date("d"); $month=date("m"); $year=date("Y"); $ref = mktime($h,0,0,$month,$day,$year); echo $ref; echo "\n"; //find the relevant forecast value in the array //means: current time + n hours for ($count = 0; $count < 49; $count++) { $parsed_json = json_decode($json_string, true); $parsed_json = $parsed_json['hourly']['data'][$count]; $time = $parsed_json['time']; if ($ref == $time) { echo $count." ".$time; echo "\n"; //now read some of the forecast values //there are more values delivered but no corresponding Domoticz devies are available :-( $temperature = $parsed_json['temperature']; echo $temperature; echo "\n"; $humidity = $parsed_json['humidity']; $hum = $humidity * 100; echo $hum; echo "\n"; $windSpeed = $parsed_json['windSpeed']; echo $windSpeed; echo "\n"; $windBearing = $parsed_json['windBearing']; echo $windBearing; echo "\n"; $pressure = $parsed_json['pressure']; echo $pressure; echo "\n"; $precipIntensity = $parsed_json['precipIntensity']; echo $precipIntensity; echo "\n"; $precipProbability = $parsed_json['precipProbability']; echo $precipProbability; echo "\n"; $icon = $parsed_json['icon']; echo $icon; echo "\n"; } } //send forecast values to Domoticz virtual devices // exchange the "idx=xyz" with your idx values // exchange the $offset value with your value here-> 12h and any else h if ($offset == 12) { $idx = 18; } else { $idx = 23; } //Thermometer----------------------------------------------------------------- if ($temperature != "") { $ch = curl_init("http://192.168.1.2:8080/json.htm?type=command¶m=udevice&idx=$idx&nvalue=0&svalue=$temperature"); curl_exec($ch); curl_close($ch); } //Thermometer/Humidity/Barometer----------------------------------------------- //Humidity to text conversion -> not clear at the moment about the correct ranges! if ($hum <40 ) { $status = 2; } elseif ($hum >= 40 && $hum < 70) { $status = 1; } else { $status = 3; } //Prediction text to value conversion------------------------------------------ if ($icon == "clear-day" || $icon == "clear-night") { $prediction = 1; } elseif ($icon == "partly-cloudy-day" || $icon == "partly-cloudy-night") { $prediction = 2; } elseif ($icon == "cloudy") { $prediction = 3; } elseif ($icon == "rain" || $icon == "snow" || $icon == "fog" || $icon == "sleet") { $prediction = 4; } else { $prediction = 0; } // exchange the "idx=xyz" with your idx values // exchange the $offset value with your value here-> 12h and any else h if ($offset == 12) { $idx = 20; } else { $idx = 24; } if ($temperature != "" && $hum != "" && $pressure != "") { $ch = curl_init("http://192.168.1.2:8080/json.htm?type=command¶m=udevice&idx=$idx&nvalue=0&svalue=$temperature;$hum;$status;$pressure;$prediction"); curl_exec($ch); curl_close($ch); } //Rain------------------------------------------------------------------------- //work-around -> since beta 1.1657 no rain value=0 will be propagated //therefore the value is set to 0.01 which will be displayed as 0.0mm // exchange the "idx=xyz" with your idx values // exchange the $offset value with your value here-> 12h and any else h if ($offset == 12) { $idx = 21; } else { $idx = 25; } if ($precipIntensity == "") { $precipIntensity = 0.01; } if ($precipIntensity != "") { $ch = curl_init("http://192.168.1.2:8080/json.htm?type=command¶m=udevice&idx=$idx&nvalue=0&svalue=0;$precipIntensity"); curl_exec($ch); curl_close($ch); } //Rain-2----------------------------------------------------------------------- // exchange the "idx=xyz" with your idx values // exchange the $offset value with your value here-> 12h and any else h if ($offset == 12) { $idx = 32; } else { $idx = 31; } if ($precipProbability == "") { $precipProbability = 0; } $precipProbabilityProcent = $precipProbability * 100; //if ($precipProbabilityProcent != "") { $ch = curl_init("http://192.168.1.2:8080/json.htm?type=command¶m=udevice&idx=$idx&nvalue=0&svalue=$precipProbabilityProcent"); curl_exec($ch); curl_close($ch); //} //Wind------------------------------------------------------------------------- //windbearing to compass direction conversion if ($windBearing < 11.25) { $dir = "N"; } elseif ($windBearing >= 11.25 && $windBearing < 33.75) { $dir = "NNE"; } elseif ($windBearing >= 33.75 && $windBearing < 56.25) { $dir = "NE"; } elseif ($windBearing >= 56.25 && $windBearing < 78.75) { $dir = "ENE"; } elseif ($windBearing >= 78.75 && $windBearing < 101.25) { $dir = "E"; } elseif ($windBearing >= 101.25 && $windBearing < 123.75) { $dir = "ESE"; } elseif ($windBearing >= 123.75 && $windBearing < 146.25) { $dir = "SE"; } elseif ($windBearing >= 146.25 && $windBearing < 168.75) { $dir = "SSE"; } elseif ($windBearing >= 168.75 && $windBearing < 191.25) { $dir = "S"; } elseif ($windBearing >= 191.25 && $windBearing < 213.75) { $dir = "SSW"; } elseif ($windBearing >= 213.75 && $windBearing < 236.25) { $dir = "SW"; } elseif ($windBearing >= 236.25 && $windBearing < 258.75) { $dir = "WSW"; } elseif ($windBearing >= 258.75 && $windBearing < 281.25) { $dir = "W"; } elseif ($windBearing >= 281.25 && $windBearing < 303.75) { $dir = "WNW"; } elseif ($windBearing >= 303.75 && $windBearing < 326.25) { $dir = "NW"; } elseif ($windBearing >= 326.25 && $windBearing < 348.75) { $dir = "NNW"; } else { $dir = "N"; } echo $dir; //Windspeed and Wind-direction //"Gust" values are not delivered by forecast.io; therefore "Windpeed" = "Gust" //"$temperature = unused but necessary dummy values // exchange the "idx=xyz" with your idx values // exchange the $offset value with your value here-> 12h and any else h if ($offset == 12) { $idx = 22; } else { $idx = 26; } if ($windBearing != "" && $windSpeed != "" && $temperature != "") { $ch = curl_init("http://192.168.1.2:8080/json.htm?type=command¶m=udevice&idx=$idx&nvalue=0&svalue=$windBearing;$dir;$windSpeed;$windSpeed;$temperature;$temperature"); curl_exec($ch); curl_close($ch); } ?>
Testons depuis la ligne de commande
Recopions ce script dans le dossier des scripts Domoticz, puis
cd /home/pi/domoticz/scripts ./weather-forecast.php 12
Me donnera l’affichage des prévisions pour les 12 h à venir
Lisez soigneusement les OK que renvoie Domoticz pour le débogage
Vérifiez dans Domoticz que le/les composants 12H se sont bien mis a jour avec les valeurs que vous voyez dans votre shell.
Lancement régulier
Le mieux est de placer ce script dans le cron pour un lancement programmé
sudo su crontab –e
Ajouter des lignes comme celle ci pour récupérer à 15 et 16 de toutes les heures,tous les jours les prévisions à 6 H et 12 H.
15 * * * * /home/pi/domoticz/scripts/weather-forecast.php 6 16 * * * * /home/pi/domoticz/scripts/weather-forecast.php 12
aie , j’ai une erreur , installation ok de php 5 .. reboot ..
et :
-bash: ./weather-forecast.php: Permission denied
une idée ?
bon j’ai trouvé ..un petit chmod 775 et c ok,
dans l’exemple il manque des capteurs non ? Rain2 et vent , il faut créer des devices ?
Parfait pour le script et non il ne faut pas créer les devices ils arrivent tt seul a la première interrogation réussi de forecast.io
Bonjour,
au moment de l’install de php5-curl, j’ai ce message qui apparaît,
quelqu’un aurait une idée
Err http://mirrordirector.raspbian.org/raspbian/ wheezy/main php5-common armhf 5.4.41-0+deb7u1
404 Not Found
Merci
Bonjour,
C’est le sudo apt-get install php5-curl qui renvoie cela ?
tente un apt-get update et un apt-get upgrade avant d’installer php5-curl
Merci, c’est bon pour l’install de php5-curl,
maintenant quand je veux executer mon script j’ai ça
root@raspberrypi:/home/pi/domoticz/scripts# ./weather_previ.php 12
-bash: ./weather_previ.php: /usr/bin/php^M: bad interpreter: No such file or directory
je suis désolé je ne comprends pas
Bonsoir
Tu as ouvert et modifié ce fichier sous Windows qui a ajouté ses propres caractères de fin de ligne (cr et lf)
Enregistre ce fichier au format unix cela fonctionnera fais ca avec notepad++
Sinon installe et lance dos2unix sur ce fichier ca fait le job .pense a le faire a chaque modif
Sinon cherche sur internet bad interpreter…
Bonjour,
J’ai l’erreur suivante :
PHP Fatal error: Call to undefined function curl_init() in /home/pi/domoticz/scripts/php/weather-previ.php on line 165
Ligne 165 :
$ch = curl_init(« http://192.169.x.xx:8080/json.htm?type=command¶m=udevice&idx=$idx&nvalue=0&svalue=$temperature »);
Ligne 156 :
if ($offset == 12) {
$idx = 104;
} else {
$idx = 104;
}
Bonsoir
A mon avis tu as du oublier de faire cela comme indiqué dans l’article
sudo apt-get install php5-curl
Salut,
Bravo pour le tuto ☺.
Je vais essayer de mettre en place ceci.
Par contre, je pense que la première copie d’écran n’est pas la bonne.
En effet image pas claire , j’ai corrigé.
Merci et bon courage pour la mise en place
Salut,
Après quelques corrections de // qui manquaient, voici ce que j’obtiens :
pi@raspberrypi:~/domoticz/scripts$ ./weather-forecast.php 12
12
30.12.16 – 14:22:22 1483104142
26
1483146000
12 1483146000
-3.46
71
8.75
98
1035.12
0
0
clear-night
<html><head><title>Unauthorized</title></head><body><h1>401 Unauthorized</h1></body></html><html><head><title>Unauthorized</title></head><body><h1>401 Unauthorized</h1></body></html><html><head><title>Unauthorized</title></head><body><h1>401 Unauthorized</h1></body></html><html><head><title>Unauthorized</title></head><body><h1>401 Unauthorized</h1></body></html>E<html><head><title>Unauthorized</title></head><body><h1>401 Unauthorized</h1></body></html>pi@raspberrypi:~/domoticz/scripts$
Je remarque dans le code php suivant que tout ce qui se trouve derrière // est en bleu, comme un commentaire. J’ai remplacé 192.168.1.2 par l’adresse de mon serveur domoticz, c’est ce qu’il fallait faire ?
$ch = curl_init(« http://192.168.1.9:8080/json.htm?type=command¶m=udevice&idx=$idx&nvalue=0&svalue=$temperature;$hum;$status;$pressure;$prediction »);
Merci d’avance
oui les // sont les commentaires
et,en effet il faut remplacer par l’adresse ip
et il faut remplacer les $idx = 18; par l’idx qu’a ton capteur temp+hum+baro partout dans le code
Salut,
J’ai bien remplacé les idx par ceux de mes capteurs 6h, 12h, 24h, comme ceci :
par contre, je pense avoir une erreur avec :
car les caractères après // sont en bleu.
De plus, dans Domoticz, les capteurs ne sont pas actualisés et sont rouge
14062;14063 ne sont pas des idx me semble t’il , trop élevés
il sont dans rglages/dispositifs
Merci. En effet j’avais pris la colonne ID.
Correction faite, mais erreur encore présente :
la commande pi@raspberrypi:~/domoticz/scripts$ ./weather-forecast.php 12 me donne :
12
30.12.16 – 15:26:51 1483108011
27
1483149600
12 1483149600
-3.57
70
8.43
98
1034.71
0
0
clear-night
<html><head><title>Unauthorized</title></head><body><h1>401 Unauthorized</h1></body></html><html><head><title>Unauthorized</title></head><body><h1>401 Unauthorized</h1></body></html><html><head><title>Unauthorized</title></head><body><h1>401 Unauthorized</h1></body></html><html><head><title>Unauthorized</title></head><body><h1>401 Unauthorized</h1></body></html>E<html><head><title>Unauthorized</title></head><body><h1>401 Unauthorized</h1></body></html>pi@raspberrypi:~/domoticz/scripts$
Oui , l’erreur 401 persiste car ce n’etait pas cela que je voulais regler
L’erreur 401 est du au fait que tu dois avoir un mot de passe pour proteger les acces à domoticz; donc dans « reglages/parametres » à la rurique « reseaux locaux » met 127.0.0.1;192.168.1.9 si 1.9 est bien ton ip Domoticz
Yes, cool, ça marche !!
Je me doutais que tu voulais régler les problèmes un par un.
Je vais maintenant essayer de lancer ça régulièrement…
Je viens de modifier le cron.
J’obtiens un joli logo Domoticz dans mes capteurs, plutôt que les données recueillies.
Salut,
Les valeurs remontent dans Domoticz car je les vois dans Dispositifs, mais elles ne s’affichent pas dans les capteurs de Météo…
Merci d’avance
Bonjour,
Merci pour ce tuto que j’ai mis en place depuis quelques temps déjà et qui fonctionne très bien.
Aujourd’hui j’ai voulu m’y repencher car depuis quelques semaines les prévisions ne s’affichaient plus. En lisant les commentaires ci-dessus, j’ai compris que mon problème venait du mdp que j’avais mis pour accéder à Domoticz. Après ajout de l’adresse IP du Rasp dans les exceptions des réseaux locaux, tout est rentré dans l’ordre.
Je ferais juste une remarque à propos de forecast.io. Le site a été repris par Dark Sky depuis quelques mois. L’adresse forecast.io fonctionne encore pour le moment mais il est possible que ça cesse un jour ou l’autre.
Par ailleurs l’URL a été modifiée depuis la dernière version stable de Domoticz (en décembre). Aussi je pense qu’il serait bon de le faire aussi dans ce script en remplaçant forecast.io par darksky.net comme suit :
$json_string = file_get_contents(« https://api.darksky.net/forecast/$API/$LAT,$LON?units=……
Le reste est inchangé.
Michel