Skip to content

Commit f277ecb

Browse files
authored
Zählermodul für Thermia Wärmepumpen mit CG Zähler (#2345)
* thermia-counter * Update counter.py * Update counter.py * thermia-counter * Update * Update * Move Modbus-ID to Device * Update device.py * Update device.py
1 parent 2944b5b commit f277ecb

6 files changed

Lines changed: 155 additions & 0 deletions

File tree

packages/modules/devices/thermia/__init__ .py

Whitespace-only changes.

packages/modules/devices/thermia/thermia/__init__.py

Whitespace-only changes.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from typing import Optional
2+
from helpermodules.auto_str import auto_str
3+
from modules.common.component_setup import ComponentSetup
4+
from ..vendor import vendor_descriptor
5+
6+
7+
@auto_str
8+
class ThermiaConfiguration:
9+
def __init__(self, ip_address: Optional[str] = None, port: int = 502, modbus_id: int = 1):
10+
self.ip_address = ip_address
11+
self.port = port
12+
self.modbus_id = modbus_id
13+
14+
15+
@auto_str
16+
class Thermia:
17+
def __init__(self,
18+
name: str = "Thermia",
19+
type: str = "thermia",
20+
id: int = 0,
21+
configuration: ThermiaConfiguration = None) -> None:
22+
self.name = name
23+
self.type = type
24+
self.vendor = vendor_descriptor.configuration_factory().type
25+
self.id = id
26+
self.configuration = configuration or ThermiaConfiguration()
27+
28+
29+
@auto_str
30+
class ThermiaCounterConfiguration:
31+
def __init__(self):
32+
pass
33+
34+
35+
@auto_str
36+
class ThermiaCounterSetup(ComponentSetup[ThermiaCounterConfiguration]):
37+
def __init__(self,
38+
name: str = "Thermia Zähler",
39+
type: str = "counter",
40+
id: int = 0,
41+
configuration: ThermiaCounterConfiguration = None) -> None:
42+
super().__init__(name, type, id, configuration or ThermiaCounterConfiguration())
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#!/usr/bin/env python3
2+
from typing import TypedDict, Any
3+
from modules.common.abstract_device import AbstractCounter
4+
from modules.common.component_state import CounterState
5+
from modules.common.component_type import ComponentDescriptor
6+
from modules.common.fault_state import ComponentInfo, FaultState
7+
from modules.common.modbus import ModbusDataType, ModbusTcpClient_
8+
from modules.common.simcount import SimCounter
9+
from modules.common.store import get_counter_value_store
10+
from modules.devices.thermia.thermia.config import ThermiaCounterSetup
11+
from pymodbus.constants import Endian
12+
13+
14+
class KwargsDict(TypedDict):
15+
device_id: int
16+
client: ModbusTcpClient_
17+
modbus_id: int
18+
19+
20+
class ThermiaCounter(AbstractCounter):
21+
def __init__(self, component_config: ThermiaCounterSetup, **kwargs: Any) -> None:
22+
self.component_config = component_config
23+
self.kwargs: KwargsDict = kwargs
24+
25+
def initialize(self) -> None:
26+
self.__device_id: int = self.kwargs['device_id']
27+
self.client: ModbusTcpClient_ = self.kwargs['client']
28+
self.modbus_id: int = self.kwargs['modbus_id']
29+
self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="bezug")
30+
self.store = get_counter_value_store(self.component_config.id)
31+
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
32+
33+
def update(self):
34+
with self.client:
35+
voltages = [val / 100 for val in self.client.read_input_registers(
36+
72, [ModbusDataType.INT_16] * 3, unit=self.modbus_id)]
37+
powers = [val / 1 for val in self.client.read_input_registers(
38+
78, [ModbusDataType.INT_16] * 3, unit=self.modbus_id)]
39+
power = sum(powers)
40+
currents = [(val / 100) for val in self.client.read_input_registers(
41+
69, [ModbusDataType.INT_16] * 3, unit=self.modbus_id)]
42+
imported = self.client.read_input_registers(
43+
83, ModbusDataType.INT_32, wordorder=Endian.Little,
44+
unit=self.modbus_id) * 100
45+
exported = 0
46+
47+
counter_state = CounterState(
48+
currents=currents,
49+
imported=imported,
50+
exported=exported,
51+
power=power,
52+
powers=powers,
53+
voltages=voltages
54+
)
55+
self.store.set(counter_state)
56+
57+
58+
component_descriptor = ComponentDescriptor(configuration_factory=ThermiaCounterSetup)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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.thermia.thermia.config import Thermia, ThermiaCounterSetup
9+
from modules.devices.thermia.thermia.counter import ThermiaCounter
10+
11+
log = logging.getLogger(__name__)
12+
13+
14+
def create_device(device_config: Thermia):
15+
client = None
16+
17+
def create_counter_component(component_config: ThermiaCounterSetup):
18+
nonlocal client
19+
return ThermiaCounter(component_config, device_id=device_config.id,
20+
client=client, modbus_id=device_config.configuration.modbus_id)
21+
22+
def update_components(components: Iterable[Union[ThermiaCounter]]):
23+
with client:
24+
for component in components:
25+
component.update()
26+
27+
def initializer():
28+
nonlocal client
29+
client = ModbusTcpClient_(device_config.configuration.ip_address, device_config.configuration.port)
30+
31+
return ConfigurableDevice(
32+
device_config=device_config,
33+
initializer=initializer,
34+
component_factory=ComponentFactoryByType(
35+
counter=create_counter_component,
36+
),
37+
component_updater=MultiComponentUpdater(update_components)
38+
)
39+
40+
41+
device_descriptor = DeviceDescriptor(configuration_factory=Thermia)
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 = "Thermia"
11+
self.group = VendorGroup.VENDORS.value
12+
13+
14+
vendor_descriptor = DeviceDescriptor(configuration_factory=Vendor)

0 commit comments

Comments
 (0)