Et voila l’hiver est arrivé, avec son pack complet : pluie, neige, grisaille et froid, déjà que le matin c’est pas top top, si en plus vous n’avez pas protégé le pare brise de votre voiture, voici votre première occupation :
Peu agréable n’est-ce pas ? Et si votre Domotique vous prévenait la veille, quand vous rentrez chez vous qu’il faut couvrir votre pare-brise ?
Grâce à un script LUA et Domoticz, nous pouvons savoir à 18h30 s’il va givrer le lendemain matin, et ainsi prévenir plutôt que de guérir (10 minutes de gagné c’est toujours bon à prendre)
A 18h30 nous allons demander à un service de prévision météo la température prévue a 6h30 demain matin, réaliser un calcul qui va déterminer s’il y aura du givre et demander à Domoticz de nous envoyer une alerte.
LES PRÉREQUIS
Avoir une clé API DarkSky : https://darksky.net/dev/
Connaître la position GPS de votre lieu de parking, dans Domoticz :
Avoir un système de notification qui fonctionne :
Tout est vide c’est normal on est sur mon Domoticz de test fait rien que pour vous.
Créer des capteurs virtuels :
Un de température pour suivre le point de rosé (dew point)
Un de température pour suivre le point de givre (frizze point)
Un de type « ALERTE » qui va vous permettre de voir en un clin d’oeil s’il a du givre ou pas
Quoi vous ne savez pas créer des capteurs Virtuels ? Réglages >Materiels puis Dummy.
Enfin cliquez sur Créer capteur virtuel et faites vos choix.
Récupérez les IDX de vos Virtuels tous neufs : Réglages>Dispositifs
C’est ceci :
Ce qui donne :
Pour l’Alerte la couleur du triangle change en fonction du niveau d’alerte
Rouge : il va y avoir du givre
Jaune : il y a un risque de givre
Vert : pas de givre
Pour les Capteurs de températures:
Et avec la fonction « log » on obtient de belles courbes :
Elle n’a pas froid !
A non c’est celle-ci :
Courbe d’historique du point de givre
LE SCRIPT
Nous allons utiliser un script LUAvia l’éditeur d’événement intégré a Domoticz (Réglages>Plus d’option>événements) et la fonction de parsing (Analyse Syntaxique) intégrée, très bien décrite sur le Blog EasyDomoticz.
Il faut absolument le personnaliser sinon cela ne fonctionne pas, tout se trouve dans le pavé « Variables à éditer », et bien mettre le script en TIME (case où il y a écrit ALL en dessous de LUA)
Vous devez aussi modifier le chemin d’accès au fichier JSON.lua
La majorité des cas de figures y sont, RPI, Syno, Windows et Linux, il suffit d’enlever les — en bout de ligne et d’en mettre sur la ligne « tunning Linux »
Vous le voulez le script hein ?
--~/domoticz/scripts/lua/script_device_givre.lua
--auteur : papoo&deennoo
--version : on s'en fiche
--MAJ : 18/01/2017
--création : 06/05/2016
--Principe :
--a une heure donnée, va chercher les previsions de temperature pour dans 12h puis va calculer
--le point de givre
--puis en comparant ensuite le point de givre et la température reçue, création d'une alerte givre.
--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local debugging = true -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local dew_point_idx = -- idx de l'éventuel dummy température point de rosée si vous souhaitez le suivre
local freeze_point_idx = -- idx du dummy température point de givre
local freeze_alert_idx = -- idx du dummy alert point de givre
local heure =18 ---heure de declenchement
local minute =35 -- minute de declenchement
local api ="garderlesguillemets"
local lat =votre latitude
local long =votre longitude
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
--parser le json forcast io
json = (loadfile "/home/votrenomutilisé/domoticz/scripts/lua/JSON.lua")() -- For Linux
--json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- for PI
--json = (loadfile "/volume1/@appstore/domoticz/var/scripts/lua/JSON.lua")() -- For Syno
commandArray = {}
now=os.date("*t")
if (now.min == minute and now.hour == heure) then
--if now.min % 1 == 0 then -- toutes les minutes
config=assert(io.popen('/usr/bin/curl https://api.forecast.io/forecast/'..api..'/'..lat..','..long..'?units=ca&exclude=currently,minutely,daily,alerts,flags'))
blocjson = config:read('*all')
config:close()
jsonValeur = json:decode(blocjson)
temp = jsonValeur.hourly.data[12].apparentTemperature
dew = jsonValeur.hourly.data[12].dewPoint
--print('temp: '..temp..' dew: '..dew)
--------------------------------------------
---------------- Fonctions -----------------
--------------------------------------------
function voir_les_logs (s, debbuging)
if (debugging) then
if s ~= nil then
print ("<font color='#f3031d'>".. s .."</font>");
else
print ("<font color='#f3031d'>aucune valeur affichable</font>");
end
end
end
function freezing_point(d, t)
if d > t then
return nil, " La température du point de rosée est supérieure à la température. Puisque la température du point de rosée ne peut être supérieure à la température de l'air , l\'humidité relative a été fixée à nil."
end
T = t + 273.15
Td = d + 273.15
return (Td + (2671.02 /((2954.61/T) + 2.193665 * math.log(T) - 13.3448))-T)-273.15
end
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------
voir_les_logs("=========== Point de rosee et point de givrage (v1.0) ===========",debugging)
voir_les_logs("--- --- --- Temperature Ext : ".. temp,debugging)
voir_les_logs("--- --- --- Point de Rosee : ".. dew,debugging)
if dew ~= nil and temp ~= nil then
if dew_point_idx ~= nil then
commandArray[1] = {['UpdateDevice'] = dew_point_idx .. "|0|" .. dew} -- Mise à jour point de rosee
end
FreezingPoint = freezing_point(dew, tonumber(temp))
if FreezingPoint ~= nil then
voir_les_logs("--- --- --- Point de Givrage : ".. FreezingPoint,debugging)
if freeze_point_idx ~= nil then
commandArray[2] = {['UpdateDevice'] = freeze_point_idx .. "|0|" .. FreezingPoint} -- Mise à jour point de givrage
end
if(tonumber(temp)<=1 and tonumber(FreezingPoint)<=0)then
voir_les_logs("--- Givre Demain Matin ---",debugging)
commandArray[3]={['UpdateDevice'] = freeze_alert_idx..'|4|'..'Presence de givre demain matin'}
commandArray['SendNotification'] = 'Alert#Presence de givre demain matin!'
elseif(tonumber(temp)<=0 and tonumber(FreezingPoint)>=0)then
voir_les_logs("--- Givre Demain Matin ---",debugging)
commandArray[3]={['UpdateDevice'] = freeze_alert_idx..'|4|'..'Presence de givre demain matin'}
commandArray['SendNotification'] = 'Alert#Presence de givre demain matin!'
elseif(tonumber(temp)<=3 and tonumber(FreezingPoint)<=0)then
voir_les_logs("--- Risque de Givre Demain Matin ---",debugging)
commandArray[3]={['UpdateDevice'] = freeze_alert_idx..'|2|'..'Risque de Givre Demain Matin'}
commandArray['SendNotification'] = 'Alert#Risque de givre demain matin!'
else
voir_les_logs("--- --- --- Aucun risque de Givre --- --- ---",debugging)
commandArray[3]={['UpdateDevice'] = freeze_alert_idx..'|1|'..'Pas de givre'}
voir_les_logs("=========== Fin Point de rosee et point de givrage (v1.0) ===========",debugging)
end
else
voir_les_logs("=========== La temperature du point de rosee est superieure a la temperature. Puisque la temperature du point de rosee ne peut etre superieure a la temperature de l'air , l\'humidite relative a ete fixee à nil ===========",debugging)
if tonumber(dew)<= -5 then
voir_les_logs("--- Risque de Givre Demain Matin ---",debugging)
commandArray[3]={['UpdateDevice'] = freeze_alert_idx..'|2|'..'Risque de Givre Demain Matin'}
commandArray['SendNotification'] = 'Alert#Risque de givre demain matin!'
end
end
else
voir_les_logs("=========== Calcul du Point de rosee et du point de givrage impossible aucune donnee a traiter ===========",debugging)
end
end
return commandArray
Résumons ce que nous avons appris :
A Créer des « Dummy » ou Capteurs Virtuels,
A Parser du Json en LUA,
A créer un script LUA dans l’éditeur de Domoticz,
A créer une clé API Darksky qui est réutilisable dans Domoticz (Réglages>Matèriels>Darksky weather lookup),
Que Papoo est un mec génial, car même a 22h00, il m’aide à déboguer le script, mais qu’il a quand même un problème avec la Météo…
Un peu de boulot mais, fini le gratout dans la nuit et le froid, nous pourrons enfin profiter de cet instant en Famille !
Déjeuner en Famille
La prochaine évolution : récupération des infos GPS dans Domoticz en direct, Création des Capteurs automatiquement.
Edit : Mise a Jour le 08/02/17 : Correction des alertes pour afficher du texte.