Batteriestatus bestimmen/Restlaufzeit

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

Stefan0815
Beiträge: 169
Registriert: 16.04.2019, 15:15
Hat sich bedankt: 9 Mal
Danksagung erhalten: 10 Mal

Batteriestatus bestimmen/Restlaufzeit

Beitrag von Stefan0815 » 17.01.2021, 09:41

Moin zusammen,

ich möchte ein Script basteln, welches mir die aktuelle Spannung und den eingestellten Wert für "Low-Bat.-Schwelle" der Batterien von HmIP-Geräten auswirft. Ich habe da bisher nichts gefunden. Jemand eine Idee oder ein Muster?

Vielen Dank.
Stefan
Zuletzt geändert von Stefan0815 am 17.01.2021, 20:10, insgesamt 1-mal geändert.
Viele Grüße
Stefan

Stefan0815
Beiträge: 169
Registriert: 16.04.2019, 15:15
Hat sich bedankt: 9 Mal
Danksagung erhalten: 10 Mal

Re: Batteriestatus bestimmen

Beitrag von Stefan0815 » 17.01.2021, 10:09

....sorry. Habe es selbst gefunden. :D Hier ein funktionierendes Beispiel von Black für Gerät "Absperrventil Taster":

Code: Alles auswählen

string stdErr=""; string stdOut="";
object oCHANNEL= dom.GetObject (ID_CHANNELS).Get ("Absperrventil Taster:0");
object oIFace= dom.GetObject (oCHANNEL.Interface () );
string sTCL= ^set p [xmlrpc ^ # oIFace.InterfaceUrl() # ^/ getParamset [list string \"^#oCHANNEL.Address ()#^\"] [list string \"MASTER\"]]; set r \"\"; ^;
sTCL= sTCL # "regexp {LOW_BAT_LIMIT ([\.0-9]*)} \$p matched sub1 ; append r \$sub1 \\t; ";
sTCL= sTCL # "puts \$r;";
system.Exec ("/bin/sh -c 'echo \"load tclrpc.so; " # sTCL # "\" |tclsh'",&stdOut,&stdErr);
if (!stdErr) {
!- stdErr kein Leerstring: Fehler ist aufgetreten
!- Generierter Beispielcode für den Zugriff auf die ausgesuchten Parameter
   real LOW_BAT_LIMIT= stdOut.StrValueByIndex ("\t",0).ToFloat ();
}

WriteLine ("Abstand bis Alarm: " # (channels.Get ("Absperrventil Taster:0").DPByHssDP ("OPERATING_VOLTAGE").Value()- LOW_BAT_LIMIT) # " V");                             
Viele Grüße
Stefan

Stefan0815
Beiträge: 169
Registriert: 16.04.2019, 15:15
Hat sich bedankt: 9 Mal
Danksagung erhalten: 10 Mal

Re: Batteriestatus bestimmen

Beitrag von Stefan0815 » 17.01.2021, 20:03

...hier nun das erste Ergebnis für HmIP-Komponenten. Es wird eine Systemvariable "Batterielevel" vom Typ Zeichenkette benötigt. Dann kann man das Script täglich laufen lassen.

Code: Alles auswählen

!- Batterielevel - V0.9 - bytelander
string device_str;
object device_obj;
object interface_obj;
string channel_str;
object channel_obj;
object channel_interface;
string stdErr="";
string stdOut="";
string output_txt="";
integer now = system.Date("%F %X").ToTime().ToInteger();

foreach(device_str, dom.GetObject(ID_DEVICES).EnumUsedIDs()){   !- durch alle Device
  device_obj = dom.GetObject(device_str); !- Device-Object
  interface_obj =  dom.GetObject(device_obj.Interface());
  if ((interface_obj.Name()=="HmIP-RF") && (device_obj.Name()!="HmIP-RCV-50")){  !- alle Device am Interface HmIP außer Virtuelle Fernbedienung der CCU3
     foreach(channel_str, device_obj.Channels().EnumUsedIDs()){   !- durch alle Cannel
        channel_obj = dom.GetObject(channel_str);                 !- Channel-Object
        if (channel_obj.ChnNumber()==0) {
        	object channel_interface= dom.GetObject(channel_obj.Interface());
        	string sTCL= ^set p [xmlrpc ^ # channel_interface.InterfaceUrl() # ^/ getParamset [list string \"^#channel_obj.Address ()#^\"] [list string \"MASTER\"]]; set r \"\"; ^;
			sTCL= sTCL # "regexp {LOW_BAT_LIMIT ([\.0-9]*)} \$p matched sub1 ; append r \$sub1 \\t; ";
			sTCL= sTCL # "puts \$r;";
            stdErr="";
			stdOut="";
            system.Exec ("/bin/sh -c 'echo \"load tclrpc.so; " # sTCL # "\" |tclsh'",&stdOut,&stdErr);
            if (!stdErr) { !- stdErr kein Leerstring: Fehler ist aufgetreten
  				real low_bat_limit=stdOut.StrValueByIndex("\t",0).ToFloat();
            	if (dom.GetObject("HmIP-RF."+dom.GetObject(device_obj).Address()+":0.OPERATING_VOLTAGE").Type().ToString()!="object"){
                	real bat_voltage=dom.GetObject(device_obj.Name()+":"+channel_obj.ChnNumber().ToString()).DPByHssDP("OPERATING_VOLTAGE").Value().ToFloat();
                }
                else{
                    bat_voltage=0.0;
                }
                !- Ausgabe
         		output_txt=output_txt+device_obj.Name()+": ";
            	if (bat_voltage!=0.0){
                	output_txt=output_txt+(bat_voltage-low_bat_limit).ToString().Replace("00000","")+"V\t/\t";
                	output_txt=output_txt+"ist "+bat_voltage.ToString().Replace("00000","")+"V\t/\t";
                }
                output_txt=output_txt+"min "+low_bat_limit.ToString().Replace("00000","")+"V"+"\n";
			}
        }
     }
  } !- ENDE IF Interface-Type
}   !- ENDE FOREACH alle Device

output_txt = output_txt.Trim();
output_txt = output_txt + "\n\n" + "letzte Aktualisierung: " +now.ToTime().Format("%d.%m.%Y %H:%M:%S Uhr");

!- WriteLine(output_txt);
dom.GetObject("Batterielevel").State(output_txt); 
Ergebnis:
Bild_2021-01-17_200139.png
Dies ist die erste Version. Künftig wird die Liste noch sortiert und es soll auch eine Speicherung des Spannungsverlaufes geben, um eine Abschätzung der verbleibenden Laufzeit zu realisieren.

Ein besonderer Dank an Black memberlist.php?mode=viewprofile&u=12901. Ohne den Script Developer viewtopic.php?f=31&t=47049 wäre das nur schwer realisierbar.
Viele Grüße
Stefan

daham@chello.at
Beiträge: 14
Registriert: 11.02.2021, 08:10
System: CCU

Re: Batteriestatus bestimmen/Restlaufzeit

Beitrag von daham@chello.at » 26.06.2021, 09:33

Danke stefan0815 dieses Script ist toll.

Aber leider bringt es mir seit ein paar Tagen keine Ergebnisse mehr.
Woran könnt das liegen?

Benutzeravatar
Baxxy
Beiträge: 10603
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 594 Mal
Danksagung erhalten: 2173 Mal

Re: Batteriestatus bestimmen/Restlaufzeit

Beitrag von Baxxy » 27.06.2021, 10:48

daham@chello.at hat geschrieben:
26.06.2021, 09:33
seit ein paar Tagen keine Ergebnisse mehr.
Die Frage wäre natürlich was sich bei Dir geändert hat.

Du könntest mal testweise Zeile 30...

Code: Alles auswählen

real bat_voltage=dom.GetObject(device_obj.Name()+":"+channel_obj.ChnNumber().ToString()).DPByHssDP("OPERATING_VOLTAGE").Value().ToFloat();
durch folgendes ersetzen...

Code: Alles auswählen

real bat_voltage = dom.GetObject("HmIP-RF."# dom.GetObject(device_obj).Address() #":0.OPERATING_VOLTAGE").Value();
Zumindest bei mir (RaspberryMatic 3.57.5.20210525) läuft das damit wieder. Ob das für CCUx auch gilt musst du selber testen.

Ruega
Beiträge: 6
Registriert: 24.12.2020, 11:01
System: CCU
Hat sich bedankt: 1 Mal

Re: Batteriestatus bestimmen/Restlaufzeit

Beitrag von Ruega » 07.01.2022, 10:42

Hallo Stefan,
ich möchte dein Skript in mein Programm kopieren, es wird aber nicht gespeichert!!
Habe schon mehrere Skripte aus dem Forum in meine Programme reinkopiert, bisher kein Problem.
Was kann das sein?

Danke dir Rüdiger

MichaelN
Beiträge: 9534
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 692 Mal
Danksagung erhalten: 1604 Mal

Re: Batteriestatus bestimmen/Restlaufzeit

Beitrag von MichaelN » 07.01.2022, 10:59

Das liegt am ^
Die original CCU Firmware kann das Zeichen nicht speichern.
Entweder auf RaspberryMatic umsteigen. die CCU patchen oder einen alternativen Editor wie Blacks SDV nutzen.
Evt. könnte hier auch der Trick funktionieren das Zeichen in einer Systemvariablen abzulegen, die SV im Skript auszulesen und in den String mit einzubauen. Bisschen Fummelsarbeit.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Ruega
Beiträge: 6
Registriert: 24.12.2020, 11:01
System: CCU
Hat sich bedankt: 1 Mal

Re: Batteriestatus bestimmen/Restlaufzeit

Beitrag von Ruega » 07.01.2022, 15:44

Danke dir Michael,
aber das ist für mich nee Nummer zu groß:-(
Gruß Rüdiger

Benutzeravatar
klana
Beiträge: 1070
Registriert: 08.02.2015, 08:37
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 53 Mal
Danksagung erhalten: 26 Mal

Re: Batteriestatus bestimmen

Beitrag von klana » 07.01.2022, 17:33

Stefan0815 hat geschrieben:
17.01.2021, 20:03
...
Dies ist die erste Version. Künftig wird die Liste noch sortiert und es soll auch eine Speicherung des Spannungsverlaufes geben, um eine Abschätzung der verbleibenden Laufzeit zu realisieren.
...
Hallo Stefan0815,
hast du vielleicht deine "künftig" Vorhaben schon umgesetzt?
Gruß
Klana
Gruß Klana
Es ist nett, wichtig zu sein. Aber es ist wichtiger, nett zu sein.

Stefan0815
Beiträge: 169
Registriert: 16.04.2019, 15:15
Hat sich bedankt: 9 Mal
Danksagung erhalten: 10 Mal

Re: Batteriestatus bestimmen

Beitrag von Stefan0815 » 07.01.2022, 17:39

klana hat geschrieben:
07.01.2022, 17:33
Hallo Stefan0815,
hast du vielleicht deine "künftig" Vorhaben schon umgesetzt?
Gruß
Klana
...leider bisher noch nicht.
Viele Grüße
Stefan

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“