Batterieüberwachung in fhem

Bei Funksendern taucht immer wieder das Problem auf das die Batterien irgendwann leer sind. Bei einem Temperatursender der mit einem Heizkörperthermostat gepeert ist, würde dann die Heizung nicht mehr richtig funktionieren. Wie eine Batterieausfall vorzeitig bzw. zeitnah erkannt werden kann beschreibe ich hier in diesem Beitrag.




 


Möglichkeiten der Überwachung

Zur Batterieüberwachung gibt es zwei Möglichkeiten:

  1. Spannungsüberwachung: Die Temperatursender die ich verwende, senden die Batteriespannung mit. Diese können wir auswerten und unterhalb eines bestimmten Grenzwertes ein baldiges Battereiende anzeigen
  2. Überwachung des letzten Sendens: Wurden z.B. länger als 3h keine Daten mehr empfangen wird von einem Batterieausfall ausgegangen.

Die zweite Möglichkeit der Batterieüberwachung kann bei praktisch jedem Funksender gemacht werden, bei der ersten ist man auf den Batteriestatus der mitgesendet werden muss angewiesen.




 


Umsetzung in fhem

Die Überwachung in fhem geschieht periodisch über ein notify. Dies wird über ein “at” alle 5min getriggert. Das notify ist folgendermaßen aufgebaut:

Bei [1] sieht man den Code der die Auswertung macht, bei [2] sind die mit dem notify verknüften Zeitgeber (“at”) und dummy “dum0005tbl” dessen Schriftfarbe angepasst wird. Im dum0005tbl schreibt der Funksender die aktuelle Temperatur, den Batteriestatus und weitere Werte.




 


Beschreibung des Codes

Bei dem Script handelt es sich um Perl-Code. Dies ist an der geschweiften Klammer vor dem “if” zu erkennen.

Die Zeitüberwachung, ob der Funksender länger als 3h(10800s) nicht gesendet hat, wird mit dem ersten Eintrag überwacht. Mit “time” bekommt man die aktuelle Zeit in Sekunden seit dem 01.01.1970 0:00:00. “time_str2num” wandelt eine Zeitangabe im Format “JJJJ-MM-TT hh:mm:ss” in vergangene Sekunden seit dem 01.01.1970 0:00:00. Die Differenz der beiden(“-“) ist dann die Zeitspanne die seit dem letzen Eintrag im Dummy vergangen ist. Diese Zeit wird mit “ReadingTimestamp” ausgelesen. Dort wird als erstes der Name des Dummys(dum0005tbl), dann das Reading(Batterie) und als letztes ein alternativer Wert, falls der Dummy keinen Wert zurück liefert, eingetragen.
Anschließend erfolgt der vergleich ob die Differenz der beiden Zeitangaben größer als 10800Sekunden(180min*60sek) ist. Ist dies der Fall wird mit dem Eintrag “attr dum0005tbl devStateStyle style=color:red” der Text des Dummys rot eingefärbt.




 

Als zweites wird die Batteriespannung überwacht[2]. Dazu wird das Reading “Batterie” des Dummys “dum0005tbl” mit der Funktion “ReadingsVal” ausgelesen. Hier muss ähnlich wie beim ReadingTimestamp, erst der Name des Dummys(dum0005tbl), dann das Reading(Batterie) und ein alternativer Wert angegeben werden. Der ausgelesene Wert wird mit 3,55 verglichen. Wird der Wert unterschritten, wird der Eintrag von dum0005tbl mit “attr dum0005tbl devStateStyle style=color:orange”orange eingefärbt.

Trifft beides nicht zu, so wird der Eintrag mit “attr dum0005tbl devStateStyle style=color:balck”schwarz eingefärbt.

Hinweis 1: Die Abarbeitung des Codes geschieht so, dass als erstes die Zeit abgefragt wird(“if”), ist diese in Ordnung, wird anschließend die Spannung abgefragt(“elsif”). Ist diese auch in Ordnung so wird die Standardfarbe verwendet(“else”). Ist nur eine der vorherigen Bedingungen “wahr” so wird die Abfrage abgebrochen und nur das ausgeführt was unter der Abfrage steht.

Hinweis 2: Steht z.B. die Batteriespannung bzw. -status nicht zur Verfügung, kann auf den zwieten Eintrag (“elsif”) verzichtet werden und nur die Zeit ausgewertet werden.

Hier noch der Code zum Einfügen über die Weboberfläche:

at_wz_vT5 {
if((time - time_str2num(ReadingsTimestamp("dum0005tbl","Batterie","1970-01-01 0:00:00"))) > (180*60)){
fhem("attr dum0005tbl devStateStyle style=color:red");
}elsif (ReadingsVal("dum0005tbl","Batterie",0.00) < 3.55){
fhem("attr dum0005tbl devStateStyle style=color:orange");
}else{
fhem("attr dum0005tbl devStateStyle style=color:black");
}
}



 


Ausblick

Mit dem Script kann man natürlich nicht nur die Batteriespannung überwachen sondern auch andere Werte. Denkbar wäre z.B. die Außentemperatur zu überwachen und gegebenenfalls eine Frostwarnung auszugeben. Hier sind der Kreativität keine Grenzen gesetzt 😉




 

Schreibe einen Kommentar

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