Steenderen.NET

Domoticz sensor-controle-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. Als een sensor al meer dan 24 uur geen data verstuurt, dan wordt er ’s morgens om 7 uur een reminder verstuurd.

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 onderstaande code daarvoor in de plaats.
  5. 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.
  6. 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

Verder Bericht

Vorige Bericht

2 Reacties

  1. Jacob Heres 6 mei 2020

    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.

Laat een reactie achter

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

© 2020 Steenderen.NET

Thema door Anders Norén