Description
Affected version: 2026.7.0 (edge), Docker deployment, Felix config admin,
Bridge.Modbus.Tcp + custom device components following the
AbstractOpenemsModbusComponent classic-binding pattern.
Summary
Toggling a Modbus device component's enabled configuration property
true -> false -> true at runtime (via updateComponentConfig JSON-RPC)
re-binds cleanly the FIRST time after a JVM boot. A SECOND
disable -> enable cycle within the same JVM lifetime frequently leaves the
device component in a state where enabled=true and the component is
ACTIVE per the config readback, but its Modbus tasks are dead: reads
return null, writes are silently lost. No error is logged.
Reproduction (as observed in our deployment)
- Edge with a
Bridge.Modbus.Tcp (modbus0) and a device component
bound to it; both enabled=true, telemetry flowing.
- Via JSON-RPC
updateComponentConfig, set the device component AND its
bridge enabled=false. Wait for deactivation.
- Re-enable both (bridge first, then device). Telemetry resumes -
binding works after the FIRST cycle.
- Repeat steps 2-3 a second time in the same JVM. With high probability
the device component reports enabled=true but its channels stay
null; FC read tasks are not queued to the bridge.
Expected: every disable -> enable cycle re-attaches the protocol
tasks, or a failure is surfaced (component FAULT state / log).
Observed: silent dead binding; only detectable by watching a live
telemetry channel for non-null values (config readback is misleading).
Context / impact
We use runtime enable/disable of the Modbus masters as the single-writer
fence in a hot-standby redundancy scheme (two edges, one set of devices).
Failover promotes the standby by enabling its bridges+devices; failback
demotes and later re-promotes - the second enable in one JVM lifetime
then hits this defect. SCR rebind of only the BRIDGE does not recover the
device; the device component's own activate() is what re-establishes the
binding, and only reliably on the FIRST activation per JVM.
Workarounds we ship (for other users hitting this)
- Functional health confirmation: after any enable, poll one live
telemetry channel per device for a non-null value - never trust
enabled=true alone.
- Re-cycle (disable -> enable) the dead components once on detection.
- Last resort: restart the container (fresh JVM) - the first enable
after boot always binds; a boot-time lease guard keeps the restarted
instance fenced until it should be active.
We are happy to provide logs, our reproduction harness, or test a patch.
Screenshots
No response
Operating System
Docker, OpenEMS Edge 2026.7.0, Felix config admin
How to reproduce the Error?
reproducibly on the second disable→enable cycle within one JVM
Description
Affected version: 2026.7.0 (edge), Docker deployment, Felix config admin,
Bridge.Modbus.Tcp+ custom device components following theAbstractOpenemsModbusComponent classic-binding pattern.
Summary
Toggling a Modbus device component's
enabledconfiguration propertytrue -> false -> trueat runtime (viaupdateComponentConfigJSON-RPC)re-binds cleanly the FIRST time after a JVM boot. A SECOND
disable -> enable cycle within the same JVM lifetime frequently leaves the
device component in a state where
enabled=trueand the component isACTIVE per the config readback, but its Modbus tasks are dead: reads
return null, writes are silently lost. No error is logged.
Reproduction (as observed in our deployment)
Bridge.Modbus.Tcp(modbus0) and a device componentbound to it; both
enabled=true, telemetry flowing.updateComponentConfig, set the device component AND itsbridge
enabled=false. Wait for deactivation.binding works after the FIRST cycle.
the device component reports
enabled=truebut its channels staynull; FC read tasks are not queued to the bridge.
Expected: every disable -> enable cycle re-attaches the protocol
tasks, or a failure is surfaced (component FAULT state / log).
Observed: silent dead binding; only detectable by watching a live
telemetry channel for non-null values (config readback is misleading).
Context / impact
We use runtime enable/disable of the Modbus masters as the single-writer
fence in a hot-standby redundancy scheme (two edges, one set of devices).
Failover promotes the standby by enabling its bridges+devices; failback
demotes and later re-promotes - the second enable in one JVM lifetime
then hits this defect. SCR rebind of only the BRIDGE does not recover the
device; the device component's own activate() is what re-establishes the
binding, and only reliably on the FIRST activation per JVM.
Workarounds we ship (for other users hitting this)
telemetry channel per device for a non-null value - never trust
enabled=truealone.after boot always binds; a boot-time lease guard keeps the restarted
instance fenced until it should be active.
We are happy to provide logs, our reproduction harness, or test a patch.
Screenshots
No response
Operating System
Docker, OpenEMS Edge 2026.7.0, Felix config admin
How to reproduce the Error?
reproducibly on the second disable→enable cycle within one JVM