Skip to content

Feature local consumption counter - #3660

Draft
AlexanderHa98 wants to merge 9 commits into
openWB:masterfrom
AlexanderHa98:feature_local_ConsumptionCounter
Draft

Feature local consumption counter#3660
AlexanderHa98 wants to merge 9 commits into
openWB:masterfrom
AlexanderHa98:feature_local_ConsumptionCounter

Conversation

@AlexanderHa98

@AlexanderHa98 AlexanderHa98 commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

openWB/openwb-ui-settings#1013

Damit die Github check-action durchläuft, muss ein Test angepasst werden:
#3662

Aufbau

Neues Gerät

  • Fügt das neue Gerät: Verbrauchszähler mit lokaler Auslegung hinzu.

Neue Komponente

  • Fügt die Komponente openWB Lokaler Verbrauchszähler hinzu.

GUI

Gerät

  • Keine Konfigurationsmöglichkeiten.
  • Der verwendete USB-Port wird fest im Code gesetzt.

Komponente

  • Das Zählermodell ist fest vorgegeben, da derzeit nur der SDM630_72 unterstützt wird.
  • Die Modbus-ID muss konfiguriert werden.

Funktionsweise

Die Implementierung orientiert sich am bestehenden ConsumptionCounter aus openwb_flex.

Unterschiede:

  • Die Modbus-Kommunikation erfolgt seriell statt über TCP.
  • Das silent_interval ist konfigurierbar.

Silent_Intervall

  • ConsumptionCounter (openwb_flex): Standardwert 0.1
  • Lokaler ConsumptionCounter: Standardwert 0.06

Testergebnisse

Getestet mit einem realen Aufbau aus 10 Zählern.

silent_interval = 0.06 (60 ms)

  • Auslesen von 10 Zählern: funktioniert nicht
    • device2 konnte nicht innerhalb des konfigurierten Timeouts abgearbeitet werden.
  • Auslesen von 9 Zählern: funktioniert sporadisch
  • Auslesen von 8 Zählern: funktioniert zuverlässig

silent_interval = 0.03 (30 ms)

  • Auslesen von 10 Zählern: funktioniert zuverlässig

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.

Pull request overview

Diese PR führt ein neues openWB-Gerät „openwb_flex_local“ ein, um einen lokalen Verbrauchszähler per Modbus RTU (seriell) auszulesen (angelehnt an den bestehenden openwb_flex ConsumptionCounter), und erweitert den SDM630_72-Treiber um ein einstellbares Lese-Intervall.

Changes:

  • Neues Gerät/Modul openwb_flex_local inkl. Device-, Config-, Versions- und ConsumptionCounter-Komponente (serieller Modbus-Client).
  • sdm.Sdm630_72: silent_interval als Parameter eingeführt und in den Lese-Pfaden statt fixer time.sleep(0.1) verwendet.
  • elgris.Elgris: silent_interval-Attribut ergänzt, um Kompatibilität mit dem neuen sdm.Sdm630_72-Verhalten sicherzustellen.

Reviewed changes

Copilot reviewed 6 out of 7 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
packages/modules/devices/openwb/openwb_flex_local/versions.py Factory-Funktionen für unterstützte Zählertypen (aus openwb_flex gespiegelt).
packages/modules/devices/openwb/openwb_flex_local/device.py Neues ConfigurableDevice mit Modbus-RTU Initializer und Component-Updater.
packages/modules/devices/openwb/openwb_flex_local/consumption_counter.py Neue LocalConsumptionCounter-Komponente (serielle Modbus-Auslesung).
packages/modules/devices/openwb/openwb_flex_local/config.py Setup-/Configuration-Klassen für Device und Komponente.
packages/modules/devices/openwb/openwb_flex_local/init.py Package-Datei für das neue Modul.
packages/modules/devices/elgris/elgris/elgris.py Ergänzt silent_interval, damit geerbte SDM630_72-Reads funktionieren.
packages/modules/common/sdm.py SDM630_72: silent_interval parametrierbar gemacht und genutzt.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +27 to +31
factory = consumption_counter_factory(self.component_config.configuration.type)
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
self.__client = factory(self.component_config.configuration.id, self.__serial_client,
self.fault_state, silent_interval=0.06)
self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="bezug")
Comment on lines +5 to +7
class FlexLocalConfiguration:
def __init__(self, port: str = '/dev/ttyACM0') -> None:
self.port = port
Comment on lines +32 to +33
def error_handler():
run_command([f"{Path(__file__).resolve().parents[4]}/modules/common/restart_protoss_admin"])

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.

