[LUA] Notification dispositifs actifs

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] Notification dispositifs actifs

Message par papoo »

un petit cadeau de noël :) un script lua pour être notifié lorsque un dispositif est resté allumé depuis un certain temps
pour par exemple être prévenu lorsque la TV des enfants est allumée depuis plus de 2 heures, ou plus simplement lorsque la porte d’entrée n'a pas été correctement refermée.
possibilités de gestion des délais (en minutes) avant notification par groupes ou personnalisé par dispositif actuellement 4 groupes disponibles : porte, fenetres, lumiere, TV. si vous voyez d'autres groupes "incontournables" n’hésitez pas à les proposer ici
Possibilités de personnaliser le type de notification pour chaque dispositif
les dispositifs (devices) sont regroupés dans un tableau les_devices
comment remplir ce tableau ?
chaque ligne se présente sous cette forme :

Code : Tout sélectionner

les_devices[#les_devices+1] = {device="", type_device ="", delai = nil, subsystem = nil}
device = le nom du dispositif à surveiller
type_device = le nom du groupe auquel appartient le device à surveiller : portes, fenetres, lumieres, TV, ordinateurs.
delai = délai en minutes particulier à n'utiliser que sur le device concerné, inhibe le délai affecté au groupe. si aucun délai particulier, nil.
si type_device = nil et delai = nil le délai defaut_delai 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;pushalot;pushbullet;pushover;pushsafer
pour plusieurs modes de notification séparez chaque mode par un point virgule. si subsystem = nil toutes les notifications seront activées.
etat = état du dispositif à surveiller "On" Ou "Off"

Code : Tout sélectionner

--[[
script_time_notification_dispositifs_actifs.lua
Principe : être notifié lorsqu'un device reste à "On" ou "open" plus de X minutes
possibilités de gestion des temps avant notification par groupes ou personnalisés par device
Possibilités de personnaliser le type de notification pour chaque device
Date Création : 22/12/2017 
Date MAJ : 26/12/2017
http://easydomoticz.com/forum/viewtopic.php?f=17&t=5540
http://pon.fr/notification-dispositifs-actifs-en-lua
]]--

--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local debugging = true  			-- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local nom_script = 'Notification dispositifs actifs'
local version = '1.12'
local defaut_delai = "10"           -- délai en minutes par défaut avant notification pour tout les devices non personnalisés
local delai_portes = "5"            -- délai en minutes par défaut avant notification pour les devices du groupe portes
local delai_fenetres = "60"         -- délai en minutes par défaut avant notification pour les devices du groupe fenêtres
local delai_lumieres = "120"        -- délai en minutes par défaut avant notification pour les devices du groupe lumieres
local delai_TV = "150"              -- délai en minutes par défaut avant notification pour les devices du groupe TV
local delai_ordinateurs = "180"            -- délai en minutes par défaut avant notification pour les devices du groupe ordinateurs
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 : porte, fenetres, lumiere, TV.  
-- delai = délai particulier à n'utiliser que sur le device concerné, inhibe le délai affecté au groupe. si aucun délai particulier, nil.
-- si type_device = nil et delai = nil le délai defaut_delai 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;pushalot;pushbullet;pushover;pushsafer
-- pour plusieurs modes de notification séparez chaque mode par un point virgule. si subsystem = nil toutes les notifications seront activées.
-- etat = état du dispositif à surveiller "On" Ou "Off"
-- les_devices[#les_devices+1] = {device="", type_device ="", delai = nil, subsystem = nil, etat = ""}
les_devices[#les_devices+1] = {device="porte entree", type_device ="portes", delai = nil, subsystem = nil, etat = "On"} -- 1er device délai en minutes
les_devices[#les_devices+1] = {device="porte cave",  type_device = "portes", delai = nil, subsystem = nil, etat = "On"} -- 2eme device
les_devices[#les_devices+1] = {device="fenetre douche",  type_device = "fenetres", delai = nil, subsystem = nil, etat = "On"} -- 3eme device
les_devices[#les_devices+1] = {device="lumiere_rdc_2",  type_device = "lumieres", delai = nil, subsystem = "pushbullet", etat = "On"} -- 4eme device
les_devices[#les_devices+1] = {device="TV Sony",  type_device = "TV", delai = nil, subsystem = nil, etat = "On"} -- 5eme device
les_devices[#les_devices+1] = {device="TV Salon",  type_device = "TV", delai = "150", subsystem = nil, etat = "On"} -- 6eme device
les_devices[#les_devices+1] = {device="I7-3500",  type_device = "ordinateurs", delai = "360", subsystem = nil, etat = "On"} -- 7eme device
les_devices[#les_devices+1] = {device="Synology",  type_device = "ordinateurs", delai = "2", subsystem = nil, etat = "Off"} -- 8eme device
les_devices[#les_devices+1] = {device="Routeur MiWiFi",  type_device = "ordinateurs", delai = "2", subsystem = nil, etat = "Off"} -- 9eme device
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
t1 = os.time()
local open
--------------------------------------------
-------------Fonctions----------------------
-------------------------------------------- 
function voir_les_logs (s, debugging) -- nécessite la variable local debugging
    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	-- usage : voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)
--============================================================================================== 
function ConvTime(timestamp) -- convertir un timestamp 
   y, m, d, H, M, S = timestamp:match("(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)")
   return os.time{year=y, month=m, day=d, hour=H, min=M, sec=S}
end
--============================================================================================== 
function round(value, digits) -- arrondi
  local precision = 10^digits
  return (value >= 0) and
      (math.floor(value * precision + 0.5) / precision) or
      (math.ceil(value * precision - 0.5) / precision)
end
--============================================================================================== 
function return_delai(type_device, delai)
    if  type_device == "portes" and delai == nil then 
        return delai_portes
    elseif  type_device == "fenetres" and delai == nil then
        return delai_fenetres
    elseif  type_device == "lumieres" and delai == nil then 
        return delai_lumieres
    elseif  type_device == "TV" and delai == nil then 
        return delai_TV
    elseif  type_device == "ordinateurs" and delai == nil then 
        return delai_ordinateurs        
    elseif delai ~= nil then 
        return delai        
    else
        return defaut_delai
    end
end

--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------
commandArray = {}
voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)
	for k,v in pairs(les_devices) do  -- On parcourt chaque device
        local Vtype = v.type_device
        local Vdelai = v.delai
        local Delai = tonumber(return_delai(Vtype, Vdelai))
        if otherdevices_lastupdate[v.device] ~= nil then
            t2 = ConvTime(otherdevices_lastupdate[v.device])
            difference = (os.difftime (t1, t2))
    --============================= Etat à On ou "" =======================================         
            if (otherdevices[v.device] == 'Open' or otherdevices[v.device] == 'On' and (v.etat == "" or v.etat == 'On')) then -- on n'affiche que les devices à ON ou open
                if Vtype  ~= nil and Vtype ~= "" then 
                    voir_les_logs('=========== Etat du device '.. v.device ..' : '.. otherdevices[v.device] ..' delai : '.. Delai ..' type : '.. Vtype  ..' ===========',debugging)
                else  
                    voir_les_logs('=========== Etat du device '.. v.device ..' : '.. otherdevices[v.device] ..' ===========',debugging) 
                end
            voir_les_logs("=========== maintenant : ".. round(tonumber(t1)/60,0) .." - dernier changement d\'etat : ".. round(tonumber(t2)/60,0) .." - Difference : " .. round(tonumber(difference)/60,0) .."mn ===========",debugging)
            end 
            if (otherdevices[v.device] == 'Open' or otherdevices[v.device] == 'On' and difference > ((tonumber(Delai)*60)-20) and difference < (tonumber(Delai)*60)+40 and (v.etat == "" or v.etat == 'On' or v.etat == 'on')) then -- si le delai est dépassée de moins d'une minute (pour une seule notification)
            voir_les_logs('=========== delai dépassé pour le device '.. v.device ..' : '.. otherdevices[v.device],debugging)
                if v.type_device == "lumieres" or v.type_device == "TV" then open = "allumée" elseif v.type_device == "ordinateurs" then open = "allumé" else  open = "ouverte" end
                if v.subsystem ~= nil then
                    commandArray['SendNotification'] = 'Attention#'.. v.device ..' est restée '..open ..' depuis ' .. Delai ..' mn!#0###'.. v.subsystem ..''
                else
                    commandArray['SendNotification'] = 'Attention#'.. v.device ..' est restée '..open ..' depuis ' .. Delai ..' mn!'
                end
            end
    --============================= Etat à Off ===========================================
            if (otherdevices[v.device] == 'Close' or otherdevices[v.device] == 'Off' and v.etat == 'Off') then -- on n'affiche que les devices à Off
                if Vtype  ~= nil and Vtype ~= "" then 
                    voir_les_logs('=========== Etat du device '.. v.device ..' : '.. otherdevices[v.device] ..' delai : '.. Delai ..' type : '.. Vtype  ..' ===========',debugging)
                else  
                    voir_les_logs('=========== Etat du device '.. v.device ..' : '.. otherdevices[v.device] ..' ===========',debugging) 
                end
            voir_les_logs("=========== maintenant : ".. round(tonumber(t1)/60,0) .." - dernier changement d\'etat : ".. round(tonumber(t2)/60,0) .." - Difference : " .. round(tonumber(difference)/60,0) .."mn ===========",debugging)
            end 
            if (otherdevices[v.device] == 'Close' or otherdevices[v.device] == 'Off' and difference > ((tonumber(Delai)*60)-20) and difference < (tonumber(Delai)*60)+40 and (v.etat == 'Off' or v.etat == 'off')) then -- si le delai est dépassée de moins d'une minute (pour une seule notification)
            voir_les_logs('=========== delai dépassé pour le device '.. v.device ..' : '.. otherdevices[v.device],debugging)
                if v.type_device == "lumieres" or v.type_device == "TV" then open = "éteinte" elseif v.type_device == "ordinateurs" then open = "éteint" else  open = "fermée" end
                if v.subsystem ~= nil then
                    commandArray['SendNotification'] = 'Attention#'.. v.device ..' est restée '..open ..' depuis ' .. Delai ..' mn!#0###'.. v.subsystem ..''
                else
                    commandArray['SendNotification'] = 'Attention#'.. v.device ..' est restée '..open ..' depuis ' .. Delai ..' mn!'
                end
            end        
        else
        print (v.device.. " n\'existe pas")
        end
    end -- end for
voir_les_logs("========= Fin ".. nom_script .." (v".. version ..") =========",debugging)
return commandArray
Dernière modification par papoo le 26 déc. 2017, 09:42, modifié 4 fois.
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
balajol
Messages : 864
Inscription : 13 nov. 2015, 18:54
Localisation : 62

Re: LUA : notification dispositifs actifs

Message par balajol »

Bonsoir Papoo,
:shock: Comme toujours très bien détaillé et utilisable par la Majorité :)
Merci pour ce partage qui fera bien surement des Heureux (Dont moi-même)
Bon Noël à toi également.
Cdt
Bertrand
Dernière modification par balajol le 24 déc. 2017, 18:57, modifié 1 fois.
2024.6 PC Windows10 ; 2ème DEBIAN 10;DANFOSS LC13, Topp; Senseurs univ FIBARO FGBS001, Flood Sensor, ZMNHBD1 Flush 2 Relays ; FIBARO FGS222-FGS212;RFXCOM-RFXtrx433 USB 433.92MHz , Prises Phénix, Prises et Eclairage DI-O, SOMFY RTS,Sonoff ..
victor81
Messages : 152
Inscription : 25 juin 2017, 09:59
Localisation : Tarn

Re: LUA : notification dispositifs actifs

Message par victor81 »

merci pour ce cadeau, il sera utile a beaucoup, moi le premier :)
bon et joyeux noel a tout le monde ;)
Rpi 3b jessie sur ssd, rflink48, domoticz 4.9700, YANA
ma presentation: https://easydomoticz.com/forum/viewtopi ... =21&t=6449
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : notification dispositifs actifs

Message par papoo »

petites modifs du script :
ajout Surveillance des dispositifs à l'état Off (idéal pour être prévenu rapidement de la disparition d'un périphérique réseau par exemple)
ajout d'un groupe ordinateurs.
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
christophe2836
Messages : 195
Inscription : 26 déc. 2017, 22:27
Contact :

Re: LUA : notification dispositifs actifs

Message par christophe2836 »

Merci pour le script, toujours bien expliqué !
daland
Messages : 24
Inscription : 30 janv. 2020, 19:16

Re: LUA : notification dispositifs actifs

Message par daland »

Bonsoir,

j'ai un petit soucis avec ce script et je ne comprends pas ce qui se passe : d'abord je débute dans tout ça (domoticz, lua, script...) et je ne maîtrise pas encore tout !

Donc je teste pour l'instant sur un seul "device" à savoir un détecteur d'ouverture de fenêtre, et envoie de sms (http via free)
Tout fonctionne sauf le delai : le sms est émis dès l'ouverture de la fenêtre.

j'ai essayé en changeant le
local delai_fenetres = "60" (faut il garder les "" ?)

ou directement dans la ligne :
les_devices[#les_devices+1] = {device="NOM", type_device ="fenetres", delai = nil, subsystem = "http", etat = "On"} -- 1er device délai en minutes (ici aussi faut il mettre la valeur temps entre "" ou chiffre seul ?)

Dans les deux cas, la notification d'ouverture est lancée immédiatement, ou au pire après 2 mn mais jamais les 10-15 minutes que je voudrais.

Pouvez vous m'expliquer ce qui se passe et comment résoudre le problème ??
J'ai la dernière version stable de domoticz.

Merci d'avance !
daland
Messages : 24
Inscription : 30 janv. 2020, 19:16

Re: LUA : notification dispositifs actifs

Message par daland »

Bon j'ai vu que ce script avait été remplacé maintenant par :

viewtopic.php?f=17&t=8167

pour ceux qui tomberait par hasard sur cette page...
Répondre