Status: Verouderd, versie 1.1 is beschikbaar.
Beschrijving
Gebruikersgebeurtenis in Lua-script om te controleren of sensoren ten minste 1 keer per x-aantal minuten data versturen (standaard 120 minuten, kan aangepast worden). Verstuurt een sensor al langer geen data, dan wordt er een notificatie verstuurd. Als een sensor al meer dan 24 uur geen data verstuurt, dan wordt er ’s morgens om 7 uur een reminder verstuurd.
Instructies
- Creëer in Domoticz onder Instellingen > Meer opties > Gebruikersvariabelen een nieuwe variabele met de naam No update from sensor van het type String. De waarde van de variabele mag leeg blijven.
- Creëer in Domoticz onder Instellingen > Meer opties > Gebeurtenissen een nieuwe gebeurtenis via + (plus-knop) > Lua > Time.
- Geef de nieuwe gebeurtenis een herkenbare naam (bij mij heet deze bijvoorbeeld Controle data van sensors.
- Verwijder alle voorbeeld code en plak onderstaande code daarvoor in de plaats.
- Pas in de eerste alinea van het script aan door de namen van jouw sensors hierin op te nemen. Er staan nu drie sensornamen opgenomen (Sensor 1, Sensor 2 en Sensor 3), dit kan uiteraard uitgebreid worden. Let daarbij op tussen iedere sensornaam (die tussen aanhalingstekens moet staan) er ook een komma staat.
- Sla de gebeurtenis/het script op en kijk of deze geen fouten bevat (dan staat er een rood kruisje voor één van de regels code) en goed werkt (kan bijvoorbeeld door uit één van je sensoren meer dan een uur een batterij te trekken).
Code
-- Enter all devices that you want to monitor in the device array.
local devices = {
"Sensor 1",
"Sensor 2",
"Sensor 3"
}
-- Enter time in minutes after how long not sending data a notification should be sending
no_data_timer = 120
-- Function to calculate difference between given timestamp (s) and current time
function datetimedifferencenow(s)
year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)
t1 = os.time()
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = os.difftime (t1, t2)
return difference
end
time = os.date("*t")
commandArray = {}
-- Once a failing device is detected (meaning no update received in the last hour), this device is stored in the user variable "No update from sensor" and a notification is send.
-- To prevent a notification storm, no update is send out as long as the user variable contains a value.
if (uservariables["No update from sensor"] ~= tostring("")) then
if (datetimedifferencenow(otherdevices_lastupdate[uservariables["No update from sensor"]]) < no_data_timer*60) then
commandArray["Variable:No update from sensor"] = tostring("")
commandArray["SendNotification"] = "Sensor \"" .. uservariables["No update from sensor"] .. "\" verstuurt weer data."
print ("Received data from sensor \"" .. uservariables["No update from sensor"] .. "\" again.")
end
end
-- If there is no device stored in the user variable "No update from sensor", all devices are checked if they send data in the last hour.
if (uservariables["No update from sensor"] == tostring("")) then
for i,device in pairs(devices) do
-- If check device did not give an update in the last hour (= 3600 seconds) then send notification and write device to user variable "No update from sensor".
if (datetimedifferencenow(otherdevices_lastupdate[device]) >= no_data_timer*60) then
commandArray["Variable:No update from sensor"] = tostring(device)
commandArray["SendNotification"] = "Sensor \"" .. device .. "\" heeft meer dan " .. no_data_timer .. " minuten geen data verstuurd."
print ("No data received from sensor \"" .. device .. "\" for more than " .. no_data_timer .. " minutes.")
break -- stop the for loop.
end
end
end
-- To make sure a failing sensor is not forgotten, every morning at 7:00 a notification is send if the sensor is failing for > 24 hours.
if (uservariables["No update from sensor"] ~= tostring("") and time.hour==7 and time.min==0) then
if (datetimedifferencenow(otherdevices_lastupdate[uservariables["No update from sensor"]]) >= 86400) then
commandArray["SendNotification"] = "Ter herinnering, sensor \"" .. uservariables["No update from sensor"] .. "\" verstuurt nog steeds geen data."
print ("Reminder sent for sensor \"" .. uservariables["No update from sensor"] .. "\" that is not sending data for more than 24 hours.")
end
end
return commandArray
Mooie oplossing en inmiddels zelf (met eigen sensors) in gebruik genomen. Dank.
Als gekend “mierenneuker”: pas in het script nog even de strings ” verstuurd weer data” en “verstuurd nog steeds geen data.” aan en vervang “verstuurd” door “verstuurt”. 😉
Groet, Jacob.
Thanks, foutjes zijn aangepast!
Hoi, dank voor het delen van het script. Ik heb het in 1x werkend, helemaal top. Nog een vraagje, kun je ook nog op een makkelijke manier voor een bepaald notificatie type kiezen. Nu verstuurd hij het via alle notificatie mogelijkheden.
Goeie vraag, en geen idee eerlijk gezegd 🙂 Ik zal er eens induiken…
Thanks! Ik hou je blog in de gaten 😉
De SendNotification in het script roept het standaard notifictie-mechanisme van Domoticz aan. De enige andere mogelijkheid qua scripting is om een mail te versturen. Wat had je in gedachte?
Ik gebruikt de app Pilot om mijn Domoticz ook door vrouw en kinderen eenvoudig te laten bedienen, enkele berichten mogen hierin getoond worden. Daarnaast gebruik ik Pushover om meer technische/hobby berichten via te versturen, zodat vrouw en kinderen niet allerlei berichten binnen krijgen. Dit script verstuurd dus via allebei. Dus ik hoopte dat het mogelijk was om een communicatiekanaal te kiezen.
Oh en hij stuurt ook een mail :-).
Is alleen email ook mogelijk? Het hele gezin word dan niet gestoord met problemen 🙂
Ja kan, script heb ik werkend, moet ik alleen nog even netjes publiceren. Probeer ik komende dagen ergens te doen.
Nieuwe versie (1.1 om precies te zijn) van het script is beschikbaar. Hierin heb ik toegevoegd dat je ook alleen per e-mail genotificeerd kan worden.