Depuis le rachat de la société Darksky par Apple, nous avons appris que les API de Darksky ne seront plus utilisables par des tiers, il faut donc trouver une autre solution. OpenWeatherMap, qui espère récupérer les utilisateurs de Darksky, propose depuis peu de temps une nouvelle API « One Call Api ». On va donc l’utiliser et enrichir le contenu de Domoticz pour permettre une meilleure utilisation des projets d’arrosage grâce à l’ajout d’informations jusqu’à présent absentes.
Je suis parti de cette discussion sur easydomoticz : One Call API d’OpenWeatherMap
J’ai récupéré le script de Joebuz et le travail des autres participants de cette discussion (Merci à eux) pour arriver au script .lua que vous pouvez télécharger et installer.
J’ai rajouté quelques fonctionnalités et pas mal d’autres choses pour permettre une réutilisation simple par d’autres utilisateurs et un paramétrage externe complet pour ne plus avoir à retoucher le script (ou le moins possible !). L’objectif est que nous utilisions tous le même script avec des paramètres personnalisés à l’extérieur du script :
- ajout de la création des dispositifs météo nécessaires au script
- ajout de la création des variables utilisateurs (à remplir avec vos valeurs dans Domoticz)
- utilisation des variables utilisateur pour les paramètres API Key et Latitude/Longitude
- récupération des IDX pour les mises à jour des dispositifs
- ajout de la visibilité, de la température ressentie, de la température maximum du jour et du point de rosée
- ajout du statut pour l’humidité et la météo
- intégration du calcul du cumul de pluie hebdomadaire
- ajout des prévisions de pluie pour les 7 jours à venir
- envoi quotidien d’un mail et d’une notification Pushbullet avec les prévisions pour les 7 jours à venir
Vous devez donc tout d’abord créer un compte gratuit sur OpenWeatherMap et obtenir une clé pour l’utilisation de l’API (gratuite pour 1.000 appels à l’API par jour). Il vous faudra aussi latitude et longitude de l’emplacement pour lequel vous souhaitez obtenir la météo.


La variable « pluie_jour de la semaine » est mise à jour à 5h00 chaque nuit pour la journée de la veille. La variable « pluie_semaine » est mise à jour chaque nuit à 5h10, c’est le cumul de pluie observé sur les 7 derniers jours. Les variables « pluie_j+n » sont mises à jour chaque nuit à 00h10.
Après le premier passage du script qui va créer les dispositifs et les variables utilisateur, et qui se termine en erreur (c’est normal car les variables qui viennent d’être créées ne sont pas utilisables dans le script de création), vous avez 10 minutes pour mettre vos propres valeurs dans les variables (latitude, longitude, ville, mail-meteo et api_OWM). Pour mail-meteo, vous pouvez mettre plusieurs adresses en les séparant par un ;
Au second passage, les dispositifs seront renseignés avec les valeurs fournies par l’API. Il faut vérifier dans les logs de Domoticz qu’il n’y a pas d’erreur (il est possible que certaines données utilisées indirectement par le script soient absentes de votre configuration ou dans un format différent de celui qui est attendu). Lorsque tout est OK, il est conseillé de mettre en commentaire la ligne 37 du script pour supprimer l’alimentation des logs.
Le script est lancé toutes les 10 minutes et il met à jour les dispositifs créés préalablement.


