Domoticz sensor-controle – Versie 1.1

Status: Dit is de laatste versie van dit script.

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 via het standaard notificatie-mechanisme, of alleen per e-mail wanneer gewenst. Als een sensor al meer dan 24 uur geen data verstuurt, dan wordt er ’s morgens om 7 uur een herinnering verstuurd.

Update

Verbeterde versie van versie 1.0 van dit script. Op verzoek de optie toegevoegd om ook alleen per e-mail genotificeerd te kunnen worden toegevoegd.

Code

-- Steenderen.NET
-- Domoticz sensor-controle – Versie 1.1

-- Setup variables.
local devices = {
    "Sensor 1",
    "Sensor 2",
    "Sensor 3"
}			-- Alle te monitoren devices in array format.
no_data_timer = 120 	-- Data time-out tijd in minuten.
email_address = ""	-- Voer e-maladres in om notificaties alleen per e-mail te ontvangen, laat leeg om standaard notificaties te ontvangen.

-- No need to edit below

-- 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("")
		if (email_address == tostring("")) then
			commandArray["SendNotification"] = "Sensor \"" .. uservariables["No update from sensor"] .. "\" verstuurt weer data."
			print ("Received data from sensor \"" .. uservariables["No update from sensor"] .. "\" again. Notification was sent.")
		else
			-- FOUT (wordt netjes hersteld in volgende versie
			-- commandArray["SendEmail"]="Domoticz sensor waarschuwing#Sensor \"" .. device .. "\" verstuurt weer data.#" .. email_address
			commandArray["SendEmail"]="Domoticz sensor waarschuwing#Sensor \"" .. uservariables["No update from sensor"] .. "\" verstuurt weer data.#" .. email_address
			print ("Received data from sensor \"" .. uservariables["No update from sensor"] .. "\" again. Email was sent.")
		end


    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)
            if (email_address == tostring("")) then
				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. Notification was sent.")
			else
				commandArray["SendEmail"]="Domoticz sensor time-out#Sensor \"" .. device .. "\" heeft meer dan " .. no_data_timer .. " minuten geen data verstuurd.#" .. email_address
				print ("No data received from sensor \"" .. device .. "\" for more than " .. no_data_timer .. " minutes. Notification sent. Email was sent.")
			end
            
            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
		if (email_address == tostring("")) then
			commandArray["SendNotification"] = "Ter herinnering, sensor \"" .. uservariables["No update from sensor"] .. "\" verstuurt nog steeds geen data."
			print ("Reminder notification was sent for sensor \"" .. uservariables["No update from sensor"] .. "\" that it is not sending data for more than 24 hours.")
		else
			commandArray["SendEmail"]="Domoticz sensor time-out reminder#Ter herinnering, sensor \"" .. uservariables["No update from sensor"] .. "\" verstuurt nog steeds geen data.#" .. email_address
			print ("Reminder email was sent for sensor \"" .. uservariables["No update from sensor"] .. "\" that it is not sending data for more than 24 hours.")
		end
    end
end

return commandArray

Instructies

  1. 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.
  2. Creëer in Domoticz onder Instellingen > Meer opties > Gebeurtenissen een nieuwe gebeurtenis via + (plus-knop) > Lua > Time.
  3. Geef de nieuwe gebeurtenis een herkenbare naam (bij mij heet deze bijvoorbeeld Controle data van sensors.
  4. Verwijder alle voorbeeld code en plak bovenstaande code daarvoor in de plaats.
  5. Pas 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.
  6. Pas wanneer gewenst de no_data_timer aan. Deze staat standaard op 120 minuten. (na een tijdje draaien heb ik deze zelf op 300 minuten gezet)
  7. 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).

