Solarwatt MyReserve per JSON auslesen - Readings

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

Vorheriges Thema - Nächstes Thema

topa_LE

Photovoltaik erweitert mit Stromspeicher von Solarwatt (My Reserve)

Fronius Sym 6.03 habe ich nun erweitert mit den  Stromspeichern MyReserve von Solarwatt. Da nun der Batteriespeicher von den WR geschaltet wird, werden meine bisherigen Daten gerade bei der PV-Produktion verfälscht.

Möchte das ganze nun aus dem EnergyManager auslesen. Zusätzlich ist noch ein PDG (Raspi) per Bluetooth verbunden. Diese JSON Daten sind aber nicht ganz so aussagekräftig. Per IP-RASPI:8080 kann man diese auch abrufen.

Möchte allerdings von AC  Sensor und dem EnergyManager diese Daten in FHEM per Readings bereitstellen.

Dazu dient die URL:

http://192.168.178.160/rest/kiwigrid/wizard/devices (IP vom EnergyManager)

Diese JSON Daten möchte ich nun gerne per Readings haben.

Hab das mal so probiert:
attr httpmod_MR_Solarwatt_Stromspeicher reading01Name MR_Batteriestand
attr httpmod_MR_Solarwatt_Stromspeicher reading01OMap null:0
attr httpmod_MR_Solarwatt_Stromspeicher reading01Regex "VoltageBatteryCellMean.value"[ : \t]+([-+]?[a-z\d\.]+)

Funktioniert nicht, habe gerade eine Blockade im Ansatz, kann mir da einer helfen?

Die JSON fängt immer mit "results" items an ...

Weiß daher nicht wie ich das umbauen kann.

