HepaFilterMonitoring Cluster
Cluster ID: 0x0071 |
Endpoint: Application endpoint (typically Endpoint 1)
HepaFilterMonitoring monitors the lifecycle status of HEPA filters in air purifiers, including remaining life percentage, degradation level, whether replacement is needed, and recommended replacement product information. After the user replaces the filter, the state can be reset via a command to begin a new monitoring cycle.
Air purifiers require periodic HEPA filter replacement. This Cluster enables apps to display remaining filter life in real time, push reminders when the filter is nearing depletion, and even provide purchase links for replacement filters. After the user replaces the filter, a single ResetCondition command restarts the timer.
Feature Map
HepaFilterMonitoring uses the Feature Map to control optional feature activation. Devices can declare supported features based on hardware capabilities.
| Bit | Code | Name | Description |
|---|---|---|---|
0 |
CON | Condition | Supports filter remaining life percentage (Condition attribute) |
1 |
WAR | Warning | Supports degradation level (DegradationDirection attribute) |
2 |
REP | ReplacementProductList | Supports replacement product list (ReplacementProductList attribute) |
Feature Map = 0b111 (7): supports life percentage, degradation direction, and replacement product list -- the most complete configuration.
Feature Map = 0b001 (1): supports only life percentage, suitable for low-cost devices.
Feature Map = 0b101 (5): supports life percentage + replacement product list, does not report degradation direction.
Attribute Overview
HepaFilterMonitoring attributes are divided into required and optional parts; optional attributes depend on the features declared by the device.
| ID | Name | Type | Access | Required | Description |
|---|---|---|---|---|---|
0x00 |
Condition | uint8 | Read-only | CON | Filter remaining life percentage (0-100%) |
0x01 |
DegradationDirection | enum8 | Read-only | WAR | Degradation direction: whether higher or lower values mean worse condition |
0x02 |
ChangeIndication | enum8 | Read-only | Yes | Change indication: OK / Warning / Critical |
0x03 |
InPlaceIndicator | bool | Read-only | No | Whether the filter is physically installed |
0x04 |
LastChangedTime | epoch_s | Read-only | No | Time of last filter change (may be null) |
0x05 |
ReplacementProductList | list | Read-only | REP | Recommended replacement product list |
Condition (Filter Remaining Life)
Represents the filter's remaining life as a percentage, ranging from 0 to 100.
100 indicates a brand new filter, 0 indicates the filter is fully depleted.
Requires the device to declare the CON Feature for this attribute to appear.
This percentage is calculated by the device firmware based on factors such as usage duration, airflow, and particulate concentration. Different manufacturers may use different algorithms, but app developers only need to focus on this 0-100 value. It is recommended to display this in the app using a progress bar or ring chart, with highlighting when below 20%.
DegradationDirection (Degradation Direction)
Indicates the degradation direction of the Condition value -- whether increasing or decreasing values represent worsening filter condition. Requires the device to declare the WAR Feature for this attribute to appear.
DegradationDirectionEnum Enum Values
Different manufacturers may define the Condition value in opposite ways: some use "remaining percentage" (lower is worse), others use "pollution level" (higher is worse). DegradationDirection enables apps to correctly interpret the Condition value regardless of how the manufacturer defines it.
ChangeIndication (Replacement Indication)
The filter's current replacement status. This is a required attribute; even if the device does not support the Condition percentage, it must report the replacement indication.
ChangeIndicationEnum Enum Values
InPlaceIndicator (Filter Installation Status)
A boolean indicating whether the filter is physically installed in the device. true means the filter is in place; false means it is not installed or has been removed.
This is an optional attribute, depending on whether the device has a physical detection sensor.
When InPlaceIndicator = false, the app should prompt the user that the filter is not installed and prevent operation.
The typical filter replacement flow is: remove old filter (false) → install new filter (true) → send ResetCondition command.
LastChangedTime (Last Changed Time)
The UTC timestamp (epoch seconds) of the last filter replacement. Can be null, indicating the device has not recorded a replacement time.
After the user sends a ResetCondition command, the device updates this attribute to the current time.
ReplacementProductList (Replacement Product List)
A list of recommended replacement products; each entry contains a product identification type and value. Requires the device to declare the REP Feature for this attribute to appear. The list can contain multiple entries, identifying the same replacement filter using different coding systems.
ReplacementProductStruct
| Field | Type | Description |
|---|---|---|
| ProductIdentifierType | enum8 | Product identification coding system |
| ProductIdentifierValue | string | Product identification value (barcode, serial number, etc.) |
ProductIdentifierTypeEnum Enum Values
Commands
HepaFilterMonitoring has only one command, sent from Client to Server (i.e. app to device). Used to reset the monitoring state after the user replaces the filter.
| ID | Name | Description |
|---|---|---|
0x00 |
ResetCondition | Reset filter condition (called after filter replacement) |
ResetCondition -- Reset Filter Status (0x00)
After the user replaces the HEPA filter, this command is sent to notify the device to restart lifecycle monitoring.
Upon receipt, the device resets Condition to 100, ChangeIndication to OK,
and updates LastChangedTime to the current time.
This command has no parameters; send it directly.
Request example:
{
"invokeRequests": [{
"commandPath": {
"endpointId": 1,
"clusterId": "0x0071",
"commandId": "0x00" // ResetCondition
},
"commandFields": {}
}]
}
ResetCondition does not verify whether the filter was actually physically replaced. If the device supports InPlaceIndicator,
the app can first confirm that the attribute changed from false to true (user removed old filter and installed new one) before sending this command,
to avoid accidental resets.
Example Data
Read all attributes of the HepaFilterMonitoring Cluster from an air purifier:
{
// --- Attributes ---
"0x0": 72, // Condition = 72% (filter remaining life)
"0x1": 1, // DegradationDirection = Down (lower values indicate worse condition)
"0x2": 0, // ChangeIndication = OK (condition normal)
"0x3": true, // InPlaceIndicator = true (filter installed)
"0x4": 1695206400, // LastChangedTime = 2023-09-20T16:00:00Z
"0x5": [ // ReplacementProductList
{
"0": 0, // ProductIdentifierType = UPC
"1": "012345678905" // ProductIdentifierValue
}
]
}
Scenario 1: Filter Lifecycle Tracking
The complete flow from installing a new filter to filter depletion and replacement in an air purifier. The app updates the UI in real time by subscribing to attribute changes, and pushes notifications at key milestones.
{
// Scenario: After 6 months of operation, the filter begins to age
// First read -- filter status good
"readAttributes": {
"0x0": 72, // Condition = 72%
"0x2": 0 // ChangeIndication = OK
},
// Two months later -- filter enters warning zone
"readAttributes_later": {
"0x0": 18, // Condition = 18%
"0x2": 1 // ChangeIndication = Warning
},
// Continued use -- filter enters critical state
"readAttributes_critical": {
"0x0": 3, // Condition = 3%
"0x2": 2 // ChangeIndication = Critical
},
// After user replaces filter, send ResetCondition command
"resetCommand": {
"endpointId": 1,
"clusterId": "0x0071",
"commandId": "0x00"
},
// Status after reset
"readAttributes_after_reset": {
"0x0": 100, // Condition = 100% (reset)
"0x2": 0 // ChangeIndication = OK
}
}
Recommended implementation for filter management in the app:
- Display
Conditionpercentage on the home card using a ring progress bar for visual representation - Subscribe to
ChangeIndicationattribute changes; push app notification when the value becomesWarning - When the value becomes
Critical, display a red warning badge on the device card - Provide a "Filter Replaced" button that sends the
ResetConditioncommand when clicked - If the device supports
InPlaceIndicator, check whether the filter is installed before the button tap
Scenario 2: Replacement Product Purchase Guide
When the filter needs replacement, the app reads the replacement product list from the device to help the user quickly find the correct replacement filter and complete the purchase.
{
// Scenario: App reads replacement product info to guide user purchase
"readAttributes": {
"0x2": 2, // ChangeIndication = Critical (replacement needed)
"0x5": [ // ReplacementProductList
{
"0": 0, // ProductIdentifierType = UPC
"1": "012345678905"
},
{
"0": 4, // ProductIdentifierType = OEM
"1": "HEPA-H13-PRO-2024"
}
]
}
// App can use UPC code to redirect to e-commerce search, or OEM number to redirect to manufacturer website
}
How to use replacement product information:
- Read
ReplacementProductListand iterate through all entries - If entries with
UPC/EAN/GTINtypes exist, redirect to e-commerce platform to search by barcode - If entries with
OEMtype exist, search by manufacturer part number on the brand website or authorized channels - Display all available product identifiers on the app's "Filter Replacement" page, letting users choose their preferred purchase channel
The same filter may have both UPC and OEM identifiers. The app should display both to accommodate purchasing habits in different regions.