[LUA] Alarme augmentation température V2

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.
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

[LUA] Alarme augmentation température V2

Message par papoo »

Dans la version 1 de ce script il était possible de comparer la valeur de sondes de température ambiante à un seuil d'alarme unique.
Ceci afin d'etre prévenu en cas d'augmentation anormale d'une température ambiante assimilable à une pré-alarme incendie.
Les principaux inconvénients :
- limités aux seuls températures ambiantes
- un seul seuil de température
La version 2 permet :
- d'utiliser n'importe quelle sonde de température
- de définir un seuil personnalisé par sonde
- de définir des seuils par groupe (type) de sondes
- de définir un seuil par défaut pour les sondes sans groupe ni seuil personnalisé.
- de définir pour chacune des sondes un système de notification différent
- de modifier le délai d’exécution du script simplement
- d'activer/désactiver simplement l’exécution du script

vous pouvez définir un seuil de température (en °C) par sonde ou par groupe ou par défaut, actuellement 3 groupes disponible : ambiance, frigo, congel
le seuil défini par sonde est prioritaire sur le seuil par groupe qui est prioritaire sur le seuil par défaut
comparaison de chaque température au seuil fixé et envoi d'une notification si dépassement du seuil.
Si plusieurs températures sont supérieures au(x) seuil(s), envoie d'une notification pour chacune d'elle.
/!\ si le seuil est fixé trop bas, cela risque de générer beaucoup de notifications et éventuellement bloquer les services de type pushbullet.

comment remplir le tableau les_devices ?
device = le nom du dispositif à surveiller
type_device = le nom du groupe auquel appartient le device à surveiller : ambiance, frigo, congel. Si aucun groupe particulier, nil.
seuil = seuil particulier à n'utiliser que sur le device concerné, inhibe le seuil affecté au groupe et le seuil par défaut . Si aucun seuil particulier, nil.
si type_device = nil et seuil = nil le seuil defaut_seuil sera appliqué.
Pour activer un ou plusieurs mode de notifications particuliers renseigner subsystem
les différentes valeurs de subsystem acceptées sont : gcm;http;kodi;lms;nma;prowl;pushbullet;pushover;pushsafer;telegram
pour plusieurs modes de notification séparez chaque mode par un point virgule. si subsystem = nil toutes les notifications seront activées.

Code : Tout sélectionner

--[[
script_time_alarme_temperature.lua
auteur : papoo

MAJ : 30/12/2018
création : 15/08/2016

Principe : ce script vérifie toutes les deux minutes (modifiable via la variable delai) si il n'y a pas une augmentation de température anormale
sur les sondes de températures référencées dans le tableau les_devices.
vous pouvez définir un seuil de température (en °C) par sonde ou par groupe ou par défaut, actuellement 3 groupes disponible : ambiance, frigo, congel
le seuil défini par sonde est prioritaire sur le seuil par groupe qui est prioritaire sur le seuil par défaut
comparaison de chaque température au seuil fixé et envoi d'une notification si dépassement du seuil.
Si plusieurs températures sont supérieures au(x) seuil(s), envoie d'une notification pour chacune d'elle.
/!\ si le seuil est fixé trop bas, cela risque de générer beaucoup de notifications et éventuellement bloquer les services de type pushbullet.
url blog : https://pon.fr/lua-alarme-augmentation-temperature-v2
URL post : http://easydomoticz.com/forum/viewtopic.php?f=17&t=6205
URL github : https://github.com/papo-o/domoticz_scripts/blob/master/Lua/script_time_alarme_temperature.lua
--]]
--------------------------------------------
------------ Variables à éditer ------------
-------------------------------------------- 
local debugging = false  	            -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local script_actif    = true            -- active (true) ou désactive (false) ce script simplement
local delai = 2                         -- délai d'exécution de ce script en minutes de 1 à 59
local only_mail = false                 -- true si l'on ne souhaite être notifié que par mail, false si l'on souhaite toutes les notifications disponible.
local EmailTo = 'votre.mail@gmail.com'        -- adresse mail, séparées par ; si plusieurs
local defaut_seuil = "45"               -- seuil en °C par défaut avant notification pour tout les devices non personnalisés
local seuil_ambiance = "40"             -- seuil en °C par défaut avant notification pour les devices du groupe ambiance
local seuil_frigo = "25"                -- seuil en °C par défaut avant notification pour les devices du groupe réfrigérateur
local seuil_congel = '25'               -- seuil en °C par défaut avant notification pour les devices du groupe lumières

