Skip to content

Modbus: verbleibende ungesperrte Delegate-Zugriffe schliessen - #3947

Merged
LKuemmel merged 2 commits into
openWB:masterfrom
seaspotter:fix-modbus-raw-delegate-bypass
Sep 16, 2026
Merged

LKuemmel merged 2 commits into
openWB:masterfrom
seaspotter:fix-modbus-raw-delegate-bypass

Conversation

@seaspotter

Copy link
Copy Markdown
Collaborator

Follow-up zu #3895 (siehe Review-Kommentar von Copilot).

Problem

Die neue Verbindungssperre in ModbusClient schuetzt nur Aufrufe ueber die eigenen Wrapper-Methoden. Drei Stellen greifen direkt auf self._delegate/.delegate zu und umgehen die Sperre damit vollstaendig:

  • sungrow_sh/bat.py:83 - liest ein rohes Register fuer ein Bitfeld
  • marstek/venus_c_e/bat.py:38 - braucht FC06, write_register() nutzt intern FC16
  • openwb_series2_satellit/chargepoint_module.py (Phasenumschaltung) - selbes FC06-Problem, genau auf der Verbindung, fuer die die Sperre urspruenglich gedacht war

Fix

  • Sungrow: Umstellung auf den normalen, gesperrten Lesepfad (ModbusDataType.UINT_16 liefert denselben Rohwert fuers Bitmasking)
  • Neue Methode ModbusClient.write_single_register_raw() fuer echtes FC06, gesperrt - Marstek und die Phasenumschaltung nutzen sie jetzt statt des rohen Delegates

…iessen

Follow-up zu openWB#3895 - Copilot-Review deckte auf, dass die neue Verbindungs-
sperre in ModbusClient nur die eigenen Wrapper-Methoden schuetzt, waehrend
drei Stellen direkt an self._delegate/.delegate vorbeigreifen und die
Sperre damit umgehen:

- sungrow_sh/bat.py: unnoetiger Roh-Zugriff fuer ein Bitfeld, das per
  ModbusDataType.UINT_16 identisch dekodiert werden kann - jetzt ueber den
  normalen, gesperrten Lesepfad.
- marstek/venus_c_e/bat.py und openwb_series2_satellit/chargepoint_module.py
  (Phasenumschaltung) brauchten echtes FC06 (Write Single Register), das
  write_register() (FC16) nicht abbildet - dafuer gab es bisher keinen
  gesperrten Zugriffspfad. Neue Methode write_single_register_raw() schliesst
  diese Luecke.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

is_socket_open() still accesses the delegate without acquiring the shared lock.

Pull request overview

This follow-up secures remaining Modbus delegate accesses, adds locked FC06 writes, and expands retry coverage.

Changes:

  • Routes Sungrow reads through the locked wrapper.
  • Adds locked single-register writes for Marstek and phase switching.
  • Broadens retry handling and adds regression tests.
File summaries
File Summary
packages/modules/devices/sungrow/sungrow_sh/bat.py Uses the locked register-read path.
packages/modules/devices/marstek/venus_c_e/bat.py Uses locked FC06 writes.
packages/modules/common/modbus.py Adds locking and raw single-register writes.
packages/modules/common/modbus_test.py Tests serialization and FC06 behavior.
packages/modules/common/hardware_check.py Retries broader exception types.
packages/modules/common/hardware_check_test.py Tests retry behavior.
packages/modules/chargepoints/openwb_series2_satellit/chargepoint_module.py Uses locked phase-switch writes.
Review details

Suppressed comments (1)

packages/modules/common/modbus.py:107

  • is_socket_open() still calls _delegate.is_socket_open() without acquiring _lock (line 97). The internal calls here are protected by the surrounding RLock, but the public method remains an unlocked delegate access, so a concurrent socket check can race with connect() or close() and violate the serialization this change introduces. Guard is_socket_open() with the same lock; the RLock keeps these nested calls safe.
        with self._lock:
            if self.is_socket_open() is False:
                self.connect()
  • Files reviewed: 7/7 changed files
  • Comments generated: 0
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@LKuemmel
LKuemmel merged commit f5f8445 into openWB:master Sep 16, 2026
1 check passed
@seaspotter
seaspotter deleted the fix-modbus-raw-delegate-bypass branch September 16, 2026 09:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants