Skip to content

Geräte mit gemeinsamer Verbindung: Fehlerzustand korreliert setzen - #3958

Open
seaspotter wants to merge 2 commits into
openWB:masterfrom
seaspotter:fix-shared-connection-fault-state
Open

seaspotter wants to merge 2 commits into
openWB:masterfrom
seaspotter:fix-shared-connection-fault-state

Conversation

@seaspotter

Copy link
Copy Markdown
Collaborator
  • RCT, Kostal Piko, generic/http, solar_view, sonnenBatterie, Discovergy, Powerfox und smart-me lesen Zähler/WR/Speicher über eine gemeinsame Verbindung/Session desselben Geräts aus, nutzten dafür aber IndependentComponentUpdater - jede Komponente bekam so einen eigenen Fehlerzustand statt eines gemeinsamen, obwohl ein Verbindungsausfall alle betrifft
  • Umgestellt auf MultiComponentUpdater: schlägt die Verbindung fehl, werden jetzt alle Komponenten des Geräts als fehlerhaft markiert
  • RCT zusätzlich umgebaut: alle drei Komponenten teilen sich jetzt eine TCP-Verbindung statt je eine eigene zu öffnen

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Component-specific request or parsing failures now abort updates and incorrectly mark healthy sibling components as faulty.

Get a fresh assessment by requesting another Copilot review.

Pull request overview

Refactors shared-device updates to use MultiComponentUpdater, correlating component fault states. RCT components additionally share one TCP connection.

Changes:

  • Replaced independent updaters across eight device integrations.
  • Added grouped component update callbacks.
  • Reworked RCT connection lifecycle.
File summaries
File Description
sonnen/.../device.py Groups SonnenBatterie component updates
solar_view/.../device.py Groups SolarView updates
smart_me/.../device.py Groups smart-me session updates
rct/.../device.py Shares one RCT TCP connection
powerfox/.../device.py Groups Powerfox session updates
kostal/.../device.py Groups Kostal component updates
generic/http/device.py Groups HTTP session updates
discovergy/.../device.py Groups Discovergy session updates
Review details
  • Files reviewed: 8/8 changed files
  • Comments generated: 8
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +34 to +35
for component in components:
component.update(session)
Comment on lines +42 to +43
for component in components:
component.update(session)
Comment on lines +36 to +37
for component in components:
component.update()
Comment on lines +32 to +33
for component in components:
component.update(session)
Comment on lines +34 to +35
for component in components:
component.update(rct)
Comment on lines +33 to +34
for component in components:
component.update(session)
Comment on lines +23 to +27
for component in components:
component.update(
device_config.configuration.ip_address,
device_config.configuration.port,
device_config.configuration.timeout)
Comment on lines +60 to +61
for component in components:
component.update()
@seaspotter

Copy link
Copy Markdown
Collaborator Author

Copilot moniert ja aber genau das gewünscht Verhalten :) Bei den aller Meisten anderen Modulen ist es ja auch korrekt, nur bei diesen paar Module ist es eben bisher imho eben falsch bisher :)

@LKuemmel

LKuemmel commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

Das gewünschte Verhalten ist, wenn es eine Verbindung gibt, aber unterschiedliche Register/Endpoints, soll nicht für alle Komponenten die Abfrage abbrechen, sondern nur für das, bei dem das Register falsch ist. Kann die Verbindung nicht aufgebaut werden, bricht die Verarbeitung sofort ab und setzt bei allen Komponenten den Fehlerstatus. Bei den Modbus-Modulen wird deshalb MultiComponentUpdater genutzt und dann jede einzelne Komponente mit SingleComponentUpdateContext abgesichert. Das setzt voraus, dass die Verbindung außerhalb der Komponenten aufgebaut wird.
Nutzt jede Komponente ihren eigenen GET-Request, funktioniert das so nicht. Dann kann man es entweder so machen wie Du:
Vorteil: bei einem Verbindungsproblem wird nach der ersten Komponente abgebrochen und nicht alle durchprobiert
Nachteil: Bei einem Problem mit dem Endpoint gehen alle Komponenten in den Fehlerstatus und zeigen eine Fehlermeldung an, die eine andere Komponente betrifft

Oder so wie bei der aktuellen Implementierung. Dort sind die Vor- und Nachteile genau andersrum. Das finde ich kundenfreundlicher, weil möglichst viele Daten angezeigt werden und die Fehlersuche erleichtert wird, wenn das Problem eine einzelne Komponente betrifft.

Für RCT kannst Du auch die Vorgehensweise wie bei den Modbus-Modulen verwenden: MultiComponentUpdater genutzt und für die einzelnen Komponenten SingleComponentUpdateContext

- RCT, Kostal Piko, generic/http, solar_view, sonnenBatterie, Discovergy,
  Powerfox, smart-me lesen Zähler/Wechselrichter/Speicher alle über dieselbe
  Verbindung/Session desselben physischen Geräts aus, verwendeten dafür aber
  IndependentComponentUpdater - dadurch bekam jede Komponente einen eigenen,
  unabhängigen Fehlerzustand statt eines gemeinsamen, obwohl ein Verbindungs-
  ausfall alle betrifft.
- Umgestellt auf MultiComponentUpdater: schlägt die gemeinsame Verbindung
  fehl, werden jetzt alle Komponenten des Geräts als fehlerhaft markiert,
  nicht nur die zuerst geprüfte.
- RCT zusätzlich so umgebaut, dass sich alle drei Komponenten eine einzige
  TCP-Verbindung teilen statt je eine eigene zu öffnen.
- Shelly und Tasmota bewusst nicht angepasst: technisch möglich, kombinierte
  Zähler+WR+Speicher-Konfiguration auf einem Gerät anzulegen, aber keine
  reale Anwendung bei diesen Einzelzweck-Sensoren.
…eren

Wie von Lena vorgeschlagen: MultiComponentUpdater deckt weiterhin
Verbindungsfehler ab (alle Komponenten betroffen), zusätzlich
SingleComponentUpdateContext pro Komponente wie bei den
Modbus-Modulen - ein Fehler bei nur einer Komponente (falsches
Register/Endpoint) markiert nicht mehr fälschlich die anderen als
defekt.
@seaspotter
seaspotter force-pushed the fix-shared-connection-fault-state branch from 1d2bc88 to 221de26 Compare September 23, 2026 14:22
@seaspotter

Copy link
Copy Markdown
Collaborator Author

Umgesetzt: SingleComponentUpdateContext pro Komponente wie bei den Modbus-Modulen, MultiComponentUpdater bleibt nur für Verbindungsfehler zuständig. Deckt auch die Copilot-Kommentare ab.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants