User Variable e gestione del tempo in Domoticz

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.

UserVariableDomoticz

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']);

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.