home-01: ulice z externího CT (reg 619) + celková spotřeba domu; Deye zero-export to CT
Fakturační elektroměr ~8 kW vs Deye 13.5 kW: hlavní okruhy domu (vč. wallboxu, EV 10.5 kW při load 164 W) visí MEZI střídačem a CT u elektroměru — reg 625 (svorky) ani 653 (UPS port) je nevidí. home-01 bylo chybně vedeno jako bez CT. V100: deye_zero_export_mode=2 (reg 142 → zero export to CT, propíše exporter), sloupce inverter_grid_port_w + ups_load_w, komentáře se změnou sémantiky. Collector: grid_power_w z reg 619 (instalace s CT; fallback 625), load_power_w = pv + baterie + grid = celkový dům. R__049 +2 parametry, R__052 + deye_zero_export_mode. Audit/baseline od teď počítají se skutečnou ulicí; historie (do 2026-06-12) nese svorky střídače — přepočet ekonomiky po faktuře. Baseline rebuild doporučen po týdnu nových dat. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -239,7 +239,8 @@ DEYE_REG_BATT_CHARGE_TODAY = 514
|
||||
DEYE_REG_BATT_DISCHARGE_TODAY = 515
|
||||
DEYE_REG_BATTERY_SOC = 588
|
||||
DEYE_REG_BATTERY_POWER_FLOW = 590
|
||||
DEYE_REG_GRID_TOTAL_POWER = 625
|
||||
DEYE_REG_GRID_TOTAL_POWER = 625 # tok na grid svorkách střídače
|
||||
DEYE_REG_GRID_CT_TOTAL_POWER = 619 # tok na externím CT (= ulice; jen instalace s CT)
|
||||
DEYE_REG_GEN_PORT_POWER = 667
|
||||
DEYE_REG_LOAD_TOTAL_POWER = 653
|
||||
DEYE_REG_GRID_IMPORT_TOTAL_LO = 522
|
||||
@@ -342,8 +343,9 @@ 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)
|
||||
grid_power = await mb.read_register_signed(DEYE_REG_GRID_TOTAL_POWER)
|
||||
load_power = await mb.read_register_signed(DEYE_REG_LOAD_TOTAL_POWER)
|
||||
inverter_grid_port_w = await mb.read_register_signed(DEYE_REG_GRID_TOTAL_POWER)
|
||||
ups_load_w = await mb.read_register_signed(DEYE_REG_LOAD_TOTAL_POWER)
|
||||
grid_ct_w = await mb.read_register_signed(DEYE_REG_GRID_CT_TOTAL_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)
|
||||
@@ -353,6 +355,13 @@ async def poll_inverter(site_id: int, db: asyncpg.Connection) -> None:
|
||||
reg145 = await mb.read_register(DEYE_REG_SOLAR_SELL)
|
||||
reg179 = await mb.read_register(DEYE_REG_CONTROL_BOARD_SPECIAL1)
|
||||
pv_power_w = aggregate_pv_production_w(pv1_power, pv2_power, gen_port_power)
|
||||
# Ulice: instalace s CT (deye_zero_export_mode=2) čte reg 619; bez CT
|
||||
# zůstává reg 625. Okruhy MEZI střídačem a CT (home-01: wallbox,
|
||||
# kuchyň…) jsou vidět jen v CT — reg 625/653 je nezahrnují.
|
||||
has_ct = int(row["deye_zero_export_mode"] or 1) == 2
|
||||
grid_power = grid_ct_w if has_ct else inverter_grid_port_w
|
||||
# Celková spotřeba domu = pv + baterie(+vybíjí) + grid(+import).
|
||||
load_power = max(0, pv_power_w + battery_power + grid_power)
|
||||
grid_import_total_wh = (grid_energy_regs[1] << 16 | grid_energy_regs[0]) * 100
|
||||
grid_export_total_wh = (grid_energy_regs[3] << 16 | grid_energy_regs[2]) * 100
|
||||
is_export_limited, pv_derating_flags = _export_limit_flags_from_deye_regs(reg145, reg179)
|
||||
@@ -360,7 +369,7 @@ async def poll_inverter(site_id: int, db: asyncpg.Connection) -> None:
|
||||
logger.debug("inverter:%s Deye run_state raw=%s", code, run_state)
|
||||
|
||||
await db.execute(
|
||||
"select ems.fn_telemetry_inverter_sample($1::int, $2::int, $3::timestamptz, $4::int, $5::int, $6::int, $7::int, $8::float8, $9::int, $10::int, $11::int, $12::int, $13::int, $14::bigint, $15::bigint, $16::int, $17::boolean, $18::int)",
|
||||
"select ems.fn_telemetry_inverter_sample($1::int, $2::int, $3::timestamptz, $4::int, $5::int, $6::int, $7::int, $8::float8, $9::int, $10::int, $11::int, $12::int, $13::int, $14::bigint, $15::bigint, $16::int, $17::boolean, $18::int, $19::int, $20::int)",
|
||||
site_id,
|
||||
inv_id,
|
||||
measured_at,
|
||||
@@ -379,6 +388,8 @@ async def poll_inverter(site_id: int, db: asyncpg.Connection) -> None:
|
||||
run_state,
|
||||
is_export_limited,
|
||||
pv_derating_flags,
|
||||
inverter_grid_port_w,
|
||||
ups_load_w,
|
||||
)
|
||||
inv_temp: float | None = None
|
||||
await manager.broadcast_telemetry(
|
||||
|
||||
Reference in New Issue
Block a user