Feature local consumption counter - #3660
Conversation
There was a problem hiding this comment.
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_localinkl. Device-, Config-, Versions- und ConsumptionCounter-Komponente (serieller Modbus-Client). sdm.Sdm630_72:silent_intervalals Parameter eingeführt und in den Lese-Pfaden statt fixertime.sleep(0.1)verwendet.elgris.Elgris:silent_interval-Attribut ergänzt, um Kompatibilität mit dem neuensdm.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.
| 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") |
| class FlexLocalConfiguration: | ||
| def __init__(self, port: str = '/dev/ttyACM0') -> None: | ||
| self.port = port |
| def error_handler(): | ||
| run_command([f"{Path(__file__).resolve().parents[4]}/modules/common/restart_protoss_admin"]) |
There was a problem hiding this comment.
| 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", |
There was a problem hiding this comment.
| name: str = "openWB Lokaler-Verbrauchszähler", | |
| name: str = "openWB Lokaler Verbrauchszähler", |
|
|
||
| class FlexLocalConfiguration: | ||
| def __init__(self) -> None: | ||
| self.port = '/dev/ttyACM0' |
There was a problem hiding this comment.
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.
| 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.") |
There was a problem hiding this comment.
| 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.
342238f to
874a277
Compare
| if self.kwargs['client'] is None: | ||
| raise Exception("Verbrauchszähler mit lokaler Auslesung konnte Port nicht ermitteln, ") |
There was a problem hiding this comment.
| 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.
4205035 to
7189bc9
Compare
openWB/openwb-ui-settings#1013
Damit die Github check-action durchläuft, muss ein Test angepasst werden:
#3662
Aufbau
Neues Gerät
Verbrauchszähler mit lokaler Auslegunghinzu.Neue Komponente
openWB Lokaler Verbrauchszählerhinzu.GUI
Gerät
Komponente
SDM630_72unterstützt wird.Funktionsweise
Die Implementierung orientiert sich am bestehenden ConsumptionCounter aus openwb_flex.
Unterschiede:
Silent_Intervall
0.10.06Testergebnisse
Getestet mit einem realen Aufbau aus 10 Zählern.
silent_interval = 0.06(60 ms)device2konnte nicht innerhalb des konfigurierten Timeouts abgearbeitet werden.silent_interval = 0.03(30 ms)