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.

 

4 Replies to “Anticipez le givre avec Domoticz”

  1. Bonjour,

    J’ai testé ce script, mais je ne comprends pas le LUA… Je suis resté au VBA…
    Je pense avoir fait toutes les manips correctement, la température de point de rosée de met bien à jour, mais pas celle du point de givre…
    Une idée du problème ??

    Cordialement,
    ChToutatis

     

Laisser un commentaire