Steenderen.NET

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).

Verder Bericht

Vorige Bericht

5 Reacties

  1. Mark 15 december 2020

    Top! Bedankt.

  2. Jan 17 februari 2021

    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?

    • jos 21 februari 2021 — Berichtauteur

      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.

    • Jan 24 februari 2021

      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 = “”)

      • jos 25 februari 2021 — Berichtauteur

        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.

Laat een reactie achter

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

© 2021 Steenderen.NET

Thema door Anders Norén