11 reacties

  1. Je script draait bij mij en nu en dan krijg ik een notificatie als een sensor langere tijd geen signaal afgeeft. So far so good, echter … af en toe krijg ik echter een foutmelding in mijn Domoticz log:

    Error: EventSystem: in Status Zigbee sensors en plugs: [string “local devices = { “Achter beweging”, …”]:36: attempt to concatenate a nil value (global ‘device’)

    Ik kan er geen patroon in ontdekken en heb alles al gecheckt, maar kom niet achter oorzaak. Namen van de sensors en de variabele kloppen, LUA script heeft een time trigger. En over het algemeen werkt hij ook naar behoren. Enig idee wat hier mis kan zijn?

    • Hoi, ja herkenbaar, en ik er ook geen patroon in kunnen ontdekken. Het lijkt erop dat Domoticz af en toe een verkeerd soort waarde geeft. Ik heb het zelf nu alweer een maand of wat niet meer.

    • Er zit een fout in de commandArray voor SendEmail onder ‘Once a failing device is detected’ (was bij mij regel 36): ipv
      .. device ..
      moet daar staan:
      .. uservariables[“No update from sensor”] ..

      @Jos, als je de foutmelding niet meer krijgt heb je geen failures meer of je hebt e-mail notificatie uitstaan (email_address = “”)

      • Hoi Jan, goed gevonden! Ik gebruik inderdaad geen e-mailnotificatie, alles komt binnen op Telegram aan notificaties. Ik heb hierboven de fout even lelijk gecorrigeerd, zodat men in ieder geval niet meer de foutieve code pakt. Ik probeer van de week nog even een nette versie te publiceren.

  2. Dag Jos,

    Recent je mooie script met succes geïnstalleerd, top, bedankt!

    Wellicht kun je me nog een tip geven, script draait prima, maar toch krijg ik telkens een melding van met name van drie brandmelders (of schuur, of keuken, of bijkeuken) dat de betreffende melder al meer dan 120 minuten geen data versturen (met herhaling van meer dan 300 minuten of nog steeds geen data, etc.). Van de overige brandmelders en sensoren (deur/temperatuur/beweging/smartplug) geen meldingen. Alles via het Zigbee protocol (Zigbee2MQTT). Het vreemde is dat al mijn sensoren in Domoticz gewoon steeds een recente “last seen” geven, ook die betreffende via het script gemelde brandmelders.

    Als ik de betreffende via de script gemelde brandmelder dan even test middels de testknop en/of een brandje simuleer, gaat ie uiteraard luid piepen en krijg ik de melding “… verstuurt weer data”. Echter even daarna een melding van een andere brandmelder dat die meer als 300 minuten geen data verstuurd. Als ik die weer test hopt de melding naar de volgende brandmelder, etc. Verder dus nooit een melding van meerdere brandmelders tegelijk.

    Enig idee wat hier aan de hand kan zijn of ligt de oorzaak mogelijk buiten het script?

    Bedankt alvast!

    • Hoi Theo,

      Excuses voor de late reactie, had je vraag even gemist. Ik zit zelf inmiddels al geruime tijd op Home Assistant i.p.v. Domoticz. Dus ik ben niet helemaal meer bij.

      Wat vreemd is, is dat jij wel een update time in Domoticz ziet, maar dat je toch een time-out melding krijgt.

      Wat voor type brandmelders gebruik je precies? Heb je nog andere soorten sensoren die je met dit script monitort? Werken die wel gewoon goed?

      Gr. Jos

  3. Ik heb dit script getest en vraag me af of het is aan te passen zodat het ook met een LUX meter gaat werken.
    Het script berekent zo te zien verschillen tussen de doorgegeven waardes en mijn LUX meter geeft ’s nachts urenlang elke minuut de waarde 0 door. Het script “denkt” echter dat er geen verschil zit tussen de waardes en daarom elke avond en elke ochtend meldingen dat er geen data is ontvangen en dat er weer data wordt ontvangen.

    Zou dit script aangepast kunnen worden zodat ik het alsnog hiervoor kan gebruiken ipv de timeout op bijv. 9 uur te zetten zoals nu?

      • Hi, dank voor je reactie. ik zou dan de no_data_timer al op 720 ofzo moeten zetten of in ieder geval zo instellen dat het ruim genoeg is, maar daarmee rek ik ook de tijd voordat ik erachter kom dat er een sensor niet reageert toch?

        • Ja klopt inderdaad, dus dat zou een beetje balanceren zijn tussen wat je acceptabel vindt. Wat wel vreemd is, is dat dit script wel echt kijkt naar datum wanneer een laatste update is gegeven. Dus niet naar wanneer voor het laatste de daadwerkelijke waarde is aangepast. M.a.w. blijkbaar geeft de sensor niet standaard zijn waarde door eens per x-tijd? Is dat niet iets wat je kan instellen op de sensors?

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.