FHEM - Anwendungen > Solaranlagen

lokale Anbindung SENEC Batterie an FHEM

(1/19) > >>

cjung:
Ich habe mich jetzt durch die Doku von HTTPMod gearbeitet und meinen Batteriespeicher lokal ausgelesen.
Der wichtigste Wert ist für mich PV1_POWER_RATIO, der in der normalen SENEC Oberfläche 'PV-Begrenzung' genannt ist. Da meine Einspeisung auf max 70 % limitiert ist, möchte ich beim Erreichen des Limits weitere Verbraucher einschalten um neben der Batterie auch noch z.B. die Wasch- oder Spülmaschine einzuschalten.

Mit der folgenden Konfiguration bekomme ich jetzt den Wert der PV-Begrenzung und die aktuelle Produktion ins FHEM:

--- Code: ---define SENEC HTTPMOD http://192.168.178.123/lala.cgi 30
attr SENEC enableControlSet 1
attr SENEC reading01JSON PV1_POWER_RATIO
attr SENEC reading01Name PV-Begrenzung
attr SENEC reading01OExpr {hex( (split ('_',$val,0 ))[1] )}
attr SENEC reading02JSON ENERGY_GUI_INVERTER_POWER
attr SENEC reading02Name PV-Erzeugung
attr SENEC reading02OExpr {sprintf("%.2f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
attr SENEC reading03JSON ENERGY_GUI_BAT_DATA_FUEL_CHARGE
attr SENEC reading03Name AKKU-Beladung
attr SENEC reading03OExpr {sprintf("%.2f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
attr SENEC reading04JSON ENERGY_GUI_BAT_DATA_POWER
attr SENEC reading04Name AKKU-Entnahme
attr SENEC reading04OExpr {sprintf("%.2f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
attr SENEC reading05JSON ENERGY_GUI_HOUSE_POW
attr SENEC reading05Name Haus-Stromverbrauch
attr SENEC reading05OExpr {sprintf("%.2f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
attr SENEC reading06JSON PM1OBJ1_P_TOTAL
attr SENEC reading06Name Netz-Einspeisung
attr SENEC reading06OExpr {sprintf("%.2f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
attr SENEC requestData {"PV1":{"POWER_RATIO":""},"ENERGY":{"GUI_HOUSE_POW":"","GUI_INVERTER_POWER":"","GUI_BAT_DATA_POWER":"","GUI_BAT_DATA_FUEL_CHARGE":"","STAT_STATE":""},"PM1OBJ1":{"P_TOTAL":""}}

--- Ende Code ---

Anmerkung: Wenn keine PV-Begrenzung aktiv ist, ist der Wert 100, wenn sie aktiv ist, geht der Wert in Schritten auf max 70 runter.
In meinem Fall gibt es einen ABB Zweirichtungszähler vor dem - leider nicht auslesbaren - Zähler des Versorgers (ECHELON Zähler), der per ModBus an der Batterie angeschlossen ist, um die tatsächliche Einspeisung zur ermitteln. Zusätzlich ist ein Fronius Wechselrichter per IP angeschlossen, den ich auch per HTTPMOD auslesen kann.

Besonderen Dank an die Diskussion zur HEX Umrechnung im Thread Thread sonst hätte ich nie verstanden, dass die beiden Werte unterschiedlich umzurechnen sind. Weitere Anregungen habe ich mir aus OpenHAB geholt

Es gibt noch eine größere Menge anderer Werte, aber leider scheint es keinen kumulierten Zähler zur Tageseinspeisung oder Produktion zu geben.
Senec bietet auf Mein-Senec ein Portal mit den kumulierten Daten an. Evtl. versuche ich die Daten dort auszulesen.

Wie haben andere das gelöst ?


Änderung27.01.: Ich habe weitere Felder aufgenommen und die Werte auf zwei Stellen hinter dem Komma erweitert.

Nielsiwilsi:
Super, Danke für deine Mühen. Den Speicher auslesen steht bei mir auf der ToDo Liste, allerdings hatte ich noch nicht die Zeit, das anzugehen.
Ich werde deinen Code heute Abend mal bei mir testen.
Habe ein ganz ähnliches Setup wie du, aber einen Wechselrichter von SolarEdge, den ich soweit ich weiß nicht auslesen kann. Es gibt aber ein Modul, dass die Web-API abfragt.

VG
Niels

ritter_runkel:
Guten Morgen,
ich habe auch einen Senec-Speicher und bin leicht gefrustet, das Senec trotz mehrfacher Nachfragen nicht willens scheint einen Zugang zu DEREN Daten aus MEINEM System bereit zu stellen.

Ich habe mit Freude Deinen Ansatz gelesen und versucht ihn für meine Zwecke anzupassen.
ACHTUNG - keine Ahnung von Programmierung - eher mutiges Reengineering ;-)

Ich habe versucht Deine Variablen ("ENERGY_GUI_INVERTER_POWER", "PV1_POWER_RATIO") einfach durch die für mich interessanten Werte
Batterieleistung(W) --> ENERGYGUI_BAT_DATA_POWER. (auf der gleichen Webpage)
Akkuentnahme --> GuiDataOverViewPowerBatteryDischarge (auf der Statusseite)
Akkubeladung --> GuiDataOverViewPowerBatteryCharge (auf der Statusseite)
zu ersetzen.

Ich bekomme es mit dieser Methode allerdings nicht mal hin, dass die Readings im Device entsprechend angelegt werden.

Habt Ihr einen Ansatz wie ich an diese Daten komme?
Grüße aus Leipzig!
Erik
Das Device sieht dann so aus:

--- Code: ---defmod SENEC HTTPMOD http://192.168.100.68/lala.cgi 30
attr SENEC userattr reading01JSON reading01Name reading01OExpr reading02JSON reading02Name reading02OExpr reading03JSON reading03Name reading03OExpr requestData
attr SENEC enableControlSet 1
attr SENEC reading01JSON GuiDataOverViewPowerBatteryDischarge
attr SENEC reading01Name Akkuentnahme
attr SENEC reading01OExpr {sprintf("%.0f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
attr SENEC reading02JSON ENERGYGUI_BAT_DATA_POWER
attr SENEC reading02Name Batterieleistung
attr SENEC reading02OExpr {sprintf("%.0f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
attr SENEC reading03JSON GuiDataOverViewPowerBatteryCharge
attr SENEC reading03Name Akkubeladung
attr SENEC reading03OExpr {sprintf("%.0f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
attr SENEC requestData {"Akkuentnahme":{"GuiDataOverViewPowerBatteryDischarge":""},"Batterieleistung":{"ENERGYGUI_BAT_DATA_POWER":""},"Akkubeladung":{"GuiDataOverViewPowerBatteryCharge":""}}


--- Ende Code ---
bzw:

--- Code: ---Internals:
   BUSY       0
   CFGFN     
   CHANGED   
   DEF        http://192.168.100.68/lala.cgi 30
   FUUID      5e276be5-f33f-47a1-1ca1-06dfbfa4a53d9ebe
   Interval   30
   JSONEnabled 1
   LASTSEND   1579676919.78724
   MainURL    http://192.168.100.68/lala.cgi
   ModuleVersion 3.5.21 - 27.12.2019
   NAME       SENEC
   NOTIFYDEV  global
   NR         18660
   NTFY_ORDER 50-SENEC
   STATE      ???
   TRIGGERTIME 1579676949.78585
   TRIGGERTIME_FMT 2020-01-22 08:09:09
   TYPE       HTTPMOD
   addr       http://192.168.100.68:80
   auth       0
   code       200
   compress   1
   conn       
   data       {"Akkuentnahme":{"GuiDataOverViewPowerBatteryDischarge":""},"Batterieleistung":{"ENERGYGUI_BAT_DATA_POWER":""},"Akkubeladung":{"GuiDataOverViewPowerBatteryCharge":""}}
   displayurl http://192.168.100.68/lala.cgi
   header     
   host       192.168.100.68
   httpheader HTTP/1.0 200 OK
Content-Type: application/json; charset=utf-8
   httpversion 1.0
   hu_blocking 0
   hu_filecount 59
   hu_port    80
   hu_portSfx
   ignoreredirects 0
   loglevel   4
   path       /lala.cgi
   protocol   http
   redirects  0
   timeout    2
   url        http://192.168.100.68/lala.cgi
   value      0
   QUEUE:
   READINGS:
     2020-01-22 08:08:36   PV-Begrenzung   100
   REQUEST:
     data       {"Akkuentnahme":{"GuiDataOverViewPowerBatteryDischarge":""},"Batterieleistung":{"ENERGYGUI_BAT_DATA_POWER":""},"Akkubeladung":{"GuiDataOverViewPowerBatteryCharge":""}}
     header     
     ignoreredirects 0
     retryCount 0
     type       update
     url        http://192.168.100.68/lala.cgi
     value      0
   defptr:
     readingBase:
       PV-Begrenzung reading
     readingNum:
       PV-Begrenzung 01
     readingOutdated:
     requestReadings:
       update:
         PV-Begrenzung reading 01
   sslargs:
Attributes:
   enableControlSet 1
   reading01JSON GuiDataOverViewPowerBatteryDischarge
   reading01Name Akkuentnahme
   reading01OExpr {sprintf("%.0f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
   reading02JSON ENERGYGUI_BAT_DATA_POWER
   reading02Name Batterieleistung
   reading02OExpr {sprintf("%.0f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
   reading03JSON GuiDataOverViewPowerBatteryCharge
   reading03Name Akkubeladung
   reading03OExpr {sprintf("%.0f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
   requestData {"Akkuentnahme":{"GuiDataOverViewPowerBatteryDischarge":""},"Batterieleistung":{"ENERGYGUI_BAT_DATA_POWER":""},"Akkubeladung":{"GuiDataOverViewPowerBatteryCharge":""}}
   userattr   reading01JSON reading01Name reading01OExpr reading02JSON reading02Name reading02OExpr reading03JSON reading03Name reading03OExpr requestData

--- Ende Code ---


cjung:
Hallo ritter_runkel

Im Code der Seite ist Batterieleistung(W)  und Akkuentnahme der gleiche abgefragte Wert. Die Batterieleistung wird dabei als float umgerechnet und in W angezeigt, die Akkuentnahme wird auf positive Ganzzahl abgeschnitten und in kW angezeigt. Bei mir ist gerade Nacht und der Akku ist fast leer: BatterieLeistung ist -1.44 und Akkuentnahme ist 0

Ob ich die Floatzahl aber richtig umrechne, kann ich noch nicht sagen. Aber es kommen valide Werte raus.

Als erstes musst Du die richtigen Werte abfragen:

--- Code: ---attr SENEC requestData {"PV1":{"POWER_RATIO":""},"ENERGY":{"GUI_INVERTER_POWER":"","GUI_BAT_DATA_POWER":"","GUI_BAT_DATA_FUEL_CHARGE":""}}

--- Ende Code ---
Dann die Werte extrahieren und umrechnen:

--- Code: ---attr SENEC reading03JSON ENERGY_GUI_BAT_DATA_FUEL_CHARGE
attr SENEC reading03Name AKKU-Beladung
attr SENEC reading03OExpr {sprintf("%.0f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
attr SENEC reading04JSON ENERGY_GUI_BAT_DATA_POWER
attr SENEC reading04Name AKKU-Entnahme
attr SENEC reading04OExpr {sprintf("%.0f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}

--- Ende Code ---

ritter_runkel:
Erstmal lieben Dank für die Unterstützung!
es ist wieder dunkel - und da ist 0 in jeder Codierung 0 ;)

Ich schaue mir das morgen live mal an.

Den Code verstanden - im Sinne "ich kann ihn erweitern/verändern" - habe ich noch nicht. Dazu müsste ich die Website besser verstehen.
Aber das schaffe ich für meine Zwecke noch.

Grüße aus Leipzig
//Erik

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln