Skip to content

Commit 41c65b0

Browse files
authored
Merge branch 'openWB:master' into master
2 parents 5236af4 + 8f93729 commit 41c65b0

File tree

350 files changed

+3530
-2357
lines changed

Some content is hidden

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

350 files changed

+3530
-2357
lines changed

packages/modules/common/sdm.py

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#!/usr/bin/env python3
22
from enum import IntEnum
3+
import logging
34
import time
45
from typing import List, Tuple
56

@@ -10,11 +11,14 @@
1011
from modules.common.hardware_check import check_meter_values
1112
from modules.common.modbus import ModbusDataType
1213

14+
log = logging.getLogger(__name__)
15+
1316

1417
class Sdm(AbstractCounter):
1518
def __init__(self, modbus_id: int, client: modbus.ModbusTcpClient_) -> None:
1619
self.client = client
1720
self.id = modbus_id
21+
self.fast_mode = True
1822
with client:
1923
self.serial_number = str(self.client.read_holding_registers(0xFC00, ModbusDataType.UINT_32, unit=self.id))
2024

@@ -64,16 +68,48 @@ def get_voltages(self) -> Tuple[List[float], float]:
6468

6569
def get_counter_state(self) -> CounterState:
6670
# entgegen der Doku können nicht bei allen SDM72 80 Register auf einmal gelesen werden,
67-
# manche können auch nur 20
68-
time.sleep(0.1)
69-
bulk_1 = self.client.read_input_registers_bulk(
70-
SdmRegister.VOLTAGE_L1, 20, mapping=self.REG_MAPPING_BULK_1, unit=self.id)
71-
time.sleep(0.1)
72-
power_factors = self.client.read_input_registers(0x1E, [ModbusDataType.FLOAT_32]*3, unit=self.id)
73-
time.sleep(0.1)
74-
bulk_2 = self.client.read_input_registers_bulk(
75-
SdmRegister.FREQUENCY, 8, mapping=self.REG_MAPPING_BULK_2, unit=self.id)
76-
resp = {**bulk_1, **bulk_2}
71+
# manche können auch nur 10
72+
if self.fast_mode:
73+
try:
74+
time.sleep(0.1)
75+
bulk_1 = self.client.read_input_registers_bulk(
76+
SdmRegister.VOLTAGE_L1, 18, mapping=self.REG_MAPPING_BULK_1, unit=self.id)
77+
time.sleep(0.1)
78+
power_factors = self.client.read_input_registers(
79+
SdmRegister.POWER_FACTOR_L1, [ModbusDataType.FLOAT_32]*3, unit=self.id)
80+
time.sleep(0.1)
81+
bulk_2 = self.client.read_input_registers_bulk(
82+
SdmRegister.FREQUENCY, 6, mapping=self.REG_MAPPING_BULK_2, unit=self.id)
83+
resp = {**bulk_1, **bulk_2}
84+
except Exception:
85+
log.exception("Fehler beim Auslesen des Zählers")
86+
self.client.read_input_registers(
87+
SdmRegister.VOLTAGE_L1, [ModbusDataType.FLOAT_32]*3, unit=self.id)
88+
self.fast_mode = False
89+
if self.fast_mode is False:
90+
# im gleichen Durchlauf noch im slow mode versuchen, sonst schlägt der Hardware-Check fehl
91+
log.debug("Auslesung des Zählers im Kompatibilitäts-Modus")
92+
resp = {}
93+
time.sleep(0.1)
94+
resp[SdmRegister.VOLTAGE_L1] = self.client.read_input_registers(
95+
SdmRegister.VOLTAGE_L1, [ModbusDataType.FLOAT_32]*3, unit=self.id)
96+
time.sleep(0.1)
97+
resp[SdmRegister.CURRENT_L1] = self.client.read_input_registers(
98+
SdmRegister.CURRENT_L1, [ModbusDataType.FLOAT_32]*3, unit=self.id)
99+
time.sleep(0.1)
100+
resp[SdmRegister.POWER_L1] = self.client.read_input_registers(
101+
SdmRegister.POWER_L1, [ModbusDataType.FLOAT_32]*3, unit=self.id)
102+
time.sleep(0.1)
103+
power_factors = self.client.read_input_registers(
104+
SdmRegister.POWER_FACTOR_L1, [ModbusDataType.FLOAT_32]*3, unit=self.id)
105+
time.sleep(0.1)
106+
# frequency noch mit auslesen klappt nicht
107+
resp[SdmRegister.IMPORTED], resp[SdmRegister.EXPORTED] = self.client.read_input_registers(
108+
SdmRegister.IMPORTED, [ModbusDataType.FLOAT_32]*2, unit=self.id)
109+
time.sleep(0.1)
110+
resp[SdmRegister.FREQUENCY] = self.client.read_input_registers(
111+
SdmRegister.FREQUENCY, ModbusDataType.FLOAT_32, unit=self.id)
112+
77113
frequency = resp[SdmRegister.FREQUENCY]
78114
if frequency > 100:
79115
frequency = frequency / 10
@@ -123,7 +159,7 @@ def get_counter_state(self) -> CounterState:
123159
power_factor = self.client.read_input_registers(0x1E, ModbusDataType.FLOAT_32, unit=self.id)
124160
time.sleep(0.1)
125161
bulk_2 = self.client.read_input_registers_bulk(
126-
SdmRegister.FREQUENCY, 8, mapping=self.REG_MAPPING_BULK_2, unit=self.id)
162+
SdmRegister.FREQUENCY, 6, mapping=self.REG_MAPPING_BULK_2, unit=self.id)
127163
resp = {**bulk_1, **bulk_2}
128164
frequency = resp[SdmRegister.FREQUENCY]
129165
if frequency > 100:

packages/modules/devices/elgris/elgris/bat.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ def initialize(self) -> None:
2929
self.store = get_bat_value_store(self.component_config.id)
3030

3131
def update(self):
32-
with self.__tcp_client:
33-
counter_state = self.elgris.get_counter_state()
32+
counter_state = self.elgris.get_counter_state()
3433
bat_state = BatState(
3534
exported=counter_state.exported,
3635
imported=counter_state.imported,

packages/modules/devices/elgris/elgris/counter.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ def initialize(self) -> None:
2828
self.store = get_counter_value_store(self.component_config.id)
2929

3030
def update(self):
31-
with self.__tcp_client:
32-
counter_state = self.elgris.get_counter_state()
31+
counter_state = self.elgris.get_counter_state()
3332
self.store.set(counter_state)
3433

3534

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ def __init__(self, modbus_id: int, client: modbus.ModbusTcpClient_, fault_state:
99
self.id = modbus_id
1010
self.serial_number = ""
1111
self.fault_state = fault_state
12+
self.fast_mode = True
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
from unittest.mock import Mock
2+
3+
from modules.common.component_state import BatState, CounterState, InverterState
4+
from modules.common.modbus import ModbusTcpClient_
5+
6+
from modules.common.sdm import SdmRegister
7+
from modules.devices.elgris.elgris.config import Elgris, ElgrisBatSetup, ElgrisCounterSetup, ElgrisInverterSetup
8+
from modules.devices.elgris.elgris.device import create_device
9+
10+
11+
def setup_modbus_mocks(monkeypatch):
12+
"""Setup common Modbus mocks für alle Tests"""
13+
mock_read_input_registers_bulk = Mock(side_effect=[
14+
{SdmRegister.VOLTAGE_L1: [231]*3, SdmRegister.CURRENT_L1: [0.5]*3, SdmRegister.POWER_L1: [115]*3},
15+
{SdmRegister.IMPORTED: 100, SdmRegister.EXPORTED: 200, SdmRegister.FREQUENCY: 50}])
16+
mock_read_input_registers = Mock(side_effect=[[0.99]*3])
17+
18+
monkeypatch.setattr(ModbusTcpClient_, "__enter__", Mock())
19+
monkeypatch.setattr(ModbusTcpClient_, "__exit__", Mock())
20+
monkeypatch.setattr(ModbusTcpClient_, "read_input_registers_bulk", mock_read_input_registers_bulk)
21+
monkeypatch.setattr(ModbusTcpClient_, "read_input_registers", mock_read_input_registers)
22+
23+
24+
def test_elgris_bat(monkeypatch):
25+
setup_modbus_mocks(monkeypatch)
26+
27+
device = create_device(Elgris())
28+
device.add_component(ElgrisBatSetup())
29+
30+
store_bat_mock = Mock()
31+
monkeypatch.setattr(device.components["component0"], "store", store_bat_mock)
32+
33+
# execution
34+
device.update()
35+
36+
# evaluation
37+
assert vars(store_bat_mock.set.call_args[0][0]) == vars(BatState(
38+
exported=200000,
39+
imported=100000,
40+
power=345,
41+
currents=[0.5]*3,
42+
))
43+
44+
45+
def test_elgris_counter(monkeypatch):
46+
setup_modbus_mocks(monkeypatch)
47+
48+
device = create_device(Elgris())
49+
device.add_component(ElgrisCounterSetup(id=1))
50+
51+
store_counter_mock = Mock()
52+
monkeypatch.setattr(device.components["component1"], "store", store_counter_mock)
53+
54+
# execution
55+
device.update()
56+
57+
# evaluation
58+
assert vars(store_counter_mock.set.call_args[0][0]) == vars(CounterState(
59+
exported=200000,
60+
imported=100000,
61+
power=345,
62+
voltages=[231]*3,
63+
currents=[0.5]*3,
64+
powers=[115]*3,
65+
power_factors=[0.99]*3,
66+
frequency=50,
67+
serial_number=""
68+
))
69+
70+
71+
def test_elgris_inverter(monkeypatch):
72+
setup_modbus_mocks(monkeypatch)
73+
74+
device = create_device(Elgris())
75+
device.add_component(ElgrisInverterSetup(id=2))
76+
77+
store_inverter_mock = Mock()
78+
monkeypatch.setattr(device.components["component2"], "store", store_inverter_mock)
79+
80+
# execution
81+
device.update()
82+
83+
# evaluation
84+
assert vars(store_inverter_mock.set.call_args[0][0]) == vars(InverterState(
85+
exported=200000,
86+
imported=100000,
87+
power=345,
88+
currents=[0.5]*3,
89+
))

packages/modules/devices/elgris/elgris/inverter.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ def initialize(self) -> None:
2929
self.store = get_inverter_value_store(self.component_config.id)
3030

3131
def update(self):
32-
with self.__tcp_client:
33-
counter_state = self.elgris.get_counter_state()
32+
counter_state = self.elgris.get_counter_state()
3433
inverter_state = InverterState(
3534
exported=counter_state.exported,
3635
imported=counter_state.imported,

packages/modules/web_themes/colors/config.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,39 @@
11
from helpermodules.auto_str import auto_str
2-
32
from modules.common.abstract_device import DeviceDescriptor
43

54

65
@auto_str
76
class ColorsWebThemeConfiguration:
8-
def __init__(self) -> None:
9-
pass
7+
def __init__(self,
8+
displayMode: str = 'dark',
9+
smartHomeColors: str = 'normal',
10+
liveGraphDuration: int = 3600,
11+
showGrid: bool = False,
12+
decimalPlaces: int = 1,
13+
showRelativeArcs: bool = False,
14+
showInverters: bool = True,
15+
showVehicles: bool = False,
16+
showCounters: bool = False,
17+
showPrices: bool = False,
18+
alternativeEnergy: bool = False,
19+
showStandardVehicle: bool = False,
20+
lowerPriceBound: float = 0.0,
21+
upperPriceBound: float = 0.0
22+
) -> None:
23+
self.displayMode = displayMode
24+
self.smartHomeColors = smartHomeColors
25+
self.liveGraphDuration = liveGraphDuration
26+
self.showGrid = showGrid
27+
self.decimalPlaces = decimalPlaces
28+
self.showRelativeArcs = showRelativeArcs
29+
self.showInverters = showInverters
30+
self.showVehicles = showVehicles
31+
self.showCounters = showCounters
32+
self.showPrices = showPrices
33+
self.alternativeEnergy = alternativeEnergy
34+
self.showStandardVehicle = showStandardVehicle
35+
self.lowerPriceBound = lowerPriceBound
36+
self.upperPriceBound = upperPriceBound
1037

1138

1239
@auto_str

packages/modules/web_themes/colors/source/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# wbcolortheme2
2+
23
Ein Theme für die openWB2 (http://openwb.de)
34

45
Alpha version, basierend auf der Alpha der openwb2.

0 commit comments

Comments
 (0)