Page 1 sur 12

Script de Givre full auto ou presque

Publié : 18 janv. 2017, 16:48
par deennoo
Salut,

Je presque fini de modifier le script de givre de Papoo, mon idée est qu'il ce met en route la veille pour nous prévenir de couvrir la voiture :
- Pour cela je vais parser le Json de forcast.io (Darksky) et demande les prévision pour dans 12h (le script va de mettre en route a 18h30)


Code : Tout sélectionner

 
--~/domoticz/scripts/lua/script_time_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 long =votre longitude
local lat =votre latitude


--------------------------------------------
----------- 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|'..FreezingPoint}
 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|'..FreezingPoint}
 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|'..FreezingPoint}
 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


Les "Problemes" ont été corriger, ce script est fonctionnel.
Merci a Papoo

Re: Script de Givre full auto ou presque

Publié : 18 janv. 2017, 17:22
par vil1driver
salut,

ta variable doit également être une chaîne de caractères ou une valeur numérique
tu concatènes/joints les chaines par deux points successifs

Code : Tout sélectionner

local couleur = 'rouge'
local phrase = 'la voiture '..couleur..' est propre'
gaffe aux espaces pour ne pas se retrouver avec ce genre de phrase
la voiturerougeest propre ;)

pour l'erreur de fonction log, je ne sais pas là comme ça :roll:

Re: Script de Givre full auto ou presque

Publié : 18 janv. 2017, 19:08
par deennoo
Merci probleme numero 1 : resolu

Reste le 2eme

Re: Script de Givre full auto ou presque

Publié : 18 janv. 2017, 19:49
par Neutrino
Tes fonctions sont après ta condition
if (now.min == minute and now.hour == heure) then
donc quand c'est pas l'heure, le script n'accède pas aux fonctions.
Déplace ton "if (now.min == minute and now.hour == heure) then"
après Fin Fonctions et ça devrait marcher.

Re: Script de Givre full auto ou presque

Publié : 18 janv. 2017, 21:09
par deennoo
Neutrino a écrit :Tes fonctions sont après ta condition
if (now.min == minute and now.hour == heure) then
donc quand c'est pas l'heure, le script n'accède pas aux fonctions.
Déplace ton "if (now.min == minute and now.hour == heure) then"
après Fin Fonctions et ça devrait marcher.
je viens d'essayer mais non le pb est toujours present il c'est déplacer a la ligne qui fait :

Code : Tout sélectionner

json = (loadfile "/home/nico/domoticz/scripts/lua/JSON.lua")()  -- For Linux
Je pense que mon probleme vient du fait que je n'ai pas créée de "function" pour le parsing de json, le ;-) de Vil1driver semble orienter dans cette voie

Re: Script de Givre full auto ou presque

Publié : 18 janv. 2017, 22:20
par papoo
tu as resolu le passage des lattitude longitude? ou l'erreur toute les minutes?

Re: Script de Givre full auto ou presque

Publié : 19 janv. 2017, 00:18
par deennoo
tout est OK Grace a toi.

On en parle ICI : http://domo-attitude.fr/category/news-2/

Re: Script de Givre full auto ou presque

Publié : 21 janv. 2017, 19:10
par diunyr
Débutant sur Domoticz, j'ai testé le script lua et cela ne marche pas de mon coté.

Je suis sous Domoticz Windows (Win10).
Les parametres api, lat et long sont bien rentrés.
la ligne json windows qui pointe vers mon repertoire est bonne et décommentée.
J'ai une erreur à la ligne 51 qui correspond à la ligne

Code : Tout sélectionner

temp  = jsonValeur.hourly.data[12].apparentTemperature
Mais je pense que le soucis à l'origine est la ligne 47

Code : Tout sélectionner

config=assert(io.popen('/usr/bin/curl https://api.forecast.io/forecast/'..api..'/'..lat..','..long..'?units=ca&exclude=currently,minutely,daily,alerts,flags'))
Sauf erreur de ma part cURL n'est pas présent dans l'installation windows.
Comment regler le soucis ? une idée ?

Merci !
(Au passage, très bonne idée de script et bien expliqué je trouve)

Re: RE: Re: Script de Givre full auto ou presque

Publié : 21 janv. 2017, 23:12
par deennoo
diunyr a écrit :Débutant sur Domoticz, j'ai testé le script lua et cela ne marche pas de mon coté.

Je suis sous Domoticz Windows (Win10).
Les parametres api, lat et long sont bien rentrés.
la ligne json windows qui pointe vers mon repertoire est bonne et décommentée.
J'ai une erreur à la ligne 51 qui correspond à la ligne

Code : Tout sélectionner

temp  = jsonValeur.hourly.data[12].apparentTemperature
Mais je pense que le soucis à l'origine est la ligne 47

Code : Tout sélectionner

config=assert(io.popen('/usr/bin/curl https://api.forecast.io/forecast/'..api..'/'..lat..','..long..'?units=ca&exclude=currently,minutely,daily,alerts,flags'))
Sauf erreur de ma part cURL n'est pas présent dans l'installation windows.
Comment regler le soucis ? une idée ?

Merci !
(Au passage, très bonne idée de script et bien expliqué je trouve)
Ah oui ! Pas de curl avec windows !

Je vais regarder cela.

Re: Script de Givre full auto ou presque

Publié : 22 janv. 2017, 10:03
par vil1driver
Curl pour Windows existe !

Souvent mentionné sur ce forum.. et je ne parle même pas de google :oops:

https://curl.haxx.se/download.html