[LUA] Températures min/max et envoi par mail

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
AlexElectro
Messages : 55
Inscription : 18 juil. 2015, 22:13

[LUA] Températures min/max et envoi par mail

Message par AlexElectro »

Salut à tous
J'suis trop content, j'ai enfin réussi à écrire un script .... et il fonctionne :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Le but du script est de mémoriser les températures mini et maxi de ma sonde de température extérieur, puis de m'envoyer le résultat par courriel chaque matin à 7h. Ca donne un mail du genre:
Objet: Température du 24
Corps: Cette nuit, la température est descendue à -1.4°C à 1h56. Hier la température maxi a été de 8°C à 13h31

Pour commencer, il faut créer des variables utilisateurs:
variables.png
variables.png (13.05 Kio) Consulté 13815 fois
Attention de bien respecter la casse (minuscule/majuscule) et le type de variable. Si vous voulez changer les noms, il faudra aussi changer ces valeurs dans le script.

Code : Tout sélectionner

commandArray = {}

---------------------------------
------ Variables à adapter ------
---------------------------------
local EmailTo = 'adresse@gmail.com'  -- adresse mail, séparées par ; si plusieurs
local sonde = 'Extérieur'  -- nom de la sonde à surveiller
local debug = 'oui'  -- oui ou non pour avoir des valeurs dans le log

---------------------------------
---------------------------------

 if (devicechanged[sonde])
        then
            temp = tonumber(otherdevices_svalues[sonde])
            temp_min = tonumber(uservariables["Temp_min_ext"])
			temp_max = tonumber(uservariables["Temp_max_ext"])
			hour 	= tonumber(os.date("%H"));
			min 	= tonumber(os.date("%M"));
			day 	= tonumber(os.date("%d"));
			if (debug == 'oui') then
				print('#### Debug script température ####')
				print('sonde '..sonde..' = '..temp..'°C')
				print('Temp_max_ext = '..temp_max..'°C')
				print('Temp_min_ext = '..temp_min..'°C')
				print('Nous sommes le '..day..', il est '..hour..'h'..min..'min')
				end
			
			
			if (tonumber(uservariables["Temp_ext_day"]) ~= day)
				then 
				commandArray['Variable:Temp_min_ext']= tostring(30)
				commandArray['Variable:Temp_ext_day'] = tostring(day)   
				if (debug == 'oui') then
					print('Variable "day" changée, maintenant :'..day)
					print('Variable Temp_min_ext passée à 30')
					end
				end
			
			if (temp < temp_min)
				then
				commandArray['Variable:Temp_min_ext']= tostring (temp)
				commandArray['Variable:Temp_min_ext_hour']= tostring (hour)
				commandArray['Variable:Temp_min_ext_min']= tostring (min)
				print('Temp_min_ext mis à jour : '..temp..' °c à '..hour..'h'..min)
				
			end
			
			if (temp > temp_max)
				then
				commandArray['Variable:Temp_max_ext']= tostring (temp)
				commandArray['Variable:Temp_max_ext_hour']= tostring (hour)
				commandArray['Variable:Temp_max_ext_min']= tostring (min)
				print('Temp_max_ext mis à jour : '..temp..' °c à '..hour..'h'..min)
			end
			
			if (hour==07 and min==00)
				then 
				objet = 'Températures du '..day
				message = 'Cette nuit, la température est descendue à '..uservariables["Temp_min_ext"]..'°C à ' ..uservariables["Temp_min_ext_hour"]..'h'..uservariables["Temp_min_ext_min"]..'. Hier la température maxi a été de '..uservariables["Temp_max_ext"]..'°C à '..uservariables["Temp_max_ext_hour"]..'h'..uservariables["Temp_max_ext_min"]..'.'
				commandArray['SendEmail']= objet..'#'.. message .. '#' .. EmailTo
				commandArray['Variable:Temp_max_ext']= tostring(0)
				if (debug == 'oui') then
					print('message envoyé')
					print('Objet:'..objet)
					print('Corps du message: '..message)
					print('Destinataire: '..EmailTo)
					end
			end

			if (debug == 'oui') then
					print('#### Fin du debug ####')
			end
			
				
