Skip to content
Merged

Elgris #2624

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file.
Empty file.
43 changes: 43 additions & 0 deletions packages/modules/devices/elgris/elgris/bat.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/usr/bin/env python3
from typing import Any, TypedDict

from modules.common.component_state import BatState
from modules.devices.elgris.elgris.elgris import Elgris
from modules.devices.elgris.elgris.config import ElgrisBatSetup
from modules.common import modbus
from modules.common.abstract_device import AbstractBat
from modules.common.component_type import ComponentDescriptor
from modules.common.fault_state import ComponentInfo, FaultState
from modules.common.store import get_bat_value_store


class KwargsDict(TypedDict):
tcp_client: modbus.ModbusTcpClient_
modbus_id: int


class ElgrisBat(AbstractBat):
def __init__(self, component_config: ElgrisBatSetup, **kwargs: Any) -> None:
self.component_config = component_config
self.kwargs: KwargsDict = kwargs

def initialize(self) -> None:
self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['tcp_client']
self.__modbus_id: int = self.kwargs['modbus_id']
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
self.elgris = Elgris(self.__modbus_id, self.__tcp_client, self.fault_state)
self.store = get_bat_value_store(self.component_config.id)

def update(self):
with self.__tcp_client:
counter_state = self.elgris.get_counter_state()
bat_state = BatState(
exported=counter_state.exported,
imported=counter_state.imported,
power=counter_state.power,
currents=counter_state.currents,
)
self.store.set(bat_state)


component_descriptor = ComponentDescriptor(configuration_factory=ElgrisBatSetup)
66 changes: 66 additions & 0 deletions packages/modules/devices/elgris/elgris/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
from typing import Optional

from modules.common.component_setup import ComponentSetup
from ..vendor import vendor_descriptor


class ElgrisConfiguration:
def __init__(self, modbus_id: int = 1, ip_address: Optional[str] = None, port: int = 502):
self.modbus_id = modbus_id
self.ip_address = ip_address
self.port = port


class Elgris:
def __init__(self,
name: str = "Elgris",
type: str = "elgris",
id: int = 0,
configuration: ElgrisConfiguration = None) -> None:
self.name = name
self.type = type
self.vendor = vendor_descriptor.configuration_factory().type
self.id = id
self.configuration = configuration or ElgrisConfiguration()


class ElgrisBatConfiguration:
def __init__(self):
pass


class ElgrisBatSetup(ComponentSetup[ElgrisBatConfiguration]):
def __init__(self,
name: str = "Elgris Smart Meter Speicher",
type: str = "bat",
id: int = 0,
configuration: ElgrisBatConfiguration = None) -> None:
super().__init__(name, type, id, configuration or ElgrisBatConfiguration())


class ElgrisCounterConfiguration:
def __init__(self):
pass


class ElgrisCounterSetup(ComponentSetup[ElgrisCounterConfiguration]):
def __init__(self,
name: str = "Elgris Smart Meter",
type: str = "counter",
id: int = 0,
configuration: ElgrisCounterConfiguration = None) -> None:
super().__init__(name, type, id, configuration or ElgrisCounterConfiguration())


class ElgrisInverterConfiguration:
def __init__(self):
pass


class ElgrisInverterSetup(ComponentSetup[ElgrisInverterConfiguration]):
def __init__(self,
name: str = "Elgris Smart Meter Welchselrichter",
type: str = "inverter",
id: int = 0,
configuration: ElgrisInverterConfiguration = None) -> None:
super().__init__(name, type, id, configuration or ElgrisInverterConfiguration())
36 changes: 36 additions & 0 deletions packages/modules/devices/elgris/elgris/counter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#!/usr/bin/env python3
from typing import Any, TypedDict

from modules.devices.elgris.elgris.elgris import Elgris
from modules.devices.elgris.elgris.config import ElgrisCounterSetup
from modules.common import modbus
from modules.common.abstract_device import AbstractCounter
from modules.common.component_type import ComponentDescriptor
from modules.common.fault_state import ComponentInfo, FaultState
from modules.common.store import get_counter_value_store


class KwargsDict(TypedDict):
tcp_client: modbus.ModbusTcpClient_
modbus_id: int


class ElgrisCounter(AbstractCounter):
def __init__(self, component_config: ElgrisCounterSetup, **kwargs: Any) -> None:
self.component_config = component_config
self.kwargs: KwargsDict = kwargs

def initialize(self) -> None:
self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['tcp_client']
self.__modbus_id: int = self.kwargs['modbus_id']
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
self.elgris = Elgris(self.__modbus_id, self.__tcp_client, self.fault_state)
self.store = get_counter_value_store(self.component_config.id)

def update(self):
with self.__tcp_client:
counter_state = self.elgris.get_counter_state()
self.store.set(counter_state)


component_descriptor = ComponentDescriptor(configuration_factory=ElgrisCounterSetup)
56 changes: 56 additions & 0 deletions packages/modules/devices/elgris/elgris/device.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#!/usr/bin/env python3
import logging
from typing import Iterable, Union

from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater
from modules.devices.elgris.elgris import bat, counter, inverter
from modules.devices.elgris.elgris.config import Elgris, ElgrisBatSetup, ElgrisCounterSetup
from modules.common import modbus
from modules.common.abstract_device import DeviceDescriptor
from modules.common.component_context import SingleComponentUpdateContext
from modules.devices.elgris.elgris.config import ElgrisInverterSetup

log = logging.getLogger(__name__)


def create_device(device_config: Elgris):
client = None

def create_bat_component(component_config: ElgrisBatSetup):
nonlocal client
return bat.ElgrisBat(component_config=component_config, tcp_client=client,
modbus_id=device_config.configuration.modbus_id)

def create_counter_component(component_config: ElgrisCounterSetup):
nonlocal client
return counter.ElgrisCounter(component_config=component_config, tcp_client=client,
modbus_id=device_config.configuration.modbus_id)

def create_inverter_component(component_config: ElgrisInverterSetup):
nonlocal client
return inverter.ElgrisInverter(component_config=component_config, tcp_client=client,
modbus_id=device_config.configuration.modbus_id)

def update_components(components: Iterable[Union[bat.ElgrisBat, counter.ElgrisCounter, inverter.ElgrisInverter]]):
with client:
for component in components:
with SingleComponentUpdateContext(component.fault_state):
component.update()

def initializer():
nonlocal client
client = modbus.ModbusTcpClient_(device_config.configuration.ip_address, device_config.configuration.port)

return ConfigurableDevice(
device_config=device_config,
initializer=initializer,
component_factory=ComponentFactoryByType(
bat=create_bat_component,
counter=create_counter_component,
inverter=create_inverter_component
),
component_updater=MultiComponentUpdater(update_components)
)


device_descriptor = DeviceDescriptor(configuration_factory=Elgris)
13 changes: 13 additions & 0 deletions packages/modules/devices/elgris/elgris/elgris.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from modules.common import modbus
from modules.common.fault_state import FaultState
from modules.common.sdm import Sdm630_72


class Elgris(Sdm630_72):
def __init__(self, modbus_id: int, client: modbus.ModbusTcpClient_, fault_state: FaultState) -> None:
self.client = client
self.id = modbus_id
self.last_query = self._get_time_ms()
self.WAIT_MS_BETWEEN_QUERIES = 100
self.serial_number = ""
self.fault_state = fault_state
43 changes: 43 additions & 0 deletions packages/modules/devices/elgris/elgris/inverter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/usr/bin/env python3
from typing import Any, TypedDict

from modules.common.component_state import InverterState
from modules.devices.elgris.elgris.elgris import Elgris
from modules.common.store._inverter import get_inverter_value_store
from modules.devices.elgris.elgris.config import ElgrisInverterSetup
from modules.common import modbus
from modules.common.abstract_device import AbstractInverter
from modules.common.component_type import ComponentDescriptor
from modules.common.fault_state import ComponentInfo, FaultState


class KwargsDict(TypedDict):
tcp_client: modbus.ModbusTcpClient_
modbus_id: int


class ElgrisInverter(AbstractInverter):
def __init__(self, component_config: ElgrisInverterSetup, **kwargs: Any) -> None:
self.component_config = component_config
self.kwargs: KwargsDict = kwargs

def initialize(self) -> None:
self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['tcp_client']
self.__modbus_id: int = self.kwargs['modbus_id']
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
self.elgris = Elgris(self.__modbus_id, self.__tcp_client, self.fault_state)
self.store = get_inverter_value_store(self.component_config.id)

def update(self):
with self.__tcp_client:
counter_state = self.elgris.get_counter_state()
inverter_state = InverterState(
exported=counter_state.exported,
imported=counter_state.imported,
power=counter_state.power,
currents=counter_state.currents,
)
self.store.set(inverter_state)


component_descriptor = ComponentDescriptor(configuration_factory=ElgrisInverterSetup)
14 changes: 14 additions & 0 deletions packages/modules/devices/elgris/vendor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from pathlib import Path

from modules.common.abstract_device import DeviceDescriptor
from modules.devices.vendors import VendorGroup


class Vendor:
def __init__(self):
self.type = Path(__file__).parent.name
self.vendor = "Elgris"
self.group = VendorGroup.VENDORS.value


vendor_descriptor = DeviceDescriptor(configuration_factory=Vendor)
6 changes: 4 additions & 2 deletions packages/smarthome/smartbase.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import os
from typing import Dict, Tuple
from smarthome.smartbase0 import Sbase0
from smarthome.smartmeas import Slsdm630, Sllovato, Slsdm120, Slwe514, Slfronius
from smarthome.smartmeas import SlElgris, Slsdm630, Sllovato, Slsdm120, Slwe514, Slfronius
from smarthome.smartmeas import Sljson, Slsmaem, Slshelly, Sltasmota, Slmqtt
from smarthome.smartmeas import Slhttp, Slavm, Slmystrom, Slb23
from smarthome.smartbut import Sbshelly
Expand Down Expand Up @@ -396,7 +396,9 @@ def updatepar(self, input_param: Dict[str, str]) -> None:
") Separate Messung. Altes Measure"
+ "device gelöscht " + self._oldmeasuretype1)
del self._mydevicemeasure
if (self._device_measuretype == 'sdm630'):
if (self._device_measuretype == 'elgris'):
self._mydevicemeasure = SlElgris()
elif (self._device_measuretype == 'sdm630'):
self._mydevicemeasure = Slsdm630()
elif (self._device_measuretype == 'lovato'):
self._mydevicemeasure = Sllovato()
Expand Down
20 changes: 20 additions & 0 deletions packages/smarthome/smartmeas.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from modules.devices.elgris.elgris import elgris
from smarthome.smartbase0 import Sbase0
from typing import Dict, Tuple
from modules.common import modbus
Expand Down Expand Up @@ -524,6 +525,25 @@ def sepwattread(self) -> Tuple[int, int]:
return self.newwatt, self.newwattk


class SlElgris(Slbase):
def __init__(self) -> None:
# setting
super().__init__()

def sepwattread(self) -> Tuple[int, int]:
try:
with modbus.ModbusTcpClient_(self._device_measureip, self._device_measureportsdm) as tcp_client:
elg = elgris.Elgris(self._device_measureid, tcp_client, None)
_, newwatt = elg.get_power()
self.newwatt = int(newwatt)
self.newwattk = int(elg.get_imported())
except Exception:
log.exception("Leistungsmessung %s %d %s "
% ('Elgris ', self.device_nummer,
str(self._device_measureip)))
return self.newwatt, self.newwattk


class Slsdm120(Slbase):
def __init__(self) -> None:
# setting
Expand Down
7 changes: 4 additions & 3 deletions web/settings/modules/legacy_smart_home/smarthomeconfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -905,6 +905,7 @@
<div class="col">
<select class="form-control" name="device_measureType" id="device_measureTypeDevices<?php echo $devicenum; ?>" data-default="sdm630" data-topicprefix="openWB/LegacySmartHome/config/get/" data-topicsubgroup="Devices/<?php echo $devicenum; ?>/">
<option value ="" data-option="" disabled="disabled" selected="selected">-- Bitte auswählen --</option>
<option value="elgris" data-option="fronius">Elgris</option>
<option value="fronius" data-option="fronius">Fronius</option>
<option value="http" data-option="http">Http</option>
<option value="json" data-option="json">Json</option>
Expand All @@ -922,7 +923,7 @@
</select>
</div>
</div>
<div class="form-row mb-1 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-shelly deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-tasmota deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-sdm630 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-lovato deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-b23 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-sdm120 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-we514 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-mystrom deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-fronius deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-avm hide">
<div class="form-row mb-1 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-shelly deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-tasmota deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-sdm630 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-lovato deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-b23 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-sdm120 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-we514 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-mystrom deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-fronius deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-avm hide deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-elgris">
<label for="device_measureipDevices<?php echo $devicenum; ?>" class="col-md-4 col-form-label">IP Adresse</label>
<div class="col">
<input id="device_measureipDevices<?php echo $devicenum; ?>" name="device_measureip" class="form-control" type="text" required="required" pattern="^((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$" data-default="192.168.1.1" value="192.168.1.1" inputmode="text" data-topicprefix="openWB/LegacySmartHome/config/get/" data-topicsubgroup="Devices/<?php echo $devicenum; ?>/">
Expand Down Expand Up @@ -976,13 +977,13 @@
</select>
</div>
</div>
<div class="form-row mb-1 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-sdm630 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-b23 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-lovato deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-sdm120 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-we514 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-fronius hide">
<div class="form-row mb-1 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-sdm630 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-b23 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-lovato deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-sdm120 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-we514 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-fronius hide deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-elgris ">
<label for="device_measureidDevices<?php echo $devicenum; ?>" class="col-md-4 col-form-label">ID des Zählers</label>
<div class="col">
<input id="device_measureidDevices<?php echo $devicenum; ?>" name="device_measureid" class="form-control naturalNumber" type="number" inputmode="decimal" required min="1" max="255" data-default="1" value="1" data-topicprefix="openWB/LegacySmartHome/config/get/" data-topicsubgroup="Devices/<?php echo $devicenum; ?>/">
</div>
</div>
<div class="form-row mb-1 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-sdm120 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-b23 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-lovato deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-sdm630 hide">
<div class="form-row mb-1 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-sdm120 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-b23 deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-lovato deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-sdm630 hide deviceMeasureTypeDevices<?php echo $devicenum; ?>-option-elgris hide">
<label for="device_measurePortSdmDevices<?php echo $devicenum; ?>" class="col-md-4 col-form-label">Modbusport des Zählers</label>
<div class="col">
<input id="device_measurePortSdmDevices<?php echo $devicenum; ?>" name="device_measurePortSdm" class="form-control naturalNumber" type="number" inputmode="decimal" required min="1" max="9999" data-default="8899" value="8899" data-topicprefix="openWB/LegacySmartHome/config/get/" data-topicsubgroup="Devices/<?php echo $devicenum; ?>/">
Expand Down