11#!/usr/bin/env python3
2+ from enum import IntEnum
23from typing import TypedDict , Any
34from modules .common .abstract_device import AbstractCounter
45from modules .common .component_state import CounterState
@@ -15,7 +16,27 @@ class KwargsDict(TypedDict):
1516 client : ModbusTcpClient_
1617
1718
19+ class Register (IntEnum ):
20+ VOLTAGE_L1 = 0x00
21+ CURRENT_L1 = 0x06
22+ POWER_L1 = 0x0C
23+ POWER_FACTOR_L1 = 0x1E
24+ FREQUENCY = 0x46
25+ IMPORTED = 0x48
26+ EXPORTED = 0x4A
27+
28+
1829class SampleCounter (AbstractCounter ):
30+ REG_MAPPING = (
31+ (Register .VOLTAGE_L1 , [ModbusDataType .FLOAT_32 ]* 3 ),
32+ (Register .CURRENT_L1 , [ModbusDataType .FLOAT_32 ]* 3 ),
33+ (Register .POWER_L1 , [ModbusDataType .FLOAT_32 ]* 3 ),
34+ (Register .POWER_FACTOR_L1 , [ModbusDataType .FLOAT_32 ]* 3 ),
35+ (Register .FREQUENCY , ModbusDataType .FLOAT_32 ),
36+ (Register .IMPORTED , ModbusDataType .FLOAT_32 ),
37+ (Register .EXPORTED , ModbusDataType .FLOAT_32 ),
38+ )
39+
1940 def __init__ (self , component_config : SampleCounterSetup , ** kwargs : Any ) -> None :
2041 self .component_config = component_config
2142 self .kwargs : KwargsDict = kwargs
@@ -29,6 +50,24 @@ def initialize(self) -> None:
2950
3051 def update (self ):
3152 unit = self .component_config .configuration .modbus_id
53+ # Modbus-Bulk reader, liest einen Block von Registern und gibt ein Dictionary mit den Werten zurück
54+ # read_input_registers_bulk benötigit als Parameter das Startregister, die Anzahl der Register,
55+ # Register-Mapping und die Modbus-ID
56+ resp = self .client .read_input_registers_bulk (
57+ Register .VOLTAGE_L1 , 76 , mapping = self .REG_MAPPING , unit = self .id )
58+ counter_state = CounterState (
59+ imported = resp [Register .IMPORTED ],
60+ exported = resp [Register .EXPORTED ],
61+ power = sum (resp [Register .POWER_L1 ]),
62+ voltages = resp [Register .VOLTAGE_L1 ],
63+ currents = resp [Register .CURRENT_L1 ],
64+ powers = resp [Register .POWER_L1 ],
65+ power_factors = resp [Register .POWER_FACTOR_L1 ],
66+ frequency = resp [Register .FREQUENCY ],
67+ )
68+ self .store .set (counter_state )
69+
70+ # Einzelregister lesen (dauert länger, bei sehr weit >100 auseinanderliegenden Registern sinnvoll)
3271 power = self .client .read_holding_registers (reg , ModbusDataType .INT_32 , unit = unit )
3372 imported , exported = self .sim_counter .sim_count (power )
3473
0 commit comments