From 6f4b12df071e0ba24312a8043424a537bfaab172 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Tue, 8 Jul 2025 14:46:08 +0200 Subject: [PATCH 1/4] add second battery and update config --- packages/helpermodules/update_config.py | 21 +++++++++++++++- .../modules/devices/good_we/good_we/bat.py | 24 +++++++++++++------ 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/packages/helpermodules/update_config.py b/packages/helpermodules/update_config.py index 72a92f9461..aa07f7f0dd 100644 --- a/packages/helpermodules/update_config.py +++ b/packages/helpermodules/update_config.py @@ -56,7 +56,7 @@ class UpdateConfig: - DATASTORE_VERSION = 85 + DATASTORE_VERSION = 86 valid_topic = [ "^openWB/bat/config/configured$", @@ -2307,3 +2307,22 @@ def cp_upgrade(topic: str, payload) -> Optional[dict]: self._loop_all_received_topics(upgrade) self._loop_all_received_topics(cp_upgrade) self.__update_topic("openWB/system/datastore_version", 85) + + def upgrade_datastore_85(self) -> None: + def upgrade(topic: str, payload) -> None: + if re.search("openWB/system/device/[0-9]+", topic) is not None: + payload = decode_payload(payload) + index = get_index(topic) + if payload.get("type") == "good_we": + for component_topic, component_payload in self.all_received_topics.items(): + if re.search(f"openWB/system/device/{index}/component/[0-9]+/config", + component_topic) is not None: + config_payload = decode_payload(component_payload) + if (config_payload["type"] == "bat" and + config_payload["configuration"].get("battery_index") is None): + config_payload["configuration"].update({ + "battery_index": 1, + }) + return {component_topic: config_payload} + self._loop_all_received_topics(upgrade) + self.__update_topic("openWB/system/datastore_version", 86) diff --git a/packages/modules/devices/good_we/good_we/bat.py b/packages/modules/devices/good_we/good_we/bat.py index 3b10004f8b..9116220b99 100644 --- a/packages/modules/devices/good_we/good_we/bat.py +++ b/packages/modules/devices/good_we/good_we/bat.py @@ -7,6 +7,7 @@ from modules.common.component_type import ComponentDescriptor from modules.common.modbus import ModbusDataType from modules.common.fault_state import ComponentInfo, FaultState +from modules.common.simcount import SimCounter from modules.common.store import get_bat_value_store from modules.devices.good_we.good_we.config import GoodWeBatSetup from modules.devices.good_we.good_we.version import GoodWeVersion @@ -29,20 +30,29 @@ def initialize(self) -> None: self.version: GoodWeVersion = self.kwargs['version'] self.firmware: int = self.kwargs['firmware'] self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['client'] + self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="speicher") self.store = get_bat_value_store(self.component_config.id) self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) def update(self) -> None: + battery_index = getattr(self.component_config.configuration, "battery_index", 1) with self.__tcp_client: - if self.version == GoodWeVersion.V_1_7: - power = self.__tcp_client.read_holding_registers(35183, ModbusDataType.INT_16, unit=self.__modbus_id)*-1 + if battery_index == 1: + if self.version == GoodWeVersion.V_1_7: + power = self.__tcp_client.read_holding_registers( + 35183, ModbusDataType.INT_16, unit=self.__modbus_id)*-1 + else: + power = self.__tcp_client.read_holding_registers( + 35182, ModbusDataType.INT_32, unit=self.__modbus_id)*-1 + soc = self.__tcp_client.read_holding_registers(37007, ModbusDataType.UINT_16, unit=self.__modbus_id) + imported = self.__tcp_client.read_holding_registers( + 35206, ModbusDataType.UINT_32, unit=self.__modbus_id) * 100 + exported = self.__tcp_client.read_holding_registers( + 35209, ModbusDataType.UINT_32, unit=self.__modbus_id) * 100 else: power = self.__tcp_client.read_holding_registers(35182, ModbusDataType.INT_32, unit=self.__modbus_id)*-1 - soc = self.__tcp_client.read_holding_registers(37007, ModbusDataType.UINT_16, unit=self.__modbus_id) - imported = self.__tcp_client.read_holding_registers( - 35206, ModbusDataType.UINT_32, unit=self.__modbus_id) * 100 - exported = self.__tcp_client.read_holding_registers( - 35209, ModbusDataType.UINT_32, unit=self.__modbus_id) * 100 + soc = self.__tcp_client.read_holding_registers(37007, ModbusDataType.UINT_16, unit=self.__modbus_id) + imported, exported = self.sim_counter.sim_count(power) bat_state = BatState( power=power, From e1d6ff273dca0aab7d3e25e286b7e2d7a53c2555 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Thu, 10 Jul 2025 07:43:32 +0200 Subject: [PATCH 2/4] fix no attribute error --- packages/modules/devices/good_we/good_we/bat.py | 1 + packages/modules/devices/good_we/good_we/device.py | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/modules/devices/good_we/good_we/bat.py b/packages/modules/devices/good_we/good_we/bat.py index 9116220b99..23be888bf2 100644 --- a/packages/modules/devices/good_we/good_we/bat.py +++ b/packages/modules/devices/good_we/good_we/bat.py @@ -26,6 +26,7 @@ def __init__(self, component_config: GoodWeBatSetup, **kwargs: Any) -> None: self.kwargs: KwargsDict = kwargs def initialize(self) -> None: + self.__device_id: int = self.kwargs['device_id'] self.__modbus_id: int = self.kwargs['modbus_id'] self.version: GoodWeVersion = self.kwargs['version'] self.firmware: int = self.kwargs['firmware'] diff --git a/packages/modules/devices/good_we/good_we/device.py b/packages/modules/devices/good_we/good_we/device.py index e4ff4db18e..266b0fb046 100644 --- a/packages/modules/devices/good_we/good_we/device.py +++ b/packages/modules/devices/good_we/good_we/device.py @@ -22,6 +22,7 @@ def create_device(device_config: GoodWe): def create_bat_component(component_config: GoodWeBatSetup): nonlocal client return bat.GoodWeBat(component_config=component_config, + device_id=device_config.id, modbus_id=device_config.configuration.modbus_id, version=GoodWeVersion(device_config.configuration.version), firmware=device_config.configuration.firmware, From 974d16361264c8cbd50d7097e7d7790179d8ac4f Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Thu, 10 Jul 2025 07:59:18 +0200 Subject: [PATCH 3/4] fix register adresses --- packages/modules/devices/good_we/good_we/bat.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/good_we/good_we/bat.py b/packages/modules/devices/good_we/good_we/bat.py index 23be888bf2..c9fc003cf2 100644 --- a/packages/modules/devices/good_we/good_we/bat.py +++ b/packages/modules/devices/good_we/good_we/bat.py @@ -51,8 +51,8 @@ def update(self) -> None: exported = self.__tcp_client.read_holding_registers( 35209, ModbusDataType.UINT_32, unit=self.__modbus_id) * 100 else: - power = self.__tcp_client.read_holding_registers(35182, ModbusDataType.INT_32, unit=self.__modbus_id)*-1 - soc = self.__tcp_client.read_holding_registers(37007, ModbusDataType.UINT_16, unit=self.__modbus_id) + power = self.__tcp_client.read_holding_registers(35264, ModbusDataType.INT_32, unit=self.__modbus_id)*-1 + soc = self.__tcp_client.read_holding_registers(39005, ModbusDataType.UINT_16, unit=self.__modbus_id) imported, exported = self.sim_counter.sim_count(power) bat_state = BatState( From a2677dd3b08e3fd912e9a8b2dfb5ba732ce6b734 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Fri, 11 Jul 2025 12:29:45 +0200 Subject: [PATCH 4/4] detect battery index --- packages/modules/devices/good_we/good_we/bat.py | 1 + packages/modules/devices/good_we/good_we/config.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/good_we/good_we/bat.py b/packages/modules/devices/good_we/good_we/bat.py index c9fc003cf2..670f675415 100644 --- a/packages/modules/devices/good_we/good_we/bat.py +++ b/packages/modules/devices/good_we/good_we/bat.py @@ -14,6 +14,7 @@ class KwargsDict(TypedDict): + device_id: int modbus_id: int version: GoodWeVersion firmware: int diff --git a/packages/modules/devices/good_we/good_we/config.py b/packages/modules/devices/good_we/good_we/config.py index d8ab88b200..c244be0697 100644 --- a/packages/modules/devices/good_we/good_we/config.py +++ b/packages/modules/devices/good_we/good_we/config.py @@ -32,8 +32,8 @@ def __init__(self, class GoodWeBatConfiguration: - def __init__(self): - pass + def __init__(self, battery_index: int = 1): + self.battery_index = battery_index class GoodWeBatSetup(ComponentSetup[GoodWeBatConfiguration]):