Skip to content

Commit 617ace8

Browse files
authored
add Sentron counter as inverter an bat (#2332)
1 parent b1d75e3 commit 617ace8

4 files changed

Lines changed: 134 additions & 5 deletions

File tree

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#!/usr/bin/env python3
2+
from typing import TypedDict, Any
3+
4+
from modules.common import modbus
5+
from modules.common.abstract_device import AbstractBat
6+
from modules.common.component_state import BatState
7+
from modules.common.component_type import ComponentDescriptor
8+
from modules.common.fault_state import ComponentInfo, FaultState
9+
from modules.common.modbus import ModbusDataType
10+
from modules.common.store import get_bat_value_store
11+
from modules.devices.siemens.siemens_sentron.config import SiemensSentronBatSetup
12+
13+
14+
class KwargsDict(TypedDict):
15+
client: modbus.ModbusTcpClient_
16+
modbus_id: int
17+
18+
19+
class SiemensSentronBat(AbstractBat):
20+
def __init__(self, component_config: SiemensSentronBatSetup, **kwargs: Any) -> None:
21+
self.component_config = component_config
22+
self.kwargs: KwargsDict = kwargs
23+
24+
def initialize(self) -> None:
25+
self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['client']
26+
self.__modbus_id: int = self.kwargs['modbus_id']
27+
self.store = get_bat_value_store(self.component_config.id)
28+
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
29+
30+
def update(self) -> None:
31+
with self.__tcp_client:
32+
power = self.__tcp_client.read_holding_registers(65, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * -1
33+
imported = self.__tcp_client.read_holding_registers(801, ModbusDataType.FLOAT_64, unit=self.__modbus_id)
34+
exported = self.__tcp_client.read_holding_registers(809, ModbusDataType.FLOAT_64, unit=self.__modbus_id)
35+
36+
bat_state = BatState(
37+
imported=imported,
38+
exported=exported,
39+
power=power
40+
)
41+
self.store.set(bat_state)
42+
43+
44+
component_descriptor = ComponentDescriptor(configuration_factory=SiemensSentronBatSetup)

packages/modules/devices/siemens/siemens_sentron/config.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,31 @@ def __init__(self,
3636
id: int = 0,
3737
configuration: SiemensSentronCounterConfiguration = None) -> None:
3838
super().__init__(name, type, id, configuration or SiemensSentronCounterConfiguration())
39+
40+
41+
class SiemensSentronInverterConfiguration:
42+
def __init__(self):
43+
pass
44+
45+
46+
class SiemensSentronInverterSetup(ComponentSetup[SiemensSentronInverterConfiguration]):
47+
def __init__(self,
48+
name: str = "Siemens Sentron PV-Zähler",
49+
type: str = "inverter",
50+
id: int = 0,
51+
configuration: SiemensSentronInverterConfiguration = None) -> None:
52+
super().__init__(name, type, id, configuration or SiemensSentronInverterConfiguration())
53+
54+
55+
class SiemensSentronBatConfiguration:
56+
def __init__(self):
57+
pass
58+
59+
60+
class SiemensSentronBatSetup(ComponentSetup[SiemensSentronBatConfiguration]):
61+
def __init__(self,
62+
name: str = "Siemens Sentron Speicher-Zähler",
63+
type: str = "bat",
64+
id: int = 0,
65+
configuration: SiemensSentronBatConfiguration = None) -> None:
66+
super().__init__(name, type, id, configuration or SiemensSentronBatConfiguration())

packages/modules/devices/siemens/siemens_sentron/device.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
#!/usr/bin/env python3
22
import logging
3-
from typing import Iterable
3+
from typing import Iterable, Union
44

55
from modules.common.abstract_device import DeviceDescriptor
66
from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater
77
from modules.common.modbus import ModbusTcpClient_
8-
from modules.devices.siemens.siemens_sentron.config import SiemensSentron, SiemensSentronCounterSetup
9-
from modules.devices.siemens.siemens_sentron.counter import SiemensSentronCounter
8+
from modules.devices.siemens.siemens_sentron.config import (SiemensSentron, SiemensSentronCounterSetup,
9+
SiemensSentronInverterSetup, SiemensSentronBatSetup)
10+
from modules.devices.siemens.siemens_sentron import counter, inverter, bat
1011

1112
log = logging.getLogger(__name__)
1213

@@ -16,9 +17,21 @@ def create_device(device_config: SiemensSentron):
1617

1718
def create_counter_component(component_config: SiemensSentronCounterSetup):
1819
nonlocal client
19-
return SiemensSentronCounter(component_config, client=client, modbus_id=device_config.configuration.modbus_id)
20+
return counter.SiemensSentronCounter(component_config, client=client,
21+
modbus_id=device_config.configuration.modbus_id)
2022

21-
def update_components(components: Iterable[SiemensSentronCounter]):
23+
def create_inverter_component(component_config: SiemensSentronInverterSetup):
24+
nonlocal client
25+
return inverter.SiemensSentronInverter(component_config, client=client,
26+
modbus_id=device_config.configuration.modbus_id)
27+
28+
def create_bat_component(component_config: SiemensSentronBatSetup):
29+
nonlocal client
30+
return bat.SiemensSentronBat(component_config, client=client,
31+
modbus_id=device_config.configuration.modbus_id)
32+
33+
def update_components(components: Iterable[Union[counter.SiemensSentronCounter, inverter.SiemensSentronInverter,
34+
bat.SiemensSentronBat]]):
2235
nonlocal client
2336
with client:
2437
for component in components:
@@ -33,6 +46,8 @@ def initializer():
3346
initializer=initializer,
3447
component_factory=ComponentFactoryByType(
3548
counter=create_counter_component,
49+
inverter=create_inverter_component,
50+
bat=create_bat_component
3651
),
3752
component_updater=MultiComponentUpdater(update_components)
3853
)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#!/usr/bin/env python3
2+
from typing import TypedDict, Any
3+
4+
from modules.common import modbus
5+
from modules.common.abstract_device import AbstractInverter
6+
from modules.common.component_state import InverterState
7+
from modules.common.component_type import ComponentDescriptor
8+
from modules.common.fault_state import ComponentInfo, FaultState
9+
from modules.common.modbus import ModbusDataType
10+
from modules.common.store import get_inverter_value_store
11+
from modules.devices.siemens.siemens_sentron.config import SiemensSentronInverterSetup
12+
13+
14+
class KwargsDict(TypedDict):
15+
client: modbus.ModbusTcpClient_
16+
modbus_id: int
17+
18+
19+
class SiemensSentronInverter(AbstractInverter):
20+
def __init__(self, component_config: SiemensSentronInverterSetup, **kwargs: Any) -> None:
21+
self.component_config = component_config
22+
self.kwargs: KwargsDict = kwargs
23+
24+
def initialize(self) -> None:
25+
self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['client']
26+
self.__modbus_id: int = self.kwargs['modbus_id']
27+
self.store = get_inverter_value_store(self.component_config.id)
28+
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
29+
30+
def update(self) -> None:
31+
with self.__tcp_client:
32+
power = self.__tcp_client.read_holding_registers(65, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * -1
33+
exported = self.__tcp_client.read_holding_registers(809, ModbusDataType.FLOAT_64, unit=self.__modbus_id)
34+
35+
inverter_state = InverterState(
36+
power=power,
37+
exported=exported
38+
)
39+
self.store.set(inverter_state)
40+
41+
42+
component_descriptor = ComponentDescriptor(configuration_factory=SiemensSentronInverterSetup)

0 commit comments

Comments
 (0)