From eccb7d211d526d8adaccdde8ef79b0ed29bc81e4 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Mon, 12 Oct 2026 12:01:16 +0200 Subject: [PATCH 1/2] add support for single phase meters --- .../devices/fronius/fronius_http_api/counter.py | 8 ++++++-- .../fronius/fronius_http_api/meter_reader.py | 16 ++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/modules/devices/fronius/fronius_http_api/counter.py b/packages/modules/devices/fronius/fronius_http_api/counter.py index 8bff6df4a5..535fecf961 100644 --- a/packages/modules/devices/fronius/fronius_http_api/counter.py +++ b/packages/modules/devices/fronius/fronius_http_api/counter.py @@ -70,8 +70,12 @@ def update(self, powerflow_response: Dict, meter_system_response: Optional[Dict] if meter.location in (MeterLocation.external, MeterLocation.subload): power *= -1 - currents = [powers[i] / meter.voltages[i] for i in range(0, 3)] - + currents = [ + powers[i] / meter.voltages[i] + if powers[i] is not None and meter.voltages[i] not in (None, 0) + else 0 + for i in range(3) + ] counter_state = CounterState( voltages=meter.voltages, currents=currents, diff --git a/packages/modules/devices/fronius/fronius_http_api/meter_reader.py b/packages/modules/devices/fronius/fronius_http_api/meter_reader.py index e86322051e..a76c7bd398 100644 --- a/packages/modules/devices/fronius/fronius_http_api/meter_reader.py +++ b/packages/modules/devices/fronius/fronius_http_api/meter_reader.py @@ -36,20 +36,20 @@ def read_meter(session: Session, data = _fetch_device_scope(session, ip_address, meter_id, variant) location_key = "Meter_Location_Current" power_sum_key = "PowerReal_P_Sum" - powers = [data["PowerReal_P_Phase_"+str(num)] for num in range(1, 4)] - voltages = [data["Voltage_AC_Phase_"+str(num)] for num in range(1, 4)] - power_factors = [data["PowerFactor_Phase_"+str(num)] for num in range(1, 4)] - frequency = data["Frequency_Phase_Average"] + powers = [data.get(f"PowerReal_P_Phase_{num}", 0) for num in range(1, 4)] + voltages = [data.get(f"Voltage_AC_Phase_{num}", 0) for num in range(1, 4)] + power_factors = [data.get(f"PowerFactor_Phase_{num}", 0) for num in range(1, 4)] + frequency = data.get("Frequency_Phase_Average", 50) elif variant == 2: if meter_system_response is None: raise ValueError("meter_system_response wird für Variante 2 benötigt") data = dict(meter_system_response["Body"]["Data"]).get(str(meter_id)) location_key = "SMARTMETER_VALUE_LOCATION_U16" power_sum_key = "SMARTMETER_POWERACTIVE_MEAN_SUM_F64" - powers = [data["SMARTMETER_POWERACTIVE_MEAN_0"+str(num)+"_F64"] for num in range(1, 4)] - voltages = [data["SMARTMETER_VOLTAGE_0"+str(num)+"_F64"] for num in range(1, 4)] - power_factors = [data["SMARTMETER_FACTOR_POWER_0"+str(num)+"_F64"] for num in range(1, 4)] - frequency = data["GRID_FREQUENCY_MEAN_F32"] + powers = [data.get(f"SMARTMETER_POWERACTIVE_MEAN_0{num}_F64", 0) for num in range(1, 4)] + voltages = [data.get(f"SMARTMETER_VOLTAGE_0{num}_F64", 0) for num in range(1, 4)] + power_factors = [data.get(f"SMARTMETER_FACTOR_POWER_0{num}_F64", 0) for num in range(1, 4)] + frequency = data.get("GRID_FREQUENCY_MEAN_F32", 50) else: raise ValueError("Unbekannte Variante: "+str(variant)) From 62f6681b92de9266051a6345c07f863771613852 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Tue, 20 Oct 2026 15:29:56 +0200 Subject: [PATCH 2/2] fix zero division for production counter --- .../fronius/fronius_http_api/inverter_production_meter.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/modules/devices/fronius/fronius_http_api/inverter_production_meter.py b/packages/modules/devices/fronius/fronius_http_api/inverter_production_meter.py index bba99b4c08..4f4124e62b 100644 --- a/packages/modules/devices/fronius/fronius_http_api/inverter_production_meter.py +++ b/packages/modules/devices/fronius/fronius_http_api/inverter_production_meter.py @@ -50,7 +50,12 @@ def update(self, meter_system_response: Optional[Dict] = None) -> None: # Dokumentation (4.8.6/4.8.7) positive Werte für Erzeugung -- openWBs Konvention ist umgekehrt # (negativ = Erzeugung, siehe inverter.py), daher wird hier immer invertiert. power = meter.power_sum * -1 - currents = [meter.powers[i] / meter.voltages[i] for i in range(0, 3)] + currents = [ + meter.powers[i] / meter.voltages[i] + if meter.powers[i] is not None and meter.voltages[i] not in (None, 0) + else 0 + for i in range(3) + ] self.peak_filter.check_values(power) _, exported = self.sim_counter.sim_count(power)