fix idempotency gne port uctoff
Some checks failed
CI and deploy / migration-check (push) Failing after 19s
CI and deploy / deploy (push) Has been skipped

This commit is contained in:
Dusan Vojacek
2026-04-29 13:09:43 +02:00
parent 5593397fd3
commit 89fb4f1924
3 changed files with 22 additions and 6 deletions

View File

@@ -340,6 +340,12 @@ def _drop_registers_matching_last_verified(
continue continue
# reg179: porovnáváme jen bits01 maskou 0x0003 (masked RMW zachovává ostatní bity). # 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)): if int(reg) == 179 and _deye_reg179_verify_match(int(val), int(lv)):
# GEN cutoff (BA81): chceme na zařízení dostat "clean" hodnotu 2/3.
# Pokud minulý verified stav obsahuje jiné bity (např. 0xFFFE/0xFFFF),
# maska sice sedí, ale firmware/UI nemusí cutoff aplikovat správně.
# Proto reg179 skipneme jen tehdy, když je poslední verified hodnota už
# skutečně 2 nebo 3 (tj. clean value), ne jen maskově ekvivalentní.
if int(lv) in (REG179_MI_EXPORT_DISABLE, REG179_MI_EXPORT_ENABLE):
skipped.append(int(reg)) skipped.append(int(reg))
continue continue
if int(lv) == int(val): if int(lv) == int(val):

View File

@@ -21,9 +21,17 @@ def test_drop_registers_keeps_reg178_when_mask_differs():
assert skipped == [] assert skipped == []
def test_drop_registers_skips_reg179_when_mask_matches(): def test_drop_registers_keeps_reg179_when_mask_matches_but_not_clean():
registers = [(179, "control_board_special_1", 2)] # bits01 = 2 (cutoff ON) registers = [(179, "control_board_special_1", 2)] # want cutoff ON (clean value)
last_verified = {179: 0x1236} # ...0110b => bits01 still == 2 last_verified = {179: 0x1236} # bits01 still == 2, but not a clean 2/3 value
out, skipped = _drop_registers_matching_last_verified(registers, last_verified)
assert out == registers
assert skipped == []
def test_drop_registers_skips_reg179_when_clean_value_matches():
registers = [(179, "control_board_special_1", 2)] # want cutoff ON (clean value)
last_verified = {179: 2} # already clean cutoff ON
out, skipped = _drop_registers_matching_last_verified(registers, last_verified) out, skipped = _drop_registers_matching_last_verified(registers, last_verified)
assert out == [] assert out == []
assert skipped == [179] assert skipped == [179]

View File

@@ -72,7 +72,9 @@ protože některé firmware/UI varianty nevyhodnocují jen bity 01 maskou, al
Ověření v journalu (`verify_modbus_commands`) přesto porovnává jen bits01 maskou `0x0003` (odolnost vůči Ověření v journalu (`verify_modbus_commands`) přesto porovnává jen bits01 maskou `0x0003` (odolnost vůči
paralelním změnám jiných bitů / verzím FW). paralelním změnám jiných bitů / verzím FW).
**Idempotence:** pokud poslední `verified` hodnota už má správně nastavené bits01 (maska `0x0003`), EMS zápis reg. 179 v dalším běhu přeskočí (ostatní bity se ignorují). **Idempotence:** EMS zápis reg. 179 přeskočí jen tehdy, když poslední `verified` hodnota je už **clean 2/3**.
Masková shoda s hodnotami typu `0xfffe` / `0xffff` se záměrně **nepovažuje** za “už zapsáno”, aby se zařízení
dostalo do stabilního stavu, který odpovídá UI i chování firmware.
**Pozn.:** Flag se v solveru vůbec nevytváří ani neukládá tam, kde není povolen feature `asset_inverter.deye_gen_microinverter_cutoff_enabled` takové lokality ho nemají ani v UI. **Pozn.:** Flag se v solveru vůbec nevytváří ani neukládá tam, kde není povolen feature `asset_inverter.deye_gen_microinverter_cutoff_enabled` takové lokality ho nemají ani v UI.
### Provozní režim EMS SELF_SUSTAIN ### Provozní režim EMS SELF_SUSTAIN