11# !/usr/bin/env python3
22from enum import IntEnum
3+ from ipparser import ipparser
34from itertools import chain
45from typing import Any , Callable , Iterable , List , Union
56from pymodbus .constants import Endian
6- from ipparser import ipparser
7- import logging
87import functools
9- from modules . common . component_state import BatState , InverterState
8+ import logging
109
10+ from helpermodules .cli import run_using_positional_cli_args
11+ from modules .common import modbus
12+ from modules .common .abstract_device import DeviceDescriptor
13+ from modules .common .component_state import BatState , InverterState
14+ from modules .common .configurable_device import ConfigurableDevice , ComponentFactoryByType , MultiComponentUpdater
15+ from modules .common .store import get_counter_value_store
16+ from modules .kostal_plenticore .bat import KostalPlenticoreBat
1117from modules .kostal_plenticore .inverter import KostalPlenticoreInverter
12- from modules .kostal_plenticore .counter import KostalPlenticoreCounter
1318from modules .kostal_plenticore .config import (KostalPlenticore , KostalPlenticoreBatSetup , KostalPlenticoreCounterSetup ,
1419 KostalPlenticoreInverterSetup )
15- from modules .kostal_plenticore .bat import KostalPlenticoreBat
16- from modules .common .store import get_counter_value_store
17- from modules .common .configurable_device import ConfigurableDevice , ComponentFactoryByType , MultiComponentUpdater
18- from modules .common .abstract_device import DeviceDescriptor
19- from modules .common import modbus
20- from helpermodules .cli import run_using_positional_cli_args
20+ from modules .kostal_plenticore .counter import KostalPlenticoreCounter
2121
2222
2323log = logging .getLogger (__name__ )
@@ -33,21 +33,21 @@ def update(
3333 reader : Callable [[int , modbus .ModbusDataType ], Any ],
3434 set_inverter_state : bool = True ):
3535 battery = next ((component for component in components if isinstance (component , KostalPlenticoreBat )), None )
36- bat_state_net = battery .update (reader ) if battery else None
36+ bat_state_net = battery .read_state (reader ) if battery else None
3737 for component in components :
3838 if isinstance (component , KostalPlenticoreInverter ):
39- inverter_state = component .update (reader )
39+ inverter_state = component .read_state (reader )
4040 if bat_state_net :
4141 dc_in = component .dc_in_string_1_2 (reader )
4242 home_consumption = component .home_consumption (reader )
4343 if dc_in >= 0 :
4444 # Wird PV-DC-Leistung erzeugt, müssen die Wandlungsverluste betrachtet werden.
4545 # Kostal liefert nur DC-seitige Werte.
46- if bat_state_net .power > 0 :
46+ if bat_state_net .power < 0 :
4747 # Wird die Batterie entladen, werden die Wandlungsverluste anteilig an der DC-Leistung auf PV
4848 # und Batterie verteilt. Dazu muss der Divisor Total_DC_power != 0 sein.
49- power_gross = bat_state_net .power + dc_in
50- pv_state = InverterState (power = bat_state_net . power / power_gross * inverter_state .power ,
49+ power_gross = dc_in - bat_state_net .power
50+ pv_state = InverterState (power = dc_in / power_gross * inverter_state .power ,
5151 exported = inverter_state .exported )
5252 # Speicherladung muss durch Wandlungsverluste und internen Verbrauch korrigiert werden, sonst
5353 # wird ein falscher Hausverbrauch berechnet. Die Verluste fallen hier unter den Tisch.
@@ -59,24 +59,25 @@ def update(
5959 # Ladeleistung der Batterie. Die PV-Leistung ist die Summe aus verlustbehafteter
6060 # AC-Leistungsabgabe des WR und der DC-Ladeleistung. Die Wandlungsverluste werden also nur
6161 # in der PV-Leistung ersichtlich.
62- pv_state = InverterState (power = inverter_state .power + bat_state_net .power ,
62+ pv_state = InverterState (power = inverter_state .power - bat_state_net .power ,
6363 exported = inverter_state .exported )
6464 bat_state_gross = bat_state_net
6565 # https://github.com/snaptec/openWB/pull/2440#discussion_r996275286
6666 # power_gross = bat_state.power + dc_in
6767 # bat_state_gross = BatteryState(power=bat_state_net.power / power_gross * inverter_state.power)
6868 # pv_state = InverterState(power=inverter_state.power - bat_state_gross.power)
6969 else :
70+ inverter_state .power = 0
7071 pv_state = inverter_state
7172 bat_state_gross = bat_state_net
7273 else :
7374 pv_state = inverter_state
7475 if set_inverter_state :
75- component .set (pv_state )
76+ component .update (pv_state )
7677 elif isinstance (component , KostalPlenticoreCounter ):
7778 component .update (reader )
7879 if bat_state_net :
79- battery .set (bat_state_gross )
80+ battery .update (bat_state_gross )
8081 if set_inverter_state is False :
8182 return pv_state
8283
@@ -118,14 +119,14 @@ def read_legacy_inverter(ip1: str, ip2: str, battery: int, ip3: str) -> Inverter
118119
119120 def get_hybrid_inverter_state (ip : str ) -> InverterState :
120121 battery_component = KostalPlenticoreBat (1 , KostalPlenticoreBatSetup ())
121- with modbus .ModbusTcpClient_ (ip ) as client :
122+ with modbus .ModbusTcpClient_ (ip , 1502 ) as client :
122123 return update (
123124 [inverter_component , battery_component ], _create_reader (client ), set_inverter_state = False
124125 )
125126
126127 def get_standard_inverter_state (ip : str ) -> InverterState :
127- with modbus .ModbusTcpClient_ (ip ) as client :
128- return inverter_component .update (_create_reader (client ))
128+ with modbus .ModbusTcpClient_ (ip , 1502 ) as client :
129+ return inverter_component .read_state (_create_reader (client ))
129130
130131 def inverter_state_sum (a : InverterState , b : InverterState ) -> InverterState :
131132 return InverterState (exported = a .exported + b .exported , power = a .power + b .power )
@@ -135,7 +136,7 @@ def inverter_state_sum(a: InverterState, b: InverterState) -> InverterState:
135136 map (get_standard_inverter_state , filter ("none" .__ne__ , chain ([ip2 ], ipparser (ip3 )))),
136137 get_hybrid_inverter_state (ip1 ) if battery else get_standard_inverter_state (ip1 )
137138 )
138- inverter_component .set (inverter_state )
139+ inverter_component .update (inverter_state )
139140 return inverter_state
140141
141142
@@ -150,10 +151,10 @@ def read_legacy_counter(ip1: str, ip2: str, battery: int, ip3: str, position: in
150151 else :
151152 with client :
152153 counter_state = counter_component .get_values (reader )
153- bat_power = KostalPlenticoreBat (None , KostalPlenticoreBatSetup ()).update (reader ).power
154+ bat_power = KostalPlenticoreBat (None , KostalPlenticoreBatSetup ()).read_state (reader ).power
154155 inverter_power = read_legacy_inverter (ip1 , ip2 , battery , ip3 ).power
155156 counter_state .power += inverter_power + bat_power
156- counter_state = counter_component .get_imported_exported (counter_state )
157+ counter_state = counter_component .update_imported_exported (counter_state )
157158 get_counter_value_store (None ).set (counter_state )
158159
159160
0 commit comments