sphings-dev.de

Aus den 3.0-Betas: Solar-Durchleitung, abgeschaltete Speicher, Packzahl

Die 3.0-Betas der Marstek Modbus Suite bestanden aus dreizehn Betas und drei Release-Kandidaten. Welche Register sich geändert haben, steht im Beitrag zu 3.0.0. Hier geht es um das, was zwischen den Betas passiert ist: wie ein Speicher, der Solarstrom durchleitet, das Panel ins Stolpern brachte, was ein ausgeschalteter Speicher mit einer Integration macht, die weiterfragt, und warum das Panel erst mit sich selbst einig sein musste.

Eine Venus A, die Solarstrom durchreicht

Auslöser war eine Venus A im Betrieb, bei der das Panel 184 W Entladung zeigte, während der Speicher mit 1300 W geladen wurde. Der berechnete Zykluszähler stand auf 1210,91, das BMS meldete 152. Beides war dieselbe Fehllesung: Register 30001 ist ein Messpunkt auf der DC-Seite, den auch die PV-Strings durchlaufen. Die Folgen für die Entitätsnamen stehen im 3.0.0-Beitrag; interessant ist, was sich daran in den nächsten Betas anschloss.

  • Die Summe braucht nicht alle Strings. Der neue berechnete battery_power erbte vom Solar-Sensor, dass er nichts liefert, sobald ein Eingang fehlt. Das ist für vier Strings eines Feldes richtig, hier aber falsch, weil der Wert die Hauptzahl des Panels und beide Laufzeiten trägt. Ein einziges nicht lesbares MPPT-Register ließ alle drei leer, auf einer Venus A als Strich bei „Zeit bis voll“. Seitdem zählt ein fehlender oder nicht verbauter String als null.
  • Berechnete Werte liegen im Koordinator. Die Laufzeiten gingen danach auf unknown, weil ein berechneter Sensor seine Eingänge aus den Koordinatordaten liest und die nur Registerwerte enthielten. Der Koordinator rechnet die Summe jetzt direkt nach dem Lesen und legt sie neben die Register. Dabei zählt, dass die Skalierung vor der Summe angewendet wird: Der DC-Punkt zählt ganze Watt, die Strings Zehntelwatt, und ohne das wäre das Ergebnis um den Faktor zehn falsch.

Die Statuszeile sagte währenddessen „Discharge“, obwohl geladen wurde. Das ist kein Fehler im Panel: Register 35100 kennt Sleep · Standby · Charge · Discharge · Backup · OTA · Bypass, und eine Venus A, die Solarstrom ans Haus liefert, meldet Discharge, weil der Wechselrichter aus seiner Sicht abgibt, egal ob die Energie aus den Packs oder direkt vom Dach kommt. Weil genau das immer wieder als Fehler gemeldet wurde, zeigt die Statuszeile bei gleichzeitigem Laden und Abgeben seit beta.6 „Bypass“; der System-Reiter zeigt weiterhin das rohe Register, damit man beides nebeneinander sieht.

Das war noch nicht richtig. Zustand 6 des Registers heißt Backup Passthrough: Er tritt auf, wenn die Backup-Steckdose mit einer Last eingeschaltet ist und das Netz diese Last trägt, nicht, wenn Solarstrom das Haus speist, während die Packs laden. beta.13 benennt den abgeleiteten Zustand deshalb in „PV-Durchleitung“ um, und der Begriff läuft jetzt durch die Übersetzungskataloge. rc.1 ergänzte eine Bedingung: Die Bezeichnung braucht einen Messwert, den nur Modelle mit Strings haben, sonst wäre jede Venus E mit gleichzeitigem Laden und Abgeben „PV-Durchleitung“ geworden, obwohl dort nichts anderes als die Packs am DC-Bus hängt. Auf A und D ändert das nichts: 72 Auslösungen in elf Minuten realer Messwerte, in beiden Formen identisch.

Wie viele Packs sind eigentlich verbaut?

Die Registerkarte beschreibt alle sieben Packblöcke, also zeigten Pack-Tabelle und Zellansicht bei einem Speicher mit drei Packs vier leere Spalten. Das Panel zählt seit beta.1 die Packs, die sich melden. Ein nicht verbautes Pack beantwortet seinen ganzen Block mit Nullen, daran ist es erkennbar, ohne Konfiguration.

