Batteriecheck Szene

Advertisements

Leere Batterien in Aktoren und Sensoren können im Fibaro Home Center zu unerwünschten Effekten und bei entsprechender Konfiguration zu einer Flut von E-Mails führen. In diesem Artikel stelle ich eine LUA Szene für den Batteriecheck vor, mit der gezielte und detaillierte Benachrichtigungen möglich sind.

Batteriecheck

Batteriecheck

Batteriebetriebene Geräte finden

Im ersten Schritt ging es um die Identifikation von batteriebetriebenen Geräten im Home Center 2. Statt einer Iteration über alle Geräte hinweg, habe ich die Funktion getDevicesId genutzt. Ich nutze diese Funktion gerne um Geräte nach ihren Eigenschaften zu filtern. So stelle ich sicher, dass ich alle betreffenden (hier die batteriebetriebenen) Geräte betrachte und die Zentrale nicht übermäßig belastet wird. Weiterhin werden nur Geräte geprüft die im Home Center sichtbar und aktiviert sind.

Trigger

Ist die Benachrichtigung für kritische Batteriestände im Home Center aktiviert, so versendet dieses in mehr oder weniger regelmäßigen Abständen eine Benachrichtigung per E-Mail. Ist man vor Ort und kann die Energiequelle sofort wechseln ist dies eine nützliche Einrichtung. Die Szene wird durch die globale Variable TimeOfDay getriggert und versendet so Benachrichtigungen zu definierten Zeitpunkten. Siehe Grundausstattung globale Variablen.

Batteriestatus 0% oder 255%

Ist die Batterie eines Aktors oder Sensors leer und das Home Center hat keine Verbindung mehr, so wird als Batteriestatus entweder 0 oder 255% übermittelt. Dies ist in der Szene ebenfalls berücksichtigt und es wird eine entsprechende Nachricht generiert und verschickt.

Virtuelles Device und Globale Variable

Um die Benachrichtigungen komfortabel steuern zu können, habe ich ein virtuelles Device erstellt. Die benötigte globale Variable mit dem Namen BatterieMsg wird automatisch durch das VD erstellt. Als Port muss die ID der Szene eingetragen werden, damit es funktioniert.
Sowohl VD als auch globale Variable sind optional. Die Szene kann ohne beides, nur mit globaler Variable oder mit Variable und VD betrieben werden. Für die manuelle Erstellung der globalen Variable hier das Schema:

Beispiel 1,0,1

1 = Benachrichtigungen aktiv (jeweils 1 oder 0 als Wert)
0 = E-Mail Benachrichtigungen inaktiv
1 = Push Benachrichtigungen aktiv
Batteriecheck VD

Batteriecheck VD

Update: Die globale Variable BatterieMsg wird nun automatisch durch das virtuelle Device erstellt.

Download

Download VD:

Icon:

Icon

Icon

Konfiguration der Szene

In der Szene lassen sich Benachrichtigungen per E-Mail und/oder Push-Nachricht konfigurieren. Auch kann angepasst werden, ob die globale Variable zur Steuerung genutzt werden soll. Jeweils für einen oder mehrere Empfänger. Weiterhin lässt sie die Betreffzeile der E-Mail und der Schwellwert ab welchem eine Benachrichtigung erfolgen soll anpassen.

-- Konfiguration
-----------------------------------------------
local advdebug		= true
local minBatteryLevel 	= 25
local mail		= 2 -- 0 = off / 1 = on / 2 = check global
local mailSubject	= "Fibaro Batteriecheck"
local mailRecipient	= {2}
local notification	= 2 -- 0 = off / 1 = on / 2 = check global
local notiRecipient	= {8}
  • advdebug = Weiterführendes Debug ausgeben true/false
  • minBatteryLevel = Unter welchem Batteriewert wird benachrichtigt
  • mail = Mail Benachrichtigung Ausschalten (0), Einschalten (1) oder vom VD steuern lassen (2)
  • mailSubject = Der E-Mail Betreff
  • mailReceipient = IDs der E-Mail Empfänger
  • notifocation = Push Benachrichtigung Ausschalten (0), Einschalten (1) oder vom VD steuern lassen (2)
  • notiReceipient = IDs der mobilen Geräte

Die Batteriecheck Szene

--[[ 
%% properties 
%% globals 
TimeOfDay
--]] 
-----------------------------------------------
-- mkshb.de - Batteriecheck
-----------------------------------------------
--[[
Batteriecheck
Trigger: globale Variable TimeOfDay 
--]]
---------------------------------------------------
--------- Schleifenschutz -------------------------
if (fibaro:countScenes()>1) then
fibaro:debug('Kill the second scene!');
fibaro:abort();
end
-- Konfiguration
-----------------------------------------------
local advdebug			= true
local minBatteryLevel 	= 25
local mail				= 2 -- 0 = off / 1 = on / 2 = check global
local mailSubject		= "Fibaro Batteriecheck"
local mailRecipient		= {2}
local notification		= 2 -- 0 = off / 1 = on / 2 = check global
local notiRecipient		= {8}
--------- Farbiges Debug
---------------------------------------------------
debug = function ( color, message )
if (advdebug) then 
fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span"));
end
end	
--------- VD Werte auslesen
---------------------------------------------------
if (mail == 2) or (notification == 2) then
msgArray = {}
for msgValue in string.gmatch(fibaro:getGlobal("BatterieMsg"), "([^,]+)") do table.insert(msgArray, tonumber(msgValue)) end
if (msgArray[1] == 0) then debug("red","Benachrichtigungen sind beaktiviert. Abbruch!"); fibaro:abort(); end
if (msgArray[2] == 1 and mail == 2) or (mail == 1) then mail = true else mail = false end
if (msgArray[3] == 1 and notification == 2) or (notification == 1) then notification = true else notification = false end
else
if (mail == 1) then mail = true else mail = false end
if (notification == 1) then notification = true else notification = false end
end
--------- Benachrichtigungsfunktionen
---------------------------------------------------
function sendMail(msgBody, user)
mailBody = ""
for i=1,#msgBody do
debug("green","Sendmail: "..msgBody[i])
mailBody = mailBody .. msgBody[i] .. "\n"
end
if mail 		then fibaro:call(user,"sendEmail",mailSubject,mailBody) end
end
function sendNoti(msgBody, user)
for i=1,#msgBody do
debug("green","Sendmail: "..msgBody[i])
if notification then fibaro:call(user,"sendPush",msgBody[i]) end
end
end
--------- Skript
---------------------------------------------------
devices 	= fibaro:getDevicesId({interfaces ={"battery"}, visible = true, enabled = true})
mailMessage = {}
for i = 1, #devices do
local name = fibaro:getName(devices[i])
local room = fibaro:getRoomNameByDeviceID(devices[i])
local battery = fibaro:get(devices[i], 'batteryLevel')
if tonumber(battery) > 100 then
debug( 'red', "ACHTUNG! " ..name.." ("..room..")/Batterie: "..battery.." % - Vermutlich leer!")
table.insert(mailMessage,name.." ("..room..")/Batterie: "..battery.." % - Vermutlich leer!")
elseif tonumber(battery) <= minBatteryLevel then
debug( 'red', "ACHTUNG! " ..name.." ("..room..")/Batterie: "..battery.." %")
table.insert(mailMessage,name.." ("..room..")/Batterie: "..battery.." %")
else
debug( 'green', name.." ("..room..")/Batterie: "..battery.." %")
end
end
for i = 1, #mailRecipient do sendMail(mailMessage, mailRecipient[i]) end
for i = 1, #notiRecipient do sendNoti(mailMessage, notiRecipient[i]) end

Feedback erwünscht

Die Kommentarfunktion wartet auf Deine Meinung. Gib mir Feedback, damit ich weiß ob die Szene nützlich oder verbesserungswürdig ist.

Posted in Strom and tagged .

33 Comments

  1. Hallo Bastian, ich habe diese Szene direkt einmal eingabeut. Soweit alles gut… Nur warum erhalte ich eine Meldung das bei manchen Geräten der Batteriestand bei 0% wäre? Die Batterien sind aber voll.
    Auszug:

    [DEBUG] 14:37:15: ACHTUNG! EG-Bewegung Treppe (Eingang)/Batterie: 0 %
    [DEBUG] 14:37:15: ACHTUNG! EG-Temp Treppe (Eingang)/Batterie: 0 %
    [DEBUG] 14:37:15: ACHTUNG! EG-Lux Treppe (Eingang)/Batterie: 0 %
    [DEBUG] 14:37:15: ACHTUNG! EG-Rauchmelder (Büro)/Batterie: 0 %
    [DEBUG] 14:37:15: ACHTUNG! Temperatur Sensor EG (Büro)/Batterie: 0 %
    [DEBUG] 14:37:15: ACHTUNG! Temperatur EG (Eingang)/Batterie: 0 %
    [DEBUG] 14:37:15: Hauseingang Türsenso (Eingang)/Batterie: 83 %
    [DEBUG] 14:37:15: Heizung-Eingang (Eingang)/Batterie: 76 %
    [DEBUG] 14:37:15: Waschküche Fenster (Waschküche)/Batterie: 84 %
    [DEBUG] 14:37:15: Alarmsirene (Eingang)/Batterie: 70 %
    [DEBUG] 14:37:15: Heizung Kinderzimmer (Kinderzimmer)/Batterie: 82 %
    [DEBUG] 14:37:15: Heizung WZ rechts (Wohnzimmer)/Batterie: 82 %
    [DEBUG] 14:37:15: Heizung WZ links (Wohnzimmer)/Batterie: 83 %
    [DEBUG] 14:37:15: Küchentheke (Küche)/Batterie: 100 %
    [DEBUG] 14:37:15: Wassersensor (Waschküche)/Batterie: 71 %
    [DEBUG] 14:37:15: Temp. Waschküche (Waschküche)/Batterie: 71 %
    [DEBUG] 14:37:15: ACHTUNG! Rauchmelder (Gästezimmer)/Batterie: 0 %
    [DEBUG] 14:37:15: ACHTUNG! Rauch-TempSensor (Gästezimmer)/Batterie: 0 %
    [DEBUG] 14:37:15: ACHTUNG! TempSensor (Gästezimmer)/Batterie: 0 %
    [DEBUG] 14:37:15: ACHTUNG! Rauchmelder (Kinderzimmer)/Batterie: 0 %
    [DEBUG] 14:37:15: ACHTUNG! Temp-Rauchmelder (Kinderzimmer)/Batterie: 0 %
    [DEBUG] 14:37:15: ACHTUNG! Temperatursensor (Kinderzimmer)/Batterie: 0 %
    [DEBUG] 14:37:15: EG-Bewegung Eingang (Eingang)/Batterie: 100 %
    [DEBUG] 14:37:15: Tp-Bewegung-Eingang (Eingang)/Batterie: 100 %
    [DEBUG] 14:37:15: LUX-Bewegung-Eingang (Eingang)/Batterie: 100 %
    ….. usw.

  2. Hallo Bastian,

    vielen Dank für Dein tolles Script. Läuft bei mir super.

    Habe aber noch folgende Zeilen eingefügt, da ich dachte 4 mal am Tag bei min Batteriestand eine Mail zu erhalten wäre übertrieben.

    local trigger = fibaro:getSourceTrigger()
    local varToD = fibaro:getGlobalValue(„TimeOfDay“)

    if (varToD == ‚Day‘ or (trigger[‚type‘] == ‚other‘)) then
    devices = fibaro:getDevicesId({interfaces ={„battery“}, visible = true, enabled = true})
    mailMessage = {}

    ….

    end

    Gruß
    ChrisBeat

    • Hallo Chris,
      danke für das Feedback. Ich hatte die TimeOfDay gewählt, weil sie die einzige Variable ist die bei mir automatisch und zyklisch aktualisiert wird. Natürlich kann jeder beliebige Trigger verwendet werden um die Szene zu starten. Sehr gute Ergänzug, vielen Dank.
      Gruß
      Bastian

    • Hi,

      aktuell erhalte ich auch 3 bis 5 Mails am Tag, sind mir auch zu viele.

      Ich würde gerne deine Zeilen einfügen, finde aber im Script selbst keine Werte die man durch deine „tauschen“ könnte.

      Wo genau müssten die Zeilen denn eingefügt werden, damit das Script sauber läuft?

      Grüße und Danke

      • Hallo Dom,

        ersetze Zeile 102 und 103 mit den folgenden:
        local trigger = fibaro:getSourceTrigger()
        local varToD = fibaro:getGlobalValue(„TimeOfDay“)

        if (varToD == 'Day' or (trigger['type'] == 'other')) then
        for i = 1, #mailRecipient do sendMail(mailMessage, mailRecipient[i]) end
        for i = 1, #notiRecipient do sendNoti(mailMessage, notiRecipient[i]) end
        end

        Du erhältst dann nur noch beim Wechsel der TimeOfDay Variable von „Morning“ zu „Day“ und beim manuellen Ausführen der Szene Benachrichtigungen.

        Gruß
        Bastian

  3. Hi,

    ich bin noch recht frisch im Fibaro Bereich. Ich erhalte beim Ausführen der Szene „Batteriecheck“ die Debug „Meldung Benachrichigungen sind deaktiviert. Abbruch!“

    Woran liegt das?

    Grüße
    Dom

    • Hi Dom,

      willkommen in der Fibaro Welt.
      Hast Du das virtuelle Device (VD) importiert? Dieses legt eine globale Variable an welche die Benachrichtigungen steuern. Weiterhin kannst Du im VD auswählen ob und wie Du benachrichtig werden möchtest.

      Gruß
      Bastian

  4. Hi,

    danke für die schnelle Antwort. Ja das VD wurde importiert. Die Variable BatterieMsg wurde mit den Werten 0,1,1 automatisch angelegt.

    Innerhalb des VD Batteriecheck kann ich den jeweiligen Status umstellen, Bsp. E-Mail aktiv oder inaktiv. Jedoch erhält z.B. der Superuser keine Mail, die Adresse ist aber beim Nutzer hinterlegt. Ich vermute mal das liegt an der nicht vollständig ausführbaren Szene.

    Muss ich die Empfänger noch irgendwo einfügen?

    • Hallo Dom,

      steht denn Global im VD auf active? Wenn nicht, werden gar keine Benachrichtigungen verschickt und würde das Verhalten bei Dir erklären.

      Gruß
      Bastian

  5. Danke, nun hats geklappt. Die Email geht an den Superuser, jedoch habe ich noch einen einfachen Benutzer angelegt, dieser erhält die Email aktuell noch nicht. Muss ich dafür etwas in der Szene ändern?

  6. Vielen lieben Dank. Jetzt versuche ich noch herauszufinden wo die ID’s für User und Geräte stehen, dann sollte alles klappen.

  7. Hi Basti,

    Batteriecheck läuft 1a, ich hoffe ich bekomme noch so einige deiner Szenen, VDs usw. dank deiner ausführlichen Beschreibungen auf meinem HC2 zum laufen. Vielen Dank dass du uns an deinem Wissen teilhaben lässt.

    Gruß
    Christian

  8. Hallo Bastian,
    Dein Schwellenwert für die Batteriekapazität ist 25%. Ist das der Wert, unterhalb dessen man erfahrungsgemäß die Batterie direkt ersetzen sollte? Oder ab welchem Ladezustand ersetzt Du üblicherweise Deine Batterien?
    Beste Grüße und vielen Dank für die Szene, Rüdiger

  9. Hallo, ich bekomme weder eine Mail noch ein Push aufs Handy. Aus anderen Scenen funktioniert es. Woran kann es liegen? Grüße

      • Ich nehme an ja, die Variable „BatterieMsg“ existiert und hat den Wert „1,1,1“.
        Im virtulellen Device steht alles auf „active“.

          • Nutürlich, die hab ich aus funktionierenden Scripten entnommen…
            110 für einem E-Mail Benutzer & 112 für Push auf mein iPhone, auch die 2 für E-Mail des „Admin“ klappt nicht.

          • Hallo Matze,

            ich habe mir die Szene noch einmal intensiv angeschaut. Mit den von Dir geschilderten Einstellungen funktioniert die Szene bei mir problemlos. Wenn Du noch Unterstützung brauchst, dann schicke mir bitte eine kurze E-Mail.

            Gruß
            Bastian

  10. Hallo Bastian, deine Seite ist eine richtige Bereicherung und sehr gut gemacht für Anfänger. Dafür ein herzliches Dankeschön.

    Ich habe mir auch das VD geladen und die Variable füllt sich mit 1,1,1. Wenn ich die Szene starte, werden mir mit dem Debug alle Sensoren mit dem jeweiligen Wert angezeigt. Aber auch ich bekomme keine Nachrichten gesendet. Nun habe ich nochmal User und Device geprüft. Mein SuperUser hat die „2“ und mein iOS hat die „14“ als ID.
    Als ID habe ich die Szenen-ID eingetragen. Muss ich noch den TCP Port eintragen?
    Ich hoffe ich habe alles oben richtig eingetragen. Muss denn alles in der {14} Klammer stehen, auch wenn ich nur an den Superuser senden will?
    Eventuell hast Du ja noch einen Tipp für mich.

    Gruß secundani

    • Zusatz:
      Ich habe meinen Fehler entdeckt, ich musste ja die Szenen ID als TCPPort eintragen. Wer lesen kann ist klar im Vorteil!!!!!

      Dann habe ich das minBatteryLevel mal auf 100 gesetzt und dann kam auch Mail und Push Nachricht.
      Ist es richtig, dass mir erst eine Nachricht geschickt wird, wenn die 25% erreicht bzw. unterschritten werden?

      Nochmals Danke
      Gruß secundani

      • Hallo secundani,

        über den Schwellwert in minBatteryLevel kannst Du definieren ab wann eine Benachrichtigung verschickt wird.

        Gruß
        Bastian

    • Hallo secundani,

      vielen Dank für die netten Worte.
      In der Benachrichtigungskonfiguration sind 2 unterschiedliche Variabeln zu pflegen mailRecipient und notiRecipient. Die ID 2 ist ein User der eine E-Mail empfangen kann. Dieser gehört in die Variable mailRecipient . Wenn Du eine Push-Benachrichtigung auf einem Mobilgerät haben möchtest muss dessen Id in die Variable notiRecipient.

      Gruß
      Bastian

  11. Hallo Bastian,

    „Asche über mein Haupt“, hatte angenommen das in jedem Fall eine Benachritigung kommt (beim auslösen über „Check Now“ bzw. manuellem Starten des Scripts) mit den tatsächlichen Werten oder -> „keine Module unter „minBatteryLevel“ erkannt.

    Hab zu test „minBatteryLevel“ höher angesetzt und siehe da, Push und Mail geht!!! Super!

    Aber vielleicht wäre das noch ein Ansatz zur „Verfeinerung“. Beim betätigen eines „Check Now IST BAT“ die IST Werte zu schicken und beim betätigen von „Check Now minBAT“ nur die unterhalb der Variable zu schicken. Vielleicht kann man noch im Label des Buttons den aktuell eingestellten „minBatteryLevel“ anzeigen. Dann wäre noch schick, wenn man auswählen kann welches von beiden täglich verschickt wird „Check Now IST BAT“ oder „Check Now minBAT“.

    Grüße Matze

  12. Hallo Bastian!

    Ich finde auch Deine Seite sehr sehr gut und übersichtlich! Vorallem für Einsteiger sehr wertvoll und eine echte Hilfe!

    Deine Battery-Check Szene habe ich bei meinem HC2 (4.180) eingebuat, funktioniert sehr gut.
    Was mir aufgefallen ist, dass bei einigen Devices (z.B. Motion Sensor) die Anzeige des Battery-Levels gleich mehrfach kommt. Ist auch klar, weil der Motion Sensor auch Temp. Sensor und Erschütterungs-Sensor ist.
    Ich benötige aber den Batt.Level nur einmal pro Node!
    Ich habe daher Dein Script erweitert:
    Ich lese bei jeder Device die Node_ID aus und vergleiche mit der letzten Device! Falls die Node_ID die gleiche ist, wird diese Device ignoriert!

    Hier die Modification:

    devices = fibaro:getDevicesId({interfaces ={„battery“}, visible = true, enabled = true})
    mailMessage = {}
    local Last_Node_ID = 0
    for i = 1, #devices do
    local name = fibaro:getName(devices[i])
    local room = fibaro:getRoomNameByDeviceID(devices[i])
    local battery = fibaro:get(devices[i], ‚batteryLevel‘)
    local Node_ID = tonumber(fibaro:getValue(tonumber(devices[i]), „nodeId“))

    if Node_ID ~= Last_Node_ID then

    if tonumber(battery) > 100 then
    debug( ‚red‘, „ACHTUNG! “ .. devid ..“ „..name..“ („..room..“)/Batterie: „..battery..“ % – Vermutlich leer!“)
    table.insert(mailMessage,name..“ („..room..“)/Batterie: „..battery..“ % – Vermutlich leer!“)
    elseif tonumber(battery) <= minBatteryLevel then
    –debug( 'red', "ACHTUNG! " ..devid .." "..name.." ("..room..")/Batterie: "..battery.." %")
    table.insert(mailMessage,name .." ("..room..")/Batterie: "..battery.." %")
    else
    — batterylevel ok!
    — debug( 'green', devid.." "..name.." ("..room..")/Batterie: "..battery.." %")
    –table.insert(mailMessage,devid.." "..name.." ("..room..")/Batterie: "..battery.." %")
    end
    lastid = devid
    end
    end

    Gruß und DANKE ,
    Klaus

    • Hallo Klaus,

      danke für die netten Worte. Ich freue mich, wenn ich weiterhelfen kann!

      Und danke auch für die gute Idee zur Verbesserung der Szene. Ich habe mir Deinen Code gerade mal angesehen.
      Entweder ich bin blind (durchaus möglich) oder da passt etwas nicht. Du setzt die Variable Last_Node_ID ausserhalb der Schleife auf 0 und veränderst diese im weiteren Verlauf nicht mehr. So bleibt diese immer 0 und die Bedingung Node_ID ~= Last_Node_ID trifft immer zu.

      Oder, wie gesagt, ich bin blind 😉

      Grüße
      Bastian

  13. Hallo, woher bekomme ich die ID des Benutzers welche ich für den Email Empfang eintragen muss? Ich stehe gerade auf dem Schlauch. Vielen Dank!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Ich akzeptiere