Skip to content

Commit cc53d66

Browse files
authored
add Algodue inverter and battery (#2593)
* add Algodue inverter and battery * remove duplicate context handler
1 parent c0545ec commit cc53d66

5 files changed

Lines changed: 160 additions & 15 deletions

File tree

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#!/usr/bin/env python3
2+
from typing import Any, TypedDict
3+
4+
from modules.devices.algodue.algodue.config import AlgodueBatSetup
5+
from modules.common import modbus
6+
from modules.common.abstract_device import AbstractBat
7+
from modules.common.component_state import BatState
8+
from modules.common.component_type import ComponentDescriptor
9+
from modules.common.fault_state import ComponentInfo, FaultState
10+
from modules.common.modbus import ModbusDataType
11+
from modules.common.simcount import SimCounter
12+
from modules.common.store import get_bat_value_store
13+
14+
15+
class KwargsDict(TypedDict):
16+
device_id: int
17+
tcp_client: modbus.ModbusTcpClient_
18+
modbus_id: int
19+
20+
21+
class AlgodueBat(AbstractBat):
22+
def __init__(self, component_config: AlgodueBatSetup, **kwargs: Any) -> None:
23+
self.component_config = component_config
24+
self.kwargs: KwargsDict = kwargs
25+
26+
def initialize(self) -> None:
27+
self.__device_id: int = self.kwargs['device_id']
28+
self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['tcp_client']
29+
self.__modbus_id: int = self.kwargs['modbus_id']
30+
self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="speicher")
31+
self.store = get_bat_value_store(self.component_config.id)
32+
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
33+
34+
def update(self):
35+
currents = self.__tcp_client.read_input_registers(
36+
0x100E, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id)
37+
powers = self.__tcp_client.read_input_registers(0x1020, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id)
38+
power = sum(powers)
39+
40+
imported, exported = self.sim_counter.sim_count(power)
41+
42+
bat_state = BatState(
43+
power=power,
44+
currents=currents,
45+
imported=imported,
46+
exported=exported
47+
)
48+
self.store.set(bat_state)
49+
50+
51+
component_descriptor = ComponentDescriptor(configuration_factory=AlgodueBatSetup)

packages/modules/devices/algodue/algodue/config.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from modules.common.component_setup import ComponentSetup
44
from ..vendor import vendor_descriptor
5+
from helpermodules.auto_str import auto_str
56

67

78
class AlgodueConfiguration:
@@ -24,15 +25,49 @@ def __init__(self,
2425
self.configuration = configuration or AlgodueConfiguration()
2526

2627

28+
@auto_str
2729
class AlgodueCounterConfiguration:
2830
def __init__(self):
2931
pass
3032

3133

34+
@auto_str
3235
class AlgodueCounterSetup(ComponentSetup[AlgodueCounterConfiguration]):
3336
def __init__(self,
3437
name: str = "Algodue Zähler",
3538
type: str = "counter",
3639
id: int = 0,
3740
configuration: AlgodueCounterConfiguration = None) -> None:
3841
super().__init__(name, type, id, configuration or AlgodueCounterConfiguration())
42+
43+
44+
@auto_str
45+
class AlgodueInverterConfiguration:
46+
def __init__(self):
47+
pass
48+
49+
50+
@auto_str
51+
class AlgodueInverterSetup(ComponentSetup[AlgodueInverterConfiguration]):
52+
def __init__(self,
53+
name: str = "Algodue Wechselrichterzähler",
54+
type: str = "inverter",
55+
id: int = 0,
56+
configuration: AlgodueInverterConfiguration = None) -> None:
57+
super().__init__(name, type, id, configuration or AlgodueInverterConfiguration())
58+
59+
60+
@auto_str
61+
class AlgodueBatConfiguration:
62+
def __init__(self):
63+
pass
64+
65+
66+
@auto_str
67+
class AlgodueBatSetup(ComponentSetup[AlgodueBatConfiguration]):
68+
def __init__(self,
69+
name: str = "Algodue Speicherzähler",
70+
type: str = "bat",
71+
id: int = 0,
72+
configuration: AlgodueBatConfiguration = None) -> None:
73+
super().__init__(name, type, id, configuration or AlgodueBatConfiguration())

packages/modules/devices/algodue/algodue/counter.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,15 @@ def initialize(self) -> None:
3232
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
3333

3434
def update(self):
35-
with self.__tcp_client:
36-
37-
frequency = self.__tcp_client.read_input_registers(0x1038, ModbusDataType.FLOAT_32, unit=self.__modbus_id)
38-
currents = self.__tcp_client.read_input_registers(
39-
0x100E, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id)
40-
powers = self.__tcp_client.read_input_registers(0x1020, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id)
41-
power = sum(powers)
42-
voltages = self.__tcp_client.read_input_registers(
43-
0x1000, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id)
44-
power_factors = self.__tcp_client.read_input_registers(
45-
0x1018, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id)
35+
frequency = self.__tcp_client.read_input_registers(0x1038, ModbusDataType.FLOAT_32, unit=self.__modbus_id)
36+
currents = self.__tcp_client.read_input_registers(
37+
0x100E, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id)
38+
powers = self.__tcp_client.read_input_registers(0x1020, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id)
39+
power = sum(powers)
40+
voltages = self.__tcp_client.read_input_registers(
41+
0x1000, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id)
42+
power_factors = self.__tcp_client.read_input_registers(
43+
0x1018, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id)
4644

4745
imported, exported = self.sim_counter.sim_count(power)
4846

packages/modules/devices/algodue/algodue/device.py

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

55
from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater
6-
from modules.devices.algodue.algodue import counter
7-
from modules.devices.algodue.algodue.config import Algodue, AlgodueCounterSetup
6+
from modules.devices.algodue.algodue import counter, inverter, bat
7+
from modules.devices.algodue.algodue.config import Algodue, AlgodueCounterSetup, AlgodueInverterSetup, AlgodueBatSetup
88
from modules.common import modbus
99
from modules.common.abstract_device import DeviceDescriptor
1010
from modules.common.component_context import SingleComponentUpdateContext
@@ -20,7 +20,18 @@ def create_counter_component(component_config: AlgodueCounterSetup):
2020
return counter.AlgodueCounter(component_config=component_config, device_id=device_config.id,
2121
tcp_client=client, modbus_id=device_config.configuration.modbus_id)
2222

23-
def update_components(components: Iterable[counter.AlgodueCounter]):
23+
def create_inverter_component(component_config: AlgodueInverterSetup):
24+
nonlocal client
25+
return inverter.AlgodueInverter(component_config=component_config, device_id=device_config.id,
26+
tcp_client=client, modbus_id=device_config.configuration.modbus_id)
27+
28+
def create_bat_component(component_config: AlgodueBatSetup):
29+
nonlocal client
30+
return bat.AlgodueBat(component_config=component_config, device_id=device_config.id,
31+
tcp_client=client, modbus_id=device_config.configuration.modbus_id)
32+
33+
def update_components(
34+
components: Iterable[Union[counter.AlgodueCounter, inverter.AlgodueInverter, bat.AlgodueBat]]):
2435
with client:
2536
for component in components:
2637
with SingleComponentUpdateContext(component.fault_state):
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#!/usr/bin/env python3
2+
from typing import Any, TypedDict
3+
4+
from modules.devices.algodue.algodue.config import AlgodueInverterSetup
5+
from modules.common import modbus
6+
from modules.common.abstract_device import AbstractInverter
7+
from modules.common.component_state import InverterState
8+
from modules.common.component_type import ComponentDescriptor
9+
from modules.common.fault_state import ComponentInfo, FaultState
10+
from modules.common.modbus import ModbusDataType
11+
from modules.common.simcount import SimCounter
12+
from modules.common.store import get_inverter_value_store
13+
14+
15+
class KwargsDict(TypedDict):
16+
device_id: int
17+
tcp_client: modbus.ModbusTcpClient_
18+
modbus_id: int
19+
20+
21+
class AlgodueInverter(AbstractInverter):
22+
def __init__(self, component_config: AlgodueInverterSetup, **kwargs: Any) -> None:
23+
self.component_config = component_config
24+
self.kwargs: KwargsDict = kwargs
25+
26+
def initialize(self) -> None:
27+
self.__device_id: int = self.kwargs['device_id']
28+
self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['tcp_client']
29+
self.__modbus_id: int = self.kwargs['modbus_id']
30+
self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="pv")
31+
self.store = get_inverter_value_store(self.component_config.id)
32+
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
33+
34+
def update(self):
35+
currents = self.__tcp_client.read_input_registers(
36+
0x100E, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id)
37+
powers = self.__tcp_client.read_input_registers(0x1020, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id)
38+
power = sum(powers)
39+
40+
_, exported = self.sim_counter.sim_count(power)
41+
42+
inverter_state = InverterState(
43+
power=power,
44+
currents=currents,
45+
exported=exported
46+
)
47+
self.store.set(inverter_state)
48+
49+
50+
component_descriptor = ComponentDescriptor(configuration_factory=AlgodueInverterSetup)

0 commit comments

Comments
 (0)