Seite 1 von 2

mit Zahlen aus String rechnen

Verfasst: 26. Jan 2024 17:29
von oh73
Hallo,

ich habe meine Pv-Anlage um einen PV-Speicher erweitert.
deswegen musste ich auch meinen Wechselrichter gegen einen Hybrid Wechselrichter tauschen (Goodwe GW10K-ET).

jetzt bin ich am Daten auslesen, für openhab gibt es ja ein SEMS Binding dafür, bringt mir aber nicht alle Werte!

deshalb rufe ich die Daten mit Hilfe eines sh Script ab, erhalte da einen Json String mit sehr vielen Daten.

mit JSONPATH bekomme ich vieles schon richtig hin,
nur hänge ich im Moment bisschen fest, da mir einige Werte als String geliefert werden und ich den auseinander nehmen und damit rechnen muss.

Beispiel:
"pv_input_2": "189.9V/0.7A",
"pv_input_1": "250.3V/1.3A",

mit

Code: Alles auswählen

var pv_input_2 = transform("JSONPATH", "$.inverter[0].pv_input_2", returngoodwe)
logInfo("Inverter"," Inverter A  (pv_input_2): "+pv_input_2)
erhalte ich einen String mit "189.9V/0.7A"

jetzt müsste ich ja die 189,9V mit 0.7A malnehmen um die Watt zu erhalten.

weiß da jemand eine einfache Lösung ?

Re: mit Zahlen aus String rechnen

Verfasst: 26. Jan 2024 19:24
von udo1toni
Wenn Du schon ein Shellscript nutzt, wäre es ja das naheliegndste, das Script entsprechend zu pimpen :)

Du kannst aber den String auch in openHAB zerlegen, dafür brauchst Du dann halt eine Rule, auf die Du komplett verzichten könntest, wen Du das Shell Script passend umschreibst.
Aber so als Ansatz:

Code: Alles auswählen

val pv_input_2 = transform("JSONPATH", "$.inverter[0].pv_input_2", returngoodwe)
val nPV2V      = Float.parseFloat(pv_input_2.split("/").get(0))
val nPV2A      = Float.parseFloat(pv_input_2.split("/").get(1))
logInfo("inverter","Inverter A pv_input_2: {} ({} V / {} A)", pv_input_2, nPV2V, nPV2A)
sollte zu diesem Output führen:

Code: Alles auswählen

Inverter A pv_input_2: 189.9V/0.7A (189.9 V / 0.7 A)

Re: mit Zahlen aus String rechnen

Verfasst: 26. Jan 2024 20:24
von oh73
Super,

ich wusste das du das besser als ich kannst!

Danke!

hab zwar noch andere Probleme, da einfach zu viele Werte kommen und ich die noch nicht richtig zu ordnen kann.

so viele Werte aber das was ich will finde ich noch nicht,

zB. die getrennte Werte für Ost und West Seite, bei dem SMA Wechselrichter war das einfacher, Inverter A und Inverter B
aber hier finde ich nichts in der Richtung!

Re: mit Zahlen aus String rechnen

Verfasst: 26. Jan 2024 20:38
von udo1toni
Wie sieht denn das komplette JSON aus, welches vom Script geliefert wird? Wie sieht das Script selbst aus?

Re: mit Zahlen aus String rechnen

Verfasst: 26. Jan 2024 20:46
von oh73
das Script ist kein Problem,

Code: Alles auswählen

#!/bin/bash

USERNAME="xxxxxxxxxx"

PASSWORD=“xxxxxxxxxx”

