Summary
Using z2m/aircube.js, temperature/humidity/brightness work, but eco2, voc, aqi are always null.
Root cause
Cluster 0xFC01 is already a built-in cluster in zigbee-herdsman: manuSpecificLegrandDevices.
The AirCube sends these attribute reports without a manufacturer code (manufacturerSpecific: false),
so herdsman resolves the raw 0xFC01 to its built-in manuSpecificLegrandDevices definition.
Zigbee2MQTT then dispatches fromZigbee converters by the resolved cluster name, not the number —
so cluster: CUSTOM_CLUSTER_ID (0xFC01 / '64513') never matches, and the values stay null.
Evidence (Z2M debug log)
The device sends the data correctly (attrs 0/1/2 of cluster 64513):
Received Zigbee message from 'AirCube', type 'attributeReport', cluster 'manuSpecificLegrandDevices', data '{"0":751}' from endpoint 10
No converter available for 'AirCube' with cluster 'manuSpecificLegrandDevices' and type 'attributeReport' and data '{"0":751}'
... '{"1":182}' ... '{"2":49}' ...
Fix
In fzAirCubeAirQuality, set cluster: 'manuSpecificLegrandDevices' (instead of the numeric id).
The convert body is unchanged — the Legrand cluster doesn't define attrs 0/1/2, so msg.data
keeps numeric keys and the existing hasOwnProperty(0/1/2) checks work.
Verified on hardware: eco2 751 ppm, voc 182 ppb, aqi 49. Same applies to aircube.mjs.
A cleaner long-term fix would be to disambiguate the manufacturer-specific cluster — either send it
with a manufacturer code from firmware, or declare a private cluster via addCustomCluster() in the
converter so herdsman parses it under a unique name.
Relation to #57
Distinct from #57 (converter failing to load on Z2M 2.11.0). Here the converter loads fine —
temp/humidity/brightness work — but air-quality values stay null due to this cluster-name collision.
Affects 1.x, and would still bite on 2.x after #57 is resolved.
Environment
- Zigbee2MQTT 1.39.1
- zigbee-herdsman 0.55.3 ← this is where 0xFC01 →
manuSpecificLegrandDevices is defined
- zigbee-herdsman-converters 19.72.0
- Coordinator: Sonoff ZBDongle-E, EmberZNet 7.4.4 / ember (EZSP v13)
Note: this is a Zigbee2MQTT/zigbee-herdsman dispatch behaviour, not a device-firmware issue.
The coordinator only relays the raw numeric cluster id (0xFC01); herdsman resolves the name.
Summary
Using
z2m/aircube.js, temperature/humidity/brightness work, but eco2, voc, aqi are always null.Root cause
Cluster
0xFC01is already a built-in cluster in zigbee-herdsman:manuSpecificLegrandDevices.The AirCube sends these attribute reports without a manufacturer code (
manufacturerSpecific: false),so herdsman resolves the raw
0xFC01to its built-inmanuSpecificLegrandDevicesdefinition.Zigbee2MQTT then dispatches
fromZigbeeconverters by the resolved cluster name, not the number —so
cluster: CUSTOM_CLUSTER_ID(0xFC01 / '64513') never matches, and the values stay null.Evidence (Z2M debug log)
The device sends the data correctly (attrs 0/1/2 of cluster 64513):
Received Zigbee message from 'AirCube', type 'attributeReport', cluster 'manuSpecificLegrandDevices', data '{"0":751}' from endpoint 10
No converter available for 'AirCube' with cluster 'manuSpecificLegrandDevices' and type 'attributeReport' and data '{"0":751}'
... '{"1":182}' ... '{"2":49}' ...
Fix
In
fzAirCubeAirQuality, setcluster: 'manuSpecificLegrandDevices'(instead of the numeric id).The
convertbody is unchanged — the Legrand cluster doesn't define attrs 0/1/2, somsg.datakeeps numeric keys and the existing
hasOwnProperty(0/1/2)checks work.Verified on hardware: eco2 751 ppm, voc 182 ppb, aqi 49. Same applies to
aircube.mjs.A cleaner long-term fix would be to disambiguate the manufacturer-specific cluster — either send it
with a manufacturer code from firmware, or declare a private cluster via
addCustomCluster()in theconverter so herdsman parses it under a unique name.
Relation to #57
Distinct from #57 (converter failing to load on Z2M 2.11.0). Here the converter loads fine —
temp/humidity/brightness work — but air-quality values stay null due to this cluster-name collision.
Affects 1.x, and would still bite on 2.x after #57 is resolved.
Environment
manuSpecificLegrandDevicesis definedNote: this is a Zigbee2MQTT/zigbee-herdsman dispatch behaviour, not a device-firmware issue.
The coordinator only relays the raw numeric cluster id (0xFC01); herdsman resolves the name.