Weil ein Block, nach dem niemand fragt, nicht als leer erkannt werden kann, gibt es zusätzlich die Option Optionen → Battery packs (nur Venus D und A). Auf 0 bleibt es bei der Erkennung. Bei 1 bis 7 werden die Blöcke darüber gar nicht mehr abgefragt: 170 Register je Zyklus statt 234 auf einem Speicher mit drei Packs. Wird später ein Pack ergänzt, muss die Zahl hoch, sonst bleibt es unsichtbar. Die Entitäten der höheren Packs werden trotzdem angelegt und bleiben unknown, eine zu niedrig gesetzte Zahl löscht also nichts.

Eine Nebenwirkung zeigte erst beta.13. battery_cycle_count und battery_power_bms nannten alle sieben Packs als Abhängigkeit, und ein berechneter Sensor bleibt leer, wenn auch nur eine fehlt. Bei fixierter Packzahl werden die höheren Blöcke nie abgefragt, also verweigerten beide Sensoren auf einer Venus A mit drei Packs 99 Mal in elf Minuten ihre Berechnung, einmal je Zyklus. Berechnete Sensoren können jetzt Abhängigkeiten nennen, auf die sie verzichten können. Auf demselben Gerät lesen die beiden danach 395 W und 133 Zyklen, bei Packströmen von zusammen 8,7 A und Zählerständen von 156, 123 und 120.

Ein Speicher, der ausgeschaltet ist

Die Betas 8 bis 11 gehen auf ein Issue zurück: Was passiert, wenn man einen Speicher für den Winter oder eine Urlaubswoche abschaltet. Der Statuspunkt im Panel hing daran, ob der Ladezustand einen Wert hat. Alle Sensoren behalten absichtlich ihren letzten Wert über einen Aussetzer hinweg, das trägt die Integration über Firmware-Resets. Der Punkt konnte also nie ausgehen, ein am Abend abgeschalteter Speicher stand am nächsten Morgen noch auf Grün über eingefrorenen Zahlen. Er liest jetzt die Verbindungsentität: grün für antwortet, gelb für antwortet, aber Register liefen in den Timeout, rot für antwortet nicht, mit der Uhrzeit der letzten Antwort daneben. Eine Uhrzeit statt eines Alters, weil nichts mehr eintrifft und damit nichts neu gezeichnet wird – ein hochgezähltes Alter bliebe auf dem Wert stehen, den es beim letzten Zeichnen hatte. Die WLAN-Stärke wird grau, der Wechselrichterzustand verschwindet, solange die Verbindung weg ist.

Das Log war das zweite Problem: Nach fünf fehlgeschlagenen Zyklen wurde die Verbindung zwar ausgesetzt, aber nur eine Minute lang, danach kam der volle Zyklus samt Warnungen und einem Fehler zurück. Jetzt ist „aus“ ein Zustand. Eine Meldung beim Eintritt mit Host und Versuchsintervall, eine beim Austritt, dazwischen Ruhe. Währenddessen wird alle sechzig Sekunden ein Register gelesen (der Ladezustand dient als Sonde, der Wert wird verworfen). beta.9 musste nachlegen: Die Sonde ging noch durch den normalen Lesepfad, der jeden Fehler meldet, vier Zeilen pro Minute. Seitdem trägt ein Lesezugriff ein Flag für den einen Aufrufer, der weiß, dass das Gerät weg ist, und meldet auf Debug. Alles andere, ein Schreibzugriff bei ausgeschaltetem Speicher oder ein echter Aussetzer, meldet unverändert, denn das sind Nachrichten.

Ein eigener Fehler war das Wiedereinschalten. Das Abfrageintervall jedes Registers verdoppelt sich mit jedem Fehlversuch bis auf eine Stunde und wird nur durch einen Erfolg beim selben Register zurückgesetzt. Nichts setzte es zurück, wenn die Verbindung insgesamt wiederkam, und ein Speicher, der lange aus war, tröpfelte seine Sensoren über die nächste Stunde hinein. Die Zähler werden jetzt zurückgesetzt, sobald die Sonde Antwort bekommt und nach einem Reconnect nach einem komplett gescheiterten Zyklus.

Die Abfragepause als Einstellung, mit ihren drei Zuständen, ist im 3.0.0-Beitrag beschrieben. Zwei Details aus beta.10 und beta.11: Ein pausierter Eintrag verbindet sich beim Setup gar nicht erst. Das beseitigt auch einen älteren Fehler, denn bisher verschwanden nach dem Abschalten des Speichers und einem Neustart von Home Assistant alle Entitäten, weil der Eintrag nie fertig eingerichtet wurde. Und beta.11 schloss eine Lücke: Wer pausierte, während ein Zyklus lief, bekam den Socket mitten im Zyklus zugemacht, der Zyklus baute ihn neu auf und ließ ihn offen. Die Verbindung kann jetzt gesperrt gehalten werden, an der einen Stelle, durch die jeder Weg zu einem neuen Socket geht, und ein laufender Zyklus bemerkt den Modus zwischen den Blöcken.

Zwei Log-Zeilen aus pymodbus.logging sind in diesem Zusammenhang kein Fehler der Integration: received pdu without a corresponding request bedeutet, dass eine Antwort eintraf, die keiner offenen Anfrage mehr zugeordnet werden konnte. Der Logger wird von jeder Modbus-Integration im System geteilt, der Name sagt nichts über den Urheber.

Ein Panel, das mit sich selbst einig ist

Mehrere Änderungen an den Betas hatten dieselbe Form: Zwei Anzeigen beantworten dieselbe Frage mit zwei verschiedenen Regeln. Die Packtabelle markierte Packs ab fünf Punkten Abstand zum Median, ein hartkodierter Rest aus der Zeit vor den zentralen Schwellen, während die Spreizungskachel 19 Punkte verwendete und die Legende unter der Tabelle ebenfalls 19 nannte. Eine grüne Kachel stand routinemäßig über roten Zeilen. beta.12 markiert Packs nur noch, wenn die Spreizung selbst auf Warnstufe ist, und dann die mit mehr als der Hälfte davon Abstand zum Median. Ein Stapel von [0, 18, 18, 18] hat 18 Punkte Spreizung und markiert nichts, wo die alte Regel den Ausreißer markierte. Beide Schwellen sind in den Panel-Einstellungen einstellbar, weil das Auseinanderdriften von der Packzahl abhängt. beta.13 zog die Säulen nach, die noch eine eigene Regel hatten.

Weitere Korrekturen: Laufzeiten stehen als 8 h 50 min, nicht als „8,8 h“. „WIFI 0 dBm“ ist aus der Statusleiste verschwunden, denn Register 30303 liest 0 bei Kabelanbindung und sonst einen alten Wert aus einer früheren WLAN-Sitzung; das Lesen setzt die LAN-Verbindung voraus, und dann ist das Funkmodul nicht der Uplink. Die Pack-Tabelle schreibt die Temperatureinheit einmal in die Spaltenüberschrift, gelesen aus der Entität, sodass eine Installation in Fahrenheit °F über Fahrenheit-Zahlen bekommt. Eine Auswahl, die für ein Telefon zu breit ist, bricht um, statt die Seite zu verbreitern. Und der Neustart des Geräts fragt in einem Dialog nach: Die Bestätigung ersetzte vorher die Taste, die sie geöffnet hatte, an derselben Stelle, sodass ein Doppelklick durchrutschte.

Modbus TCP nur über das LAN-Kabel

beta.12 enthält eine Messung, die den Abschnitt „Voraussetzungen“ des READMEs begründet. Auf einer Venus D wurden vier Netzzustände durchgespielt: beide Schnittstellen aktiv, Kabel im Betrieb gezogen, Kaltstart ganz ohne Kabel und Kabel wieder angeschlossen. Port 502 antwortet an der Kabeladresse und wird an der WLAN-Adresse abgelehnt, jedes Mal, auch nach dem Kaltstart. Der Modbus-Server sitzt am Ethernet-Chip und taucht auf der Funkseite nie auf. Die Erkennungs-Beacons folgen der aktiven Schnittstelle: 538 Pakete von der LAN-Adresse gegen 15 von der WLAN-Adresse in fünf Minuten, nie beide gleichzeitig, der Wechsel dauert etwa 26 Sekunden. Ein Speicher ohne Kabel wird also gefunden, die Adresse eingetragen, und dann lässt er sich nicht einrichten. Der Dialog sagt das jetzt, indem er bei einem Fehler unterscheidet, ob das Gerät verweigert hat oder gar nichts da war.

Tags

Zum Projekt

Unterstützen

Diese Tools entstehen in meiner Freizeit und bleiben kostenlos, offen und cloud-frei. Wenn dir eins davon einen Nachmittag gespart hat, freue ich mich über einen Kaffee oder ein Stück Pizza.

Kaffee oder Pizza

Weitere Beiträge