idempotence zapisu 178 a 179 grid peak shaveing a grid cuttoff
Some checks failed
CI and deploy / migration-check (push) Failing after 10s
CI and deploy / deploy (push) Has been skipped

This commit is contained in:
Dusan Vojacek
2026-04-20 11:41:57 +02:00
parent a07f5d57cb
commit 6cf14ed25b
3 changed files with 59 additions and 5 deletions

View File

@@ -332,9 +332,18 @@ def _drop_registers_matching_last_verified(
skipped: list[int] = []
for reg, meta, val in registers:
lv = last_verified.get(int(reg))
if lv is not None and lv == int(val):
skipped.append(int(reg))
continue
if lv is not None:
# reg178: porovnáváme jen masku bitů 45 (Deye si v dalších bitech drží vlastní stav).
if int(reg) == 178 and _deye_reg178_verify_match(int(val), int(lv)):
skipped.append(int(reg))
continue
# reg179: porovnáváme jen bits01 maskou 0x0003 (masked RMW zachovává ostatní bity).
if int(reg) == 179 and _deye_reg179_verify_match(int(val), int(lv)):
skipped.append(int(reg))
continue
if int(lv) == int(val):
skipped.append(int(reg))
continue
out.append((reg, meta, val))
return out, skipped

View File

@@ -0,0 +1,38 @@
from services.control.exporter_monolith import (
REG178_PASSIVE,
_drop_registers_matching_last_verified,
)
def test_drop_registers_skips_reg178_when_mask_matches():
# last_verified contains extra bits beyond 0x0030; we still want to skip if bits 45 match.
registers = [(178, "grid_peak_shaving_switch", REG178_PASSIVE)]
last_verified = {178: 12030} # real-world example from home-01 (bits4-5 still == 0b11)
out, skipped = _drop_registers_matching_last_verified(registers, last_verified)
assert out == []
assert skipped == [178]
def test_drop_registers_keeps_reg178_when_mask_differs():
registers = [(178, "grid_peak_shaving_switch", REG178_PASSIVE)]
last_verified = {178: 32} # SELL mask 0b10
out, skipped = _drop_registers_matching_last_verified(registers, last_verified)
assert out == registers
assert skipped == []
def test_drop_registers_skips_reg179_when_mask_matches():
registers = [(179, "control_board_special_1", 2)] # bits01 = 2 (cutoff ON)
last_verified = {179: 0x1236} # ...0110b => bits01 still == 2
out, skipped = _drop_registers_matching_last_verified(registers, last_verified)
assert out == []
assert skipped == [179]
def test_drop_registers_keeps_reg179_when_mask_differs():
registers = [(179, "control_board_special_1", 2)] # want cutoff ON
last_verified = {179: 0x1237} # ...0111b => bits01 == 3 (cutoff OFF)
out, skipped = _drop_registers_matching_last_verified(registers, last_verified)
assert out == registers
assert skipped == []