Summary
After upgrading from 3.10.2 to 3.10.3, Apple Home no longer displays the live
wattage on bridged devices that expose ElectricalPowerMeasurement. The tiles
render as plain On / Off, with no reading on the tile or in the accessory
detail view, and the room's aggregated Power summary disappears.
Pinning the image back to luligu/matterbridge:3.10.2 restores it immediately —
same plugin, same config, same Matter storage, no re-commissioning. Moving
forward to 3.10.3 breaks it again. I've flipped the tag both ways to confirm.
The devices themselves are unaffected: On/Off still works from Home, and
Matterbridge logs ElectricalPowerMeasurement.activePower updating on every poll.
It is only the controller-side rendering of the measurement that stops.
Environment
|
|
| Matterbridge |
3.10.3 (broken) vs 3.10.2 (works) |
| Image |
luligu/matterbridge:<tag>, --docker -childbridge |
| matter.js |
0.17.6 (3.10.2) / 0.17.7 (3.10.3) |
| Node |
v24.18.0 (in container) |
| Host |
Raspberry Pi, Linux 6.1.21-v8+ aarch64, network_mode: host |
| Controller |
Apple Home, iOS 27, single fabric, Apple TV / HomePod hub |
| Device |
onOffPlugInUnit + electricalSensor on one endpoint, with PowerTopology, ElectricalPowerMeasurement, ElectricalEnergyMeasurement |
The affected devices come from an unpublished local plugin (a power meter — it polls
a vendor cloud API and republishes the readings), but they're built with nothing but
the standard helpers, so this should reproduce with any bridged device exposing an
electrical sensor:
new MatterbridgeEndpoint([onOffPlugInUnit, electricalSensor], { id })
.createDefaultIdentifyClusterServer()
.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Acme', 0x8000, model)
.createDefaultOnOffClusterServer(true)
.createDefaultPowerTopologyClusterServer()
.createDefaultElectricalPowerMeasurementClusterServer(null, null, 0)
.createDefaultElectricalEnergyMeasurementClusterServer(0, 0)
.addRequiredClusterServers();
Updated on each poll with
updateAttribute('ElectricalPowerMeasurement', 'activePower', milliwatts, log).
Steps to reproduce
- Run Matterbridge 3.10.2 in childbridge mode with a plugin exposing the endpoint
above; commission the childbridge into Apple Home. Tiles show On • <n> W.
- Change the image tag to 3.10.3 and recreate the container. No other change.
- Apple Home tiles now show only
On — no wattage on the tile or in the detail
view, and the room Power summary is gone.
- Change the tag back to 3.10.2 and recreate. The wattage returns within a couple
of minutes, without re-pairing.
What I ruled out
I went looking in my own plugin first, and it isn't there:
- The attribute is written and the cluster is live on 3.10.3. The log shows
Update endpoint <MyMeter>:2 attribute ElectricalPowerMeasurement.activePower from 629000 to 1054000. updateAttribute() logs an error and returns false when
the cluster or attribute is absent, so a successful update proves the endpoint
really does carry the cluster.
- Apple is still subscribed. On restart:
Reestablish subscription » … isFabricFiltered: false maxInterval: 3m 6s.
- The endpoint advertises exactly the same thing on both versions. I built the
endpoint above under 3.9.3, 3.10.2 and 3.10.3 inside a real ServerNode and
diffed Descriptor.deviceTypeList, Descriptor.serverList, tagList, feature
maps, attributeList, numberOfMeasurementTypes, powerMode, ranges and
cluster revisions. Byte-identical across all three (EPM rev 3, EEM rev 2,
PowerTopology rev 1).
- Not the endpoint count. Going from 9 bridged endpoints back to 8 changed
nothing. (This was my first theory — a controller subscription-path budget — and
it was wrong. Noting it so nobody re-runs the dead end.)
- Not
BridgedDeviceBasicInformation rev 5 → 6. That landed in 3.10.0, but
3.10.2 works.
- No endpoint renumbering —
checkEndpointNumbers logs no warnings — and the
plugin code is identical across the whole comparison.
Suspicion
The only 3.10.3 change I can see that touches Matter-visible structure is:
[matterbridge]: Add a wired AC PowerSource to server nodes.
That alters each childbridge's root node rather than its endpoints, which fits
the symptom shape: Apple still drives On/Off from the same endpoints but stops
reading the optional measurement clusters. My guess at a mechanism is that adding
PowerSource to the root node of an aggregator changes how Apple models the bridge
and invalidates part of its cached view — Apple resumes its existing subscription
rather than re-reading, so a stale model would persist.
Questions, in case they help:
- Is the server-node
PowerSource added unconditionally, including in childbridge
mode where the server node is an aggregator?
- Does the root node also need
PowerTopology, or a deviceTypeList entry, for a
controller to accept a PowerSource there?
- Given Apple's reaction, would it be worth putting it behind a flag?
Happy to test a patch or gather more logs — I can flip tags on this system freely
and have a reproducible before/after.
Summary
After upgrading from 3.10.2 to 3.10.3, Apple Home no longer displays the live
wattage on bridged devices that expose
ElectricalPowerMeasurement. The tilesrender as plain
On/Off, with no reading on the tile or in the accessorydetail view, and the room's aggregated
Powersummary disappears.Pinning the image back to
luligu/matterbridge:3.10.2restores it immediately —same plugin, same config, same Matter storage, no re-commissioning. Moving
forward to 3.10.3 breaks it again. I've flipped the tag both ways to confirm.
The devices themselves are unaffected: On/Off still works from Home, and
Matterbridge logs
ElectricalPowerMeasurement.activePowerupdating on every poll.It is only the controller-side rendering of the measurement that stops.
Environment
luligu/matterbridge:<tag>,--docker -childbridgenetwork_mode: hostonOffPlugInUnit+electricalSensoron one endpoint, withPowerTopology,ElectricalPowerMeasurement,ElectricalEnergyMeasurementThe affected devices come from an unpublished local plugin (a power meter — it polls
a vendor cloud API and republishes the readings), but they're built with nothing but
the standard helpers, so this should reproduce with any bridged device exposing an
electrical sensor:
Updated on each poll with
updateAttribute('ElectricalPowerMeasurement', 'activePower', milliwatts, log).Steps to reproduce
above; commission the childbridge into Apple Home. Tiles show
On • <n> W.On— no wattage on the tile or in the detailview, and the room
Powersummary is gone.of minutes, without re-pairing.
What I ruled out
I went looking in my own plugin first, and it isn't there:
Update endpoint <MyMeter>:2 attribute ElectricalPowerMeasurement.activePower from 629000 to 1054000.updateAttribute()logs an error and returns false whenthe cluster or attribute is absent, so a successful update proves the endpoint
really does carry the cluster.
Reestablish subscription » … isFabricFiltered: false maxInterval: 3m 6s.endpoint above under 3.9.3, 3.10.2 and 3.10.3 inside a real
ServerNodeanddiffed
Descriptor.deviceTypeList,Descriptor.serverList,tagList, featuremaps,
attributeList,numberOfMeasurementTypes,powerMode,rangesandcluster revisions. Byte-identical across all three (EPM rev 3, EEM rev 2,
PowerTopology rev 1).
nothing. (This was my first theory — a controller subscription-path budget — and
it was wrong. Noting it so nobody re-runs the dead end.)
BridgedDeviceBasicInformationrev 5 → 6. That landed in 3.10.0, but3.10.2 works.
checkEndpointNumberslogs no warnings — and theplugin code is identical across the whole comparison.
Suspicion
The only 3.10.3 change I can see that touches Matter-visible structure is:
That alters each childbridge's root node rather than its endpoints, which fits
the symptom shape: Apple still drives On/Off from the same endpoints but stops
reading the optional measurement clusters. My guess at a mechanism is that adding
PowerSourceto the root node of an aggregator changes how Apple models the bridgeand invalidates part of its cached view — Apple resumes its existing subscription
rather than re-reading, so a stale model would persist.
Questions, in case they help:
PowerSourceadded unconditionally, including in childbridgemode where the server node is an aggregator?
PowerTopology, or adeviceTypeListentry, for acontroller to accept a
PowerSourcethere?Happy to test a patch or gather more logs — I can flip tags on this system freely
and have a reproducible before/after.