end
 return commandArray
Voilà, j'espère que ça sera utile à quelqu'un... :D
Domoticz sur RPi - RfxCom - Sondes oregon DIY - Bus one wire - sondes DS18B20 - BMP085 - Home confort
http://electro.bassignyinformatique.fr/
adv
Messages : 580
Inscription : 02 févr. 2016, 13:54
Contact :

Re: Températures min/max et envoi par mail

Message par adv »

Bonjour !

Excellent job :P , que je vais mettre en application de suite ...

Mon problème c'est que ma sonde extérieure m'envoie aussi l’humidifié, et à l’exécution du code... patatrak !!! ;)

Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_tempmail.lua: /home/pi/domoticz/scripts/lua/script_time_tempmail.lua:13: attempt to index global 'devicechanged' (a nil value)

La sonde doit envoyer une chaine plutôt qu'une valeur je pense...

Voici un début de piste: https://www.domoticz.com/forum/viewtopi ... =23&t=3019

Autre point, je souhaite envoyer le mail uniquement si la température est passée en dessous de zéro, donc il faut rajouter :

if (hour==07 and min==00 and temp_min < 0)

C'est correct ou je vais avoir un souci de syntaxe ?

Bye bye !
Raspberry pi 3 - Domoticz 2024.4 | Piface v.2 + Téléinfo + RFXtrx433E
sondes Oregon | motorisations Somfy Yslo Flex 2 RTS
prises chacon, wifi | Sonoff easyESP, Tasmota, Espurna | ParadoxMG5050
AlexElectro
Messages : 55
Inscription : 18 juil. 2015, 22:13

Re: Températures min/max et envoi par mail

Message par AlexElectro »

Salut
J'ai une sonde qui fait aussi temp/humidité. Je vais tester et je te tiens au courant.
Domoticz sur RPi - RfxCom - Sondes oregon DIY - Bus one wire - sondes DS18B20 - BMP085 - Home confort
http://electro.bassignyinformatique.fr/
adv
Messages : 580
Inscription : 02 févr. 2016, 13:54
Contact :

Re: Températures min/max et envoi par mail

Message par adv »

Bein ça c'est de la réactivité :D

Code : Tout sélectionner

commandArray = {}

valeur_ext = (otherdevices_svalues['Exterieur'])
print("Donnee brute = "..valeur_ext)

--Données de la sonde Exterieure:
sExtTemp, sExtHumidity, sExtTruc = otherdevices_svalues['Exterieur']:match("([^;]+);([^;]+);([^;]+)")

sExtTemp = tonumber(sExtTemp);
sExtHumidity = tonumber(sExtHumidity);
sExtTruc = tonumber(sExtTruc);
 
print("Temperature exterieure : " .. sExtTemp .. " ");
print("Humidite exterieure : " .. sExtHumidity .. " ");
print("Truc : " .. sExtTruc .. " ");

return commandArray
RENVOI:

2016-02-04 10:25:00.133 LUA: Donnee brute = 6.3;78;3
2016-02-04 10:25:00.133 LUA: Temperature exterieure : 6.3
2016-02-04 10:25:00.133 LUA: Humidite exterieure : 78
2016-02-04 10:25:00.133 LUA: Truc : 3

Ce "type" de sonde enfin disons la manière dont il envoi ses données n'est pas compatible avec cette expression: if (devicechanged[sonde]), je continue de chercher en // :mrgreen:

EDIT: ah mais dis dont j'avais nommé le fichier "script_time_xxx"... mais c'est "script_device_xxx" qu'il faut l’appeler nan ?!

Du coup l’erreur n'est plus la même:
Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_device_tempmail.lua: /home/pi/domoticz/scripts/lua/script_device_tempmail.lua:23: attempt to concatenate global 'temp' (a nil value)
Raspberry pi 3 - Domoticz 2024.4 | Piface v.2 + Téléinfo + RFXtrx433E
sondes Oregon | motorisations Somfy Yslo Flex 2 RTS
prises chacon, wifi | Sonoff easyESP, Tasmota, Espurna | ParadoxMG5050
AlexElectro
Messages : 55
Inscription : 18 juil. 2015, 22:13

