Les prévisions météo de forecast.io dans Domoticz

Dans un article précédent nous avions vu comment récupérer la météo depuis un service météo et l’intégrer dans Domoticz.

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.

temp_hum_baro tem_hum_baro_final2

 

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.

virtualdevices

 

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&param=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&param=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&param=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&param=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&param=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.

Forecast12h.jpg

 

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

 

Posted in Débutants, domoticz, domotique and tagged , , , , , .

21 Comments

  1. aie , j’ai une erreur , installation ok de php 5 .. reboot ..
    et :
    -bash: ./weather-forecast.php: Permission denied
    une idée ?

  2. 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 ?

  3. 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

  4. 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

  5. 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

  6. 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…

  7. 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&param=udevice&idx=$idx&nvalue=0&svalue=$temperature »);

    Ligne 156 :

    if ($offset == 12) {
    $idx = 104;
    } else {
    $idx = 104;
    }

     

  8. Bonsoir
    A mon avis tu as du oublier de faire cela comme indiqué dans l’article
    sudo apt-get install php5-curl

  9. 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.

  10. 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&param=udevice&idx=$idx&nvalue=0&svalue=$temperature;$hum;$status;$pressure;$prediction »);

    Merci d’avance

  11. 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

  12. Salut,
    J’ai bien remplacé les idx par ceux de mes capteurs 6h, 12h, 24h, comme ceci :

    if ($offset == 6) {
            $idx = 14062;
    } elseif ($offset == 12) {
            $idx = 14063;
    } else {
            $idx = 14064;
    }
    

    par contre, je pense avoir une erreur avec :

    if ($temperature != "")  {
    $ch = curl_init("http://192.168.1.9:8080/json.htm?type=command&param=udevice&idx=$idx&$
    curl_exec($ch);
    curl_close($ch);
    }
    

    car les caractères après // sont en bleu.
    De plus, dans Domoticz, les capteurs ne sont pas actualisés et sont rouge

  13. 14062;14063 ne sont pas des idx me semble t’il , trop élevés
    il sont dans rglages/dispositifs
    idx

  14. 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$

  15. 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

  16. 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…

  17. Je viens de modifier le cron.
    J’obtiens un joli logo Domoticz dans mes capteurs, plutôt que les données recueillies.

  18. 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

  19. 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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *