[solved] openWB API ausgelesene Werte - Textvariablen zuweisen

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

Moderator: Co-Administratoren

nseith
Beiträge: 320
Registriert: 23.06.2013, 11:08
Wohnort: bei Karlsruhe
Hat sich bedankt: 8 Mal
Danksagung erhalten: 3 Mal

[solved] openWB API ausgelesene Werte - Textvariablen zuweisen

Beitrag von nseith » 07.02.2023, 15:56

Hallo an Alle,

ich wuerde gerne Werte dich ich von der openWB bekomme in Textvariablen umwandeln.
Derzeit frage ich die openwb lokal mit GET=ALL ab und zerlege das Ergebnis dann.
Jetzt bekomme ich fuer den Ladepunkt Zahlenwerte zurueck die ich dann aber gerne direkt in eine Textvariable (SV_OWB_Auto_angesteckt) schreiben wuerde.

Ich habe das aus verschiedenen Foren kopiert und fuer mich angepasst, leider scheitere ich an dem vorhaben von oben (integer to string/variable)

Bsp.
0 = abgestecket
1 = angesteckt

Code: Alles auswählen

string word = "plugstatLP1";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 1);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = -1.0 * daten.ToFloat();
dom.GetObject("SV_OWB_Auto_angesteckt").State(zahl);
Vielen Dank.
N
Zuletzt geändert von nseith am 09.02.2023, 08:29, insgesamt 1-mal geändert.


nseith
Beiträge: 320
Registriert: 23.06.2013, 11:08
Wohnort: bei Karlsruhe
Hat sich bedankt: 8 Mal
Danksagung erhalten: 3 Mal

Re: openWB API ausgelesene Werte - Textvariablen zuweisen

Beitrag von nseith » 07.02.2023, 20:27

ich hole mir mit

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:10.CMD_SETS").State("wget --no-check-certificate -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:10.CMD_QUERY_RET").State(1);
string openwb_xml = dom.GetObject("CUxD.CUX2801001:10.CMD_RETS").State();
die daten:
der openwb_xml string sieht dann so aus
{"date":"2023:02:07 14:07:32","lademodus":"1","minimalstromstaerke":"6","maximalstromstaerke":"16","llsoll":"6","restzeitlp1":"--","restzeitlp2":"0","restzeitlp3":"0","gelkwhlp1":"0.20","gelkwhlp2":"0","gelkwhlp3":"0","gelrlp1":"0","gelrlp2":"0","gelrlp3":"0","llgesamt":"0","evua1":"3.298","evua2":"1.576","evua3":"-7.502","lllp1":"0","lllp2":"0","lllp3":"0","evuw":"-729","pvw":"-5515","evuv1":"234.048","evuv2":"234.24","evuv3":"236.241","ladestatusLP1":"1","ladestatusLP2":"0","ladestatusLP3":"0","ladestartzeitLP1":"0","ladestartzeitLP2":"0","ladestartzeitLP3":"0","zielladungaktiv":"0","lla1LP1":"0","lla2LP1":"0","lla3LP1":"0","lla1LP2":"0","lla2LP2":"0","lla3LP2":"0","llkwhLP1":"3481.100","llkwhLP2":"0","llkwhLP3":"0","evubezugWh":"4435153.0","evueinspeisungWh":"5955528.0","pvWh":"48200686","speichersoc":"0","socLP1":"0","socLP2":"0","speicherleistung":"0","ladungaktivLP1":"0","ladungaktivLP2":"0","ladungaktivLP3":"0","chargestatLP1":"0","chargestatLP2":"0","plugstatLP1":"0","plugstatLP2":"0","restzeitlp1m":"1682","restzeitlp2m":"0","restzeitlp3m":"0","lla1LP3":"0","lla2LP3":"0","lla3LP3":"0"}
Vielen Dank fuer deine Muehen

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

Re: openWB API ausgelesene Werte - Textvariablen zuweisen

Beitrag von Tyfys » 07.02.2023, 21:03

Das sollte so klappen (nach dem Abholen der openwb_xml) :

Code: Alles auswählen

string word = "plugstatLP1";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 1);
WriteLine(daten);
integer zahl=daten.ToInteger();
WriteLine(zahl);
dom.GetObject("SV_OWB_Auto_angesteckt").State(zahl);
Falls in openwb_xml immer "plugstatLP1":"0" oder "plugstatLP1":"1" vorkommt (auch nach dem Abholen der openwb_xml) :
kann das auch verkürzt werden auf:

Code: Alles auswählen

integer zahl =  openwb_xml.Contains('"plugstatLP1":"1"').ToInteger();
WriteLine(zahl);
dom.GetObject("SV_OWB_Auto_angesteckt").State(zahl);
Die WriteLine-Zeilen können gelöscht oder auskommentiert werden.
Gruß
Harry

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