Re: Températures min/max et envoi par mail

Message par AlexElectro »

Pour lire les infos d'une sonde qui fait température et humidité il faut utiliser quelquechose comme ça:

Code : Tout sélectionner

commandArray = {}

 	
	sTemp, sHumid = otherdevices_svalues['Salon']:match("([^;]+);([^;]+)")
 
	sTemp = tonumber(sTemp)
	sHumid = tonumber(sHumid)
	
	print(sTemp)
	print(sHumid)
	
	
return commandArray
tu peux essayer ce petit script, en remplaçant 'Salon' par le nom de ta sonde. Tu verras le résultat dans le log.

J'ai modifié le script pour qu'il soit adapté aux deux types de sondes:

Code : Tout sélectionner

commandArray = {}

---------------------------------
------ Variables à adapter ------
---------------------------------
local EmailTo = 'email@gmail.com'  -- adresse mail, séparées par ; si plusieurs
local sonde = 'Salon'  -- nom de la sonde à surveiller
local typeSonde = 'humid' -- type de sonde: 'temp': uniquement température / 'humid' : temp+humidité
local debug = 'oui'  -- oui ou non pour avoir des valeurs dans le log

---------------------------------
---------------------------------

 if (devicechanged[sonde])
        then
			if (typeSonde == 'temp') then
				temp = tonumber(otherdevices_svalues[sonde])
			elseif (typeSonde == 'humid') then
				temp, sHumid = otherdevices_svalues[sonde]:match("([^;]+);([^;]+)")
				temp = tonumber(temp)
			end
            temp_min = tonumber(uservariables["Temp_min_ext"])
			temp_max = tonumber(uservariables["Temp_max_ext"])
			hour 	= tonumber(os.date("%H"));
			min 	= tonumber(os.date("%M"));
			day 	= tonumber(os.date("%d"));
			if (debug == 'oui') then
				print('#### Debug script température ####')
				print('sonde '..sonde..' = '..temp..'°C')
				print('Temp_max_ext = '..temp_max..'°C')
				print('Temp_min_ext = '..temp_min..'°C')
				print('Nous sommes le '..day..', il est '..hour..'h'..min..'min')
				end
			
			
			if (tonumber(uservariables["Temp_ext_day"]) ~= day)
				then 
				commandArray['Variable:Temp_min_ext']= tostring(30)
				commandArray['Variable:Temp_ext_day'] = tostring(day)   
				if (debug == 'oui') then
					print('Variable "day" changée, maintenant :'..day)
					print('Variable Temp_min_ext passée à 30')
					end
				end
			
			if (temp < temp_min)
				then
				commandArray['Variable:Temp_min_ext']= tostring (temp)
				commandArray['Variable:Temp_min_ext_hour']= tostring (hour)
				commandArray['Variable:Temp_min_ext_min']= tostring (min)
				print('Temp_min_ext mis à jour : '..temp..' °c à '..hour..'h'..min)
				
			end
			
			if (temp > temp_max)
				then
				commandArray['Variable:Temp_max_ext']= tostring (temp)
				commandArray['Variable:Temp_max_ext_hour']= tostring (hour)
				commandArray['Variable:Temp_max_ext_min']= tostring (min)
				print('Temp_max_ext mis à jour : '..temp..' °c à '..hour..'h'..min)
			end
			
			if (hour==07 and min==00)
				then 
				objet = 'Températures du '..day
				message = 'Cette nuit, la température est descendue à '..uservariables["Temp_min_ext"]..'°C à ' ..uservariables["Temp_min_ext_hour"]..'h'..uservariables["Temp_min_ext_min"]..'. Hier la température maxi a été de '..uservariables["Temp_max_ext"]..'°C à '..uservariables["Temp_max_ext_hour"]..'h'..uservariables["Temp_max_ext_min"]..'.'
				commandArray['SendEmail']= objet..'#'.. message .. '#' .. EmailTo
				commandArray['Variable:Temp_max_ext']= tostring(0)
				if (debug == 'oui') then
					print('message envoyé')
					print('Objet:'..objet)
					print('Corps du message: '..message)
					print('Destinataire: '..EmailTo)
					end
			end

			if (debug == 'oui') then
					print('#### Fin du debug ####')
			end
			
				