Suggested change
def error_handler():
run_command([f"{Path(__file__).resolve().parents[4]}/modules/common/restart_protoss_admin"])

Einen Protoss gibt es in dieser Installation nicht.


class LocalConsumptionCounterSetup(ComponentSetup[LocalConsumptionCounterConfiguration]):
def __init__(self,
name: str = "openWB Lokaler-Verbrauchszähler",

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.

Suggested change
name: str = "openWB Lokaler-Verbrauchszähler",
name: str = "openWB Lokaler Verbrauchszähler",


class FlexLocalConfiguration:
def __init__(self) -> None:
self.port = '/dev/ttyACM0'

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.

Am besten wäre es, wenn wir die client detection von den Internen Ladepunkten so umstrukturieren, dass wir sie hierfür auch nutzen können, dann braucht man einen neuen USB-Adapter /dev/ttyXXX nur an einer Stelle einfügen und kann ihn für alles verwenden.

Comment on lines +8 to +44
def kit_counter_version_factory(
version: int) -> Type[Union[mpm3pm.Mpm3pm, lovato.Lovato, sdm.Sdm630_72, b23.B23]]:
if version == 0:
return mpm3pm.Mpm3pm
elif version == 1:
return lovato.Lovato
elif version == 2:
return sdm.Sdm630_72
elif version == 3:
return b23.B23
else:
raise ValueError("Version "+str(version) + " unbekannt.")


def kit_inverter_version_factory(
version: int) -> Type[Union[mpm3pm.Mpm3pm, lovato.Lovato, sdm.Sdm630_72, sdm.Sdm120]]:
if version == 0:
return mpm3pm.Mpm3pm
elif version == 1:
return lovato.Lovato
elif version == 2:
return sdm.Sdm630_72
elif version == 3:
return sdm.Sdm120
else:
raise ValueError("Version "+str(version) + " unbekannt.")


def kit_bat_version_factory(version: int) -> Type[Union[mpm3pm.Mpm3pm, sdm.Sdm630_72, sdm.Sdm120]]:
if version == 0:
return mpm3pm.Mpm3pm
elif version == 1:
return sdm.Sdm120
elif version == 2:
return sdm.Sdm630_72
else:
raise ValueError("Version "+str(version) + " unbekannt.")

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.

Suggested change
def kit_counter_version_factory(
version: int) -> Type[Union[mpm3pm.Mpm3pm, lovato.Lovato, sdm.Sdm630_72, b23.B23]]:
if version == 0:
return mpm3pm.Mpm3pm
elif version == 1:
return lovato.Lovato
elif version == 2:
return sdm.Sdm630_72
elif version == 3:
return b23.B23
else:
raise ValueError("Version "+str(version) + " unbekannt.")
def kit_inverter_version_factory(
version: int) -> Type[Union[mpm3pm.Mpm3pm, lovato.Lovato, sdm.Sdm630_72, sdm.Sdm120]]:
if version == 0:
return mpm3pm.Mpm3pm
elif version == 1:
return lovato.Lovato
elif version == 2:
return sdm.Sdm630_72
elif version == 3:
return sdm.Sdm120
else:
raise ValueError("Version "+str(version) + " unbekannt.")
def kit_bat_version_factory(version: int) -> Type[Union[mpm3pm.Mpm3pm, sdm.Sdm630_72, sdm.Sdm120]]:
if version == 0:
return mpm3pm.Mpm3pm
elif version == 1:
return sdm.Sdm120
elif version == 2:
return sdm.Sdm630_72
else:
raise ValueError("Version "+str(version) + " unbekannt.")

Die brauchen wir hier nicht.

@AlexanderHa98
AlexanderHa98 force-pushed the feature_local_ConsumptionCounter branch from 342238f to 874a277 Compare July 14, 2026 12:59
Comment on lines +27 to +28
if self.kwargs['client'] is None:
raise Exception("Verbrauchszähler mit lokaler Auslesung konnte Port nicht ermitteln, ")

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.

Suggested change
if self.kwargs['client'] is None:
raise Exception("Verbrauchszähler mit lokaler Auslesung konnte Port nicht ermitteln, ")
raise Exception("USB-Adapter für die lokale Auslesung unbekannt oder nicht eingesteckt.")

So ist es für den Support und Endkunden besser verständlich, was konkret das Problem ist.

@AlexanderHa98
AlexanderHa98 force-pushed the feature_local_ConsumptionCounter branch from 4205035 to 7189bc9 Compare July 15, 2026 10:09
@AlexanderHa98
AlexanderHa98 requested a review from ndrsnhs July 17, 2026 07:58
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