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);
        if (interface_name=="BidCos-RF"){
           string channel_name = interface_name # "." # device_address # ":0.LOWBAT";
        } else {
           string channel_name = interface_name # "." # device_address # ":0.LOW_BAT";
        }
        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 …

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

    • Yann sagt:

      Hi Arno, ich habe diese Komponente leider nicht, kann sie daher auch nicht testen. Gibt es daran ggfs. LOWBAT nicht oder an einer anderen Struktur?

    • Frank sagt:

      Hallo,
      ich hatte das gleiche Problem. Es wurden keine „Nicht HMIP“ Geräte angezeigt.
      Testen kannst Du das z.B., wenn Du im Script channel_state und channel_value temporär von true auf false anpasst.
      Die Lösung liegt in der foreach-Schleife. Dort anstatt EnumUsedIDs einfach EnumIDs reinschreiben.
      Bei mir hat das funktioniert.
      Vielen Dank noch mal an Yann für das tolle Skript!!!
      VG Frank

  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

      • Yann sagt:

        Hallo Oliver,
        das ist ein kleines L und kein Pipe. ;-)
        Damit wird die Variable entsprechend auf den ersten Wert der übergebenen Argumente gesetzt.
        Gruß
        Yann

  19. Jürgen Gläser sagt:

    Hallo ich bin neu hier und bin Anfänger.
    Meine Frage ist wo schreibe ich die Script hin?

  20. Udo sagt:

    Hallo Yann,
    bin leider blutiger Anfänger und tue mich deshalb schwer, das Script zu interpretieren, deshalb meine Frage. Habe eigentlich alles wie von dir vorgegeben gemacht. Bekomme aber leider keine Mail. Kann es sein, dass nur eine Mail generiert wird, wenn auch tatsächlich eine Batterie zu schwach ist? Meine Geräte sind nämlich recht neu und die Batterien deshalb voll.
    Und ist die Frage mittlerweile geklärt, ob ich bei meinen Homematic IP-Geräten LOWBAT oder LOW_BAT eingeben muss?
    Danke dür deine Antwort.

  21. Martin sagt:

    Hallo Yann,
    vielen Dank für das tolle Skript – der Mailversand klappt einwandfrei, aber die Darstellung auf der Startseite der CCU3 ist nur für 1s gut (Zeilenumbrüche stimmt), dann kommt irgendein Refresh und der Test ist zerwürfelt, da die Zeilenumbrüche nicht mehr als solche funktionieren, sondern als dargestellt werden. Ich kann das mit jedem Klick auf den Reload-Button des Browser reproduzieren (IE, Edge, FF, Chrome)

    Ich kann Dir gerne zwei Screeshots schicken.

    Kannst Du Dir vorstellen, woran das liegt?

    Danke,

    Martin

  22. Norman sagt:

    Danke das du dem Krempel mit uns teilst! Lief auf anhieb und nun wundere ich mich vielleicht nicht mehr wenn du Bude kalt ist, da meine Thermostate stromlos sind. Dickes MERCI!

    Gruß
    Norman

  23. Andreas sagt:

    Hallo,

    ich bekomme zwar die E-Mail aber ohne Inhalt.
    Habe alles so wie in der Anleitung gemacht.
    Wo konnte der Fehler liegen ?

  24. Oppi sagt:

    valueString.State(„O.K. “ #system.Date(„%d.%m.%Y“)# “ “ #system.Date(„%H:%M Uhr“));
    In der letzten Zeile eingeben, um zu erkennen, wann die letzte erfolgreiche Prüfung stattfand.

    • Andreas sagt:

      Hallo Oppi,
      vielen Dank für den Tipp.
      Bekomme aber wenn ich die Zeile einfüge folgende Meldung wenn ich auf Fehlerprüfung klicke

      Error 1 at row 33 col 35 near ^„O.K. “ #system.Date(„%d.%m.%Y“)# “ “ #system.Date(„%H:%M

      • Yann sagt:

        Das kann auch an den „falschen“ Anführungszeichen liegen. das ^â deutet das zumindest an. „“ sind die richtigen. Kann sein, dass das mancher Editor ersetzt mit typografisch richtigen „unten“ und „oben“ ;-)

  25. Andreas sagt:

    Hallo Yann,

    ganz tolles Script.Ich habe alles so gemacht wie hier beschrieben .Die Variable selber wird befüllt. Ich bekomme auch die E-Mail, nur leider ohne Inhalt.
    Ich finde einfach den Fehler nicht. Kannst du mir bitte einen Tipp geben ?
    Vielen Dank.

    Andreas

    • Yann sagt:

      Hast Du die E-Mail Konfiguration auch so gemacht, wie angegeben? Richtige Nummer? Variablen im Default übergeben?

    • Andreas sagt:

      Hallo Yann,
      was meinst du mit Variablen im Default übergeben?
      Ich bin genau nach deiner Anleitung vorgegangen, hab auch alles so benannt wie du. Hab jetzt alles nochmal überprüft.
      Wie gesagt, die Variable „Batteriezustand“ wird befüllt, die E-Mail versendet nur ohne Inhalt.
      Was bewirkt der Eintrag set batteriestatus [lindex $argv1] bei TCL ?

  26. Vanessa sagt:

    Hallo Yann,
    ich habe E-Mail Versand eingerichtet, Testmails kommen auch an. Allerdings wird bei mir die Systemvariable „Batteriezustand“ gar nicht erst gefüllt. Ich habe alles 3x kontrolliert, gelöscht, neu angelegt… es geht nicht. Die Systemvariable bleibt leer.
    -> Systemvariable heißt „Batteriezustand“
    -> Gewerk heißt „Batterie betrieben“
    -> Programm heißt „Batterietest“
    Inhalt ist Copy/Paste von dieser Seite, nur die Zahl des e-Mail Templates habe ich von 03 auf 01 geändert.
    Kein Inhalt in der Variable… Wie gehe ich am Besten als Skript-Noob vor bei der Fehlersuche?
    Tausend Dank für Deine Arbeit!
    Viele Grüße,
    Vanessa

    • Yann sagt:

      Hallo Vanessa,
      die Namen von Variable und Gewerk sind passend zu dem Code, richtig?
      Demnach müsste zumindest ein „O.K.“ drin stehen. Ausgeführt hast du das Programm sicherlich auch oder?
      Die Zahl des Templates ist irrelevant. Wichtig ist da nur, dass die Einstellung für TCL übernommen wird.
      Gruß
      Yann

      • Vanessa sagt:

        Ja, habe das Skript wie gesagt 1:1 kopiert.

        var myAssembly = dom.GetObject(„Batterie betrieben“);
        var valueString = dom.GetObject(„Batteriezustand“);

        Bei Status der Systemvariablen steht:
        Batteriezustand Resultat des Programms 22.03.2021 09:05:00 -> Status ist aber leer. Auch kein Wert ersichtlich. Vermutlich, weil’s ein Objekt ist, oder?

        tcl-Skript im E-Mail-Teil ist set batteriestatus [lindex $argv 1] -> Test sagt tcl-Skript ist okay.

        Ich habe nur die Befürchtung, dass schon in der Systemvariable nichts rein geschrieben wird. Sie bleibt einfach leer.

        • Yann sagt:

          Hallo Vanessa,
          Du hast Recht gehabt, das Script lief nicht mehr. Offensichtlich gibt es nur bei den RF (klassischen) HM Geräten den Zustand „LOWBAT“. Bei den IP Geräten, die hatte ich damals (noch) nicht, hat sich das geändert zu „LOW_BAT“…
          Ich habe das Script aktualisiert und nun läuft es auch (wieder) bei mir ;-).

  27. Wolle sagt:

    Hallo Yann,

    tolle Idee mit dem Skript. Um sicher zu sein, dass tut würde ich es gerne vorher testen. Gibt es denn einen BattFull Zustand oder ähnliches für einen Probelauf nur um sicher zu sein, dass es auch tut?

    Gruß Wolle

    • Yann sagt:

      Man kann die writeline Zeilen einkommentieren und das ganze im Dialog ausführen.

      • Wolle sagt:

        Danke für die Rückmeldung. Gibt es noch ein anderes Skript? Ich sehe nichts was kommentiert wäre…

        • Yann sagt:

          Hi Wolle,
          ja, die Ausgaben hatte ich erst nachträglich ein gepflegt. Auch hat sich inzwischen bei mir die Email und einige Details zu oben verändert. Dennoch anbei meine aktuelle Version:
          object myAssembly = dom.GetObject(„Battery“);
          object valueString = dom.GetObject(„VAR_Batteriezustand“);
          string itemID;
          string subject = „Batterie-Monitoring“;
          string text = „“;
          integer counter = 0;
          object item;
          object device;
          object interface;
          string interface_name;
          string device_address;
          string channel_name;
          object channel;
          foreach(itemID, myAssembly.EnumUsedIDs()) {
          item = dom.GetObject(itemID);
          device = dom.GetObject(item.Device());
          WriteLine( „device: “ + device.Name());
          interface = dom.GetObject(item.Interface());
          interface_name = interface.Name();
          device_address = device.Address();
          device_address = device_address.StrValueByIndex(„:“, 0);
          if (interface_name==“BidCos-RF“){
          channel_name = interface_name # „.“ # device_address # „:0.LOWBAT“;
          } else {
          channel_name = interface_name # „.“ # device_address # „:0.LOW_BAT“;
          }
          WriteLine( “ “ + channel_name);
          channel = dom.GetObject(channel_name);

          if ( (channel.State()==true) && (channel.Value()==true) ) {
          WriteLine( “ –> Tauschen“);
          text = text # „- “ # item.Name() # „\r\n“;
          counter = counter + 1;
          }
          }
          if ( counter > 0 ) {
          string MailText;
          string sDate = system.Date(„%d.%m.%Y“);
          string stdout;
          string stderr;
          system.Exec(„/etc/config/addons/email/email 02 ‚“+subject+“‚ ‚“+MailText+“‚“,&stdout,&stderr);
          valueString.State(MailText);
          } else {
          valueString.State(„O.K.“);
          }
          WriteLine(valueString.Value());

  28. Hi Yann,

    ich bin ganz neu im „Homematic – Business“ und daher ein wenig aufgeschmissen was Fehlersuche angeht. Ich hätte da mal eine Frage zu deinem Skript:

    Ich habe es so angepasst (ich denke es sollte funktionieren), das es auch eine Mail schick wenn alles ok ist, leider funktioniert es in weder deiner orig. Version noch in meiner… Meine Anmerkungen/Fragen per # Im Skript einmal aufgeführt. Eventuell kannst du mir ja helfen, das wäre super!

    #set batteriestatus[lindex $argv1] als TCL angelegt, generell funktioniert der Versand bei anderen Mails auch.
    #
    #Mailvorlage:
    #
    #Dies ist eine Fehlermeldung der CCU 3:
    #
    #$batteriestatus
    #
    #Klicken Sie hier, um die WebUI aufzurufen.
    #Gruß,HomeMatic
    #

    object myAssembly = dom.GetObject(„Batterie betrieben“); #Gewerk ist angelegt
    object valueString = dom.GetObject(„Batteriezustand“); #Var als Zeichenkette angelegt
    string itemID;
    string subject = „Batterie-Monitoring“;
    string text = „“;
    integer counter = 0;
    object item;
    object device;
    object interface;
    string interface_name;
    string device_address;
    string channel_name;
    object channel;
    foreach(itemID, myAssembly.EnumUsedIDs()) {
    item = dom.GetObject(itemID);
    device = dom.GetObject(item.Device());
    WriteLine( „device: “ + device.Name());
    interface = dom.GetObject(item.Interface());
    interface_name = interface.Name();
    device_address = device.Address();
    device_address = device_address.StrValueByIndex(„:“, 0);
    channel_name = interface_name # „.“ # device_address # „:0.LOW_BAT“;
    WriteLine( “ “ + channel_name);
    channel = dom.GetObject(channel_name);

    if ( (channel.State()==true) && (channel.Value()==true) ) {
    WriteLine( “ –> Tauschen“);
    text = text # „- “ # item.Name() # „\r\n“;
    counter = counter + 1;
    } else {
    WriteLine( “ –> OK“);
    text = text # „- “ # item.Name() # „\r\n“;
    counter = counter + 1;
    }
    }
    if ( counter > 0 ) {
    string MailText;
    string sDate = system.Date(„%d.%m.%Y“);
    string stdout;
    string stderr;
    system.Exec(„/etc/config/addons/email/email 03 ‚“+subject+“‚ ‚“+MailText+“‚“,&stdout,&stderr);
    valueString.State(MailText);
    } else {
    string MailText;
    string sDate = system.Date(„%d.%m.%Y“);
    string stdout;
    string stderr;
    system.Exec(„/etc/config/addons/email/email 03 ‚“+subject+“‚ ‚“+MailText+“‚“,&stdout,&stderr);
    valueString.State(MailText);
    }
    WriteLine(valueString.Value());

    Meine Umgebung CCU3 und zwei Batteriebetriebene Geräte (Türkontakt & Fernbedienung)

    Gruß
    Sebastian

    • Yann sagt:

      Hallo Sebastian,
      Das LOW_BAT was Du nutzt ist für IP Geräte. Sind deine beiden IP-Geräte? Ansonsten schau mal ein paar Zeilen höher in den Kommentaren. Da hatte ich den letzten Stand meines Scriptes gepostet. EQ3 hat inzwischen unterschieden…. Warum auch immer…
      Gruß
      Yann

  29. Martin sagt:

    Hallo Yann

    Ich hatte nun sehr lange dein Script erfolgreich in Bterieb, seit kurzem oder seit Wechsel auf CCU3 funktioniert dein script nicht mehr.
    Mail und alle andere einstellungen stimmen.
    Hab auch dein neues Script versucht einzufügen (ein paar meldungen weiter oben) aber das wirft mir nur fehler aus bei der Überprüfung.
    Kannst du mir hier weiterhelfen?

    Danke nochmal für dein Bemühen udn für das funktionierende Script all die Jahre!

    lg
    Martin

  30. Andreas sagt:

    Hallo Yann,

    erst einmal danke für das Script, echt klasse.

    Bei mir läuft das Script von oben (unter Punkt 6) Einwand frei.
    Wenn ich nun das Script vom 09.06.2021 20:28 nehme funktioniert nichts mehr.

    Du nutzt auf einmal „objekte“
    object myAssembly = dom.GetObject(„Battery“);
    object valueString = dom.GetObject(„VAR_Batteriezustand“);

    wobei du zuvor „var“

    var myAssembly = dom.GetObject(„Batterie betrieben“);
    var valueString = dom.GetObject(„Batteriezustand“);

    genutzt hast.

    Kopiere ich die zwei Zeilen mit in das Script (unterhalb von den „objekten“ bekomme ich zu mindestens beim prüfen alles angezeigt. Jedoch werden diese Daten nicht in der Mail verschickt.

    Kann es sein, das zu dem Script vom 09.06.2021 20:28 noch weitere Änderungen notwendig sind ?

    Gruß Andreas

    • Yann sagt:

      Hallo Andreas,
      ja, da sind Änderungen vorgenommen worden. Das eigentliche Problem sind aber weder „object“ noch „var“. Es ist schlicht einfach so, dass ich das Gewerk nicht mehr „Batterie betrieben“ sondern „Battery“ nenne und ebenso die Variable von „Batteriezustand“ zu „VAR_Batteriezustand“ umbenannt wurde.
      Gruß
      Yann

  31. Gerd sagt:

    Vielen herzlichen Dank für dieses Tutorial. Ich hab alles nach Anleitung eingerichtet, und es funktioniert prima.
    Ein kleiner Hinweis am Rande:
    Das E-Mail-Addon scheint mit Umlauten nicht klar zu kommen. So wird das Wort „Prüfung“ in der versendeten Mail zu „Pr�fung“. Ich hab’s durch „Kontrolle“ ersetzt – Problem gelöst :)

  32. Gerd sagt:

    UPDATE:
    Wenn Umlaute gewünscht werden, muss das Tcl-Skript folgendermaßen ergänzt werden:

    set batterystatus [lindex $argv 1]
    set batterystatus [encoding convertfrom utf-8 $batterystatus]

    Außerdem hat es mich gestört, dass nur der geräteinterne Name in der E-Mail verwendet wird, z.B. HmIP-DLD 002A1BE9A781D7:1. Wenn man mehrere gleichartige Geräte hat, ist das nicht sehr hilfreich.
    In diesem Fall empfiehlt es sich, den bei der Einrichtung vergebenen Namen für die Geräte mit auszugeben (z.B. Haustuer).
    Dazu muss das Skript innerhalb des CCU-Programms angepasst werden.

    Aus der Zeile

    text = text # „- “ # item.Name() # „\r\n“;

    wird dann

    text = text # „- “ # item.Name() # “ (“ # device.Name() # „) “ # „\r\n“;

  33. Gerd sagt:

    Jetzt wäre nur noch eine Lösung für den HM-SCI-3-FM interessant. Das ist ein 3-Kanal-Kontaktinterface, dass Schließung von drei Kontakten überwachen kann.
    Problem: Dieses Teil sendet eine Aktualisierung und damit Meldung über seinen Status nur dann, wenn einer der überwachten Kontakte geschlossen wird, oder einmal in 24 Stunden.
    Wie kann man den HM-SCI-3-FM in die hier diskutierte Batterie-Überwachung einbeziehen? Ein Ansatz wäre eventuell https://de.elv.com/forum/lowbat-meldung-9724 , aber wie verbinde ich das mit der Batterie-Überwachung?

  1. 31. August 2021

    […] öfter nachfragen muss. Das möchte ich zwar auch ausschließen, schließlich habe ich ja das Batteriemonitoring am laufen, was bisher nie versagt hat, aber ich machte mich dennoch zuerst auf die Suche bei diesen […]

Schreibe einen Kommentar

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