Pour le dispositif « Vent », les rafales ne sont presque jamais indiquées dans l’API, si elles sont mentionnées je les prends en compte, sinon je mets la vitesse prévue à la place.
Pour le dispositif « Pluie », la valeur principale est la prévision de pluie pour la journée en cours indiquée par l’API à 00h10 et cette valeur ne change plus pour la journée. La valeur indiquée dans « Rate » est la prévision de pluie dans l’heure, elle est mise à jour toutes les 10 minutes.
J’ai classé cet article dans la catégorie Domotique mais aussi Aide Mémoire car il y a plusieurs « trucs » à conserver en mémoire.
La recherche de l’IDX d’un matériel pour connaître le matériel qui gère les Dummy. Cela permet la création « automatique » de switchs virtuels depuis un script sans trop connaître les caractéristiques du Domoticz que l’on utilise.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
-- Recherche de l'IDX d'un matériel de type Dummy pour la création des dispositifs local config = assert(io.popen(curl..'"'.. domoticzURL ..'/json.htm?type=hardware" &')) local blocjson = config:read('*all') config:close() local jsonValeur = json:decode(blocjson) if jsonValeur ~= nil then for Index, Value in pairs( jsonValeur.result ) do if Value.Type == 15 then -- hardware dummy = 15 idx = Value.idx end end end |
La création d’un dispositif dans un script lua. A noter : %20 qui remplace un blanc dans le nom du dispositif pour l’url de création et &sensortype=84 pour indiquer le type de sensor à créer. On retrouve aussi l’idx du matériel recherché dans l’étape précédente.
|
1 2 3 4 5 6 |
-- Création des dispositifs nécessaires pour le script s'ils n'existent pas déjà if not otherdevices['Météo OWM'] then commandArray[tonumber(i)] = { ['OpenURL']=domoticzURL..'/json.htm?type=createvirtualsensor&idx='..idx..'&sensorname=Météo%20OWM&sensortype=84&vvalue=0' } i = i + 1 log('Création du dispositif Météo OWM') end |
La création d’une variable utilisateur dans un script lua. A noter : le type de variable et comme ci-dessus l’incrémentation de i l’index qui permet l’exécution de plusieurs commandes commandArray dans un même script.
|
1 2 3 4 |
if not uservariables['latitude'] then commandArray[tonumber(i)]={['OpenURL']=domoticzURL..'/json.htm?type=command&param=adduservariable&vname=latitude&vtype=2&vvalue=44.837789'} i = i + 1 end |
La récupération des IDX dans un script lua.
|
1 2 3 4 |
-- Récupération des IDX local meteoidx = otherdevices_idx["Météo OWM"] local ventidx = otherdevices_idx["Vent OWM"] local visibiliteidx = otherdevices_idx["Visibilité OWM"] |
La mise à jour de dispositifs en utilisant l’IDX.
|
1 2 3 |
commandArray[pluieidx] = { ['UpdateDevice'] = pluieidx..'|1|0;'..rain } commandArray[uvidx] = { ['UpdateDevice'] = uvidx..'|1|'..UVIndex..';0' } commandArray[humiditeidx] = { ['UpdateDevice'] = humiditeidx..'|'..humidity..'|'..hum_status } |
La mise à jour d’une série de variables dans une boucle for. Les variables à mettre à jour se nomment : pluie_j+1 … pluie_j+7 , les valeurs jsonValeur.daily[(n)].rain sont stockées dans un json organisé en table (résultat de la requête en utilisant l’API). La boucle débute à l’index 2 de la table et va jusqu’à 8 car la première occurrence concerne le jour en cours.
|
1 2 3 4 5 6 7 8 |
----------------------------------------------------------- -- Ajout du volume de pluie prévu pour les jours à venir -- ----------------------------------------------------------- for n=2, 8 do pluie = jsonValeur.daily[(n)].rain m = n - 1 commandArray['Variable:pluie_j+'..m..'']=tostring(pluie) end |
Extrait de la réponse de l’API
L’envoi d’un mail de plusieurs lignes en récupérant les informations dans une table avec une boucle for. A noter : <br> pour le saut de ligne dans le mal et \n pour le saut de ligne Pushbullet, on voit aussi que la valeur rain ne figure pas dans la table lorsqu’elle est à zéro, il faut donc faire un traitement spécifique pour ce cas.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
for n=2, 8 do date_prev = jsonValeur.daily[(n)].dt jour = libjour[tonumber(os.date("%u", date_prev))] jj = (os.date("%d", date_prev)) mois = libmois[tonumber(os.date("%m", date_prev))] m_date = ''..jour..' '..jj..' '..mois..'' m_matin = jsonValeur.daily[(n)].temp.morn m_jour = jsonValeur.daily[(n)].temp.max m_soir = jsonValeur.daily[(n)].temp.eve m_ress = jsonValeur.daily[(n)].feels_like.day m_vent = jsonValeur.daily[(n)].wind_speed m_temps = jsonValeur.daily[(n)].weather[1].description m_nebu = jsonValeur.daily[(n)].clouds m_baro = jsonValeur.daily[(n)].pressure if jsonValeur.daily[(n)].rain then m_pluie = jsonValeur.daily[(n)].rain else m_pluie = 0 end -- Formattage des informations à envoyer ligne1 = ''..m_date..', il fera '..m_matin..'° le matin, '..m_soir..'° dans la soirée et au maximum de la journée '..m_jour..'° ('..m_ress..'° en température ressentie).' ligne2 = 'La météo prévoit "'..m_temps..'" avec '..m_pluie..' mm de précipitations, un vent de '..m_vent..' m/s et une couverture nuageuse de '..m_nebu..'%.' ligne3 = 'Le baromètre indiquera une pression atmosphérique de '..m_baro..' hPa.' -- Cumul des lignes dans le corps du mail et pour Pushbullet corps = ''..corps..''..ligne1..'<br>' corps = ''..corps..''..ligne2..'<br>' corps = ''..corps..''..ligne3..'<br><br>' corps_push = ""..corps_push..""..ligne1.."\n" corps_push = ""..corps_push..""..ligne2.."\n" corps_push = ""..corps_push..""..ligne3.."\n" end -- Formattage des informations à envoyer pour le mail objet = "Prévisions météo pour la semaine à venir à "..ville.."" -- Envoi du mail commandArray['SendEmail']=''..objet..'#'..corps..'#'..destinataire..'' |
Explications complémentaires pour les lignes 2 à 6 de l’extrait de code ci-dessus : l’objectif de ces lignes est d’obtenir une date en format « français ». Grâce aux 2 tables ci-dessous, on obtient les libellés des jours de la semaine et des mois en français. Mais, il faut partir de la date en format unix que nous récupérons de l’API (jsonValeur.daily[(n)].dt), dans la ligne 3, on combine l’utilisation de la table avec un os.date qui nous donne le numéro du jour dans la semaine (soit l’index de la table) à partir du temps unix. Pour le mois, c’est pareil en ligne 5.
|
1 2 3 4 |
-- Table des jours pour avoir un libellé en français libjour = { "Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche" } -- Table des mois pour avoir un libellé en français libmois = { "Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre" } |
Le temps internet selon wikipedia + un convertisseur pour le temps unix + quelle heure est-il ?
Les envois mail et Pushbullet
Le mail et la notification Pushbullet sont envoyés chaque jour à 18h00.
Vigilance Météo
En complément des prévisions et de l’historique météo, j’ai mis à jour la gestion de la vigilance Météo fournie par Météo France via une autre API (Merci Papoo !). Chaque jour à 8h00, 12h00 et 18h00 (heures paramétrables dans le script DZvents), les informations sont récupérées et indiquées dans 3 dispositifs. Ces dispositifs sont créés par le script Meteo.


Script Vigilance Météo (c’est un script dzVents à mettre dans /home/pi/domoticz/scripts/dzVents/scripts)
Nous verrons plus tard comment être alerté en cas de passage en alerte Orange ou Rouge 😉
Si vous constatez des anomalies ou si vous souhaitez des améliorations, prévenez-moi 🙂 Si vous faites des améliorations ou des corrections diffusez les 😛 .






Fin de la mise au point et ajout de la vigilance météo à partir des données de Météo France.
J’ai ajouté dans l’article quelques explications sur le temps unix et son utilisation dans le script pour obtenir des dates dans notre format (plus lisible !).