Re: openWB API ausgelesene Werte - Textvariablen zuweisen

Beitrag von Baxxy » 07.02.2023, 23:02

Ach Harry hat's schon gelöst... :wink:

Hier noch die gekürzte Version mit Textausgabe.

Code: Alles auswählen

string status;
if (openwb_xml.Contains('"plugstatLP1":"1"')) { status = "angesteckt"; }
 elseif (openwb_xml.Contains('"plugstatLP1":"0"')) { status = "abgesteckt"; }
  else { status = "unbekant"; }
   WriteLine(status);
dom.GetObject("SV_OWB_Auto_angesteckt").State(status);
Ich würde aber den Status eher an eine WerteListe-SysVar übergeben, lässt sich doch viel besser handhaben wenn man damit was automatisieren will...

nseith
Beiträge: 320
Registriert: 23.06.2013, 11:08
Wohnort: bei Karlsruhe
Hat sich bedankt: 8 Mal
Danksagung erhalten: 3 Mal

Re: openWB API ausgelesene Werte - Textvariablen zuweisen

Beitrag von nseith » 08.02.2023, 08:37

Danke Euch beiden!
Baxxy hat geschrieben:
07.02.2023, 23:02
Ich würde aber den Status eher an eine WerteListe-SysVar übergeben, lässt sich doch viel besser handhaben wenn man damit was automatisieren will...
Genau das ist ja was ich vorhatte - aber ich kann ja erst an eine Werteliste was schicken wenn ich die auch erstellen kann ;)

Jetzt kann ich mal weiterbasteln!

Vielen Dank - ich werde berichten!
N

nseith
Beiträge: 320
Registriert: 23.06.2013, 11:08
Wohnort: bei Karlsruhe
Hat sich bedankt: 8 Mal
Danksagung erhalten: 3 Mal

Re: openWB API ausgelesene Werte - Textvariablen zuweisen

Beitrag von nseith » 08.02.2023, 09:07

bin fast am Ziel
Wenn ich euren Code

Code: Alles auswählen

string status;
if (openwb_xml.Contains('"plugstatLP1":"1"')) { status = "angesteckt"; }
 elseif (openwb_xml.Contains('"plugstatLP1":"0"')) { status = "abgesteckt"; }
  else { status = "unbekant"; }
   WriteLine(status);
dom.GetObject("SV_OWB_Auto_angesteckt").State(status);
aufrufe bekomme ich

Code: Alles auswählen

"status": "angesteckt",
  "sessionId": "",
  "httpUserAgent": "",
  "openwb_xml": "\{\"date\":\"2023:02:08-08:57:20\",\"lademodus\":\"0\",\"minimalstromstaerke\":\"6\",\"maximalstromstaerke\":\"16\",\"llsoll\":\"6\",\"restzeitlp1\":\"--\",\"restzeitlp2\":\"0\",\"restzeitlp3\":\"0\",\"gelkwhlp1\":\"7.60\",\"gelkwhlp2\":\"0\",\"gelkwhlp3\":\"0\",\"gelrlp1\":\"25\",\"gelrlp2\":\"0\",\"gelrlp3\":\"0\",\"llgesamt\":\"0\",\"evua1\":\"-1.717\",\"evua2\":\"-2.035\",\"evua3\":\"-1.804\",\"lllp1\":\"0\",\"lllp2\":\"0\",\"lllp3\":\"0\",\"evuw\":\"-1007\",\"pvw\":\"-1514\",\"evuv1\":\"237.049\",\"evuv2\":\"236.171\",\"evuv3\":\"237.883\",\"ladestatusLP1\":\"1\",\"ladestatusLP2\":\"0\",\"ladestatusLP3\":\"0\",\"ladestartzeitLP1\":\"0\",\"ladestartzeitLP2\":\"0\",\"ladestartzeitLP3\":\"0\",\"zielladungaktiv\":\"0\",\"lla1LP1\":\"0\",\"lla2LP1\":\"0\",\"lla3LP1\":\"0\",\"lla1LP2\":\"0\",\"lla2LP2\":\"0\",\"lla3LP2\":\"0\",\"llkwhLP1\":\"3492.900\",\"llkwhLP2\":\"0\",\"llkwhLP3\":\"0\",\"evubezugWh\":\"4454070.1\",\"evueinspeisungWh\":\"5957458.2\",\"pvWh\":\"48213011\",\"speichersoc\":\"0\",\"socLP1\":\"0\",\"socLP2\":\"0\",\"speicherleistung\":\"0\",\"ladungaktivLP1\":\"0\",\"ladungaktivLP2\":\"0\",\"ladungaktivLP3\":\"0\",\"chargestatLP1\":\"0\",\"chargestatLP2\":\"0\",\"plugstatLP1\":\"1\",\"plugstatLP2\":\"0\",\"restzeitlp1m\":\"3823\",\"restzeitlp2m\":\"0\",\"restzeitlp3m\":\"0\",\"lla1LP3\":\"0\",\"lla2LP3\":\"0\",\"lla3LP3\":\"0\"}",
  "url": "http:\/\/192.168.254.XX\/openWB\/web\/api.php?get=all",
  "STDOUT": "angesteckt\r\n"
zurueck.

Die erstellte WerteListe SysVar mit unbekannt;angesteckt;abgesteckt bleibt aber auf unbekannt. Wenn ich die WerteListe leer lasse bleibt sie leer.
Wenn ich die gleiche Variable in den Typ Zeichenkette wandle steht angesteckt drin, was natuerlich spaeter in den Programmen eher unkomfortabel ist.
Muss ich da nochmals wandeln damit es mit der WerteListe funktioniert?

Tausend Dank
N

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

Re: openWB API ausgelesene Werte - Textvariablen zuweisen

Beitrag von Baxxy » 08.02.2023, 09:55

Naja, ich bezog mich auf...
nseith hat geschrieben:
07.02.2023, 15:56
die ich dann aber gerne direkt in eine Textvariable (SV_OWB_Auto_angesteckt) schreiben wuerde
Die Werteliste hatte ich ja erst ins Spiel gebracht. :wink:

Angenommen SysVar WerteListe mit 3 "Werten"
Bspw.

Code: Alles auswählen

0 = abgesteckt;1 = angesteckt;unbekannt
(die "Werte" kannst du ja benennen wie du willst)

Wenn du diese Reihenfolge nimmst dann kannst du direkt das Beispiel von @Tyfys nutzen (dann ohne unbekannt Status)

Ansonsten hier zum testen, spielen und lernen...

Code: Alles auswählen

string SysVar_Name = "SV_OWB_Auto_angesteckt"; !- Werteliste bspw. 0 = abgesteckt;1 = angesteckt;unbekannt
!- #######################################################################################################
integer status_int = 2; integer status_sv_int; string status_txt;

if (openwb_xml.Contains('"plugstatLP1":"1"')) { status_txt = "angesteckt"; status_int = 1; }
 elseif (openwb_xml.Contains('"plugstatLP1":"0"')) { status_txt = "abgesteckt"; status_int = 0; }
  else { status_txt = "unbekant"; }
   WriteLine("Status Text: "# status_txt #" | Werteliste-Soll-Position: "# status_int);

object oSysVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get (SysVar_Name);
   if (!oSysVar) { WriteLine("SysVar nicht vorhanden, quit."); quit; }
        status_sv_int  = oSysVar.Value();
    if (status_sv_int != status_int) {
        WriteLine("SysVar vorhanden, Werteliste-Position setzen von "# status_sv_int #" auf: "# status_int);
        oSysVar.State(status_int);
       }
     else { WriteLine("SysVar vorhanden, Werteliste-Position nicht geändert."); }

nseith
Beiträge: 320
Registriert: 23.06.2013, 11:08
Wohnort: bei Karlsruhe
Hat sich bedankt: 8 Mal
Danksagung erhalten: 3 Mal

Re: openWB API ausgelesene Werte - Textvariablen zuweisen

Beitrag von nseith » 08.02.2023, 10:12

Oh Mann! :D
ich hatte das mit

Code: Alles auswählen

integer zahl=daten.ToInteger();
wohl komplett nicht verstanden
Aber klar 0 = erster Wert 1 = zweiter Wert

Jetzt klappts auch mitm Nachbarn!

MEGA!
Danke - ich bastel weiter!
N

nseith
Beiträge: 320
Registriert: 23.06.2013, 11:08
Wohnort: bei Karlsruhe
Hat sich bedankt: 8 Mal
Danksagung erhalten: 3 Mal

Re: openWB API ausgelesene Werte - Textvariablen zuweisen

Beitrag von nseith » 08.02.2023, 15:57

Hallo Ihr beiden Helfer,

dank euer Hilfe hat das mit der openWB super geklappt weshalb ich mich auch noch an den Go-E Charger gemacht hatte.
Jetzt haenge ich aktuell noch an der Formatierung des Zeistempels den ich im JSON auch nur als String wiederbekomme:

Rückgabe im JSON
{"version":"B","tme":"0702231458","rbc":"141","rbt":"2986669513","car":"1","amx" ... usw)

0104191236 entspricht to 01.04.2019 12:36

mit welchem Befehl kann ich das jetzt wieder "umformatieren" - ich hab keine Idee.

Lieben Dank.
N

(da die Abfrage fast 100% gleich funktioniert wie bei der openWB habe ich es jetzt hier mir in the Thread gepackt)

Antworten

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