local les_devices = {};
-- comment remplir le tableau les_devices ?  
-- device = le nom du dispositif à surveiller
-- type_device = le nom du groupe auquel appartient le device à surveiller : ambiance, frigo, congel.  Si aucun groupe particulier, nil.
-- seuil = seuil particulier à n'utiliser que sur le device concerné, inhibe le seuil affecté au groupe et le seuil par défaut . Si aucun seuil particulier, nil.
-- si type_device = nil et seuil = nil le seuil defaut_seuil sera appliqué.
-- Pour activer un ou plusieurs mode de notifications particuliers renseigner subsystem
-- les différentes valeurs de subsystem acceptées sont : gcm;http;kodi;lms;nma;prowl;pushbullet;pushover;pushsafer;telegram
-- pour plusieurs modes de notification séparez chaque mode par un point virgule. si subsystem = nil toutes les notifications seront activées.
-- les_devices[#les_devices+1] = {device="", type_device ="", seuil = nil, subsystem = nil}
les_devices[#les_devices+1] = {device="Temperature Salon",  type_device = "ambiance", seuil = nil, subsystem = "pushbullet"} -- 1er device, seuil en °C
les_devices[#les_devices+1] = {device="Temperature Cave",  type_device = "ambiance", seuil = nil, subsystem = nil} -- 2eme device
les_devices[#les_devices+1] = {device="Temperature Parents",  type_device = "ambiance", seuil = nil, subsystem = nil} -- 3eme device
les_devices[#les_devices+1] = {device="Temperature Bureau",  type_device = "ambiance", seuil = nil, subsystem = nil} -- 4eme device
les_devices[#les_devices+1] = {device="Temperature Cuisine",  type_device = "ambiance", seuil = nil, subsystem = nil} -- 5eme device
les_devices[#les_devices+1] = {device="Temperature Douche",  type_device = "ambiance", seuil = nil, subsystem = nil} -- 6eme device
les_devices[#les_devices+1] = {device="Réfrigérateur",  type_device = "frigo", seuil = nil, subsystem = "telegram"} -- 7eme device
les_devices[#les_devices+1] = {device="Congélateur",  type_device = "congel", seuil = nil, subsystem = "telegram"} -- 8eme device
les_devices[#les_devices+1] = {device="Temperature 1", type_device ="ambiance", seuil = nil, subsystem = nil} -- 9eme device
les_devices[#les_devices+1] = {device="Temperature 2",  type_device = "ambiance", seuil = nil, subsystem = nil} -- 10eme device
les_devices[#les_devices+1] = {device="Temperature Entree",  type_device = "ambiance", seuil = nil, subsystem = nil} -- 11eme device
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
local nom_script = "Alarme température"
local version = "2.03"
local message = {}
local alarmes = 0
local seuil_notification = nil
commandArray = {}
--------------------------------------------
---------------- Fonctions -----------------
--------------------------------------------
package.path = package.path..";/home/pi/domoticz/scripts/lua/fonctions/?.lua"   -- ligne à commenter en cas d'utilisation des fonctions directement dans ce script
require('fonctions_perso')                                                      -- ligne à commenter en cas d'utilisation des fonctions directement dans ce script

-- ci-dessous les lignes à décommenter en cas d'utilisation des fonctions directement dans ce script( supprimer --[[ et --]])
--[[ function voir_les_logs (s, debugging) -- nécessite la variable local debugging
    if (debugging) then 
		if s ~= nil then
        print (s)
		else
		print ("aucune valeur affichable")
		end
    end
end	-- usage voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)
-------------------------------------------- 
function round(value, digits)
	if not value or not digits then
		return nil
	end
		local precision = 10^digits
        return (value >= 0) and
		  (math.floor(value * precision + 0.5) / precision) or
		  (math.ceil(value * precision - 0.5) / precision)
end
--]]
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------
time=os.date("*t")
  
if script_actif == true then
    if ((time.min-1) % delai) == 0 then -- toutes les xx minutes en commençant par xx:01.  xx définissable via la variable delai
        voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)

        for k,v in pairs(les_devices) do 
            local Vtype = v.type_device
            local Vseuil = v.seuil
            local V=otherdevices_temperature[v.device]
            if v.seuil ~= nil then 
                seuil_notification  = v.seuil
            else 
                if Vtype ~= nil then 
                    if Vtype == "ambiance" then seuil_notification = seuil_ambiance 
                    elseif Vtype == "frigo" then seuil_notification = seuil_frigo 
                    elseif Vtype == "congel" then seuil_notification = seuil_congel 
                    end
                else 
                    seuil_notification = defaut_seuil    
                end
                voir_les_logs("--- --- --- seuil de notification : ".. seuil_notification .."°C",debugging)
            end

            voir_les_logs("--- --- --- device value "..v.device.." = "..(round(V, 2) or "nil"),debugging)
            if V~= nil then
                if string.match(V, ';')  then
                V=V:match('^(.-);')
                voir_les_logs("--- --- --- svalue "..v.device.." = "..(round(V, 2) or "nil"),debugging)
                end	
                
              
                if  tonumber(seuil_notification) < tonumber(V) then
                    alarmes = alarmes+1
                    table.insert(message, 'température '..v.device..' : '..round(V, 2)..'°C, supérieure au seuil fixé à '..seuil_notification..'°C <br>')
                    if only_mail ~= true then
                        if v.subsystem ~= nil then
                            commandArray[#commandArray + 1] = {['SendNotification'] = 'Attention#température '..v.device..' : '..round(V, 2)..'°C, supérieure au seuil fixé à '..seuil_notification..'°C!#0###'.. v.subsystem ..''}
                        else
                            commandArray[#commandArray + 1] = {['SendNotification'] = 'Attention#température '..v.device..' : '..round(V, 2)..'°C, supérieure au seuil fixé à '..seuil_notification..'°C!'}
                        end                        
                    end
                end
            end                                            
        end

        if alarmes >= 1 then
            if only_mail == true and EmailTo ~= nil then
                voir_les_logs("--- --- --- Nb d'alarmes : "..alarmes,debugging)
                objet = 'Alerte température '..os.date("%H:%M")
                commandArray['SendEmail']= objet..'#'.. table.concat(message)  .. '#' .. EmailTo
                voir_les_logs("--- --- --- Objet:"..objet,debugging)
                voir_les_logs("--- --- --- Corps du message: "..table.concat(message),debugging)
                voir_les_logs("--- --- --- Destinataire: "..EmailTo,debugging)
            end
        end    
      voir_les_logs("========= Fin ".. nom_script .." (v".. version ..") =========",debugging)
    end -- if time
end -- if script actif
return commandArray
Dernière modification par papoo le 30 déc. 2018, 17:31, modifié 1 fois.
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
Titof2375
Messages : 91
Inscription : 19 avr. 2017, 21:40

Re: LUA : Alarme augmentation température V2

Message par Titof2375 »

Bonjour, super scripts papoo et toujours bien commenté.
Dim33
Messages : 209
Inscription : 29 janv. 2017, 23:19

Re: LUA : Alarme augmentation température V2

Message par Dim33 »

Excellent script, 2 remarques toutefois :

- un seul chiffre après la virgule pour la température des sondes serait plus lisible.
- les font color sont devenus inopérants sur les dernières versions de Domoticz (il me semble).

Code : Tout sélectionner

2018-12-20 01:13:00.451 Status: LUA: <font color='#f3031d'>=========== Alarme température (v2.0) ===========</font>
2018-12-20 01:13:00.451 Status: LUA: <font color='#f3031d'>--- --- --- seuil de notification : 21°C</font>
2018-12-20 01:13:00.451 Status: LUA: <font color='#f3031d'>--- --- --- device value Sonde_xxxxx = 19.700000762939</font>
2018-12-20 01:13:00.451 Status: LUA: <font color='#f3031d'>--- --- --- seuil de notification : 19°C</font>
2018-12-20 01:13:00.451 Status: LUA: <font color='#f3031d'>--- --- --- device value Sonde_Chambre_yyyyy = 17.299999237061</font>
2018-12-20 01:13:00.452 Status: LUA: <font color='#f3031d'>--- --- --- seuil de notification : 19°C</font>
2018-12-20 01:13:00.452 Status: LUA: <font color='#f3031d'>--- --- --- device value Sonde_Chambre_zzzzz = 18.10000038147</font>
2018-12-20 01:13:00.452 Status: LUA: <font color='#f3031d'>--- --- --- seuil de notification : 19°C</font>
2018-12-20 01:13:00.452 Status: LUA: <font color='#f3031d'>--- --- --- device value Sonde_Chambre_aaaaa = 17</font>
2018-12-20 01:13:00.452 Status: LUA: <font color='#f3031d'>========= Fin Alarme température (v2.0) =========</font>
Merci.
NUC sous Ubuntu Server / RFXCom / Domoticz Version: 2020.2
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : Alarme augmentation température V2

Message par papoo »

la derniere version disponible sur le github prend en compte une de tes remarques, la suppression du code html, non supporté dans les dernieres versions de dz
https://github.com/papo-o/domoticz_scri ... rature.lua
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : Alarme augmentation température V2

Message par papoo »

et je viens de mettre à jour, pour ajouter l'arrondi à 2 décimale
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
Dim33
Messages : 209
Inscription : 29 janv. 2017, 23:19

Re: LUA : Alarme augmentation température V2

Message par Dim33 »

Merci Papoo, testé et approuvé.
NUC sous Ubuntu Server / RFXCom / Domoticz Version: 2020.2
Dim33
Messages : 209
Inscription : 29 janv. 2017, 23:19

Re: LUA : Alarme augmentation température V2

Message par Dim33 »

En fait non ....... ;)

Pour ma part, si plusieurs sondes sont supérieures au(x) seuil(s), je ne reçois qu'une notification (seulement pour la dernière des sondes déclarées dans les_devices[#les_devices+1] = .........)
NUC sous Ubuntu Server / RFXCom / Domoticz Version: 2020.2
dxfantome
Messages : 114
Inscription : 14 sept. 2018, 23:29

Re: LUA : Alarme augmentation température V2

Message par dxfantome »

une petite coquille dans les com:

Code : Tout sélectionner

local seuil_congel = '-5'               -- seuil en °C par défaut avant notification pour les devices du groupe lumières
...les devices du groupe congélateur....
Mais super script, trés complet, que je m'empresse d'utiliser :D
orange pi one, raspberry pi 2 b,yeelink v2, rflink 433.92:inters/pir/écran projecteur,Broadlink ,sonde diy(temperature ,hyrgo,co2,particule fine pm10, pm5, pm2.5 /esp wifi et attiny 433) xiaomi: switch/cube/pir/mi flower
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: LUA : Alarme augmentation température V2

Message par denis_brasseur »

Dim33 a écrit : 22 déc. 2018, 22:56 En fait non ....... ;)

Pour ma part, si plusieurs sondes sont supérieures au(x) seuil(s), je ne reçois qu'une notification (seulement pour la dernière des sondes déclarées dans les_devices[#les_devices+1] = .........)
C'est normal la 2eme commande écrase la première.

Envoi de 2 OPENURL : Seul le second est pris en compte.....

Il suffit de remplacer commandArray['SendNotification']='xxxxxxxxxxxxxxxxxxx'

Code : Tout sélectionner

commandArray['SendNotification'] = 'Attention#température '..v.device..' : '..round(V, 2)..'°C, supérieure au seuil fixé à '..seuil_notification..'°C!#0###'.. v.subsystem ..''
par commandArray[#commandArray + 1]={['SendNotification']= 'xxxxxxxxxxxxxxxxx'}

Code : Tout sélectionner

commandArray[#commandArray + 1]={['SendNotification']= 'Attention#température '..v.device..' : '..round(V, 2)..'°C, supérieure au seuil fixé à '..seuil_notification..'°C!#0###'.. v.subsystem ..''}
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Dim33
Messages : 209
Inscription : 29 janv. 2017, 23:19

Re: LUA : Alarme augmentation température V2

Message par Dim33 »

Merci c'est mieux ainsi mais j'ai encore une remarque :?

Tant que la température n'est pas redescendu en-dessous du seuil, la notification est envoyée à chaque exécution du script. A mon sens, une seule fois suffit. Je dis ça .. je dis rien.
NUC sous Ubuntu Server / RFXCom / Domoticz Version: 2020.2
Répondre