Skip to content

Ecosystem commands that match the endpoint's current state are silently dropped (observed with Alexa) #143

Description

@simons-plugins

Observed

First non-Apple ecosystem test, 2026-08-06. Alexa paired successfully — fabric #3, CASE sessions established, accessories discovered and shown. But the devices did not respond to commands, and Alexa reported them as not responding.

The bridge node received and accepted Alexa's invokes:

12:53:57  indigo-matter-bridge.aggregator.indigo-287885105.onOff.on   (Study Lamp)
12:54:09  indigo-matter-bridge.aggregator.indigo-287885105.onOff.off
12:54:42  indigo-matter-bridge.aggregator.indigo-1736047509.onOff.on  (Study Pendant)
12:54:47  indigo-matter-bridge.aggregator.indigo-1736047509.onOff.off
          … each answered  Invoke (final) » commands: 1

The plugin was attached throughout (Client attached (plugin 2026.8.4) at 11:44:45Z, invokes from 11:53Z). Nothing appeared in the Indigo event log for any of them — no dispatch, no sent "Study Lamp" on from the owning plugin, no error.

Suspected mechanism — NOT yet proven

Command events are emitted from attribute-change listeners (watchCommandsonOff$Changed etc.), not from invocation handlers. If an ecosystem commands a state the endpoint already holds, matter.js accepts the invoke, the attribute does not change, no $Changed fires, and nothing is emitted — so the real Indigo device is never told.

That would make control silently dependent on the endpoint's belief matching reality. Any drift (a dropped state push, a physical switch, a plugin restart between pushes) leaves commands in that direction dead until something else moves the attribute.

This is not Alexa-specific in principle — Apple would behave the same way under the same conditions. Apple control has worked in testing, which is consistent with its endpoint state simply being accurate at the time.

To investigate before fixing

  1. Confirm the mechanism: set an endpoint's onOff true via set_state, then invoke onOff.on remotely, and check whether any command event is emitted.
  2. If confirmed, emit from the invocation as well as the attribute change — an ecosystem asking for a state is an intent to be forwarded, regardless of what the endpoint currently believes. Mind the echo guard: a plugin-originated set_state must still not round-trip.
  3. Check every role, not just onOff — setLevel, setColor, lock/unlock and covering commands ride the same watcher design. Note doorLock and windowCovering are already invocation-driven (E4 made them emit-only), so they may be unaffected — which would be evidence for the mechanism.
  4. Re-test with Alexa afterwards; the fabric was removed (removeFabric fabricIndex: 3) when the user deleted the pairing.

Also worth noting

Alexa pairing itself worked — three fabrics live simultaneously (two Apple, one Alexa), which is the multi-admin proof ADR-0007 asks for (#139), independent of this control bug.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions