idempotence zapisu 178 a 179 grid peak shaveing a grid cuttoff
This commit is contained in:
@@ -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ů 4–5 (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 bits0–1 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
|
||||
|
||||
|
||||
38
backend/tests/test_drop_registers_matching_last_verified.py
Normal file
38
backend/tests/test_drop_registers_matching_last_verified.py
Normal 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 4–5 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)] # bits0–1 = 2 (cutoff ON)
|
||||
last_verified = {179: 0x1236} # ...0110b => bits0–1 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 => bits0–1 == 3 (cutoff OFF)
|
||||
out, skipped = _drop_registers_matching_last_verified(registers, last_verified)
|
||||
assert out == registers
|
||||
assert skipped == []
|
||||
|
||||
Reference in New Issue
Block a user