Skip to content

Commit 35129f6

Browse files
authored
Component error handler (#2317)
* component error handler * fixes * fix test * fix janitza
1 parent db40eb2 commit 35129f6

263 files changed

Lines changed: 2828 additions & 2095 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/samples/sample_modbus/device.py

Lines changed: 0 additions & 86 deletions
This file was deleted.
File renamed without changes.

docs/samples/sample_modbus/bat.py renamed to docs/samples/sample_modbus/sample_modbus/bat.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,36 @@
11
#!/usr/bin/env python3
2-
from typing import Optional
3-
from dataclass_utils import dataclass_from_dict
2+
from typing import Optional, TypedDict, Any
43
from modules.common.abstract_device import AbstractBat
54
from modules.common.component_state import BatState
65
from modules.common.component_type import ComponentDescriptor
76
from modules.common.fault_state import ComponentInfo, FaultState
87
from modules.common.modbus import ModbusDataType, ModbusTcpClient_
98
from modules.common.simcount import SimCounter
109
from modules.common.store import get_bat_value_store
11-
from modules.devices.sample_modbus.config import SampleBatSetup
10+
from modules.devices.sample_modbus.sample_modbus.config import SampleBatSetup
11+
12+
13+
class KwargsDict(TypedDict):
14+
device_id: int
15+
client: ModbusTcpClient_
1216

1317

1418
class SampleBat(AbstractBat):
15-
def __init__(self, device_id: int, component_config: SampleBatSetup, client: ModbusTcpClient_) -> None:
16-
self.__device_id = device_id
17-
self.component_config = dataclass_from_dict(SampleBatSetup, component_config)
19+
def __init__(self, component_config: SampleBatSetup, **kwargs: Any) -> None:
20+
self.component_config = component_config
21+
self.kwargs: KwargsDict = kwargs
22+
23+
def initialize(self) -> None:
24+
self.__device_id: int = self.kwargs['device_id']
25+
self.client: ModbusTcpClient_ = self.kwargs['client']
1826
self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="speicher")
1927
self.store = get_bat_value_store(self.component_config.id)
2028
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
21-
self.client = client
2229

2330
def update(self) -> None:
31+
unit = self.component_config.configuration.modbus_id
2432
power = self.client.read_holding_registers(reg, ModbusDataType.INT_32, unit=unit)
33+
soc = self.client.read_holding_registers(reg, ModbusDataType.INT_32, unit=unit)
2534
imported, exported = self.sim_counter.sim_count(power)
2635

2736
bat_state = BatState(

docs/samples/sample_request_by_device/config.py renamed to docs/samples/sample_modbus/sample_modbus/config.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55

66
@auto_str
77
class SampleConfiguration:
8-
def __init__(self, ip_address: Optional[str] = None):
8+
def __init__(self, ip_address: Optional[str] = None, port: int = 502):
99
self.ip_address = ip_address
10+
self.port = port
1011

1112

1213
@auto_str
@@ -24,8 +25,8 @@ def __init__(self,
2425

2526
@auto_str
2627
class SampleBatConfiguration:
27-
def __init__(self):
28-
pass
28+
def __init__(self, modbus_id: int = 1):
29+
self.modbus_id = modbus_id
2930

3031

3132
@auto_str
@@ -40,8 +41,8 @@ def __init__(self,
4041

4142
@auto_str
4243
class SampleCounterConfiguration:
43-
def __init__(self):
44-
pass
44+
def __init__(self, modbus_id: int = 1):
45+
self.modbus_id = modbus_id
4546

4647

4748
@auto_str
@@ -56,8 +57,8 @@ def __init__(self,
5657

5758
@auto_str
5859
class SampleInverterConfiguration:
59-
def __init__(self):
60-
pass
60+
def __init__(self, modbus_id: int = 1):
61+
self.modbus_id = modbus_id
6162

6263

6364
@auto_str

docs/samples/sample_modbus/counter.py renamed to docs/samples/sample_modbus/sample_modbus/counter.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,31 @@
11
#!/usr/bin/env python3
2-
from dataclass_utils import dataclass_from_dict
2+
from typing import TypedDict, Any
33
from modules.common.abstract_device import AbstractCounter
44
from modules.common.component_state import CounterState
55
from modules.common.component_type import ComponentDescriptor
66
from modules.common.fault_state import ComponentInfo, FaultState
77
from modules.common.modbus import ModbusDataType, ModbusTcpClient_
88
from modules.common.simcount import SimCounter
99
from modules.common.store import get_counter_value_store
10-
from modules.devices.sample_modbus.config import SampleCounterSetup
10+
from modules.devices.sample_modbus.sample_modbus.config import SampleCounterSetup
11+
12+
13+
class KwargsDict(TypedDict):
14+
device_id: int
15+
client: ModbusTcpClient_
1116

1217

1318
class SampleCounter(AbstractCounter):
14-
def __init__(self, device_id: int, component_config: SampleCounterSetup, client: ModbusTcpClient_) -> None:
15-
self.__device_id = device_id
16-
self.component_config = dataclass_from_dict(SampleCounterSetup, component_config)
19+
def __init__(self, component_config: SampleCounterSetup, **kwargs: Any) -> None:
20+
self.component_config = component_config
21+
self.kwargs: KwargsDict = kwargs
22+
23+
def initialize(self) -> None:
24+
self.__device_id: int = self.kwargs['device_id']
25+
self.client: ModbusTcpClient_ = self.kwargs['client']
1726
self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="bezug")
1827
self.store = get_counter_value_store(self.component_config.id)
1928
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
20-
self.client = client
2129

2230
def update(self):
2331
power = self.client.read_holding_registers(reg, ModbusDataType.INT_32, unit=unit)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#!/usr/bin/env python3
2+
import logging
3+
from typing import Iterable, Union
4+
5+
from modules.common.abstract_device import DeviceDescriptor
6+
from modules.common.configurable_device import ConfigurableDevice, ComponentFactoryByType, MultiComponentUpdater
7+
from modules.common.modbus import ModbusTcpClient_
8+
from modules.devices.sample_modbus.sample_modbus.bat import SampleBat
9+
from modules.devices.sample_modbus.sample_modbus.config import Sample, SampleBatSetup, SampleCounterSetup, SampleInverterSetup
10+
from modules.devices.sample_modbus.sample_modbus.counter import SampleCounter
11+
from modules.devices.sample_modbus.sample_modbus.inverter import SampleInverter
12+
13+
log = logging.getLogger(__name__)
14+
15+
16+
def create_device(device_config: Sample):
17+
client = None
18+
19+
def create_bat_component(component_config: SampleBatSetup):
20+
nonlocal client
21+
return SampleBat(component_config, device_id=device_config.id, client=client)
22+
23+
def create_counter_component(component_config: SampleCounterSetup):
24+
nonlocal client
25+
return SampleCounter(component_config, device_id=device_config.id, client=client)
26+
27+
def create_inverter_component(component_config: SampleInverterSetup):
28+
nonlocal client
29+
return SampleInverter(component_config, device_id=device_config.id, client=client)
30+
31+
def update_components(components: Iterable[Union[SampleBat, SampleCounter, SampleInverter]]):
32+
with client:
33+
for component in components:
34+
component.update()
35+
36+
def initializer():
37+
nonlocal client
38+
client = ModbusTcpClient_(device_config.configuration.ip_address, device_config.configuration.port)
39+
40+
return ConfigurableDevice(
41+
device_config=device_config,
42+
initializer=initializer,
43+
component_factory=ComponentFactoryByType(
44+
bat=create_bat_component,
45+
counter=create_counter_component,
46+
inverter=create_inverter_component,
47+
),
48+
component_updater=MultiComponentUpdater(update_components)
49+
)
50+
51+
52+
device_descriptor = DeviceDescriptor(configuration_factory=Sample)

docs/samples/sample_modbus/inverter.py renamed to docs/samples/sample_modbus/sample_modbus/inverter.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,31 @@
11
#!/usr/bin/env python3
2-
from dataclass_utils import dataclass_from_dict
2+
from typing import TypedDict, Any
33
from modules.common.abstract_device import AbstractInverter
44
from modules.common.component_state import InverterState
55
from modules.common.component_type import ComponentDescriptor
66
from modules.common.fault_state import ComponentInfo, FaultState
77
from modules.common.modbus import ModbusDataType, ModbusTcpClient_
88
from modules.common.simcount import SimCounter
99
from modules.common.store import get_inverter_value_store
10-
from modules.devices.sample_modbus.config import SampleInverterSetup
10+
from modules.devices.sample_modbus.sample_modbus.config import SampleInverterSetup
11+
12+
13+
class KwargsDict(TypedDict):
14+
device_id: int
15+
client: ModbusTcpClient_
1116

1217

1318
class SampleInverter(AbstractInverter):
14-
def __init__(self, device_id: int, component_config: SampleInverterSetup, client: ModbusTcpClient_) -> None:
15-
self.__device_id = device_id
16-
self.component_config = dataclass_from_dict(SampleInverterSetup, component_config)
19+
def __init__(self, component_config: SampleInverterSetup, **kwargs: Any) -> None:
20+
self.component_config = component_config
21+
self.kwargs: KwargsDict = kwargs
22+
23+
def initialize(self) -> None:
24+
self.__device_id: int = self.kwargs['device_id']
25+
self.client: ModbusTcpClient_ = self.kwargs['client']
1726
self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="pv")
1827
self.store = get_inverter_value_store(self.component_config.id)
1928
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
20-
self.client = client
2129

2230
def update(self) -> None:
2331
power = self.client.read_holding_registers(reg, ModbusDataType.INT_32, unit=unit)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from pathlib import Path
2+
3+
from modules.common.abstract_device import DeviceDescriptor
4+
from modules.devices.vendors import VendorGroup
5+
6+
7+
class Vendor:
8+
def __init__(self):
9+
self.type = Path(__file__).parent.name
10+
self.vendor = "Sample"
11+
self.group = VendorGroup.VENDORS.value
12+
13+
14+
vendor_descriptor = DeviceDescriptor(configuration_factory=Vendor)
File renamed without changes.

0 commit comments

Comments
 (0)