end
 return commandArray
Pour ta condition qui concerne la situation de gel, je pense que ça devrait fonctionner comme tu l'as écrit.


tiens nous au courant!
Domoticz sur RPi - RfxCom - Sondes oregon DIY - Bus one wire - sondes DS18B20 - BMP085 - Home confort
http://electro.bassignyinformatique.fr/
adv
Messages : 580
Inscription : 02 févr. 2016, 13:54
Contact :

Re: Températures min/max et envoi par mail

Message par adv »

Merci Alex, yep j'avais réussi à "découper la trame" envoyée par la sonde un post au dessus du tiens ;)

Les sondes Oregon renvoient trois infos, je ne sais pas ce qu'est la troisième que j'ai appelé "Truc".

Dis moi qu'on soit bien d'accord... ton script c'est un script_device ou un script_time ?? Car selon le type je n'ai pas les mêmes erreurs. Dans le cas présent je ne sais lequel choisir, j'ai pas encore bien compris la différence mais je me documente.

Merci.

Antoine.
Raspberry pi 3 - Domoticz 2024.4 | Piface v.2 + Téléinfo + RFXtrx433E
sondes Oregon | motorisations Somfy Yslo Flex 2 RTS
prises chacon, wifi | Sonoff easyESP, Tasmota, Espurna | ParadoxMG5050
AlexElectro
Messages : 55
Inscription : 18 juil. 2015, 22:13

Re: Températures min/max et envoi par mail

Message par AlexElectro »

c'est script_device, c'est à dire qu'il s'exécute à chaque changement d'état d'u périphérique. d'où la première condition qui est:
if (devicechanged[sonde])
Domoticz sur RPi - RfxCom - Sondes oregon DIY - Bus one wire - sondes DS18B20 - BMP085 - Home confort
http://electro.bassignyinformatique.fr/
adv
Messages : 580
Inscription : 02 févr. 2016, 13:54
Contact :

Re: Températures min/max et envoi par mail

Message par adv »

Exact, et cela fonctionne, bravo !

Je vois les infos "debug" dans le log...

J'ai juste modifié (bien que cela ne soit pas indispensable, car on ne se sert pas de ce qu'il y a après le premier point virgule):

elseif (typeSonde == 'humid') then
temp, sHumid, sTruc = otherdevices_svalues[sonde]:match("([^;]+);([^;]+);([^;]+)")
temp = tonumber(temp)

Voilà donc pour mon cas perso je vais rajouter dans l'email la température actuelle, et ne faire envoyer le mail qui si la température a été négative. Deux indices qui m'indiqueront si je dois sauter la case petit dèj pour passer directement à la case grattage de pare brise 8-)

Merci pour ton aide, j'ai même pas eu le temps de chercher :D
Raspberry pi 3 - Domoticz 2024.4 | Piface v.2 + Téléinfo + RFXtrx433E
sondes Oregon | motorisations Somfy Yslo Flex 2 RTS
prises chacon, wifi | Sonoff easyESP, Tasmota, Espurna | ParadoxMG5050
AlexElectro
Messages : 55
Inscription : 18 juil. 2015, 22:13

Re: Températures min/max et envoi par mail

Message par AlexElectro »

J'ai testé le 'sTruc', moi ça me renvoi 0 comme valeur. Je ne sais pas à quoi ça correspond!
Domoticz sur RPi - RfxCom - Sondes oregon DIY - Bus one wire - sondes DS18B20 - BMP085 - Home confort
http://electro.bassignyinformatique.fr/
adv
Messages : 580
Inscription : 02 févr. 2016, 13:54
Contact :

Re: Températures min/max et envoi par mail

Message par adv »

Moi 3... :|

Encore une fois merci pour ce script sympa et utile !
Raspberry pi 3 - Domoticz 2024.4 | Piface v.2 + Téléinfo + RFXtrx433E
sondes Oregon | motorisations Somfy Yslo Flex 2 RTS
prises chacon, wifi | Sonoff easyESP, Tasmota, Espurna | ParadoxMG5050
Répondre