Automated Zigbee device testing

A script-based platform that sends ZCL commands to real devices over-the-air, validates responses automatically, and logs every result. 43 test scripts, 93 ZCL clusters, production-proven.

Request a Demo Technical Details

What It Does

The Zigbee Test Tool automates the testing of Zigbee devices at the ZCL protocol level. You write test scripts that read attributes, write values, send commands, and check responses. The tool executes them over-the-air against real hardware via a Silicon Labs coordinator and reports pass/fail results with expected vs actual values.

It was built to solve a specific problem: manually testing Zigbee devices is tedious, error-prone, and doesn't scale. This tool makes the same tests repeatable and scriptable.

A Real Test Script

This is from adv-thermostat-setpoint-limits.test — one of 43 test scripts in the current library. It writes new setpoint limits, then verifies the device rejects values outside those limits.

# Read factory defaults
SCENARIO Read AbsMinHeatSetpointLimit (expect 400)
Read_AbsMinHeatSetpointLimit
delay 0.5
@check_payload_value(400)

# Write new limits and verify
SCENARIO Write MinHeatSetpointLimit to 1000 (10.00C)
@writeattr(0x0201, 0x0015, 1000, zbtype=0x29, size=2, endpoint=1)
delay 1

SCENARIO Verify MinHeatSetpointLimit is 1000
@readattr(0x0201, 0x0015, size=2, endpoint=1)
delay 0.5
@check_payload_value(1000)

# Test setpoint clamping — this should be rejected
SCENARIO Attempt to write below MinHeatSetpointLimit (800 = 8.00C < 10.00C)
Write_OccupiedHeatingSetpoint(800)
delay 1

SCENARIO Verify setpoint was rejected (still 2000)
Check_OccupiedHeatingSetpoint(2000)

SCENARIO labels describe each step. M4 macros like Read_AbsMinHeatSetpointLimit expand to the correct ZCL read command. Inline Python (@ prefix) handles raw attribute operations and validation.

Real Test Output

This is the actual summary report from running that script on a commercial thermostat (device serial 94B216FFFEE5090D, 2 March 2026):

========================================================================
  TEST SUMMARY REPORT
========================================================================
  Test      : adv-thermostat-setpoint-limits.test
  Date      : 2026-03-02 09:18:30
  Duration  : 71 seconds

  Device Under Test
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Firmware  : 000.000.000
  Serial    : 94B216FFFEE5090D
  Node ID   : 0xee9b

  Overall Result
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  RESULT    : PASS  --  All checks passed.
  Checks    : 12 passed, 0 failed
  Scenarios : 12 executed, 12 passed, 0 failed

------------------------------------------------------------------------
  SCENARIO RESULTS
------------------------------------------------------------------------
  1.  [PASS]  Read AbsMinHeatSetpointLimit (expect 400)
        TX: zcl global read 513 3
        RX: payload VALUE = 400  [03 00 00 29 90 01]

  7.  [PASS]  Write OccupiedHeatingSetpoint within limits (2000 = 20.00C)
        TX: zcl global read 513 18
        RX: payload VALUE = 2000  [12 00 00 29 D0 07]

  8.  [PASS]  Verify setpoint was rejected (still 2000)
        TX: zcl global read 513 18
        RX: payload VALUE = 2000  [12 00 00 29 D0 07]

  12/12 scenarios passed. No issues found.

Each scenario shows the exact ZCL frame sent (TX) and received (RX), with the parsed attribute value and raw hex bytes. When a check fails, you get the expected value, actual value, and the script line number:

  1.  [FAIL]  Verify OnOff attribute is 1 (on)
        TX: zcl global read 6 0
        RX: clus 0x0006 (On/off) payload [00 00 86]
        CHECK: FAIL  Expected value of 1 but got 0 — Line 34

What It Covers

93 ZCL clusters across 9 functional domains. All standard data types and commands.

⚙️

General

28 clusters — Basic identity, power configuration, groups, scenes, commissioning, OTA upgrade, poll control, and analog/binary I/O.

🌡️

HVAC & Climate

5 clusters — Thermostat (50+ attributes including setpoints, scheduling, PI demand), pump, fan, dehumidifier, and UI configuration.

💡

Lighting

Colour control (hue, saturation, CIE X/Y, colour temperature, enhanced hue, colour loop) and ballast configuration.

📏

Measurement & Sensing

32 clusters — Temperature, humidity, pressure, occupancy, illuminance, plus CO₂, PM2.5, and 16 water quality clusters.

Smart Energy

12 clusters — Metering, tariff pricing, demand response, prepayment, tunneling, messaging, and key establishment.

🔒

Closures & Security

Door locks, window coverings, IAS zone sensors (14 zone types), alarm panels, and warning devices.

Full cluster reference →

How It Works

1. Connect a Zigbee coordinator

Plug a Silicon Labs EFR32 USB coordinator into your PC. The tool detects it on the serial port at 115200 baud and communicates via the EmberZNet CLI. Devices on the network are identified by their EUI64 address and short node ID.

🔌 Connect

2. Write a test script

Tests are plain-text files processed through GNU M4 macros. Each macro maps to a specific ZCL operation — Check_OccupiedHeatingSetpoint(2100) becomes a Read Attributes command on cluster 0x0201, attribute 0x0012, with validation against the value 2100.

For anything the macros don't cover, prefix a line with @ to run inline Python.

📜 Script

3. Run and inspect results

The tool sends ZCL frames over-the-air and validates each response. Results are colour-coded in the terminal — green for pass, red for fail — with the attribute name, expected value, actual value, and timestamp. Every run is logged to a dated result file and appended to a historical ledger.

✅ Results

Technical Summary

Platform

Hardware

Environment

Who This Is For

🏭

Device Manufacturers

Run the same test suite against every firmware build. Catch attribute regressions, incorrect defaults, and broken commands before they reach production.

See supported clusters →
🔬

Test Labs

Automate repetitive ZCL validation. Generate consistent, timestamped reports for each device model. Reduce per-device test time.

View features →
💻

Firmware Engineers

Test your ZCL implementation as you develop. Scripts are text files — diff them, review them, check them into git alongside your firmware source.

View features →

Manual vs. Scripted Testing

An honest comparison of the two approaches.

Manual Scripted
Effort per test run Re-do everything each time Write once, run repeatedly
Consistency Depends on the tester Identical every time
Regression testing Rarely done — too slow Runs on every build
Audit trail Notes and screenshots Timestamped log files
Scales with device count Linearly — more testers Run more scripts in parallel
Learning curve Low Moderate — scripting required

Want to see a real test run?

We'll connect to a Zigbee device, run a test script, and walk through the results. No slides.

Request a Demo View Pricing