[LUA] Notification dispositifs actifs
Publié : 24 déc. 2017, 16:02
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 :
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"
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}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