Solarwatt MyReserve per JSON auslesen - Readings

Begonnen von topa_LE, 25 Juni 2019, 21:47:09

Vorheriges Thema - Nächstes Thema

topa_LE

Hallo Stefan,

danke für die Unterstützung.
Was meinst du genau damit "Auszug aus den gelieferten Daten" ?

Den JSON-String aus http://192.168.178.160/rest/kiwigrid/wizard/devices
oder ein List vom Device?


Korrekt ist deine Aussage, das es eigentlich immer nur ein Reading-Wert ist, sich aber dann der Pfad ändert von:

result_items_02_tagValues_PowerIn_value

zu zum Beispiel

result_items_06_tagValues_PowerIn_value

Somit dann in deinem Modul das Reading : PowerIn-2 zu PowerIn-3

Sagt mir bitte genau was du benötigst, vielen Dank

StefanStrobel

Ja, den JSON-String. Eventuell kann man den per Regex so parsen, dass die Position egal ist.

Gruß
   Stefan

topa_LE

Zitat von: StefanStrobel am 04 August 2023, 16:26:08Poste doch mal einen Auszug aus den gelieferten Daten, dann sieht man besser, was es noch für Optionen geben könnte.


JSON
"PowerIn": {
            "tagName": "PowerIn",
            "guid": "di://powermeter@ERCXX-XXXXXXXXXX?input=0",
            "value": 182.00202224469163
          },


HTTP 1.1
"PowerIn":{"tagName":"PowerIn","guid":"di:\/\/powermeter@ERCXX-XXXXXXXXX?input=0","value":182.00202224469163},"

topa_LE

Das sind die Reading die sich ständig ändern:

"PowerInstalledPeak": {
            "tagName": "PowerInstalledPeak",
            "guid": "8c569b53-477e-4648-91aa-0f8524178949",
            "value": 5500
          },

"PowerIn": {
            "tagName": "PowerIn",
            "guid": "di://powermeter@ERCXX-XXXXXXXX?input=0",
            "value": 152.2263097805404
          },
       
       
"PowerIn": {
            "tagName": "PowerIn",
            "guid": "di://powermeter@ERCXX-XXXXXXXX?input=1",
            "value": 474.934036939314
          },
      

Die Input 0 und 1 sind die beiden S0 Zähler die verbaut sind.       

"PowerIn": {
            "tagName": "PowerIn",
            "guid": "876fc3f7-f31e-4eb3-923c-5d43d3f72b26",
            "value": 0
          },

"PowerIn": {
            "tagName": "PowerIn",
            "guid": "49beb2c8-a79f-45c7-9e2e-001e03fb87df",
            "value": 0
          },
       
Die beiden hier sind immer gleich und bedeuten den aktuellen Netzbezug/Verbrauch.      

topa_LE

Beim JSON String fehlte scheinbar noch etwas:
Beispiel komplett

{
  "result": {
    "items": [
      {
        "tagValues": {
          "DegreeInclination": {
            "tagName": "DegreeInclination",
            "guid": "8c569b53-477e-4648-91aa-0f8524178949",
            "value": 38
          }
  }
}
    ]
  }
}
 

topa_LE

Gibt es hier keinen außer Stefan, der da unterstützen kann?

StefanStrobel

Mit einer Regex wie
input=0",\s*"value": ([\d. ]+)bekommst Du z.B. den Wert, der auf Input=0 folgt. Ähnlich könntest Du auf die GUIDs matchen.

Gruß
  Stefan

topa_LE

Danke Stefan,

So kommt aber kein Reading rein:

attr MR_Solarwatt reading24Name S0_garage_test
attr MR_Solarwatt reading24Regex input=0",\s*"value": ([\d.]+)

So auch nicht:

attr MR_Solarwatt reading24Name S0_garage_test
attr MR_Solarwatt reading24Regex input=0",\s*"value": ([\d. ]+)"

Irgendwas scheint noch nicht zu passen.

topa_LE

So habst gelöst  ;D

So wäre die richtig zu matchen:

attr MR_Solarwatt reading10Name S0_1_Stromverbrauch_Garage_Schuppen
attr MR_Solarwatt reading10Regex (?s)PowerIn?.*input=0",\s*"value":([0-9]+\.[0-9]+)

Besten Dank an Dich Stefan für den Weg zum Ziel ...

topa_LE

Hallo Stefan,

hättest Du noch die korrekte Definition für eine GUID ?

Danke

StefanStrobel

Die konkreten GUIDs kenne ich leider nicht. Ich hoffe, dass die eindeutige sind. Dann kannst Du sie einfach aus dem JSON übernehmen.

Gruß
    Stefan

topa_LE

Hallo Stefan,

Kenne mich mit regEx kaum aus und teste sehr viel bis es passt.

Bei WorkIn gibt es auch 4 verschiedene Werte und Möglichkeiten.
Daher komme ich mit nur "input 0 und 1" nicht eindeutig zum Ziel.

z.B. gibt mir das hier 4 verschiedene Readingwerte und nicht eindeutig, das was es soll.

WorkIn?.*?input=1","value":([\d.]+)
Also immer wieder andere der restlichen 3 Werte.

In diesem RegEx brauche ich eben zusätzlich noch die GUID mit drin:
"guid":"di:\/\/powermeter@ERC05-XXXX?input=0"
um das Reading 5691611 zu erhalten.

Komplett HTTP Response:
WorkIn":{"tagName":"WorkIn","guid":"di:\/\/powermeter@ERC05-XXXX?input=0","value":5691611}

Wie würde das denn jetzt komplett zusammengebaut auszusehen haben?

Wie gesagt bei PowerIn passt es , weil es hier eben nur input0 und 1 gibt.

Bei WorkIn reicht:
(?s)WorkIn?.*?input=0","value":([\d.]+)
nicht aus, da nicht eindeutig genug.

Die 4 GUID von WorkIn sind eben:

"guid":"di:\/\/powermeter@ERC05-XXXX?input=0"
"guid":"di:\/\/powermeter@ERC05-XXXX?input=1"
"guid": "876fc3f7-f31e-4eb3-923c-5d43d3f72b26"
"guid": "49beb2c8-a79f-45c7-9e2e-001e03fb87df"

Könnte man das so vollständig in RegEx definieren, hätte man die Eindeutigkeit erreicht und würde das exakte Reading erhalten. Voraussetzung ist natürlich, das im RegEx weiterhin WorkIn drin ist.

Danke, Stefan.

LG

StefanStrobel

Eigentlich musst du das nur zusammenbauen.
Z.B.
WorkIn","guid":"di:....powermeter@ERC05-XXXX.input=0","value":\s*([\d.]+)
Am besten mit https://regex101.com/ testen.

Mit .* wäre ich vorsichtig. Das macht eventuell zu viel und geht schon in den nächsten Abschnitt.

Gruß
   Stefan

topa_LE

Danke Stefan,

werde ich testen.

Ja .* , hatte ich gemerkt ist zu viel teilweise. War nur froh das ich überhaupt paar Werte hatte.

topa_LE

Perfekt Stefan, passt nun alles. Großes Dankeschön.

Werde das nun mal alles zusammenstellen und das Endergebnis hier posten.

Vielleicht gibt es den ein oder anderen der Solarwatt nutzt ...
(hatte zwar hier die letzten Wochen nicht den Anschein aber na gut  ;) )