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.

When to Use

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 Combination Examples

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.

Understanding the Condition Value

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

0
Up Higher values indicate worse condition (e.g. pollution index from 0 to 100)
1
Down Lower values indicate worse condition (e.g. remaining life from 100 to 0)
Why Degradation Direction Is Needed

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

0
OK Filter condition is normal; no replacement needed
1
Warning Filter is aging; replacement recommended soon
2
Critical Filter is severely degraded; immediate replacement required

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.

App-Side Tip

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

0
UPC Universal Product Code (12-digit North American barcode)
1
GTIN8 Global Trade Item Number (8-digit short barcode)
2
EAN European Article Number (13-digit international barcode)
3
GTIN14 Global Trade Item Number (14-digit logistics barcode)
4
OEM OEM-defined number (e.g. model name)

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": {}
  }]
}
Important Notes

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
  }
}
Developer Advice

Recommended implementation for filter management in the app:

  1. Display Condition percentage on the home card using a ring progress bar for visual representation
  2. Subscribe to ChangeIndication attribute changes; push app notification when the value becomes Warning
  3. When the value becomes Critical, display a red warning badge on the device card
  4. Provide a "Filter Replaced" button that sends the ResetCondition command when clicked
  5. 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
}
Developer Advice

How to use replacement product information:

  1. Read ReplacementProductList and iterate through all entries
  2. If entries with UPC / EAN / GTIN types exist, redirect to e-commerce platform to search by barcode
  3. If entries with OEM type exist, search by manufacturer part number on the brand website or authorized channels
  4. 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.