Batterieüberwachung

Wie ich bereits im ersten Artikel geschrieben hatte, sind einige Sensoren bzw. Schalfaktoren, die ich einsetze, Batterie betrieben. Das ist auch so weit in Ordnung, wie der Ladezustand O.K. ist. Wenn die Batterien aber im Laufe der Zeit nachlassen, landet die Information „nur“ im Systemlog der CCU und mal ehrlich, wer liest das schon regelmäßig? Wäre es im Rahmen der Hausautomatisierung nicht mehr als sinnvoll, wenn auch dieser Punkt einem Automatismus unterwerfen werden könnte? Er kann 🙂

Dazu habe ich ein Script angelegt, welches die batterie betriebenen Geräte regelmäßig überprüft und im Fall, dass eine Batterie nur noch einen niedrigen Ladezustand aufweist, das in einer Systemvariablen ablegt und mit gleichzeitig eine E-Mail schickt. Den Grund für die Systemvariable werde ich in einem späteren Blogeintrag erklären. Einzige Voraussetzung ist, dass das E-Mail Add-on entsprechend eingerichtet wurde.

Hier zunächst einmal das „Kochrezept“:

  1. Variable anlegen:
    In meinem Fall heißt die Variable „Batteriezustand“. Falls man das ändern möchte, ist de Zeile 2 im unten gezeigten Rodung entsprechend anzupassen. Hier landet dann entweder „O.K.“ drin oder aber die Aufforderung entsprechende Batterien auszutauschen.
    01 variable
  2. E-Mail Template anlegen:
    Das Template ist einfach gehalten, erfüllt aber den Zweck ;-). Falls ihr eine andere Templatenummer benutzt, ist das Coding unten mit dem „exec.System“ an die entsprechende Templatenummer anzupassen.
    02 email template
  3. E-Mail TCL script hinterlegen
    Das ist nötig, damit der Platzhalter in Form der gezeigten Variablen im E-Mail Template mit unserem Übergabeparameter gefügt wird.
    03 email tcl
  4. Gewerk „Batterie betrieben“ Anlegen
    Alle Geräte, die mit einer Batterie ausgestattet sind, werden durch die Zuordnung zu einem dedizierten Gewerk einfacher identifizierbar. Nur die Geräte, die diesem Gewerk angehören werden im folgenden Programm geprüft.
  5. Programm anlegen
    Bei mir wird täglich um neun Uhr getestet, ob alle Batterien in Ordnung sind. Das reicht dann im Zweifel auch noch, um bis zum Abend neue zu kaufen… 😉
    04 programm parameter
  6. …und mit Leben füllen:
    var myAssembly = dom.GetObject("Batterie betrieben");
    var valueString = dom.GetObject("Batteriezustand");
    string itemID;
    string text = "";
    integer counter = 0;
    foreach(itemID, myAssembly.EnumUsedIDs()) {
        var item = dom.GetObject(itemID);
        var device = dom.GetObject(item.Device());
        var interface = dom.GetObject(item.Interface());
        string interface_name = interface.Name();
        string device_address = device.Address();
        device_address = device_address.StrValueByIndex(":", 0);
        string channel_name = interface_name # "." # device_address # ":0.LOWBAT";
        var channel = dom.GetObject(channel_name);
        if ( (channel.State() == true) && (channel.Value() == true) ) {
            text = text # "- " # item.Name() # "\r\n";
            counter = counter + 1;
        }
    }
    
    if ( counter > 0 ) {
        string MailText;
        string sDate = system.Date("%d.%m.%Y");
        MailText = "Prüfung des Ladestandes der Batterien vom " # sDate # ".\r\n";
        MailText = MailText # "Der Ladezustand folgender Batterien ist niedrig: \r\n\r\n" # text;
        MailText = MailText # "\r\nBitte tauschen Sie die Batterien zeitnah aus.";
    
        string stdout;
        string stderr;
        system.Exec("/etc/config/addons/email/email 03 '"+MailText+"'",&stdout,&stderr);
        valueString.State(MailText);
    } else {
        valueString.State("O.K.");
    }

     

Fragen und Anregungen immer gerne per Kommentar :-).

Das könnte Dich auch interessieren …

43 Antworten

  1. GEissler sagt:

    Hi Yann,

    habe deine Anleitung ausprobiert und bin überrascht das ich sofort eine mail bekommen habe 🙂
    scheint also im Prinzip zu funktioneren… Hast du Langzeiterfahrungen damit? Hintergrund: Ich habe ein Programm was den Batteriestatus meines HM Wassersensors prüft und mir per prowl eine Nachricht schickt. Der sagt die Batterie ist leer, erscheint aber nicht in deinem Skript. Tatsächlich hatte ich die Batterien erst gewechselt….
    Danke Steffen

    • Yann sagt:

      Hi Steffen,
      bei mir funktioniert das Skript ganz gut. Allerdings ist es ein wenig trickreich geeignete Batterien zum Test zu haben, die schon schwach genug für die Mail aber noch stark genug für die Kommunikation sind.
      Gruß
      Yann

    • Börries sagt:

      Hi Yann,

      Bin Homematic-Neuling und nutze seit Kurzem u.A. 8 Fenster-/Türkontakte und 6 Bewegungsmelder als Alarmanlage. Die Batteriekontrolle ist deshalb super wichtig für mich.
      Die Lösung ist offensichtlich Dein Script.
      Leider kann ich den Text in den Abbildungen nicht lesen und wäre für etwas Hilfe sehr dankbar.
      1. Die Systemvariable „Batteriezustand“ habe ich als Zeichenkette deklariert. Ist das korrekt?
      2. Der Text des E-Mail Templates würde mir helfen (nur der untere Teil).
      Ansonsten bekomme ich das wohl hin.
      Vielen Dank.
      Gruß Börries

  2. dazuhabichnefrage sagt:

    2 Fragen zu der Thematik

    a.) Muss man bei den Geräten die Protokollierung eingeschaltet haben, damit das Skript die Inhalte auslesen kann, oder stehen die dem Skript auch zur Verfügung wenn die Geräte-Protokollierung ausgeschaltet bleibt.

    Ich habe hier mal 2 Beispiele bei Geräten MIT Protokollierung:
    (Geräte OHNE Protokollierung tauchen naturgemäß im Protokoll nicht auf)

    a1.) von einem Raumthermostat erhalte ich in der Protokollierung:

    Manu-Modus, Keine Fehlermeldung ‚LowBat‘, Keine Kommunikations-Fehlermeldung, Keine Fenster-Auf-Meldung, Batteriestatus 2.50V, Boost-Dauer 0min, Ist-Temperatur 21.10°C, Soll-Temperatur 19.00°C, stringTablePartyTemperature 5.00°C, stringTablePartyStartTime 0minutes, stringTablePartyStartDay 1day, stringTablePartyStartMonth 1month, stringTablePartyStartYear 0year, stringTablePartyStopTime 0minutes, stringTablePartyStopDay 1day, stringTablePartyStopMonth 1month, stringTablePartyStopYear 0year

    a2.) von einem Heizkörperthermostat erhalte ich in der Protokollierung:
    Manu-Modus, kein Fehler, Batteriestatus 2.60V, Ventilposition 0%, Boost-Dauer 0min, Ist-Temperatur 20.90°C, Soll-Temperatur 20.50°C, stringTablePartyTemperature 5.00°C, stringTablePartyStartTime 0minutes, stringTablePartyStartDay 1day, stringTablePartyStartMonth 1month, stringTablePartyStartYear 0year, stringTablePartyStopTime 0minutes, stringTablePartyStopDay 1day, stringTablePartyStopMonth 1month, stringTablePartyStopYear 0year

    b.) hat jemand Erfahrung ab welcher Spannung das „LOWBATT-Ereignis“ eintritt?
    2,5 Volt halte ich für zwei 1,5 Batterien schon für recht „niedrig“.
    Was steht denn DANN im Protokoll?

    Ist dann immer noch eine Spannung mit Wert angegeben, oder wird unterhalb von ??? einfach nur LOWBAT ausgegeben?

    Hat da jemand mal ne Meldung dazu parat?

  3. Sven sagt:

    Hallo,

    kann es sein, dass dieses Skript ebenfalls darauf basiert, dass die fraglichen Geräte in einem Gewerk „Batterie betrieben“ zusammengefasst werden? Dieser Teil fehlt in der Doku leider komplett O.o

  4. Marcus sagt:

    Hallo Yann,
    habe das Programm mal getestet, Zustand ok.
    nur die email, wird nicht versand.
    habe in mail 02 geändert, in meiner tcl steht schon sysvar abfrage aus mail 01.
    kann man die zusammenfügen ?

    • Yann sagt:

      Hallo Marcus, wenn ich Duch korrekt verstehe, willst Du ein bereits existierendes Mail Template benutzen, richtig? Dann muss nur in der entsprechen Code Stelle die Nummer entsprechend angepasst werden.

  5. Pierre sagt:

    Bei mir passiert leider nichts, hatte zuvor ein anderes Skript, welches auch über das email add on mails verschickt hat… nur Deins gefällt mir besser, weil ich dann sehen kann, wo genau die Batterien leer sind.
    Spontane Idee? Hab mich genau an die Anleitung gehalten

    • Yann sagt:

      Hallo Pierre, so ohne Anhaltspunkte ist das schwer zu lösen. Werden denn die Geräte alle getestet? Das lässt sich einfach ausgeben und testen.
      Ich selbst habe heute eine Mail zu einer leeren Batterie erhalten, d.h. das Script funktioniert grundsätzlich so, wie beschrieben.
      Wenn Du noch weitere Anhaltspunkte hast, kann ich gern weiterhelfen.

      • Pierre sagt:

        Es geht wohl doch. Habe die Ausführungszeit testweise auf jetzt gestellt und eine mail erhalten. Das skript generiert aber keine mail auf knopfdruck. die ausgabe bei „skript testen“ ergibt auch nichts – aber das muss dann wohl so sein ?! Scheint also zu klappen, Danke!

  6. Michael sagt:

    Hi Yann,

    vielen Dank für Dein Skript! Ich hab das eben mal in meine CCU2 gebastelt. Im Augenblick habe ich ein Heizkörperthermostat mit dem Zustand „Leere Batterie“ Das Skript meldet aber „O.K.“
    Ich meine mich zu erinnern, dass es vorher auch einen Meldungstyp gibt der irgendwie „Batterieladezustand gering“ oder so ähnlich lautet. Habe nur grade kein Gerät in diesem Zustand.

    Meine Frage: Bei welchem Zustand genau, meldet Dein Skript einen Fehler?
    Müsste es mein Gerät mit dem Zustand „Leere Batterie“ melden?

    Gruß & Dank
    Michael

  7. Michael sagt:

    Ich hab noch 0 Erfahrung mit dem Homematic Script. Hast du mal einen Tipp wie man das debuggen kann? Kann man das Skript irgendwie an einer CLI ausführen und mal an der ein oder anderen Stelle ein „write XY“ einbauen um mal zuschauen was überhaupt passiert?
    Wenn ich das richtig sehe, ist myAssembly eine Liste mit allen Geräten die dem Gewerk zugeordnet sind.
    Die gehst Du in einer Schleife alle durch „foreach(itemID, myAssembly.EnumUsedIDs())“ oder?

    Ich würde das Skript gerne mal irgendiwe starten und mir z.B. einfach mal eine Liste mit den Geräten in myAssambly aufzulisten..

  8. Walter sagt:

    Hallo,

    ich habe eine Frage zu den Gewerken. Welchen Kanal soll ich denn jeweils dem Gewerk „Batterie betrieben“ zuordnen. Ich habe aktuell Heizkörperthermostate und Wandthermostate die ich abfragen möchte. Oder ist es theoretisch egal welchen Kanal man nimmt, da das eigentliche Gerät auf jeden Fall gefunden wird sobald ein Kanal dem Gewerk zugeordnet ist? Wo hast du denn deinen genannten Blogeintrag mit der Erklärung für die verwendete Systemvariable ? Ich finde diesen nicht.

    Gruß Walter

  9. Martin Heben sagt:

    Hallo,
    ich würde das Script gerne als Puschover senden, also ohne das E-mail addon.
    Geht das? wie geht das ,was muss ich weglassen und was muss ich einfügen?
    Gruß Martin

  10. Thomas sagt:

    Hallo Yann,
    danke für die gute Idee und das tolle Skript.
    Ich hab mal alles installiert und es wird Status „OK“ angezeigt. Werde demnächst nochmal etwas testen und hoffe, daß dann auch leere Batterien erkannt werden.

    Gruß Thomas

  11. Sven S. sagt:

    Hallo Yann,
    ich habe keine Erfahrung mit der Programmierung, habe alles so eingegeben wie du es beschrieben hast.
    Aber irgendetwas gebe ich beim Tcl script falsch ein, wenn ich es prüfe kommt eine Fehlermeldung. Eingegeben habe ich folgendes: set batteriestatus [|index $argv 1]
    Der Fehler muss bei „|index“ liegen (habe auch schon ohne den Strich vor index versucht, auch Fehlermeldung).
    Gruß Sven S

    • Yann sagt:

      Hallo Sven,
      kann es sein, dass Du das „Pipe-Symbol“ verwendest? Das wäre falsch, denn das ist ein kleines „l“.
      Hier noch mal die komplette Zeile aus meinem TCL Script zum kopieren:

      set batteriestatus [lindex $argv 1]

      Ich hoffe, Dir damit weitergeholfen zu haben.

  12. Sven S. sagt:

    Hallo Yann,
    oh mann, klar habe ich das falsche Symbol eingetragen, funktioniert jetzt alles perfekt!
    Danke für Deine Hilfe!!!

  13. Tommi sagt:

    bei mir will es leider nicht klappen…
    Alles Schritt für Schritt wie beschrieben gemacht
    Die system.Exec Zeile habe die email auf 01 geändert
    Habe z.B. einen Heizungsaktor der eine Leere Batt. meldet
    Wenn ich im HQ Webgui schaue steht bei diesem Aktor in der Zeile ALARMDP auch true

    was komisch ist, ich habe in der Variablen obwohl ein Heizungsaktor Aktor HM-CC-RT-DN eine Leer Batt meldet immer „ok“ stehen wenn ich das Script manuell auslöse, ist das normal ?
    steht da immer ok ?
    Sollte da nicht true oder sonst was stehen ?
    Die Batt Geräte hab ich dem Gewerk „Batterie betrieben“ zugeordnet

    Das email Programm sonst sollte gehen, wenn Alarmanlage on ist und Bewegung erkannt wird, kommt ein email Versand

    • Yann sagt:

      Hallo Tommi, das Script spring an, sobald ein Aktor „Lowbat“ meldet. (Z.B. bei den Thermostaten das Symbol in der Anzeige leuchtet) Genau dann wird die Variable mit einem entsprechenden Text versehen und eine Mail verschickt.

  14. Arno sagt:

    Hallo,
    ich habe das Script auch laufen, HM-Sec-RHS und HM-LC-Sw4-Ba-PCB werden auch gemeldet, aber meine Heizungsaktor HM-CC-RT-DN meldet nichts. Die Servicemeldung sagt aber Leere Batterie.

  15. Rolf Herzhoff sagt:

    Hallo, Yann,
    bin dabei, das Script zu installieren, gibt es Erfahrung, ob es auch auf einem Raspi3 mit RaspberryMatik anstelle einer CCU läuft ?
    Danke
    Rolf

  16. Rolf Herzhoff sagt:

    Hallo, Yann,
    Danke für die schnelle Antwort. Habe es installiert und es läuft, aber mit Nebenwirkungen:
    – Systemprotokoll wird in der Anzeige „Systemprotokoll“ gelöscht, läßt sich aber über „Export“ auslesen
    – wenn ich „Status und Bedienung“ –> „Geräte“ in der WebUi aufrufe und ein Gerät z.B. Steckdose einschalte durch drücken auf „EIN“ schaltet sich die Steckdose brav ein aber der Button in der Anzeige wechselt nicht auf „EIN“. Erst durch schließen und Neuaufruf von „Geräte“ ändert sich der Status auf „Eine“

    Was könnte die Ursache sein ?

  17. Rolf Herzhoff sagt:

    Hallo,Yann, Danke für die Antwort, habe die SD für den Raspi3 nochmal neu angelegt und jetzt geht es. Nur das Systemprotokoll hat so seine Eigenheiten, die hatte ich aber auch schon vorher. Problem wird auch im Forum besprochen, auch der Hersteller iQ-3 scheint keine Lösung zu haben. Zum Glück kann man ja das Systemprotokoll exportieren.
    YAHM nutze ich nicht.
    Gruß
    RolfB3

  18. Hi,

    falls jemand Homematic IP Geräte mit einer CCU verwendet, dort scheint unter Umständen LOW_BAT statt LOWBAT verwendet zu werden, jedenfalls konnte ich den Datenpunkt mit folgendem Skript herausfinden (auf Kanal 0):

    https://haustech.wordpress.com/2016/03/29/datenpunkte-eines-geraetes-z-b-fht80b-unter-webui-auslesen/

    Grüße
    Stefan

    • Yann sagt:

      Danke für die Info. Habe (noch) keine IP Geräte.

    • Oliver sagt:

      Hi, danke für Dein Einsatz mit diesem Script. Es ist in der Funktion super, allerdings habe ich meine Probleme damit wenn es um Mail oder SMS geht.
      Ich komme mit der Angabe [|index $argv 1] nicht zurecht. Wozu wird diese Eingabe benötigt, bzw. wo wird argv 1 abgefragt/gesetzt?
      Wenn ich die Ausgabe von MailText in WriteLine setzte, bekomme ich eine Anzeige. Wie wird diese Info für ein MailAddon gesetzt?
      z.B. dom.GetObject(„CUxD.CUX2801001:1.CMD_EXEC“).State(„/etc/config/addons/email/email 13“); -wo und wie bringe ich „MailText“ unter?
      (Ich vermeide System.Exec und verwende CuxD)

      Aber nochmal danke für Deine Unterstützung und das Script. Ich bin noch nicht so sicher in den Scripten.

      Grüße
      Oliver

Schreibe einen Kommentar

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