YESLY Smart Home

Kleine LUA Scripte Teil 1: Batterie-Check

Geschrieben von boomx
siio-App

Von Zeit zu Zeit werden wir euch in dieser neuen Serie ein paar kleine, nützliche  LUA-Skripte zeigen. Hier erfahrt Ihr mehr.

In der ersten Folge der neuen Serie stellen wir euch ein kleines Skript vor, mit welchem Ihr den Status aller batteriebetriebenen Geräte prüfen könnt. Das Skript zeigt euch an, ob der Batterie-Status noch in Ordnung ist, oder ob Ihr darüber nachdenken solltet, die Batterien vielleicht in der nächsten Zeit auszutauschen. Die unterschiedlichen Status werden in Grün (Batterie in Ordnung) und in Rot (Batterie unter 25% Kapazität) aufgelistet. Auf dem folgenden Bild könnt Ihr das veranschaulicht erkennen:

battery_check

Unter einem bestimmten Batterie-Wert (25 %) wird der Debug in Rot dargestellt

Das LUA Skript

Das LUA Skript prüft alle Geräte, welche Ihr auf eurem Fibaro HomeCenter 2 eingerichtet – und einem Raum zugeordnet habt in einer Schleife und erkennt, ob es sich um ein batteriebetriebenes Gerät handelt. Damit zum Beispiel bei einem MotionSensor nicht noch die LUX und Temperatur extra angezeigt werden, erfolgt noch eine Prüfung um welche Modulart es sich handelt. Unterstützt werden derzeit folgende device-Typen:
  • com.fibaro.remoteSwitch (z.B. Wall-C)
  • com.fibaro.doorLock (z.B. RFID-Sensor, danalock)
  • com.fibaro.FGMS001 (MotionSensor)
  • com.fibaro.windowSensor (Doorsensor)
  • com.fibaro.doorSensor (Doorsensor)
  • com.fibaro.binarySwitch (z.B. Batteriebetriebene Sirene)
  • com.fibaro.FGSS001 (SmokeSensor v1 & v2)
  • com.fibaro.FGFS101 (FloodSensor)

Sollten euch beim Test noch weitere device-Typen auffallen, welche nicht durch das oben gezeigte Skript abgedeckt sind, dann schaut doch bitte in der API nach dem device-Type. Dies könnt Ihr über die URL http://IP-HC2/api/devices?=ID_des_devices. Hier sucht Ihr dann nach der ID, welche nicht im Skript auftaucht. In der darauf erscheinenden Ansicht, kopiert euch bitte den Reiter „type

battery_check_neuerType

 

Stellt uns diesen bitte in den Kommentaren zur Verfügung, dann können wir das Skript immer weiter updaten. Vielen Dank für eure Mithilfe und nun viel Spass mit dem Skript :)

Diesen Blogpost hat geschrieben ...

boomx

40 Kommentare

  • Gute Idee. Gefällt mir gut.

    In welchem Zeitraum werden denn die Batteriestände der Devices ausgelesen?
    Unterscheidet sich der WALL-C vom WALL-S?

    Hab noch eine POPP Aussensirene, die ist ja nicht aufgeführt oder ist das der binäre Switch?

    Werde es testen und Feedback geben sobald ich Zeit hab.

    TOP UND DANKE
    gringo

    • Hi gringo :)

      Die Szene ist bisher so eingerichtet, dass sie nur beim manuellen Ausführen startet. Man könnte natürlich weitergehen, die Werte in globale Variablen und sich ein VD erstellen, in der dann die Batteriestati aufgeführt sind. Wäre eigentlich ne coole Idee.

      Denke nicht, dass sich der Wall-C vom Wall-S unterscheidet, diese dürften beide unter remoteSwitch laufen. Die POPP Aussensirene sollte über den binarySwitch geprüft werden, sofern diese einen Status batteryLevel besitzt.

      Gruß

      • Hi Boomx,
        die Sirene besitzt ein Batterie Level. Werde Bescheid geben ob sie aufgeführt wird.
        Ich fänds cool, wenn das Script einmal die Woche oder einmal im Monat den Status der Batterien prüft und ausgibt.
        Sollte eine oder mehrere Batterien unter die 25% gelangen, könnte man sich noch benachrichtigen lassen. Obwohl, man bekommt ja eine Mail ist die Batterie leer.

        Grüße
        Gringo

  • Die Popp Sirene wird angezeigt. TOP.
    Wie bekomme ich es denn hin, das mir die Batteriezustände in der iPhone/iPad App angezeigt werden?

    Grüße
    Gringo

    • Hallo,
      dazu müsstest du dir ein virtuelles modul erstellen in dem du dann eben die stände abfragst, in diverse variablen schreibst und dir dann anzeigen lässt, wird aber je nach anzahl der module die du hast wohl nicht ganz einfach. bin grad dabei an sowas zu basteln. ob ichs so hinbekomm wie ich mir denke bin ich noch nicht ganz sicher.
      Grüsse

      • Hi,

        leider scheint die Szene so nicht 1zu1 in einem VD zu funktionieren. Und mit Szenen kann man sich leider keine Variablene automatisch erstellen lassen. Das heißt, du musst dir für jedes Modul eine Variable erstellen.

        Gruß

  • Ich habe einen Fenstersensor der mir schon seit langer Zeit eine leere Batterie anzeigt aber ohne Probleme läuft.
    Da bekomme ich im Script folgende Meldung zu:
    [DEBUG] 09:52:40: Dachfenster rechts (Dach)/Batterie: 255 %
    Irgendeine Idee warum?

  • Hallo,
    echt klasse Idee, hab die Szene ein wenig Verfeinert.
    – Danfoss Thermostate integriert
    – Szene wird bei mir einmal am Tag über die Tageszeitvariable (Morgen) ausgeführt
    – Bei niedrigem Batteriestand geht dann noch eine Push an mein Handy
    – Mehrfaches Auslösen der Szene wird abgefangen

    Trigger und Variable für Handy müssen natürlich dann jeweils angepasst werden.

    Hier die veränderte Szene:

    ——————————————————————————————————————————————————————————

    –[[
    %% properties

    %% globals
    Tageszeit
    –]]

    local scene = 295 — ID dieser Szene

    local htc = 17 — ID Handy (HTC)
    ———————————————————————————-
    fibaro:debug(„Start – Module Batteriecheck“)
    if (fibaro:countScenes()>1) then
    fibaro:debug(„stop scene“);
    fibaro:abort();
    end
    ———————————————————————————-

    if (fibaro:getGlobalValue(„Tageszeit“) == „Morgen“) then

    local minBatteryLevel = 25
    local maxID = 500

    Debug = function ( color, message )
    fibaro:debug(string.format(‚%s‘, „span“, color, message, „span“))
    end

    for id = 1, maxID do
    local batteryLevel = fibaro:get(id, ‚batteryLevel‘)
    if batteryLevel ~= nil
    then
    local name = fibaro:getName(id)
    local room = fibaro:getRoomNameByDeviceID(id)
    if not(room == „unassigned“) then
    local deviceType = fibaro:getType(id)
    if (deviceType == ‚com.fibaro.FGFS101‘ or deviceType == ‚com.fibaro.remoteSwitch‘ or deviceType == ‚com.fibaro.doorLock‘ or deviceType == ‚com.fibaro.FGMS001‘ or deviceType == ‚com.fibaro.windowSensor‘ or deviceType == ‚com.fibaro.doorSensor‘ or deviceType == ‚com.fibaro.binarySwitch‘ or deviceType == ‚com.fibaro.FGSS001‘ or deviceType == ‚com.fibaro.thermostatDanfoss‘) then
    if tonumber(batteryLevel) <= minBatteryLevel then
    Debug( 'red', "ACHTUNG! " ..name.." ("..room..")/Batterie: "..batteryLevel.." %")
    fibaro:call(htc, "sendPush", "!!! "..name.." ("..room..")/Batterie: "..batteryLevel.." %")
    else
    Debug( 'green', name.." ("..room..")/Batterie: "..batteryLevel.." %")
    end
    end
    end
    end
    end

    end
    ———————————————————————————-
    fibaro:debug("Ende – Module Batteriecheck");
    fibaro:killScenes(scene);

    ——————————————————————————————————————————————————————————

    Viel spass und Danke

  • Morgen,
    ich hab ein kleines Porblem mit dem Batteriescript von siio. Vor kurzem hab ich ein neuen Motionsensor (FGMS001 Motion Sensor 3.2) im Kinderzimmer angelernt. Das Batteriescript erkennt diesen aber nicht. Der Sensor im Flur (FGMS001 Motion Sensor EU / Version 2.7) funktioniert ohne Probleme. Ist dort irgendwas anderes?
    Der Raum ist zugeordnet und bennant. In einem Virtuellen Device, was ich aus dem netzt habe wird er auch nicht erkannt? Jemand ne Idee?
    Gruß

  • Hallo zusammen,

    ich habe dazu mal 2 Fragen.

    1. Ist es normal das nach ca 4 Monaten alle batteriebetriebenen Geräte noch einen Status von 100% melden?
    2. Ich habe 2 neue Rauchsensoren gekauft und diese hinzugefügt.
    Eine Meldung erhalte ich auch per Mail.
    Alleridings mit einem Batteriestatus von 0%.
    Mache ich heir was falsch? (Aufgeweckt habe ich die Geräte schon mehrmals)

    Danke für eure Unterstützung.

    Viele Grüße
    TomB.

    • Hi,

      seit einer der neusten Firmware-Version ist das Handling der Batterielevel unglaublich schlecht. Laut API sind bei mir alle Batterien der Rauchmelder leer. Auf der Weboberfläche sind alle noch voll. Hoffentlich wird das mit der nächsten Version wieder besser.

      Gruß

      • Eigenartig, einige werden normal angezeigt aber andere mit 0 % obwohl sie voll sind und funktionieren

        [DEBUG] 07:24:07: ACHTUNG! Rauchmelder (Esszimmer)/Batterie: 0 %
        [DEBUG] 07:24:07: ACHTUNG! Rauchmelder (Wohnzimmer)/Batterie: 0 %
        [DEBUG] 07:24:07: Rauchmelder (Flur unten)/Batterie: 100 %
        [DEBUG] 07:24:07: ACHTUNG! Rauchmelder (Kinderzimmer Alissa)/Batterie: 0 %
        [DEBUG] 07:24:07: ACHTUNG! Rauchmelder (Schlafzimmer)/Batterie: 0 %
        [DEBUG] 07:24:07: ACHTUNG! Rauchmelder (Kinderzimmer Samira)/Batterie: 0 %
        [DEBUG] 07:24:07: Rauchmelder (Flur oben)/Batterie: 100 %

  • Hallo,

    habe das Script bei mir seit einigen Wochen im Einsatz. Bei meinen Fibaro Motions sind die Angaben aber nicht korrekt. Folgendes fällt mir auf:
    – Alle meine 5 MS werden mit Batteriestatus 0% angezeigt
    – Wenn ich eine Batterie wechsele ändert sich der Status trotzdem nicht

    Bei allen anderen Komponenten scheint das Script tadellos zu funktionieren.
    Hat jemand eine Idee?

    Grüße
    Arno

  • Hallo boomx, kann man hier auch außer der Debugmeldung eine einzige EMail Nachricht über den Zustand der jeweilligen Batteriestände zukommen lassen?

    Ich habe dies in das bestehende Skript eingefügt bekomme aber 20 EMails, da ich ja 20 Sensoren überwache. Geht diese Information aller 20 Sensoren auch in einer einzigen EMail?
    Komme nicht drauf, wie man dies einfügt.
    fibaro:call(4, „sendEmail“, ‚green‘, name..“ („..room..“)/Batterie: „..batteryLevel..“ %“)

    • Hi,

      mit LUA geht eigentlich alles ;) Du kannst die Batteriemeldungen in eine lokale Variable schreiben, immer am Ende mit einem Zeilenumbruch. Am Ende des Skriptes schickst du dir dann einmalig eine Mail mit dem Inhalt der Variablen.

      Gruß

  • http://www.controlliving.nl/fibaro-weekly-battery-e-mail/

    Das habe ich gefunden kannst du das Skript nicht Anpassen, weil in der E-Mailausgabe
    steht immer nur folgendes:

    –Weekly summary–

    -Battery Status-
    Low Battery:
    Bat level: 85% Device: Bewegungssensor[43]
    Bat level: 85% Device: Temperatursensor[44]

    bei deiner Version steht sofort welchers Gerät das ist

    [DEBUG] 17:45:33: Bewegungssensor (Küche)/Batterie: 100 %
    [DEBUG] 17:45:34: Bewegungssensor (Flur)/Batterie: 85 %
    [DEBUG] 17:45:34: Bewegungssensor (Schlafzimmer)/Batterie: 100 %
    [DEBUG] 17:45:34: Bewegungssensor (Büro)/Batterie: 100 %
    [DEBUG] 17:45:34: Thermo Büro (Büro)/Batterie: 60 %
    [DEBUG] 17:45:34: Thermostat (Schlafzimmer)/Batterie: 44 %
    [DEBUG] 17:45:34: Thermostat (Bad)/Batterie: 41 %
    [DEBUG] 17:45:34: Thermostat (Kinderzimmer)/Batterie: 58 %
    [DEBUG] 17:45:34: Bewegungssensor (Bad)/Batterie: 100 %
    [DEBUG] 17:45:34: Bewegungssensor (Wohnzimmer)/Batterie: 100 %
    [DEBUG] 17:45:35: ACHTUNG! Bewegungssensor (Kinderzimmer)/Batterie: 0 %

    Nur eine ID Angezeigt zu bekommen ist nicht der HIT.

    Das wäre meiner meinung alltagstauglich, man würde jede Woche eine Mail bekommen wo drin steht wie der Batterystatus ist.
    Man brauch auch nicht extra an den PC. Und man bekommt die Information für alle Batterygeräte in einer Mail.

  • Kann es sein dass das Script nicht mehr läuft? Ich bekomme eine Fehlermeldung in Zeile 22 „attempt to compare nil with number“ Das Script versucht Zahlen zu vergleichen, kann es aber wohl nicht.

  • Ich habe die Device-Liste komplett rausgenommen und einfach die Nicht-Batterie-Module rausgefischt, um einen Fehler im Script zu vermeiden. Dann kann man jegliches Modul abfragen, ohne die Liste neu zu schreiben: Das nicht verwendete Device erscheint mit dem Devicenamen in blauer Schrift. So hat man den Überblick, was aussortiert wurde.

    local minBatteryLevel = 25
    local maxID = 1000

    Debug = function ( color, message )
    fibaro:debug(string.format('%s', "span", color, message, "span"))
    end

    for id = 1, maxID do
    local batteryLevel = fibaro:get(id, 'batteryLevel')
    if batteryLevel ~= nil
    then
    local name = fibaro:getName(id)
    local room = fibaro:getRoomNameByDeviceID(id)
    if not(room == "unassigned") then
    local deviceType = fibaro:getType(id)
    if (deviceType == 'com.fibaro.FGWP101') then
    print("Das nachfolgende Device ist kein Batteriegerät!")
    Debug ('blue',deviceType)
    else
    if tonumber(batteryLevel) <= minBatteryLevel then
    Debug( 'red', "ACHTUNG! " ..name.." ("..room..")/Batterie: "..batteryLevel.." %")
    else
    Debug( 'green', name.." ("..room..")/Batterie: "..batteryLevel.." %")
    end
    end
    end
    end
    end
    print("Alle Geräte wurden erfasst. Ende der Funktion.")

    • [DEBUG] 16:57:55: span
      [DEBUG] 16:57:55: span
      [DEBUG] 16:57:55: span
      [DEBUG] 16:57:55: span
      [DEBUG] 16:57:55: span
      [DEBUG] 16:57:55: span
      [DEBUG] 16:57:56: line 20: attempt to compare nil with number

      is the result

  • Hallo,

    da bei den meisten Geräten fast nur „com.fibaro.zwaveDevice“ angegeben wird, habe ich nur folgende Typen verwendet:
    com.fibaro.remoteController
    com.fibaro.thermostatDanfoss
    com.fibaro.temperatureSensor

    Skript funktioniert im Grunde gut, bis auf folgende Ausgabe am Ende:
    [DEBUG] 04:10:31: line 22: attempt to compare nil with number

    Dies wird aber sicherlich daran liegen, dass der Aeon MultiSensor 6 beim Temperatursensor leider kein batteryLevel Eintrag besitzt.
    Alle anderen Geräte werden korrekt ausgegeben (Fibaro Motion Sensor, Fibaro CO2 Sensor, Danfoss Stellglied, Danfoss LC-13).
    Das Gerät Remotec Szenen Master wird auch nicht ausgegeben, wird aber sicherlich daran liegen, dass dem Aeon MultiSensor 6 die Eigenschaft/Variable batteryLevel fehlt und somit das Skript abbricht.

    Könnte man dies umgehen, indem das Skript bei Fehler weiter läuft?

Gib deinen Senf dazu!