{"result":{"items":[{"guid":"urn:solarwatt:myreserve:bcxxx","deviceModel":[{"deviceClass":"com.kiwigrid.lib.device.Device"},{"deviceClass":"com.kiwigrid.devices.inverter.Inverter"},{"deviceClass":"com.kiwigrid.devices.batteryconverter.BatteryConverter"},{"deviceClass":"com.kiwigrid.devices.solarwatt.MyReserve"}],"tagValues":{"IdFingerPrint":{"value":"urn:solarwatt:myreserve:bc:xxx","guid":"urn:solarwatt:myreserve:bc:xxx","tagName":"IdFingerPrint"},"CountBatteryContactor":{"value":2,"guid":"urn:solarwatt:myreserve:bc:xxx","tagName":"CountBatteryContactor"},"StateOfChargeReactivateDischarging":{"value":null,"guid":"urn:solarwatt:myreserve:bc:xxx","tagName":"StateOfChargeReactivateDischarging"},"StateVisibleIsSet":{"value":true,"guid":"urn:solarwatt:myreserve:bc:xxx","tagName":"StateVisibleIsSet"},"VoltageBatteryCellMean":{"value":3.503,"guid":"urn:solarwatt:myreserve:bc:xxx","tagName":"VoltageBatteryCellMean"},"IdFirmwareGRM":{"value":null,"guid":"urn:solarwatt:myreserve:bc:xxx","tagName":"IdFirmwareGRM"},"WorkCapacity":{"value":null,"guid":"urn:solarwatt:myreserve:bc:xxx","tagName":"WorkCapacity"},"StateOfChargeMinimum"::
Wie müsste die Definition zusammengesetzt werden?


amenomade

Setze einmal extractAllJSON, und Du wirst sehen, was Du als readingXXJSON dann definieren kannst
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

topa_LE

Zitat von: amenomade am 25 Juni 2019, 22:38:48
Setze einmal extractAllJSON, und Du wirst sehen, was Du als readingXXJSON dann definieren kannst

Ok danke. Jetzt habe ich ne Liste ...

z.B.

setstate httpmod_MR_Solarwatt_Stromspeicher 2019-06-26 07:59:41 result_items_01_tagValues_WorkACOut_value 3840.20497881806

Wie würde ich das nun zusammensetzen?


reading01Name
MR_Batteriestand

reading01OMap
null:0

reading01Regex
"result_items_01_tagValues_WorkACOut_value":[ \t]+"([\d\.]+)"


So in etwa?

topa_LE

So hab selbst gelöst!

Es gibt da leider wenige Dokumentationen zu den JSON Url's. Aber es gibt noch diese hier:

http://IP-EnergyManager/rest/kiwigrid/eps/powerValues

Darüber lassen sich die wichtigsten Readings erzeugen.

Wer es gebrauchen kann hier die Defines:

defmod httpmod_MR_Solarwatt_Stromspeicher HTTPMOD http://192.168.178.160/rest/kiwigrid/eps/powerValues 10
attr httpmod_MR_Solarwatt_Stromspeicher userattr reading01Name reading01OMap reading01Regex reading02Name reading02OMap reading02Regex reading03Name reading03OMap reading03Regex reading04Name reading04OMap reading04Regex reading05Name reading05OMap reading05Regex
attr httpmod_MR_Solarwatt_Stromspeicher DbLogExclude .*
attr httpmod_MR_Solarwatt_Stromspeicher alias My Reserve - Solarwatt 4.8 kW
attr httpmod_MR_Solarwatt_Stromspeicher enableControlSet 1
attr httpmod_MR_Solarwatt_Stromspeicher enableCookies 1
attr httpmod_MR_Solarwatt_Stromspeicher event-on-change-reading .*
attr httpmod_MR_Solarwatt_Stromspeicher group PV Solaranlage FRONIUS
attr httpmod_MR_Solarwatt_Stromspeicher icon message_light_intensity
attr httpmod_MR_Solarwatt_Stromspeicher reading01Name PV_Produktion_Gesamt
attr httpmod_MR_Solarwatt_Stromspeicher reading01OMap null:0
attr httpmod_MR_Solarwatt_Stromspeicher reading01Regex "powerProduced"[ : \t]+([-+]?[a-z\d\.]+)
attr httpmod_MR_Solarwatt_Stromspeicher reading02Name Eigenverbrauch_Aktuell
attr httpmod_MR_Solarwatt_Stromspeicher reading02OMap null:0
attr httpmod_MR_Solarwatt_Stromspeicher reading02Regex "powerConsumed"[ : \t]+([-+]?[a-z\d\.]+)
attr httpmod_MR_Solarwatt_Stromspeicher reading03Name Netzeinspeisung_Aktuell
attr httpmod_MR_Solarwatt_Stromspeicher reading03OMap null:0
attr httpmod_MR_Solarwatt_Stromspeicher reading03Regex "powerOut"[ : \t]+([-+]?[a-z\d\.]+)
attr httpmod_MR_Solarwatt_Stromspeicher reading04Name Netzbezug_Aktuell
attr httpmod_MR_Solarwatt_Stromspeicher reading04OMap null:0
attr httpmod_MR_Solarwatt_Stromspeicher reading04Regex "powerIn"[ : \t]+([-+]?[a-z\d\.]+)
attr httpmod_MR_Solarwatt_Stromspeicher room 16-HW-Raum
attr httpmod_MR_Solarwatt_Stromspeicher userReadings Solar_Produktion { round( ReadingsVal($name,"PV_Produktion_Gesamt",0),0) }

amenomade

Zitat von: topa_LE am 26 Juni 2019, 08:06:06
setstate httpmod_MR_Solarwatt_Stromspeicher 2019-06-26 07:59:41 result_items_01_tagValues_WorkACOut_value 3840.20497881806


Etwas wie

attr httpmod_MR_Solarwatt_Stromspeicher  reading10Name WorkACOut
attr httpmod_MR_Solarwatt_Stromspeicher  reading10JSON result_items_.*_tagValues_WorkACOut_value
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

topa_LE

@amenomade

Ja es gibt zwei URL's

http://192.168.178.160/rest/kiwigrid/eps/powerValues
Diese hier funktioniert wie oben erklärt, nur fehlen da sämtliche Dinge was den Batteriespeicher betrifft. (Ladung, Entladung etc.)


http://192.168.178.160/rest/kiwigrid/wizard/devices
Hier sind sehr viele andere Daten abgreifbar, nur die items aber immer wieder andere Nummer, Daher kann ich die allEXTRACTJason nicht nutzen.

Das wäre hier die Batterieladung

result_items_08_tagValues_PowerBufferedFromProducers_tagName PowerBufferedFromProducers
result_items_08_tagValues_PowerBufferedFromProducers_value 377.21


PowerBufferedFromProducers -> Tag


{"value":9.044,"guid":"urn:solarwatt:myreserve:bc:a30b000b2137","tagName":"CurrentBatteryIn"},"TemperatureBatteryMin":{"value":27,"guid":"urn:solarwatt:myreserve:bc:a30b000b2137","tagName":"TemperatureBatteryMin"},"TemperatureBatteryCellMin":

Wie kann man nun ohne JSONExtract aus den oben zwei Zeilen userreadings bauen , um den "value" als Reading zu lesen?

topa_LE

Zitat von: amenomade am 29 Juni 2019, 13:41:48
Etwas wie

attr httpmod_MR_Solarwatt_Stromspeicher  reading10Name WorkACOut
attr httpmod_MR_Solarwatt_Stromspeicher  reading10JSON result_items_.*_tagValues_WorkACOut_value


Ok, perfekt, ich teste das mal!  ;)

amenomade

Um eine andere URL abzurufen, machst Du ein zusätzliches get:
attr httpmod_MR_Solarwatt_Stromspeicher  get50Name Block2
attr httpmod_MR_Solarwatt_Stromspeicher  get50URL http://die-andere-URL
attr httpmod_MR_Solarwatt_Stromspeicher  get50Poll 1
Das letzte, damit dieses get beim jedem Aufruf der HauptURL mit aufgerufen wird.

extractAllJSON ist i.d.R. nur am Anfang da, damit man die Struktur der benötigten readingXXJSON einfach sehen kann. Danach kann es weg.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

topa_LE

Hab das jetzt erstmal zum Testen in ein separates Define gepackt.

defmod httpmod_MR_Stromspeicher_Devices HTTPMOD http://192.168.178.160/rest/kiwigrid/wizard/devices 15
attr httpmod_MR_Stromspeicher_Devices userattr reading10JSON reading10Name
attr httpmod_MR_Stromspeicher_Devices DbLogExclude .*
attr httpmod_MR_Stromspeicher_Devices enableControlSet 1
attr httpmod_MR_Stromspeicher_Devices enableCookies 1
attr httpmod_MR_Stromspeicher_Devices enforceGoodReadingNames 1
attr httpmod_MR_Stromspeicher_Devices handleRedirects 1
attr httpmod_MR_Stromspeicher_Devices reading10JSON result_items_.*_tagValues_WorkACOut_value
attr httpmod_MR_Stromspeicher_Devices reading10Name WorkACOut


So kommt das eine Reading für WorkACOUT auch nicht rein. Fehlt da noch irgendein Attribut?

amenomade

Also.... zu welcher URL gehört WorkACOut?
Am besten poste immer ein "list" vom HTTPMOD statt eine Raw Definition, und setze verbose 5 auf dem httpmod und poste auch die Log
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

topa_LE

Gehört zu der URL, die eben nicht geht.
http://192.168.178.160/rest/kiwigrid/wizard/devices

Internals:
   .getList   
   .setList   interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
   .updateReadingList 1
   .updateRequestHash 1
   BUSY       0
   CFGFN     
   CHANGED   
   DEF        http://192.168.178.160/rest/kiwigrid/wizard/devices 15
   FUUID      5d174469-f33f-252b-8c98-858e80e8c22a8298
   Interval   15
   JSONEnabled 1
   LASTSEND   1561809747.63541
   MainURL    http://192.168.178.160/rest/kiwigrid/wizard/devices
   ModuleVersion 3.5.9 - 13.2.2019
   NAME       httpmod_MR_Stromspeicher_Devices
   NOTIFYDEV  global
   NR         8059
   NTFY_ORDER 50-MR
   STATE      ???
   TRIGGERTIME 1561809762.63343
   TRIGGERTIME_FMT 2019-06-29 14:02:42
   TYPE       HTTPMOD
   addr       http://192.168.178.160:80
   auth       0
   buf       
   code       200
   compress   1
   conn       
   data       
   displayurl http://192.168.178.160/rest/kiwigrid/wizard/devices
   header     Cookie: emsid="70e672e6-7614-4038-9177-aea67cf9af3d"
   host       192.168.178.160
   httpheader HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: application/json; charset=UTF-8
Content-Length: 95864
   httpversion 1.0
   hu_blocking 0
   hu_filecount 188
   hu_port    80
   hu_portSfx
   ignoreredirects 1
   loglevel   4
   path       /rest/kiwigrid/wizard/devices
   protocol   http
   redirects  0
   timeout    2
   url        http://192.168.178.160/rest/kiwigrid/wizard/devices
   value      0
   .attreocr:
     .*
   .readingParseList:
   QUEUE:
   READINGS:
   REQUEST:
     data       
     header     
     ignoreredirects 0
     retryCount 0
     type       update
     url        http://192.168.178.160/rest/kiwigrid/wizard/devices
     value      0
   sslargs:
Attributes:
   DbLogExclude .*
   enableControlSet 1
   event-on-change-reading .*
   reading10JSON result_items_.*_tagValues_WorkACOut_value
   reading10Name WorkACOut
   reading20JSON result_items_.*_tagValues_CurrentBatteryIn_value
   reading20Name CurrentBatteryIn
   reading30JSON result_items_.*_tagValues_PowerBufferedFromProducers_value
   reading30Name Batterieladung
   userattr   reading10JSON reading10Name reading20JSON reading20Name reading30JSON reading30Name
   verbose    5

topa_LE

#11
Dies wäre hier der komplette Block, der zu WorkACOut gehört:


setstate httpmod_MR_Solarwatt_Stromspeicher 2019-06-26 07:59:41 result_items_01_tagValues_WorkACOut_guid urn:solarwatt:myreserve:bc:xxxxxxxxxx137
setstate httpmod_MR_Solarwatt_Stromspeicher 2019-06-26 07:59:41 result_items_01_tagValues_WorkACOut_tagName WorkACOut
setstate httpmod_MR_Solarwatt_Stromspeicher 2019-06-26 07:59:41 result_items_01_tagValues_WorkACOut_value 3840.20497881806


Vielleicht muss auch noch die guid übergeben werden?

topa_LE

Aus einem fremden Post (HowTo) bei OpenHab habe ich das hier gefunden:

//Rules-Datei für Energie

rule "Get Power Usage"
    when
        Time cron "0/15 * * * * ?"
    then       
        var String json = sendHttpGetRequest("http://192.XXX.XXX.XXX/rest/kiwigrid/wizard/devices")

        //Batteriestand
        var String value = transform("JSONPATH", "$.result.items[?(@.guid == 'urn:solarwatt:myreserve:bc:xxxxxxxxxxx')].tagValues.StateOfCharge.value", json)
        value = value.stripStart("[")
        value = value.stripEnd("]")
        var Number value2 = DecimalType.valueOf(value)
        postUpdate(energieLadestand, value2) 

        //Einspeisung
        value = transform("JSONPATH", "$.result.items[?(@.guid == 'urn:kiwigrid:location:XXXXX-XXXXXXXX:0')].tagValues.PowerOut.value", json)
        value = value.stripStart("[")
        value = value.stripEnd("]")
        value2 = DecimalType.valueOf(value)
        postUpdate(energieEinspeisung, value2)
       
        //Batterieladung
        value = transform("JSONPATH", "$.result.items[?(@.guid == 'urn:kiwigrid:location:XXXXX-XXXXXXXX:0')].tagValues.PowerBufferedFromProducers.value", json)
        value = value.stripStart("[")
        value = value.stripEnd("]")
        value2 = DecimalType.valueOf(value)
        postUpdate(energieBatterieladung, value2)
       
        //Gesamterzeugung
        value = transform("JSONPATH", "$.result.items[?(@.guid == 'urn:kiwigrid:location:XXXXX-XXXXXXXX:0')].tagValues.PowerProduced.value", json)
        value = value.stripStart("[")
        value = value.stripEnd("]")
        value2 = DecimalType.valueOf(value)
        postUpdate(energieGesamterzeugung, value2)

        //Bezug
        value = transform("JSONPATH", "$.result.items[?(@.guid == 'urn:kiwigrid:location:XXXXX-XXXXXXXX:0')].tagValues.PowerConsumedFromGrid.value", json)
        value = value.stripStart("[")
        value = value.stripEnd("]")
        value2 = DecimalType.valueOf(value)
        postUpdate(energieBezug, value2)

        //Batterieentladung
        value = transform("JSONPATH", "$.result.items[?(@.guid == 'urn:kiwigrid:location:XXXXX-XXXXXXXX:0')].tagValues.PowerConsumedFromStorage.value", json)
        value = value.stripStart("[")
        value = value.stripEnd("]")
        value2 = DecimalType.valueOf(value)
        postUpdate(energieBatterieentladung, value2)

        //Gesamtverbrauch
        value = transform("JSONPATH", "$.result.items[?(@.guid == 'urn:kiwigrid:location:XXXXX-XXXXXXXX:0')].tagValues.PowerConsumed.value", json)
        value = value.stripStart("[")
        value = value.stripEnd("]")
        value2 = DecimalType.valueOf(value)
        postUpdate(energieGesamtverbrauch, value2)           
end


Dort wird ja auch GUID übergeben/ausgelesen.

Wie man das nun in FHEM umsetzt, ist mir bisher leider nicht klar.

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

topa_LE

#14
Welche meinst Du? Im normalen LOG steht nix drin, trotz verbose 5.

Nach set start im Define kommt nur das im Log:
2019.06.29 15:50:00 5: httpmod_MR_Stromspeicher_Devices: set called with start
2019.06.29 15:50:00 4: httpmod_MR_Stromspeicher_Devices: update timer modified: will call GetUpdate in 15.0 seconds at 2019-06-29 15:50:15