Description
condition = 73% corresponds to its efficiency level (0% → replace the filter)
Hi @pierre-gilles ,
I have a Dyson purifier and I think this request is a duplicate of the one concerning the HEPA filter. Indeed, the HEPA filter and the activated carbon filter are the same, so I don’t know if it’s necessary to perform two monitoring checks.
=> https://www.dyson
Hi @Nagromdark
on mine there are indeed 2 separate physical filters, one for activated carbon and one HEPA.
I’m following up on this — are you sure @mutmut that you have 2 filters to change? For me on the TP09 there’s only one and it’s stated on the Dyson website that for the TP04 it’s the same. Could you send me what Matterbridge returns to you please?
For example I have this:
The attribute “inPLaceIndicator” is false for me
mutmut
October 11, 2025, 10:01am
5
pierre-gilles:
image2792×510 68.7 KB
this is my screenshot of the activated carbon, and for the HEPA filter it’s in this topic .
I have true for HEPA and activated carbon.
Small photo of my 2 filters :
mutmut
October 12, 2025, 7:50pm
7
I have to admit I don’t understand everything about these filters
If I go through the Dyson app and click on one of my filters I get this:
so 2 distinct filters. But when I click on the first or the second Acheter, I end up on the dual filter that you show.
I get the feeling my TP04 isn’t very new and that I might have some trouble finding the right filters.
EDIT: they are indeed different models for mine and yours
OK perfect we have the explanation
For me it’s a 2-in-1 filter that’s worth 100 bucks, basically (a rip-off)
Hi everyone!
This topic is now in development .
A PR has been opened to add Matter active carbon filter tracking:
master ← claude/matter-activated-carbon-filter
ouvert 02:26AM - 17 Aug 26 UTC
Implements feature request: https://community.gladysassistant.com/t/matter-ajout… er-la-gestion-du-monitoring-de-filtre-charbon-actif/9623
### Description
Air purifiers exposed over Matter often carry two distinct physical filters: a HEPA one, already supported through the `HepaFilterMonitoring` cluster, and an activated carbon one reported by the `ActivatedCarbonFilterMonitoring` cluster (`0x0072`). Only the first was mapped, so the remaining life of the carbon filter was invisible in Gladys.
The forum thread confirms both cases exist in the wild: some appliances (Dyson TP04) ship two separate cartridges and expose both clusters, while others (TP09) ship a combined HEPA + carbon cartridge and expose a single one. Mapping the cluster covers both: an appliance simply publishes one feature per cluster it actually reports.
`ActivatedCarbonFilterMonitoring` follows the same Matter Resource Monitoring model as `HepaFilterMonitoring`, so the implementation mirrors it 1:1. Its `Condition` attribute is the remaining efficiency of the filter in percent (100 = new, 0 = to be replaced — the `condition = 73%` from the original post).
What the PR does:
- **Server** — `server/services/matter/`: read `Condition` on device discovery (`convertToGladysDevice`), on the initial state read (`matter.readInitialDeviceStates`) and on state change subscription (`matter.listenToStateChange`), exactly as the HEPA cluster is handled. The cluster row in `server/services/matter/README.md` is flipped to "handled".
- **Taxonomy** — a new `activated-carbon-filter-life-remaining` **type** is added to the **existing** `hepa-filter-monitoring` category, so a purifier with both filters exposes two features the user can actually tell apart, while the same physical quantity is not split across two categories. No new category is introduced.
- **Front** — the new type is registered where the existing one is: feature icon (`front/src/utils/consts.js`), MQTT feature defaults / default unit / preview value (`front/src/routes/integration/all/mqtt/device-page/utils.js`), and `en`/`fr`/`de` translations.
- The category label is reworded from "HEPA filter monitoring" to "Filter monitoring" now that it holds more than the HEPA filter, and each type label is qualified ("HEPA filter life remaining" / "Activated carbon filter life remaining"). This is a **translation-only** change: the `hepa-filter-monitoring` constant value is untouched, so nothing published by integrations breaks.
Notes on scope: only `Condition` is mapped, mirroring the HEPA cluster. `ChangeIndication` / `InPlaceIndicator` are deliberately left out — the replacement need is already conveyed by the condition reaching 0%, and a boolean "needs replacement" feature would deserve its own discussion rather than riding along here. The forum thread also shows `InPlaceIndicator` is inconsistently implemented by bridges, which makes it a poor first citizen.
Design review against `docs/specs/device-feature-categories.md`: the change adds a type to an existing category (rule 4 "reuse before creating", rule 5 "no new category when a new type is enough"), it uses the Matter model as the reference (rule 3), it keeps the same physical quantity in one category (rule 2), the names are kebab-case, English and brand-free (rule 1 and 7), and the full plumbing (inline scope comment on the constant, all i18n files, front icon, MQTT defaults, tests) ships in the same diff (rule 8). The pre-existing inline comment on `MAINTENANCE` already stated that "filter life reported through the Matter Resource Monitoring model (HEPA and activated carbon filters) stays in `HEPA_FILTER_MONITORING`" — this PR follows that documented boundary and now documents the category itself the same way. The `hepa-` prefix of the category value predates activated carbon support and is intentionally left as-is, since renaming it would be breaking.
This PR was produced by an automated run, and has not been tested against a physical device — the code paths are covered by unit tests only.
## Forum
Forum: https://community.gladysassistant.com/t/matter-ajouter-la-gestion-du-monitoring-de-filtre-charbon-actif/9623
### Checklist
- [x] Tests pass: `cd server && npm run coverage` (Codecov requires 100% coverage on changed lines) and Cypress (`npm run cypress:run`) if the UI changed
- [x] Linter and prettier pass on both front and server (`npm run eslint`, `npm run prettier`)
- [x] No undocumented breaking change
Checks run locally: server `prettier-check` + `eslint` (0 errors) and the full `test/services/matter/**` suite (267 passing, including the new cases in `convertToGladysDevice.test.js`, `listenToStateChange.test.js` and `matter.readInitialDeviceStates.test.js`); front `prettier-check`, `eslint`, `compare-translations` and `build`.
---
_Generated by [Claude Code](https://claude.ai/code/session_01REGRUvErzpwtSrsi9gKh4J)_
## Summary by CodeRabbit
- **New Features**
- Added monitoring for remaining activated-carbon filter life on compatible devices.
- Displayed activated-carbon filter life as a read-only percentage with dedicated iconography.
- Added support for initial and live filter status updates from Matter devices.
- **Improvements**
- Clarified filter-monitoring labels in English, German, and French.
- HEPA and activated-carbon filter life now appear as separate measurements.
- **Tests**
- Added coverage for detecting and updating both filter types.
Don’t hesitate to follow the PR, test as soon as possible, and give your feedback here.