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“:
- 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.
- 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.
- 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.
- 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. - 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… ;-)
- …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 :-).
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
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
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
Du meinst „set batterieststus [lindex $argv 1]“?
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?
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
Hallo Sven,
vielen Dank für den Hinweis, den ich soeben eingearbeitet habe :-)
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 ?
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.
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
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.
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!
Ja. Das Script arbeitet nur, wenn es auch was zu tun gibt. ;-)
Bei weiteren Fragen gern wieder.
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
Hast Du die Geräte in das entsprechende Gewerk eingetragen?
Ja, hab ich. Habe zu Testzwecken mal NUR das betroffene Gerät mit allen Kanälen dem Gewerk zugeordnet. Das Skript scheint auch zu laufen, es schreibt eben nur immer „O.K.“ in die Variable.
Bei mir geht das immer dann an, wenn z.B. im Display des Wandthermostats das Batteriesymbol halb leuchtet. (Gerade gewesen)
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..
Na ja, man kann in der foreach-Schleife mit einem „WriteLine“ die entsprechenden Variablen ausgeben un das dann im „Script testen“ durchlaufen lassen.
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
Ich habe immer irgendeinen Kanal benutzt.
Der Blogeintrag fehlt noch… da bin ich noch nicht zu gekommen.
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
Gute Idee, ich werde mal schauen, wie ich das evtl. gleich einfließen lassen kann.
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
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
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.
Hallo Yann,
oh mann, klar habe ich das falsche Symbol eingetragen, funktioniert jetzt alles perfekt!
Danke für Deine Hilfe!!!
;-)
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
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.
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.
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?
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
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
Ja, läuft da bei mir auch.
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 ?
Gute Frage, das klingt aber eher nach einem grundsätzlichen Problem mit der CCU Installation auf dem PI.
Was benutzt Du denn? Auch YAHM?
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
Hallo Rolf,
was benutzt Du denn für eine Distribution?
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
Danke für die Info. Habe (noch) keine IP Geräte.
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
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
Hallo ich bin neu hier und bin Anfänger.
Meine Frage ist wo schreibe ich die Script hin?
Das Script kommt wie beschrieben im Editor in ein neues Programm hinterlegt.
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.
Das Script schickt nur eine Mail, wenn die Batterien schwach sind. Ansonsten reicht die eingebaute noch.
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
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
Freut mich :-)
Hallo,
ich bekomme zwar die E-Mail aber ohne Inhalt.
Habe alles so wie in der Anleitung gemacht.
Wo konnte der Fehler liegen ?
Ich habe mal „nur unten“ geantwortet.
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.
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
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“ ;-)
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
Hast Du die E-Mail Konfiguration auch so gemacht, wie angegeben? Richtige Nummer? Variablen im Default übergeben?
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 ?
Hallo Andreas,
Der Eintrag übernimmt das erste Argument (argv1) und setzt die Variable betteriestatus auf den Wert.
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
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
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.
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 ;-).
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
Man kann die writeline Zeilen einkommentieren und das ganze im Dialog ausführen.
Danke für die Rückmeldung. Gibt es noch ein anderes Skript? Ich sehe nichts was kommentiert wäre…
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());
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
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
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
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
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
Ok, Danke für die Info.
Ich habe das mal geändert, bekomme es aber nicht ans laufen.
Ich habe mich nun für diese Variante entschieden
https://homematic-forum.de/forum/viewtopic.php?f=31&t=24618
Aber nochmals danke Yann für deine Arbeit die du in das Script und den Support gesteckt hast.
Gruß Andreas
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 :)
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“;
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?