|
1 | 1 | #!/usr/bin/env python3 |
2 | 2 | from enum import IntEnum |
| 3 | +import logging |
3 | 4 | import time |
4 | 5 | from typing import List, Tuple |
5 | 6 |
|
|
10 | 11 | from modules.common.hardware_check import check_meter_values |
11 | 12 | from modules.common.modbus import ModbusDataType |
12 | 13 |
|
| 14 | +log = logging.getLogger(__name__) |
| 15 | + |
13 | 16 |
|
14 | 17 | class Sdm(AbstractCounter): |
15 | 18 | def __init__(self, modbus_id: int, client: modbus.ModbusTcpClient_) -> None: |
16 | 19 | self.client = client |
17 | 20 | self.id = modbus_id |
| 21 | + self.fast_mode = True |
18 | 22 | with client: |
19 | 23 | self.serial_number = str(self.client.read_holding_registers(0xFC00, ModbusDataType.UINT_32, unit=self.id)) |
20 | 24 |
|
@@ -64,16 +68,48 @@ def get_voltages(self) -> Tuple[List[float], float]: |
64 | 68 |
|
65 | 69 | def get_counter_state(self) -> CounterState: |
66 | 70 | # 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 | + |
77 | 113 | frequency = resp[SdmRegister.FREQUENCY] |
78 | 114 | if frequency > 100: |
79 | 115 | frequency = frequency / 10 |
@@ -123,7 +159,7 @@ def get_counter_state(self) -> CounterState: |
123 | 159 | power_factor = self.client.read_input_registers(0x1E, ModbusDataType.FLOAT_32, unit=self.id) |
124 | 160 | time.sleep(0.1) |
125 | 161 | 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) |
127 | 163 | resp = {**bulk_1, **bulk_2} |
128 | 164 | frequency = resp[SdmRegister.FREQUENCY] |
129 | 165 | if frequency > 100: |
|
0 commit comments