fix cutoff
Some checks failed
CI and deploy / migration-check (push) Failing after 18s
CI and deploy / deploy (push) Has been skipped

This commit is contained in:
Dusan Vojacek
2026-04-29 13:04:30 +02:00
parent 9d37efb991
commit 5593397fd3
2 changed files with 9 additions and 4 deletions

View File

@@ -1651,14 +1651,16 @@ async def write_inverter_setpoints(
r179 = await mb179.read_holding_registers(179, 1, unit_id) r179 = await mb179.read_holding_registers(179, 1, unit_id)
if r179 and len(r179) >= 1: if r179 and len(r179) >= 1:
current_179 = int(r179[0]) current_179 = int(r179[0])
new_179 = (current_179 & ~REG179_MI_EXPORT_MASK) | int(target_bits) # Deye firmware/UI u některých instalací neinterpretuje jen bits01 maskou,
registers.append((179, "control_board_special_1", new_179)) # ale očekává přímo hodnotu 2/3. Proto zapisujeme "clean" 2/3 (bez RMW),
# aby se cutoff skutečně projevil i v UI.
registers.append((179, "control_board_special_1", int(target_bits)))
logger.info( logger.info(
"[control] %s: reg179 MI cutoff %s (old=%s new=%s mask=0x%04X)", "[control] %s: reg179 MI cutoff %s (old=%s new=%s mask=0x%04X)",
inv.code, inv.code,
"ON" if want_cutoff else "OFF", "ON" if want_cutoff else "OFF",
current_179, current_179,
new_179, int(target_bits),
REG179_MI_EXPORT_MASK, REG179_MI_EXPORT_MASK,
) )
else: else:

View File

@@ -67,7 +67,10 @@ Pro instalace s AC coupling na GEN portu (mikroinvertory) může solver uložit
- `true` → exporter nastaví reg **179** bits01 na **2** (`10b`, disable = cut-off ON) - `true` → exporter nastaví reg **179** bits01 na **2** (`10b`, disable = cut-off ON)
- `false` → exporter nastaví bits01 na **3** (`11b`, enable = cut-off OFF) - `false` → exporter nastaví bits01 na **3** (`11b`, enable = cut-off OFF)
Zápis je **masked read-modify-write** (zachová ostatní bity reg. 179). Ověření v journalu (`verify_modbus_commands`) porovnává jen bits01 maskou `0x0003`. Zápis do reg. 179 se v praxi provádí jako **„clean write“** hodnoty **2** nebo **3** (bez read-modify-write),
protože některé firmware/UI varianty nevyhodnocují jen bity 01 maskou, ale očekávají přímo hodnotu 2/3.
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).
**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:** 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í).
**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.