Jump to content

WARP Energy Manager Beta-Firmware mit SunSpec-Unterstützung


Recommended Posts

Geschrieben

Moin,

In den letzten Monaten haben wir daran gearbeitet, dass der WARP Energy Manager mit Stromzählern und Wechselrichtern kommunizieren kann, die das SunSpec-Protokoll implementieren. Damit muss bei unterstützten Stromzählern und Wechselrichtern nicht mehr ein zusätzlicher Stromzähler für den Energy Manager verbaut werden. Der Energy Manager kann dazu jetzt bis zu 7 Stromzähler verwalten und einen beliebigen dieser Stromzähler zur Regelung des PV-Überschussladens verwenden.

Changelog (1.0.91 - Beta 2)

  • Invalid Address Fehler bei Gerätesuche für SMA-Geräte repariert

Changelog (1.0.92 - Beta 3)

  • Sonderbehandlung für falsche Werte bei KOSTAL-Geräten hinzugefügt.
  • Detektion von Wechselrichter-Messwerten in der Nacht repariert; betrifft insbesondere SMA-Wechselrichter.
  • Performance von SunSpec-Geräten mit float-Modellen verbessert; reduziert das Risiko von Timeouts beim Auslesen.

Changelog (1.0.93 - Beta 4)

  • Anzeige der Wechselrichterleistung repariert.
  • Anzeige der Phasenströme bei SMA-Wechselrichtern repariert.
  • Leseperformance verbessert, insbesondere bei ModBus-RTU-Bridges.

Changelog (1.0.94 - Beta 5)

  • Wechselrichterleistung wird jetzt in der Tabelle und im Graph angezeigt.

Unterstützte Stromzähler

Der Energy Manager sollte jetzt Messwerte von allen Geräten auslesen können, die eins der Wechselrichter-Modelle 101 bis 103 bzw. 111 bis 113, oder eins der Stromzähler-Modelle (201 bis 204 bzw. 211 bis 214) anbieten. Eine Liste von zertifizierten Geräten findet sich hier: https://sunspec.org/certified-registry/ (die jeweils unterstützten Modelle werden als "ModBusModels" aufgelistet)

Konfiguration eines SunSpec-Stromzählers

Gegebenenfalls muss SunSpec zuerst beim Stromzähler oder Wechselrichter aktiviert werden!

Screenshot_20231030_162141.png

Unter Energiemanager -> Stromzähler kann ein neuer Stromzähler konfiguriert werden. Aktuell kann die Nummer (von 0 bis 6) des neuen Stromzählers frei gewählt werden. Nach Auswahl der Klasse "SunSpec" können der Hostname oder die IP, sowie gegebenenfalls der Port gewählt werden, auf dem der Wechselrichter oder Stromzähler erreichbar ist. Danach kann eine Gerätesuche gestartet werden. Gefundene Geräte werden aufgelistet, durch Klick auf ein gefundenes Gerät wird es übernommen und kann hinzugefügt werden. Nach Speichern und Neustart sollte der konfigurierte Stromzähler erscheinen:

Screenshot_20231030_162336.png

Geänderte API

Die Unterstützung von mehr als einem Stromzähler hat dazu geführt, dass wir die Stromzähler-APIs grundlegend geändert haben. Wenn die SunSpec-Unterstützung die Beta-Phase verlässt, werden wir (über ein Legacy-API-Modul) die alte Zähler-API nachbilden, in dieser Beta ist die alte API aber noch nicht implementiert. Wenn eine externe Steuerung (EVCC, Node-RED usw.) die Zählerwerte des Energy Managers lesen oder schreiben soll, wird das mit dieser Beta-Firmware NICHT funktionieren. Dann bitte auf der alten Firmware bleiben, bzw. auf die frisch veröffentlichte 1.0.8 aktualisieren.

 

Wir freuen uns wie immer auf euer Feedback, insbesondere interessiert uns:
- Mit welchen Geräten funktioniert die SunSpec-Anbindung (nicht)?
- Tauchen unerwartete Messwerte auf? Ein Beispiel, dass wir bei einem KOSTAL Smart Energy Meter beobachtet haben (Später werden wir für solche Fälle Work-Arounds einbauen):

