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)

LA DÉMARCHE

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 :
  • Email
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
Courbe d’historique du point de givre

LE SCRIPT

Nous allons utiliser un script LUA via 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.  

Laisser un commentaire