Skip to content

Commit 0786552

Browse files
authored
Elgris (#2624)
1 parent 5b82203 commit 0786552

12 files changed

Lines changed: 299 additions & 5 deletions

File tree

packages/modules/devices/elgris/__init__.py

Whitespace-only changes.

packages/modules/devices/elgris/elgris/__init__.py

Whitespace-only changes.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#!/usr/bin/env python3
2+
from typing import Any, TypedDict
3+
4+
from modules.common.component_state import BatState
5+
from modules.devices.elgris.elgris.elgris import Elgris
6+
from modules.devices.elgris.elgris.config import ElgrisBatSetup
7+
from modules.common import modbus
8+
from modules.common.abstract_device import AbstractBat
9+
from modules.common.component_type import ComponentDescriptor
10+
from modules.common.fault_state import ComponentInfo, FaultState
11+
from modules.common.store import get_bat_value_store
12+
13+
14+
class KwargsDict(TypedDict):
15+
tcp_client: modbus.ModbusTcpClient_
16+
modbus_id: int
17+
18+
19+
class ElgrisBat(AbstractBat):
20+
def __init__(self, component_config: ElgrisBatSetup, **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['tcp_client']
26+
self.__modbus_id: int = self.kwargs['modbus_id']
27+
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
28+
self.elgris = Elgris(self.__modbus_id, self.__tcp_client, self.fault_state)
29+
self.store = get_bat_value_store(self.component_config.id)
30+
31+
def update(self):
32+
with self.__tcp_client:
33+
counter_state = self.elgris.get_counter_state()
34+
bat_state = BatState(
35+
exported=counter_state.exported,
36+
imported=counter_state.imported,
37+
power=counter_state.power,
38+
currents=counter_state.currents,
39+
)
40+
self.store.set(bat_state)
41+
42+
43+
component_descriptor = ComponentDescriptor(configuration_factory=ElgrisBatSetup)
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from typing import Optional
2+
3+
from modules.common.component_setup import ComponentSetup
4+
from ..vendor import vendor_descriptor
5+
6+
7+
class ElgrisConfiguration:
8+
def __init__(self, modbus_id: int = 1, ip_address: Optional[str] = None, port: int = 502):
9+
self.modbus_id = modbus_id
10+
self.ip_address = ip_address
11+
self.port = port
12+
13+
14+
class Elgris:
15+
def __init__(self,
16+
name: str = "Elgris",
17+
type: str = "elgris",
18+
id: int = 0,
19+
configuration: ElgrisConfiguration = None) -> None:
20+
self.name = name
21+
self.type = type
22+
self.vendor = vendor_descriptor.configuration_factory().type
23+
self.id = id
24+
self.configuration = configuration or ElgrisConfiguration()
25+
26+
27+
class ElgrisBatConfiguration:
28+
def __init__(self):
29+
pass
30+
31+
32+
class ElgrisBatSetup(ComponentSetup[ElgrisBatConfiguration]):
33+
def __init__(self,
34+
name: str = "Elgris Smart Meter Speicher",
35+
type: str = "bat",
36+
id: int = 0,
37+
configuration: ElgrisBatConfiguration = None) -> None:
38+
super().__init__(name, type, id, configuration or ElgrisBatConfiguration())
39+
40+
41+
class ElgrisCounterConfiguration:
42+
def __init__(self):
43+
pass
44+
45+
46+
class ElgrisCounterSetup(ComponentSetup[ElgrisCounterConfiguration]):
47+
def __init__(self,
48+
name: str = "Elgris Smart Meter",
49+
type: str = "counter",
50+
id: int = 0,
51+
configuration: ElgrisCounterConfiguration = None) -> None:
52+
super().__init__(name, type, id, configuration or ElgrisCounterConfiguration())
53+
54+
55+
class ElgrisInverterConfiguration:
56+
def __init__(self):
57+
pass
58+
59+
60+
class ElgrisInverterSetup(ComponentSetup[ElgrisInverterConfiguration]):
61+
def __init__(self,
62+
name: str = "Elgris Smart Meter Welchselrichter",
63+
type: str = "inverter",
64+
id: int = 0,
65+
configuration: ElgrisInverterConfiguration = None) -> None:
66+
super().__init__(name, type, id, configuration or ElgrisInverterConfiguration())
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/usr/bin/env python3
2+
from typing import Any, TypedDict
3+
4+
from modules.devices.elgris.elgris.elgris import Elgris
5+
from modules.devices.elgris.elgris.config import ElgrisCounterSetup
6+
from modules.common import modbus
7+
from modules.common.abstract_device import AbstractCounter
8+
from modules.common.component_type import ComponentDescriptor
9+
from modules.common.fault_state import ComponentInfo, FaultState
10+
from modules.common.store import get_counter_value_store
11+
12+
13+
class KwargsDict(TypedDict):
14+
tcp_client: modbus.ModbusTcpClient_
15+
modbus_id: int
16+
17+
18+
class ElgrisCounter(AbstractCounter):
19+
def __init__(self, component_config: ElgrisCounterSetup, **kwargs: Any) -> None:
20+
self.component_config = component_config
21+
self.kwargs: KwargsDict = kwargs
22+
23+
def initialize(self) -> None:
24+
self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['tcp_client']
25+
self.__modbus_id: int = self.kwargs['modbus_id']
26+
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
27+
self.elgris = Elgris(self.__modbus_id, self.__tcp_client, self.fault_state)
28+
self.store = get_counter_value_store(self.component_config.id)
29+
30+
def update(self):
31+
with self.__tcp_client:
32+
counter_state = self.elgris.get_counter_state()
33+
self.store.set(counter_state)
34+
35+
36+
component_descriptor = ComponentDescriptor(configuration_factory=ElgrisCounterSetup)
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#!/usr/bin/env python3
2+
import logging
3+
from typing import Iterable, Union
4+
5+
from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater
6+
from modules.devices.elgris.elgris import bat, counter, inverter
7+
from modules.devices.elgris.elgris.config import Elgris, ElgrisBatSetup, ElgrisCounterSetup
8+
from modules.common import modbus
9+
from modules.common.abstract_device import DeviceDescriptor
10+
from modules.common.component_context import SingleComponentUpdateContext
11+
from modules.devices.elgris.elgris.config import ElgrisInverterSetup
12+
13+
log = logging.getLogger(__name__)
14+
15+
16+
def create_device(device_config: Elgris):
17+
client = None
18+
19+
def create_bat_component(component_config: ElgrisBatSetup):
20+
nonlocal client
21+
return bat.ElgrisBat(component_config=component_config, tcp_client=client,
22+
modbus_id=device_config.configuration.modbus_id)
23+
24+
def create_counter_component(component_config: ElgrisCounterSetup):
25+
nonlocal client
26+
return counter.ElgrisCounter(component_config=component_config, tcp_client=client,
27+
modbus_id=device_config.configuration.modbus_id)
28+
29+
def create_inverter_component(component_config: ElgrisInverterSetup):
30+
nonlocal client
31+
return inverter.ElgrisInverter(component_config=component_config, tcp_client=client,
32+
modbus_id=device_config.configuration.modbus_id)
33+
34+
def update_components(components: Iterable[Union[bat.ElgrisBat, counter.ElgrisCounter, inverter.ElgrisInverter]]):
35+
with client:
36+
for component in components:
37+
with SingleComponentUpdateContext(component.fault_state):
38+
component.update()
39+
40+
def initializer():
41+
nonlocal client
42+
client = modbus.ModbusTcpClient_(device_config.configuration.ip_address, device_config.configuration.port)
43+
44+
return ConfigurableDevice(
45+
device_config=device_config,
46+
initializer=initializer,
47+
component_factory=ComponentFactoryByType(
48+
bat=create_bat_component,
49+
counter=create_counter_component,
50+
inverter=create_inverter_component
51+
),
52+
component_updater=MultiComponentUpdater(update_components)
53+
)
54+
55+
56+
device_descriptor = DeviceDescriptor(configuration_factory=Elgris)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from modules.common import modbus
2+
from modules.common.fault_state import FaultState
3+
from modules.common.sdm import Sdm630_72
4+
5+
6+
class Elgris(Sdm630_72):
7+
def __init__(self, modbus_id: int, client: modbus.ModbusTcpClient_, fault_state: FaultState) -> None:
8+
self.client = client
9+
self.id = modbus_id
10+
self.last_query = self._get_time_ms()
11+
self.WAIT_MS_BETWEEN_QUERIES = 100
12+
self.serial_number = ""
13+
self.fault_state = fault_state
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#!/usr/bin/env python3
2+
from typing import Any, TypedDict
3+
4+
from modules.common.component_state import InverterState
5+
from modules.devices.elgris.elgris.elgris import Elgris
6+
from modules.common.store._inverter import get_inverter_value_store
7+
from modules.devices.elgris.elgris.config import ElgrisInverterSetup
8+
from modules.common import modbus
9+
from modules.common.abstract_device import AbstractInverter
10+
from modules.common.component_type import ComponentDescriptor
11+
from modules.common.fault_state import ComponentInfo, FaultState
12+
13+
14+
class KwargsDict(TypedDict):
15+
tcp_client: modbus.ModbusTcpClient_
16+
modbus_id: int
17+
18+
19+
class ElgrisInverter(AbstractInverter):
20+
def __init__(self, component_config: ElgrisInverterSetup, **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['tcp_client']
26+
self.__modbus_id: int = self.kwargs['modbus_id']
27+
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
28+
self.elgris = Elgris(self.__modbus_id, self.__tcp_client, self.fault_state)
29+
self.store = get_inverter_value_store(self.component_config.id)
30+
31+
def update(self):
32+
with self.__tcp_client:
33+
counter_state = self.elgris.get_counter_state()
34+
inverter_state = InverterState(
35+
exported=counter_state.exported,
36+
imported=counter_state.imported,
37+
power=counter_state.power,
38+
currents=counter_state.currents,
39+
)
40+
self.store.set(inverter_state)
41+
42+
43+
component_descriptor = ComponentDescriptor(configuration_factory=ElgrisInverterSetup)
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 = "Elgris"
11+
self.group = VendorGroup.VENDORS.value
12+
13+
14+
vendor_descriptor = DeviceDescriptor(configuration_factory=Vendor)

packages/smarthome/smartbase.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import os
44
from typing import Dict, Tuple
55
from smarthome.smartbase0 import Sbase0
6-
from smarthome.smartmeas import Slsdm630, Sllovato, Slsdm120, Slwe514, Slfronius
6+
from smarthome.smartmeas import SlElgris, Slsdm630, Sllovato, Slsdm120, Slwe514, Slfronius
77
from smarthome.smartmeas import Sljson, Slsmaem, Slshelly, Sltasmota, Slmqtt
88
from smarthome.smartmeas import Slhttp, Slavm, Slmystrom, Slb23
99
from smarthome.smartbut import Sbshelly
@@ -396,7 +396,9 @@ def updatepar(self, input_param: Dict[str, str]) -> None:
396396
") Separate Messung. Altes Measure"
397397
+ "device gelöscht " + self._oldmeasuretype1)
398398
del self._mydevicemeasure
399-
if (self._device_measuretype == 'sdm630'):
399+
if (self._device_measuretype == 'elgris'):
400+
self._mydevicemeasure = SlElgris()
401+
elif (self._device_measuretype == 'sdm630'):
400402
self._mydevicemeasure = Slsdm630()
401403
elif (self._device_measuretype == 'lovato'):
402404
self._mydevicemeasure = Sllovato()

0 commit comments

Comments
 (0)