HM-Script zum Auslesen eines Varta Pulse Energiespeichers per xml

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Thomy75
Beiträge: 4
Registriert: 19.12.2021, 16:37
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 3 Mal

HM-Script zum Auslesen eines Varta Pulse Energiespeichers per xml

Beitrag von Thomy75 » 19.12.2021, 16:57

Hallo,

bin Neuling bei der Scipt Programmierung. Möchte gerne meinen Varta Energiespeicher auslesen. CuxD ist installiert. die XML ist im Anhang sichtbar.

Ich hätte gerne die Parameter "SOC"; "P"; "Capacity" und State ausgelesen und in eine Variable gespeichert.

Vaiable:

Code: Alles auswählen

VARTA_STATUS
VARTA_SOC
VARTA_LEISTUNG
VARTA_KAPAZITÄT
Mein Scipt sieht so aus:

Code: Alles auswählen

        var url = "http://192.168.178.9/cgi/ems_data.xml";

        !hier ist die Abfrage mit CUxD
        dom.GetObject("CUxD.CUX2801001:3.CMD_SETS").State("wget -q -O - '"#url#"'");
        dom.GetObject("CUxD.CUX2801001:3.CMD_QUERY_RET").State(1);
        string Pulse_xml = dom.GetObject("CUxD.CUX2801001:3.CMD_RETS").State()

Jetzt müsste ich aus der Pulse_xml die daten auflösen und in die Variable schreiben:

Code: Alles auswählen

<root Timestamp="1639926741" id="130202543" ChargerCount="1" Description="VARTA">
<inverter id="K16706">
<var name="P" value="0"/>
<var name="SOC" value="0"/>
<var name="Capacity" value="5867"/>
<var name="State" value="4"/>
<var name="OG" value="2500"/>
<var name="UG" value="-2500"/>
</inverter>
</root>



Leider klappt es nicht meinen jetzigen Kenntnisse. Kann mich jemand unterstützen?
Dateianhänge
Varta xml.docx
(12.43 KiB) 65-mal heruntergeladen
Zuletzt geändert von alchy am 19.12.2021, 17:12, insgesamt 3-mal geändert.
Grund: Code in Codetags posten - Rückgabe eingefügt

Benutzeravatar
Black
Beiträge: 5483
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 424 Mal
Danksagung erhalten: 1074 Mal
Kontaktdaten:

Re: HM-Script zum Auslesen eines Varta Pulse Energiespeichers per xml

Beitrag von Black » 19.12.2021, 18:02

erstmal würde ich den AUfruf von dir als CallBack in 2 Programme teilen:

Grund: Sollte dein DIngen mal nicht erreichbar sein, oder sonstwie was im Netz klemmen blockierst du dir nicht die Rega

Das Vorgehen habe ich in dem Thread hier mit meiner SUSV mal beschrieben.

Wenn du denn dann das entsprechend umgesetzt hast, kommt es an das Auswerten. das XML ist ja nicht die riesen Schwierigkeit, die 4 Werte gehen mal eben mit bisschen String auswertung.

Beispielhafter Ansatz:

Code: Alles auswählen

string s='<root Timestamp="1639926741" id="130202543" ChargerCount="1" Description="VARTA">
<inverter id="K16706">
<var name="P" value="0"/>
<var name="SOC" value="0"/>
<var name="Capacity" value="5867"/>
<var name="State" value="4"/>
<var name="OG" value="2500"/>
<var name="UG" value="-2500"/>
</inverter>
</root>';
string l;
foreach (l,s.Split("\n")) {
  string name=""; string value="";
  if (l.StartsWith('<var')) {
    l=l.Substr(l.Find('"')+1);
    name=l.Substr(0,l.Find('"'));
    l=l.Substr(l.Find('="')+2);
    value=l.Substr(0,l.Find('"'));
   if ((name!="")&&(value!="")) {
      if (name=='SOC') {
         WriteLine ("SOC\t"#value);
      } elseif (name=='State') {
         WriteLine ("Status\t"#value);
      } elseif (name=='P') {
         WriteLine ("Status\t"#value);
      } elseif (name=='Capacity') {
         WriteLine ("Capacity\t"#value);
      }
   }
  }
}
Anstatt des WriteLine ("xxxxx\t"#Value) setzt du natürlich dann deinen entsprechenden Aufruf rein um eine Sysvar z.B. zu setzen.

Syntax wäre dann, wenn die Sysvar eine Zahl ist

Code: Alles auswählen

dom.GetObject (ID_SYSTEM_VARIABLES).Get("DeinSysvarName").State (value.ToFloat());
Black

Natürlich kommt das feste setzen von string s= mit dem Testwert natürlich weg

Edit:
Aufgrund der anderen Antwortsyntax auch die Anpassnung in dem Script:

Code: Alles auswählen

string s="root Timestamp='1639945036' id='130202380' ChargerCount='1' Description='VARTA'
inverter id='K126106'
var name='P' value='0'/
var name='SOC' value='0'/
var name='Capacity' value='5867'/
var name='State' value='4'/
var name='OG' value='2500'/
var name='UG' value='-2500'/
/inverter
/root";
string l;
foreach (l,s.Split("\n")) {
  string name=""; string value="";
  if (l.StartsWith('var')) {
    l=l.Substr(l.Find("'")+1);
    name=l.Substr(0,l.Find("'"));
    l=l.Substr(l.Find("='")+2);
    value=l.Substr(0,l.Find("'"));
   if ((name!="")&&(value!="")) {
      if (name=='SOC') {
         WriteLine ("SOC\t"#value);
      } elseif (name=='State') {
         WriteLine ("Status\t"#value);
      } elseif (name=='P') {
         WriteLine ("Status\t"#value);
      } elseif (name=='Capacity') {
         WriteLine ("Capacity\t"#value);
      }
   }
  }
}[code]
Zuletzt geändert von Black am 19.12.2021, 22:20, insgesamt 1-mal geändert.
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Tyfys
Beiträge: 551
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 125 Mal

Re: HM-Script zum Auslesen eines Varta Pulse Energiespeichers per xml

Beitrag von Tyfys » 19.12.2021, 18:48

Konnte ja nicht ahnen, dass black auch schon ein Lösungsweg gezeigt hat.

Ich hatte mich aber auch daran zu schaffen gemacht, daher nun meine Idee zur Verarbeitung der XML-Daten.

Code: Alles auswählen


string xml_daten= '<root Timestamp="1639926741" id="130202543" ChargerCount="1" Description="VARTA"><inverter id="K16706"><var name="P" value="0"/><var name="SOC" value="0"/><var name="Capacity" value="5867"/><var name="State" value="4"/><var name="OG" value="2500"/><var name="UG" value="-2500"/></inverter></root>';
xml_daten = xml_daten.ToLatin();
xml_daten = xml_daten.Replace("\n", "");  ! Zeilenumbrüche entfernen
xml_daten = xml_daten.Replace("\r", "");  ! da sonst auch im VariablenName bzw VariablenWert 
string  such1 = '<var name="';
string  such2 = '" value="';
string suche ;
string  index;
string  wert;
string  sysvar;
var sv_value ;

! saucharr = "1.xml_variable{HM-SysVar[VariablenTyp;2.xml_variable{HM-SysVar[VariablenTyp; usw...
string sucharr = "P[SV_Var1[n;SOC[SV_Var2[n;Capacity[SV_Var3[n;State[SV_Var4[n";

foreach(index, sucharr.Split(";"))
{
var suche = such1 #  index.StrValueByIndex("[", 0) #such2;
 wert = xml_daten.Substr(xml_daten.Find(suche) + suche.Length()).Substr(0, (xml_daten.Substr(xml_daten.Find(such1) + suche.Length()).Find(such2)));
      wert = wert.Substr(0 ,wert.Find('"/>') );

if (  index.StrValueByIndex("[", 2) =="b" )
{ 
sv_value = "false;true".StrValueByIndex(";",wert.ToInteger());
}
elseif (  index.StrValueByIndex("[", 2) =="n" )
{ 
sv_value = wert.ToFloat();
}
  
sysvar =  index.StrValueByIndex("[", 1);
object svdp = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar);
    if (svdp)
    {
        svdp.State(sv_value);
        WriteLine("Variable: " # sysvar # " gespeichert mit Wert " # sv_value);
    }
    else
    {
        WriteLine("Variable: " # sysvar # " nicht angelegt für Wert " # sv_value);
    }
}
Man sieht die unterschiedliche Weise, das Problem zu lösen.
Ein Dritter hat evtl. noch einen ganz anderen Vorschlag.
Gruß
Harry

Thomy75
Beiträge: 4
Registriert: 19.12.2021, 16:37
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 3 Mal

Re: HM-Script zum Auslesen eines Varta Pulse Energiespeichers per xml

Beitrag von Thomy75 » 19.12.2021, 21:19

Vielen Dank für die schnellen Antworten.
Ich habe mich im ersten Schritt für die Lösung von Tyfys entschieden. Mit den Daten im Script festgeschrieben funktioniert es auch. Mit den Daten des Energiespeichers kommen komische Werte raus:

Das jetzige Script lautet:

!string xml_daten= '<root Timestamp="1639926741" id="130202543" ChargerCount="1" Description="VARTA"><inverter id="K16706"><var name="P" value="0"/><var name="SOC" value="0"/><var name="Capacity" value="5867"/><var name="State" value="4"/><var name="OG" value="2500"/><var name="UG" value="-2500"/></inverter></root>';

var url = "http://192.168.178.9/cgi/ems_data.xml";

!hier ist die Abfrage mit CUxD
dom.GetObject("CUxD.CUX2801001:4.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:4.CMD_QUERY_RET").State(1);
string xml_daten = dom.GetObject("CUxD.CUX2801001:4.CMD_RETS").State();
WriteLine(xml_daten);

xml_daten = xml_daten.ToLatin();
xml_daten = xml_daten.Replace("\n", ""); ! Zeilenumbrüche entfernen
xml_daten = xml_daten.Replace("\r", ""); ! da sonst auch im VariablenName bzw VariablenWert
string such1 = '<var name="';
string such2 = '" value="';
string suche ;
string index;
string wert;
string sysvar;
var sv_value ;

! saucharr = "1.xml_variable{HM-SysVar[VariablenTyp;2.xml_variable{HM-SysVar[VariablenTyp; usw...
string sucharr = "P[VARTA_NEO_LEISTUNG[n;SOC[VARTA_NEO_SOC[n;Capacity[VARTA_NEO_KAPAZITÄT[n;State[VARTA_NEO_STATUS[n";

foreach(index, sucharr.Split(";"))
{
var suche = such1 # index.StrValueByIndex("[", 0) #such2;
wert = xml_daten.Substr(xml_daten.Find(suche) + suche.Length()).Substr(0, (xml_daten.Substr(xml_daten.Find(such1) + suche.Length()).Find(such2)));
wert = wert.Substr(0 ,wert.Find('"/>') );

if ( index.StrValueByIndex("[", 2) =="b" )
{
sv_value = "false;true".StrValueByIndex(";",wert.ToInteger());
}
elseif ( index.StrValueByIndex("[", 2) =="n" )
{
sv_value = wert.ToFloat();
}

sysvar = index.StrValueByIndex("[", 1);
object svdp = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar);
if (svdp)
{
svdp.State(sv_value);
WriteLine("Variable: " # sysvar # " gespeichert mit Wert " # sv_value);
}
else
{
WriteLine("Variable: " # sysvar # " nicht angelegt für Wert " # sv_value);
}
}

folgende Antwort kommt beim ausführen des Scriptes:

root Timestamp='1639945036' id='130202380' ChargerCount='1' Description='VARTA'
inverter id='K126106'
var name='P' value='0'/
var name='SOC' value='0'/
var name='Capacity' value='5867'/
var name='State' value='4'/
var name='OG' value='2500'/
var name='UG' value='-2500'/
/inverter
/root

Variable: VARTA_NEO_LEISTUNG gespeichert mit Wert 9945036.000000
Variable: VARTA_NEO_SOC gespeichert mit Wert 45036.000000
Variable: VARTA_NEO_KAPAZITÄT gespeichert mit Wert 0.000000
Variable: VARTA_NEO_STATUS gespeichert mit Wert 36.000000


Ich bin ein wenig ratlos!

Benutzeravatar
Black
Beiträge: 5483
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 424 Mal
Danksagung erhalten: 1074 Mal
Kontaktdaten:

Re: HM-Script zum Auslesen eines Varta Pulse Energiespeichers per xml

Beitrag von Black » 19.12.2021, 21:34

schreib das mal in CodeTags bitte, so is das ja Würg.

und: warum sind beii der Version von dir auf einmal die "<" bzw ">" chars weg ?

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Tyfys
Beiträge: 551
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 125 Mal

Re: HM-Script zum Auslesen eines Varta Pulse Energiespeichers per xml

Beitrag von Tyfys » 19.12.2021, 21:42

Thomy75 hat geschrieben:
19.12.2021, 21:19
folgende Antwort kommt beim ausführen des Scriptes:

root Timestamp='1639945036' id='130202380' ChargerCount='1' Description='VARTA'
inverter id='K126106'
var name='P' value='0'/
var name='SOC' value='0'/
var name='Capacity' value='5867'/
var name='State' value='4'/
var name='OG' value='2500'/
var name='UG' value='-2500'/
/inverter
/root
wenn das die Ausgabe dieser Anweisung ist

Code: Alles auswählen

WriteLine(xml_daten);
kann das Skript auch nicht klappen. Die bei der Suche verwendeten Grösser als / Kleiner als -Zeichen fehlen ja.

Frage mich nur wo dann die Zahlen herkommen.
Gruß
Harry

Thomy75
Beiträge: 4
Registriert: 19.12.2021, 16:37
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 3 Mal

Re: HM-Script zum Auslesen eines Varta Pulse Energiespeichers per xml

Beitrag von Thomy75 » 19.12.2021, 22:03

Die Zahlen sind vom Timestamp. Mir ist die Ausgabe ohne >< auch aufgefallen. Denke Word hat die Zeichen hinzugefügt. die Ausgabe aus Writeline ist die Richtige. Habe diese zur Kontrolle eingefügt. Habe dein Script leider auf das neue Format nicht anpassen können.

Tyfys
Beiträge: 551
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 125 Mal

Re: HM-Script zum Auslesen eines Varta Pulse Energiespeichers per xml

Beitrag von Tyfys » 19.12.2021, 22:07

Falls der Abruf mit CUxD die "<>" chars entfernt
kannst du es auch mal ohne CUxD versuchen:

Code: Alles auswählen

var url = "http://192.168.178.9/cgi/ems_data.xml";
string  stdout;
string  stderr;
system.Exec("wget --no-check-certificate -q -O - '" # url # "'", &stdout, &stderr);
if (stdout.Length() == 0)
{
    WriteLine("keine Daten empfangen");
    if (stderr.Length() > 0)
    {
        WriteLine("Fehlermeldung vom Server: " # stderr);
    }
    quit;
}
WriteLine(stdout);

ansonsten hab ich mein Skript kurz angepasst: ( ohne <> und " nach ' (doppelt > einfach getauscht):

Code: Alles auswählen

xml_daten = xml_daten.ToLatin();
xml_daten = xml_daten.Replace("\n", "");  ! Zeilenumbrüche entfernen
xml_daten = xml_daten.Replace("\r", "");  ! da sonst auch im VariablenName bzw VariablenWert 
string  such1 = "var name='";
string  such2 = "' value='";
string suche ;
string  index;
string  wert;
string  sysvar;
var sv_value ;

! saucharr = "1.xml_variable{HM-SysVar[VariablenTyp;2.xml_variable{HM-SysVar[VariablenTyp; usw...
string sucharr = "P[SV_Var1[n;SOC[SV_Var2[n;Capacity[SV_Var3[n;State[SV_Var4[n";

foreach(index, sucharr.Split(";"))
{
var suche = such1 #  index.StrValueByIndex("[", 0) #such2;
 wert = xml_daten.Substr(xml_daten.Find(suche) + suche.Length()).Substr(0, (xml_daten.Substr(xml_daten.Find(such1) + suche.Length()).Find(such2)));
      wert = wert.Substr(0 ,wert.Find("'/") );

if (  index.StrValueByIndex("[", 2) =="b" )
{ 
sv_value = "false;true".StrValueByIndex(";",wert.ToInteger());
}
elseif (  index.StrValueByIndex("[", 2) =="n" )
{ 
sv_value = wert.ToFloat();
}
  
sysvar =  index.StrValueByIndex("[", 1);
object svdp = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar);
    if (svdp)
    {
        svdp.State(sv_value);
        WriteLine("Variable: " # sysvar # " gespeichert mit Wert " # sv_value);
    }
    else
    {
        WriteLine("Variable: " # sysvar # " nicht angelegt für Wert " # sv_value);
    }
}

probiers aus.
Gruß
Harry

Thomy75
Beiträge: 4
Registriert: 19.12.2021, 16:37
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 3 Mal

Re: HM-Script zum Auslesen eines Varta Pulse Energiespeichers per xml

Beitrag von Thomy75 » 19.12.2021, 22:14

Herzlichen Dank. Diese Variante funktioniert!

Gruß Thomas

chriwi
Beiträge: 77
Registriert: 20.12.2019, 16:42
Hat sich bedankt: 15 Mal
Danksagung erhalten: 1 Mal

Re: HM-Script zum Auslesen eines Varta Pulse Energiespeichers per xml

Beitrag von chriwi » 17.01.2023, 23:08

Hallo,

wenn ich die Varta Dokumente bzgl. pulse und pulse neo richtig lese, geht der Pulse über xml und der pulse neo über modbus.
Dann muss ich mir letzteres einmal anschauen, da mein pulse neo den Zugriff über xml nicht akzeptiert und ich Eure Vorschläge wohl nicht nutzen kann.
Dateianhänge
Bildschirm­foto 2023-01-17 um 23.08.06.png
Raspberry Pi 4 auf Bookworm mit Homebridge und HomeMatic 3.75.7 (piVCCU3, RPI-RF-MOD)
Homematic-HAP
HmIP-PSM, HmIP-PS, HmIP-PS-2 x2, HmIP-BSM x3, HmIP-BROLL x17, HmIP-WTH2, HmIP-STH, HmIP-SWDO, HmIP-SWSD x3, HmIP-WRC6, HmIP-SWDM-2 x2, HmIP-SCTH230
Garagentor (HMIP-SWDO, HM-LC-Sw1-Pl-CT-R1)
Solar-log Base 15, FW 6.0.2
Nuki 3 Pro
IKEA Tradfi (Licht, ShortButton -> Garagentor)
HM-pdetect mit Fritzbox-Config (Anwesenheit)

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“