RESULT=$(curl https://www.semsportal.com/api/v2/Common/CrossLogin --silent --header "Content-Type: application/json" --header "Connect: keep-alive" --header "User-Agent: PVMaster/2.1.0 (iPhone; iOS 13.0; Scale/2.00)" --header "Accept-Language: en;q=1" --header "Token: {\"version\":\"v2.1.0\",\"client\":\"ios\",\"language\":\"en\"}" --data-binary "{\"account\":\"XXXXXXXXXXX\",\"pwd\":\"XXXXXXX\"}")

#echo "$RESULT" '\n'
HEADER=$(echo "$RESULT"|jq ".data"|tr '\n' ' ')

#RETURN=$(curl https://www.semsportal.com/api/v2/PowerStation/GetMonitorDetailByPowerstationId --silent --header "Content-Type: application/json" --header "Accept: */*" --header "User-Agent: PVMaster/2.1.0 (iPhone; iOS 13.0; Scale/2.00)" --header "Accept-Language: DE;q=1" --header 'Token: '"$HEADER" --data-binary "{\"powerStationId\":\"6190701b-1f47-41b9-a44c-07838e38a183""\"}")

RETURN=$(curl https://www.semsportal.com/api/v2/PowerStation/GetMonitorDetailByPowerstationId --silent --header "Content-Type: application/json" --header "Accept: */*" --header "User-Agent: PVMaster/2.1.0 (iPhone; iOS 13.0; Scale/2.00)" --header "Accept-Language: DE;q=1" --header 'Token: '"$HEADER" --data-binary "{\"powerStationId\":\"671e4710-ac79-4e6a-9a9d-b4ea25c91023""\"}")

#echo “$RETURN” | jq “[.data.inverter[] | {inverter: .invert_full.name, kwday: .invert_full.eday, power: .invert_full.pac}]”
echo "$RETURN" | jq ".data"

#echo "$RETURN" > /var/www/html/goodwe_return.json
das Ergebnis , ein json Script ist über 1300 Zeilen lang, weiß nicht ob ich das hier so einfach rein stellen kann ?

Re: mit Zahlen aus String rechnen

Verfasst: 26. Jan 2024 23:36
von udo1toni
Ich hab mal account und pwd unkenntlich gemacht, keine Ahnung, ob das "echte" Daten waren oder nicht...

Unterm Strich kommen die Daten aber schon genau in der Form an, da lohnt es tatsächlich nicht, das im Script auseinander zu nehmen.

Schau mal, ob Du das json als gezippte Datei hochladen kannst, dann können wir uns an die gesuchten Werte herantasten :)

Re: mit Zahlen aus String rechnen

Verfasst: 26. Jan 2024 23:56
von oh73
hab ich Dummkopf vergessen das die Daten von mir 2 x drin waren?

mit der zip Datei mal als Dateianhang versuchen,

Re: mit Zahlen aus String rechnen

Verfasst: 27. Jan 2024 01:44
von udo1toni
Ja, das ist eine ordentliche Menge an Daten... Incl. Wettervorhersage, das wäre schon mal spannend.
Ansonsten gibt es unter dict zwei Knoten left und right, die z.B. mutmaßlich die Zelltemperatur (innerTemp), die abgegebene Leistung und Spannung und auch den Batteriezustand widerspiegeln.
Die Informationen stehen aber auch noch mal als einzelne Datenpunkte zur Verfügung, da müsste man halt im Zweifel genau schauen, wie sich die Daten unterscheiden, oder ob sie sich jemals unterscheiden...

Re: mit Zahlen aus String rechnen

Verfasst: 27. Jan 2024 08:29
von oh73
bei left und right kann ich nichts brauchbares finden.

hab aber jetzt festgestellt den String auseinander nehmen brauch ich nicht, die Werte gibt es auch als Zahl einzeln unter vpv1 und ipv1, vpv2 und ipv2.

muss ich mich Stück für Stück durch kämpfen!

ps. Anregung zu dem Script kam aus dem englischen Forum
https://community.openhab.org/t/connect ... b/85480/17

Re: mit Zahlen aus String rechnen

Verfasst: 27. Jan 2024 11:21
von udo1toni
Ah, ja.
Das Script holt sich im ersten Schritt einen Token und nutzt diesen dann zum Anmelden.
Vermutlich ist dieser Token nur kurz nutzbar, das müsste man in der Beschreibung zur API finden.
Falls man den Token auch einmalig anlegen kann, wäre das natürlich die einfachere Variante, weil dann nur ein Aufruf zum Datenabruf notwendig ist.
Mit einem fixen Token könnte man den Aufruf auch direkt über das http Binding erledigen (womit man dann mit geringerem Aufwand die Werte ohne Rule in die diskreten Items bekäme)