User Variable e gestione del tempo in Domoticz
Questo script LUA mostra come gestire le variabili utente e il tempo in Domoticz.
L’obiettivo del programma è di mandare una notifica se è passato un adeguato lasso di tempo dall’ultimo update di una variabile utente, se la temperatura scende al di sotto di un certo livello e se l’orario si trova in un determinato intervallo.
Anzitutto dalla Web UI Di Domoticz andiamo in Setup-> More Options-> user variables e creiamo la variabile TempPrev.
La variabile può essere di tipo integer, Float, Date, Time e String.
Nel nostro caso, poichè intendiamo avvalerci delle funzioni che lavorano sulle stringhe, la dichiareremo String.
Potremo vedere la variabile appena creata (e quello che contiene) nella lista delle variabili nella stessa pagina.
Ribadiamo che nel nostro caso si tratta di una Stringa che corrisponde ad una data con il formato: YYYY-MM-DD hh:mm:ss
Di seguito lo script completo. Perchè venga eseguito dovremo inserirlo nella directory domoticz->script->LUA e chiamarlo con il nome del device in concomitanza del cui cambiamento vogliamo che venga avviato. In questo caso si tratta del device “Temperatura Corridoio”. Pertanto lo script dovrà chiamarsi: script_device_Temperatura_Corridoio.lua
t1 = os.time() commandArray = {} -- loop through all the changed devices for deviceName,deviceValue in pairs(devicechanged) do --confronto il tempo attuale con quello conservato nella variabile utente TempPrev t2 = uservariables["TempPrev"]; year = string.sub(t2, 1, 4) month = string.sub(t2, 6, 7) day = string.sub(t2, 9, 10) hour = string.sub(t2, 12, 13) minutes = string.sub(t2, 15, 16) seconds = string.sub(t2, 18, 19) t3 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds} difference = (os.difftime (t1, t3)); print("TIMEDIFF: " .. difference .. " "); -- estrazione dati sDeviceTemp, sDevicePress= otherdevices_svalues['Temperatura Corridoio']:match("([^;]+);([^;]+)") sDeviceTemp = tonumber(sDeviceTemp); sDevicePress = tonumber(sDevicePress); print("Actual Temp is: " .. sDeviceTemp .. " "); time = os.date("*t"); if ((sDeviceTemp <=21.5) and (time.hour >= 8 and time.hour <= 21)and difference >9500) then commandArray['Variable:TempPrev'] = tostring(otherdevices_lastupdate['Temperatura Corridoio']); --commandArray['SendNotification']='Temperatura sotto i 22 gradi. Accendi termosifoni!###0##telegram'arriva al bot e non al canale commandArray['SendNotification']='Temperatura sotto i 21.5 gradi. Accendi termosifoni!' end end return commandArray
Lo script LUA parte solo quando c’è un cambiamento sul device.
for deviceName,deviceValue in pairs(devicechanged) do
Di seguito viene calcolata la differenza tra il tempo attuale (t1 = os.time()) con quello conservato nella variabile utente TempPrev.
La variabile viene prelevata: t2 = uservariables["TempPrev"];
Quindi la stringa viene scomposta nelle varie parti
year = string.sub(t2, 1, 4) month = string.sub(t2, 6, 7) day = string.sub(t2, 9, 10) hour = string.sub(t2, 12, 13) minutes = string.sub(t2, 15, 16) seconds = string.sub(t2, 18, 19)
Di seguito queste parti vengono ricomposte nello stesso oggetto del tempo attuale in modo che si possa cofrontarlo con esso e calcolarne la differenza
t3 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds} difference = (os.difftime (t1, t3));
Vengono quindi prelevati i dati di temperatura e pressione dati dal device
sDeviceTemp, sDevicePress= otherdevices_svalues['Temperatura Corridoio']:match("([^;]+);([^;]+)") sDeviceTemp = tonumber(sDeviceTemp); sDevicePress = tonumber(sDevicePress);
Infine se la temperatura è al di sotto di un certo livello (21.5), se sono passati poco più di de ore e mezza dall’ultima modifica della variabile utente e se l’orario si trova in un determinato intervallo, viene mandata una notifica.
if ((sDeviceTemp <=21.5) and (time.hour >= 8 and time.hour <= 21)and difference >9500) then commandArray['SendNotification']='Temperatura sotto i 21.5 gradi. Accendi termosifoni!'
e viene effettuato l’update della variabile utente
commandArray['Variable:TempPrev'] = tostring(otherdevices_lastupdate['Temperatura Corridoio']);