From 5593397fd323a80b3c75f3293a2f6a3c8e04a21d Mon Sep 17 00:00:00 2001 From: Dusan Vojacek Date: Wed, 29 Apr 2026 13:04:30 +0200 Subject: [PATCH] fix cutoff --- backend/services/control/exporter_monolith.py | 8 +++++--- docs/04-modules/modbus-registers.md | 5 ++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/backend/services/control/exporter_monolith.py b/backend/services/control/exporter_monolith.py index b28d77a..cda47b2 100644 --- a/backend/services/control/exporter_monolith.py +++ b/backend/services/control/exporter_monolith.py @@ -1651,14 +1651,16 @@ async def write_inverter_setpoints( r179 = await mb179.read_holding_registers(179, 1, unit_id) if r179 and len(r179) >= 1: current_179 = int(r179[0]) - new_179 = (current_179 & ~REG179_MI_EXPORT_MASK) | int(target_bits) - registers.append((179, "control_board_special_1", new_179)) + # Deye firmware/UI u některých instalací neinterpretuje jen bits0–1 maskou, + # 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( "[control] %s: reg179 MI cutoff %s (old=%s new=%s mask=0x%04X)", inv.code, "ON" if want_cutoff else "OFF", current_179, - new_179, + int(target_bits), REG179_MI_EXPORT_MASK, ) else: diff --git a/docs/04-modules/modbus-registers.md b/docs/04-modules/modbus-registers.md index d1e2b08..02a7db2 100644 --- a/docs/04-modules/modbus-registers.md +++ b/docs/04-modules/modbus-registers.md @@ -67,7 +67,10 @@ Pro instalace s AC coupling na GEN portu (mikroinvertory) může solver uložit - `true` → exporter nastaví reg **179** bits0–1 na **2** (`10b`, disable = cut-off ON) - `false` → exporter nastaví bits0–1 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 bits0–1 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 0–1 maskou, ale očekávají přímo hodnotu 2/3. +Ověření v journalu (`verify_modbus_commands`) přesto porovnává jen bits0–1 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é bits0–1 (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.