Screenshot_20231030_162524.png

 

 

 

 

energy_manager_firmware_1_0_94_65578f18_e09f667df6273d1_feature-meters-7_merged.bin

Geschrieben

'n Abend Erik,

dann mache ich hier mal den Anfang 🙃

Mein SMA Sunny Boy 2.5 scheint nicht (zumindest nicht auf Anhieb) zu funktionieren:

Starting scan
Resolving 192.168.xxx.xxx
Connecting to 192.168.xxx.xxx:502
Using device address 1
Using base address 40000
Reading SunSpec ID
Could not read SunSpec ID: ILLEGAL_ADDRESS (2)
Using device address 1
Using base address 50000
Reading SunSpec ID
No SunSpec ID found: ffffffff
Using device address 1
Using base address 0
Reading SunSpec ID
No SunSpec ID found: ffffffff
Using device address 2
Using base address 40000
Reading SunSpec ID
Could not read SunSpec ID: ILLEGAL_ADDRESS (2)
Using device address 2
Using base address 50000
Reading SunSpec ID
No SunSpec ID found: ffffffff
Using device address 2
Using base address 0
Reading SunSpec ID
No SunSpec ID found: ffffffff
Using device address 3
Using base address 40000
Reading SunSpec ID
Could not read SunSpec ID: ILLEGAL_ADDRESS (2)
Using device address 3
Using base address 50000
Reading SunSpec ID
No SunSpec ID found: ffffffff
Using device address 3
Using base address 0
Reading SunSpec ID
No SunSpec ID found: ffffffff
Using device address 4
Using base address 40000
Reading SunSpec ID
Could not read SunSpec ID: DEVICE_FAILED_TO_RESPOND (11)
Using device address 5
Using base address 40000
Reading SunSpec ID
Could not read SunSpec ID: DEVICE_FAILED_TO_RESPOND (11)

...

Using device address 125
Using base address 40000
Reading SunSpec ID
Could not read SunSpec ID: DEVICE_FAILED_TO_RESPOND (11)
Using device address 126
Using base address 40000
Reading SunSpec ID
SunSpec ID found
Reading Common Model
Common Model found
Could not read Common Model block: ILLEGAL_ADDRESS (2)
Using device address 126
Using base address 50000
Reading SunSpec ID
No SunSpec ID found: ffffffff
Using device address 126
Using base address 0
Reading SunSpec ID
No SunSpec ID found: ffffffff
Using device address 127
Using base address 40000
Reading SunSpec ID
Could not read SunSpec ID: DEVICE_FAILED_TO_RESPOND (11)

...

Using device address 247
Using base address 40000
Reading SunSpec ID
Could not read SunSpec ID: DEVICE_FAILED_TO_RESPOND (11)
Disconnecting from 192.168.110.195
Scan finished

 

Ich bin mir allerdings auch nicht 100% sicher, ob die "kleinen" Wechselrichter SunSpec unterstützen...

Gruß Thomas

Geschrieben

Ich gehe davon aus das SunSpec aktiv ist, da die SunSpec ID gefunden wird bei Geräteadresse 126 (SMA Standardwert laut Dokumentation). Der Common Model Header wird auch gelesen, aber das Lesen des Common Model Blocks gibt dann einen ILLEGAL_ADDRESS Fehler. Es gibt gleich eine neue Firmware zum Testen.

Geschrieben
On 10/31/2023 at 9:09 AM, batti said:

hast du denn Sunspec aktiviert?

Ich hatte gestern Abend noch ein bisschen getestet, aber leider vergessen zu antworten 🙈

Modbus ist definitiv aktiv, wobei SunSpec bei SMA wohl unter Unit-ID 126 läuft (das passt ja auch zum o. g. Log) und per Node-RED kann ich auch diverse Daten abgreifen.

