Split out of #179, which was titled "smoke/CO and air-quality sensor roles" and closed on 2026-08-18 when the smoke/CO half shipped in v2026.23.0 (PR #255). The air-quality half was never built. Closing the whole issue overstated what landed — this issue carries the remainder honestly rather than leaving it buried in a closed thread.
What is missing
The plugin reads AirQuality inbound (matter_handlers/, and the inbound docs list AQI / CO₂ / PM2.5 / TVOC), but an Indigo air-quality sensor cannot be published outbound. There is no airQualitySensor role.
Not simply another numeric sensor — the open design question
The five numeric sensor roles are each one device type carrying one measured value. Air quality is not shaped like that:
- Matter's Air Quality Sensor (0x002C) carries the
AirQuality cluster (0x005B) — an enum (Good/Fair/Moderate/Poor/VeryPoor/ExtremelyPoor), not a number — plus optional concentration-measurement clusters for CO₂, PM2.5, PM10, TVOC and the rest, each its own cluster.
- Indigo, meanwhile, presents an air-quality device as several separate sensor devices, one per metric, exactly as this plugin's own inbound handler creates them.
So the question this issue has to settle before any code: does one Indigo device become one Air Quality Sensor accessory with one concentration cluster, or do several Indigo devices compose into a single accessory? The second is closer to the truth and much harder — composition is exactly what the #222 no-foreign-clusters constraint made deliberate rather than accidental.
There is also nothing in Indigo to derive the mandatory AirQuality enum from unless the user declares a mapping from their AQI number to the six bands.
Upstream position
@matter/node 0.17.8 ships air-quality-sensor.ts and the concentration-measurement behaviours, so this is not blocked on matter.js — unlike #176 and #177. It is blocked on the modelling decision above and on a device to validate against.
Want this? Post here so we can scope it
- The Indigo device(s) you would export, and which plugin creates them
- Which metric matters to you most (AQI band? CO₂ ppm? PM2.5?)
- Which ecosystem you would pair it into, and what you expect to see there
Part of the export role roadmap — see #181.
🤖 Generated with Claude Code
https://claude.ai/code/session_01UJT3eBiFAYoNRREu9VBcqW
Split out of #179, which was titled "smoke/CO and air-quality sensor roles" and closed on 2026-08-18 when the smoke/CO half shipped in v2026.23.0 (PR #255). The air-quality half was never built. Closing the whole issue overstated what landed — this issue carries the remainder honestly rather than leaving it buried in a closed thread.
What is missing
The plugin reads AirQuality inbound (
matter_handlers/, and the inbound docs list AQI / CO₂ / PM2.5 / TVOC), but an Indigo air-quality sensor cannot be published outbound. There is noairQualitySensorrole.Not simply another numeric sensor — the open design question
The five numeric sensor roles are each one device type carrying one measured value. Air quality is not shaped like that:
AirQualitycluster (0x005B) — an enum (Good/Fair/Moderate/Poor/VeryPoor/ExtremelyPoor), not a number — plus optional concentration-measurement clusters for CO₂, PM2.5, PM10, TVOC and the rest, each its own cluster.So the question this issue has to settle before any code: does one Indigo device become one Air Quality Sensor accessory with one concentration cluster, or do several Indigo devices compose into a single accessory? The second is closer to the truth and much harder — composition is exactly what the #222 no-foreign-clusters constraint made deliberate rather than accidental.
There is also nothing in Indigo to derive the mandatory
AirQualityenum from unless the user declares a mapping from their AQI number to the six bands.Upstream position
@matter/node0.17.8 shipsair-quality-sensor.tsand the concentration-measurement behaviours, so this is not blocked on matter.js — unlike #176 and #177. It is blocked on the modelling decision above and on a device to validate against.Want this? Post here so we can scope it
Part of the export role roadmap — see #181.
🤖 Generated with Claude Code
https://claude.ai/code/session_01UJT3eBiFAYoNRREu9VBcqW