11#!/usr/bin/env python3
22import logging
3- from typing import Iterable , Union , List
3+ from typing import Iterable , Union
44
55from modules .common import modbus
66from modules .common .abstract_device import DeviceDescriptor
1111from modules .devices .solaredge .solaredge .inverter import SolaredgeInverter
1212from modules .devices .solaredge .solaredge .config import (Solaredge , SolaredgeBatSetup , SolaredgeCounterSetup ,
1313 SolaredgeExternalInverterSetup , SolaredgeInverterSetup )
14- from modules .devices .solaredge .solaredge .meter import SolaredgeMeterRegisters
1514
1615log = logging .getLogger (__name__ )
1716
18- solaredge_component_classes = Union [SolaredgeBat , SolaredgeCounter ,
19- SolaredgeExternalInverter , SolaredgeInverter ]
20- default_unit_id = 85
21- synergy_unit_identifier = 160
22- reconnect_delay = 1.2
23-
24-
25- def set_component_registers (components : Iterable [solaredge_component_classes ],
26- synergy_units : int ,
27- modbus_id : int ) -> None :
28- meters : List [Union [SolaredgeExternalInverter , SolaredgeCounter , None ]] = [None ]* 3
29- for component in components :
30- if (isinstance (component , (SolaredgeExternalInverter , SolaredgeCounter )) and
31- component .component_config .configuration .modbus_id == modbus_id ):
32- # Registerverschibung nur für Komponenten mit gleicher Modbus-ID, da diese am gleichen Haupt-WR hängen und
33- # die gleichen Synergy-Units haben.
34- meters [component .component_config .configuration .meter_id - 1 ] = component
3517
36- # https://www.solaredge.com/sites/default/files/sunspec-implementation-technical-note.pdf:
37- # Only enabled meters are readable, i.e. if meter 1 and 3 are enabled, they are readable as 1st meter and 2nd
38- # meter (and the 3rd meter isn't readable).
39- for meter_id , meter in enumerate (filter (None , meters ), start = 1 ):
40- log .debug (
41- "%s: internal meter id: %d, synergy units: %s" , meter .component_config .name , meter_id , synergy_units
42- )
43- meter .registers = SolaredgeMeterRegisters (meter_id , synergy_units )
18+ reconnect_delay = 1.2
4419
4520
4621def create_device (device_config : Solaredge ):
@@ -52,53 +27,22 @@ def create_bat_component(component_config: SolaredgeBatSetup):
5227
5328 def create_counter_component (component_config : SolaredgeCounterSetup ):
5429 nonlocal client , device
55- synergy_units = get_synergy_units (component_config )
56- counter = SolaredgeCounter (component_config , client = client )
57- # neue Komponente wird erst nach Instanziierung device.components hinzugefügt
58- components = list (device .components .values ())
59- components .append (counter )
60- set_component_registers (components , synergy_units , component_config .configuration .modbus_id )
61- return counter
30+ return SolaredgeCounter (component_config , client = client , components = device .components )
6231
6332 def create_inverter_component (component_config : SolaredgeInverterSetup ):
6433 nonlocal client
6534 return SolaredgeInverter (component_config , client = client , device_id = device_config .id )
6635
6736 def create_external_inverter_component (component_config : SolaredgeExternalInverterSetup ):
6837 nonlocal client , device
69- synergy_units = get_synergy_units (component_config )
70- external_inverter = SolaredgeExternalInverter (component_config , client = client )
71- components = list (device .components .values ())
72- components .append (external_inverter )
73- set_component_registers (components , synergy_units , component_config .configuration .modbus_id )
74- return external_inverter
38+ return SolaredgeExternalInverter (component_config , client = client , components = device .components )
7539
7640 def update_components (components : Iterable [Union [SolaredgeBat , SolaredgeCounter , SolaredgeInverter ]]):
7741 nonlocal client
7842 with client :
7943 for component in components :
8044 component .update ()
8145
82- def get_synergy_units (component_config : Union [SolaredgeBatSetup ,
83- SolaredgeCounterSetup ,
84- SolaredgeInverterSetup ,
85- SolaredgeExternalInverterSetup ]) -> None :
86- nonlocal client
87- if client .read_holding_registers (40121 , modbus .ModbusDataType .UINT_16 ,
88- unit = component_config .configuration .modbus_id
89- ) == synergy_unit_identifier :
90- # Snyergy-Units vom Haupt-WR des angeschlossenen Meters ermitteln. Es kann mehrere Haupt-WR mit
91- # unterschiedlichen Modbus-IDs im Verbund geben.
92- log .debug ("Synergy Units supported" )
93- synergy_units = int (client .read_holding_registers (
94- 40129 , modbus .ModbusDataType .UINT_16 ,
95- unit = component_config .configuration .modbus_id )) or 1
96- log .debug (
97- f"Synergy Units detected for Modbus ID { component_config .configuration .modbus_id } : { synergy_units } " )
98- else :
99- synergy_units = 1
100- return synergy_units
101-
10246 def initializer ():
10347 nonlocal client
10448 client = modbus .ModbusTcpClient_ (device_config .configuration .ip_address ,
0 commit comments