On 10/31/2023 at 9:17 AM, photron said:

Es gibt gleich eine neue Firmware zum Testen.

Besten Dank. Gerne kann ich die Firmware auch selbst aus dem Development Branch kompilieren, dann braucht ihr die nicht ständig zu pushen...

Geschrieben

@poohnet Dann teste mal bitte den aktuelle Stand des features-meters-7 Branch (Commit: meters-sun-spec: Avoid reading common model block padding). Vielleichthilft das. Der Common Model Block kann laut Spec 65 oder 66 Register lang sein. Alles was wir hier zum Testen haben hat de 65er Variante. SMA hat aber die 66 Variante. Der Code geht damit richtig um, denke ich, aber vielleicht mag SMA nicht, dass ich das eine Padding Register mit lese. Das habe ich gerade geändert.

Geschrieben

Hi @photron,

hier das aktuelle Log zur Unit-ID 126. Leider noch nicht wirklich erfolgreich:

Using device address 126
Using base address 40000
Reading SunSpec ID
SunSpec ID found
Reading Common Model
Common Model found (block-length: 66)
Common Model block has padding, reading data only
Could not read Common Model block (error: ILLEGAL_ADDRESS [2])
Using device address 126
Using base address 50000
Reading SunSpec ID
No SunSpec ID found (sun-spec-id: ffffffff)
Using device address 126
Using base address 0
Reading SunSpec ID
No SunSpec ID found (sun-spec-id: ffffffff)

 

Geschrieben

@poohnet Komisch! Kannst du bitte diese Script ausführen:

https://github.com/Tinkerforge/esp32-firmware/blob/feature-meters-7/software/src/modules/meters_sun_spec/discover.py

Du brauchst dazu pymodbus >= 3.5.x, am einfachsten über pip installieren.

python3 discover.py -H <sunny-boy-addresse> -d 126

Das Script liest jeden Wert einzeln, anstatt den ganzen Common Model Block in einem Rutsch zu lesen.

Geschrieben

Here we go (Seriennummer habe ich unkenntlich gemacht):

Using pymodbus version: 3.5.4
Using host: 192.168.xxx.xxx
Using port: 502
============================================================
Using device address: 126
------------------------------------------------------------
Using base address: 40000
Sun Spec ID found: 0x53756e53
Trying to read Common Model
  Common Model ID found: 1
  Common Model length: 66
  Manufacturer Name: SMA
  Model Name: Solar Inverter
  Options: 9302
  Version: 3.10.09.R
  Serial Number: xxxxxxxxxx
  Device Address: None
  Done
Trying to read Standard Model
  Standard Model ID found: 11
  Standard Model length: 13
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 12
  Standard Model length: 98
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 101
  Standard Model length: 50
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 120
  Standard Model length: 26
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 121
  Standard Model length: 30
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 122
  Standard Model length: 44
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 123
  Standard Model length: 24
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 124
  Standard Model length: 24
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 126
  Standard Model length: 64
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 127
  Standard Model length: 10
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 128
  Standard Model length: 14
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 131
  Standard Model length: 64
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 132
  Standard Model length: 64
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 160
  Standard Model length: 128
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 129
  Standard Model length: 60
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 130
  Standard Model length: 60
  Skipping Standard Model
  Done
Trying to read Standard Model
  End
Done

 

Geschrieben

@poohnet Wir kommen näher. Das discover.py Script liest alle Werte einzeln. Der Energy Manager liest die Werte blockweise. Ich habe das discover.py Script jetzt umgestellt auf blockweises Lesen. Aktualisier mal bitte deinen git Clone und lass das Script nochmal laufen. Ich vermute, dass SMA es nicht erlaubt die Daten blockweise zu lesen. Das discover.py Script hat jetzt eine -s/--single-value-read Option, um das vorherige Verhalten wieder zu bekommen. Ich erwarte, dass das aktuelle discover.py Script ohne -s bei dir nicht funktiioniert, aber mit -s funktioniert. Kannst du das bestätigen?

Geschrieben

Jepp, kann ich bestätigen. Mit "-s" funktioniert's, ohne bricht das Skript mittendrin ab:

Using pymodbus version: 3.5.4
Using host: 192.168.xxx.xxx
Using port: 502
Using read mode: block
============================================================
Using device address: 126
------------------------------------------------------------
Using base address: 40000
Sun Spec ID found: 0x53756e53
Trying to read Common Model
  Common Model ID found: 1
  Common Model length: 66
  Manufacturer Name: SMA
  Model Name: Solar Inverter
  Options: 9302
  Version: 3.10.09.R
  Serial Number: xxxxxxxxxx
  Device Address: None
  Done
Trying to read Standard Model
  Standard Model ID found: 11
  Standard Model length: 13
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 12
  Standard Model length: 98
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 101
  Standard Model length: 50
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 120
  Standard Model length: 26
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 121
  Standard Model length: 30
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 122
  Standard Model length: 44
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 123
  Standard Model length: 24
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 124
  Standard Model length: 24
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 126
  Standard Model length: 64
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 127
  Standard Model length: 10
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 128
  Standard Model length: 14
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 131
  Standard Model length: 64
  Skipping Standard Model
  Done
Trying to read Standard Model
  Standard Model ID found: 132
  Standard Model length: 64
  Skipping Standard Model
  Done
Trying to read Standard Model
  Error: Exception Response(131, 3, IllegalValue)
------------------------------------------------------------
Using base address: 50000
Error: 'NoneType' object cannot be interpreted as an integer
------------------------------------------------------------
Using base address: 0
Error: 'NoneType' object cannot be interpreted as an integer

 

Geschrieben

git pull und teste bitte nochmal. Der Fehler dort ist ein anderer. An der Stelle wird Modell 160 gelesen, das 128 Register lang ist. Modbus erlaubt es aber nur 125 Register an einem Stück zu lesen. Das habe ich jetzt repariert. Mit -s wird der Block von Modell 160 nicht geladen, sondern übersprungen, daher tritt dieser Problem mit -s nicht auf.

Das hat aber leider alles nichts mit dem originalen Problem zu tun. Das Script kann die Daten lesen, der Energy Manager nicht. Ich such mal weiter nach dem Unterschied.

Geschrieben

SMA (steht auch in deren Dokumentation) erlaubt es nicht Werte partiell zu lesen. Genau das ist bei der Gerätesuche des Energy Managers passiert und daher kam der Invalid Address Fehler. Ist mit Beta 2 und in Git behoben. Das Script hat das Lesen da etwas anders gemacht, dadurch war das okay.

  • 2 weeks later...
Geschrieben (bearbeitet)

Eine Verständnisfrage: dann ist der (bei mir) TCP-Modbus ja belegt, es kann ja immer nur ein Gerät abfragen. Braucht evcc dann auch nochmal die Daten oder bekommt es das von dem EM? Da ich die Stromdaten auch für mehrere Sachen im Haushalt benötige, könnte ich sie mir ja auch per MQTT vom EM abfragen so wie ich es verstanden haben.

bearbeitet von zeebee
  • 2 weeks later...
Geschrieben
On 11/24/2023 at 1:11 PM, zeebee said:

Eine Verständnisfrage: dann ist der (bei mir) TCP-Modbus ja belegt, es kann ja immer nur ein Gerät abfragen. Braucht evcc dann auch nochmal die Daten oder bekommt es das von dem EM? Da ich die Stromdaten auch für mehrere Sachen im Haushalt benötige, könnte ich sie mir ja auch per MQTT vom EM abfragen so wie ich es verstanden haben.

Per Modbus TCP können prinzipiell mehrere Clients einen Host abfragen. Problematisch wird es allerdings, wenn der Host eine Modbus RTU-Bridge ist und jede Anfrage über eine lahme serielle Verbindung an einen Zähler geht. In dem Fall wird die serielle Schnittstelle der Flaschenhals sein und du wirst häufig Timeouts bekommen. Hat der Host die Werte selbst, können problemlos mehrere Clients sie abfragen.

Wenn du EVCC verwendest, steuert das wahrscheinlich das Überschussladen. In dem Fall braucht der EM die Werte gar nicht.

Ansonsten kannst du die Werte per MQTT bekommen. Der EM stellt alle ihm bekannten Stromzählerwerte per MQTT zur Verfügung.

  • rtrbt unpinned this Thema
  • 8 months later...
Geschrieben

Habe es jetzt endlich geschafft meine Solaredge-basierte PV als Zähler einzubinden. 

image.thumb.png.4846947369a20fd2a41c3bfa5611665a.png

Ich hatte zuerst nur den WattNode-Zähler eingetragen und danach den Solaredge-Wechselrichter. Wenn ich dann den Wechselrichter danach eingetragen hatte kamen einfacvh keine Daten. Ich nehme mal an weil die Adressen des Wechselrichters vor dem Zähler kommen - kann aber auch nur Zufall gewesen sein.

Was ich aber noch nicht so ganz verstanden habe ist ob die Polarität der Zahlen passt. Funktioniert das korrekt wenn bei Leistung positive Werte Folgendes bedeuten:

- WARP Charger: Verbrauch hinter dem eingebauten Zähler

- Wechselrichter: Stromerzeugung der PV-Anlage

- Zähler am Netzübergabepunkt: Einspeisung

Beispiel hier am Abend - der WARP Charger ist im Leerlauf (2W), der Wechselrichter erzeugt mit 1337W, die anderen Verbraucher im Haus sind bei 1485W in Summe und daher sind es -148W Einspeisung bzw. 148W Netzbezug.

image.thumb.png.6353c771b09ffe292ba0658345b6323f.png

Ist das alles so korrekt?

Bei einem anderen zeitlichen Snapshot kommt mir nämlich die Polarität von "draw minus feed" falsch herum vor wenn ich jetzt gerade mehr Strom erzeuge als ich verbrauche. Verbrauch im Haus ist hier jetzt bei ca. 1133W-688W, also 445W. "draw minus feed" bzw. Bezug minus Einspeisung sollte dann aber ja eine negative Zahl sein, oder?

image.thumb.png.7135527ddc8a27e09729b4155a584ab5.png

Geschrieben

Da passt etwas nicht. Wie du schon vermutet hast, ist anscheinend das Vorzeichen beim Netzbezug verkehrt. Bei tatsächlicher Einspeisung muss der Wert negativ sein.

Der WattNode-Zähler hat aber anscheinend auch noch ein anderes Vorzeichenproblem: Warum sind die Spannungen zwischen den Phasen negativ und viel zu niedrig? Sind beim Zähler zwei Phasen vertauscht, sodass er ein linksdrehendes Drehfeld sieht? Aber auch dann sollten ja eigentlich -400V angezeigt werden…

Sind die Kilowattstunden bei Bezug (15175) und Einspeisung (36184) richtig oder vertauscht?

Geschrieben

Okay, dann bedeuten positive Werte beim "Zähler am Netzübergabepunkt": Bezug. Ich habe im Github einen "Quirk" gefunden ( https://github.com/Tinkerforge/esp32-firmware/blob/135fc091912a7fdccc9aa8d0f5280469db666cb3/software/src/modules/meters_sun_spec/meter_sun_spec.cpp#L316 ), dass bei Solaredge die Wirkleistung falsche Polarität hat. Da der WattNode-Zähler Teil des Solaredge-Pakets war muss das dort vielleicht auch gelten (oder die Quirks sollten irgendwo aktivierbar sein falls sie zutreffen). Kann das Grund sein?

Danke für den Hinweis der Spannung zwischen den Phasen. Muss mal schauen was das ist und meine alten Unterlagen zu Energietechnik und dem Drehstrommodell studieren. Andererseits passt die Spannung am Wechselrichter - und es ist ja nur der FI dazwischen. Seltsam ...

image.thumb.png.5ae98c6971a51f44ecdd4979ea7ac3b6.png

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...