fix pv vyroby (unsinged)
This commit is contained in:
@@ -26,6 +26,14 @@ DEYE_REG_PV1_POWER = 672
|
||||
DEYE_REG_PV2_POWER = 673
|
||||
|
||||
|
||||
def aggregate_pv_production_w(pv1_w: int, pv2_w: int, gen_port_w: int) -> int:
|
||||
"""
|
||||
Okamžitá „výroba FVE“ pro dashboard / audit součtu: Deye registry 672/673/667
|
||||
jsou int16 W; záporné hodnoty (např. večer při exportu) nejsou DC výroba.
|
||||
"""
|
||||
return max(0, int(pv1_w)) + max(0, int(pv2_w)) + max(0, int(gen_port_w))
|
||||
|
||||
|
||||
async def poll_inverter(site_id: int, db: asyncpg.Connection) -> None:
|
||||
rows = await db.fetch(
|
||||
"""
|
||||
@@ -54,13 +62,12 @@ async def poll_inverter(site_id: int, db: asyncpg.Connection) -> None:
|
||||
battery_power = await mb.read_register_signed(DEYE_REG_BATTERY_POWER_FLOW)
|
||||
batt_charge_today = await mb.read_register(DEYE_REG_BATT_CHARGE_TODAY)
|
||||
batt_discharge_today = await mb.read_register(DEYE_REG_BATT_DISCHARGE_TODAY)
|
||||
gen_port_power = await mb.read_register(DEYE_REG_GEN_PORT_POWER)
|
||||
grid_power = await mb.read_register_signed(DEYE_REG_GRID_TOTAL_POWER)
|
||||
load_power = await mb.read_register(DEYE_REG_LOAD_TOTAL_POWER)
|
||||
pv1_power = await mb.read_register(DEYE_REG_PV1_POWER)
|
||||
pv2_power = await mb.read_register(DEYE_REG_PV2_POWER)
|
||||
# Celková výroba FVE na této instalaci = stringy PV + výkon přes GEN port.
|
||||
pv_power_w = int(pv1_power) + int(pv2_power) + int(gen_port_power)
|
||||
pv1_power = await mb.read_register_signed(DEYE_REG_PV1_POWER)
|
||||
pv2_power = await mb.read_register_signed(DEYE_REG_PV2_POWER)
|
||||
gen_port_power = await mb.read_register_signed(DEYE_REG_GEN_PORT_POWER)
|
||||
pv_power_w = aggregate_pv_production_w(pv1_power, pv2_power, gen_port_power)
|
||||
|
||||
logger.debug("inverter:%s Deye run_state raw=%s", code, run_state)
|
||||
|
||||
|
||||
34
backend/tests/test_telemetry_pv_signed.py
Normal file
34
backend/tests/test_telemetry_pv_signed.py
Normal file
@@ -0,0 +1,34 @@
|
||||
"""Signed PV kanály Deye → agregovaná pv_power_w (kladné příspěvky jen)."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
|
||||
from services.telemetry_collector import aggregate_pv_production_w
|
||||
|
||||
|
||||
class TestAggregatePvProductionW(unittest.TestCase):
|
||||
def test_daytime_typical(self) -> None:
|
||||
self.assertEqual(aggregate_pv_production_w(6000, 4000, 0), 10_000)
|
||||
|
||||
def test_negative_gen_ignored_in_total(self) -> None:
|
||||
self.assertEqual(aggregate_pv_production_w(0, 0, -61), 0)
|
||||
|
||||
def test_false_uint16_gen_becomes_small_negative(self) -> None:
|
||||
raw = 65472
|
||||
signed = raw - 65536 if raw > 32767 else raw
|
||||
self.assertEqual(signed, -64)
|
||||
self.assertEqual(aggregate_pv_production_w(0, 0, signed), 0)
|
||||
|
||||
def test_false_uint16_pv1_like_grid_export_clamped(self) -> None:
|
||||
raw = 52038
|
||||
signed = raw - 65536 if raw > 32767 else raw
|
||||
self.assertEqual(signed, -13_498)
|
||||
self.assertEqual(aggregate_pv_production_w(signed, 0, 0), 0)
|
||||
|
||||
def test_mixed_one_negative(self) -> None:
|
||||
self.assertEqual(aggregate_pv_production_w(8000, -100, 2000), 10_000)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user