Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Zigbee Thermostat example does not work with commercial temperature sensors #11095

FrankX0 started this conversation in Question - Community Help
Discussion options

Board

ESP32-C6

Device Description

None

Hardware Configuration

None

Version

latest master (checkout manually)

IDE Name

Arduino IDE

Operating System

Windows 10

Flash frequency

80 MHz

PSRAM enabled

no

Upload speed

921600

Description

Example sketch hangs when bound to a commercial Zigbee temperature sensor (e.g. TS0201).
Sketch works when bound to example temperature sensor sketch on other ESP32-C6.
Both getSensorSettings() (blocks) and setTemperatureReporting() (no response) are not working.
Functions readManufacturer() and readModel() work correctly though.

Sketch

Default Thermostat example sketch (Zigbee_Thermostat.ino)

Debug Message

[ 57][I][ZigbeeCore.cpp:138] zigbeeInit(): List of registered[ 2631][I][ZigbeeCore.cpp:328] esp_zb_app_signal_handler(): Network(0x0a8e) closed, devices joining not allowed.
[ 2642][I][ZigbeeCore.cpp:260] esp_zb_app_signal_handler(): Formed network successfully (Extended PAN ID: 8c:bf:ea:ff:fe:b9:c6:c4, PAN ID: 0x0a8e, Channel:15, Short Address: 0x0000)
[ 3125][I][ZigbeeCore.cpp:326] esp_zb_app_signal_handler(): Network(0x0a8e) is open for 180 seconds
[ 3135][I][ZigbeeCore.cpp:275] esp_zb_app_signal_handler(): Network steering started
Waiting for Temperature sensor to bound to the thermostat.........................
[ 15421][I][ZigbeeCore.cpp:298] esp_zb_app_signal_handler(): New device commissioned or rejoined (short: 0x2727)
[ 15538][I][ZigbeeThermostat.cpp:48] findCb(): Found temperature sensor
[ 15545][I][ZigbeeThermostat.cpp:72] findCb(): Request temperature sensor to bind us
[ 15552][I][ZigbeeThermostat.cpp:88] findCb(): Bind temperature sensor
[ 15562][I][ZigbeeThermostat.cpp:35] bindCb(): The temperature sensor originating from address(0x2727) on endpoint(1)
[ 15643][I][ZigbeeThermostat.cpp:163] getSensorSettings(): Sending 'read temperature' command
[ 16920][I][ZigbeeCore.cpp:326] esp_zb_app_signal_handler(): Network(0x0a8e) is open for 180 seconds
[196921][I][ZigbeeCore.cpp:328] esp_zb_app_signal_handler(): Network(0x0a8e) closed, devices joining not allowed.

Other Steps to Reproduce

No response

I have checked existing issues, online documentation and the Troubleshooting Guide

  • I confirm I have checked existing issues, online documentation and Troubleshooting guide.
You must be logged in to vote

Replies: 14 comments

Comment options

Hi @FrankX0, is the getTemperature() working? Maybe the Zigbee temperature sensor (e.g. TS0201). does not have the reporting cluster implemented and also they don't have any sensor settings attributes implemented. Are you able if you connect the temperature to any system like HomeAssistant or Z2MQTT to set the reporting there or receive the temp. sensor settings?

You must be logged in to vote
0 replies
Comment options

I will fix the blocking getSensorSettings(), there should be some kind of timeout, not to wait forever.

You must be logged in to vote
0 replies
Comment options

getTemperature() also does not give any response.
I guess the zbThermostat.onTempRecieve(recieveSensorTemp) callback should trigger, right?
(minor BTW: the code uses incorrectly written recieve instead of receive).

This sensor (and others) connect successfully to Z2MQTT and reports its data as expected.
If it helps, this is how the clusters of this device are reported in Z2MQTT:
image

Added

I have the same issue with different sensors, but all point to Tuya.
I looked at how Z2M deals with these sensors, and found the following in tuya.js:

 fingerprint: [
 { modelID: 'TS0201', manufacturerName: '_TZ3000_bguser20' },
 { modelID: 'TS0201', manufacturerName: '_TZ3000_yd2e749y' },
 { modelID: 'TS0201', manufacturerName: '_TZ3000_6uzkisv2' },
 { modelID: 'TS0201', manufacturerName: '_TZ3000_xr3htd96' },
 { modelID: 'TS0201', manufacturerName: '_TZ3000_fllyghyj' },
 { modelID: 'TS0201', manufacturerName: '_TZ3000_saiqcn0y' },
 ],
 model: 'WSD500A',
 vendor: 'TuYa',
 description: 'Temperature & humidity sensor',
 fromZigbee: [fzLocal.TS0201_battery, fromZigbee_1.default.temperature, fromZigbee_1.default.humidity],
 toZigbee: [],
 exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
 configure: tuya.configureMagicPacket,
 whiteLabel: [
 tuya.whitelabel('TuYa', 'TH02Z', 'Temperature and humidity sensor', ['_TZ3000_fllyghyj', '_TZ3000_saiqcn0y']),
 ],

I was triggered by configure: tuya.configureMagicPacket
Not sure yet what it means, but could be related.

You must be logged in to vote
0 replies
Comment options

On my code, which is somehow based on or derived from that example TS0201 is working properly (temperature and humidity).
Look at Zigbee_Gateway_2

You must be logged in to vote
0 replies
Comment options

@lsroka76 If you can help it would be great. I have the Sonoff temp/hum sensor and I have no issues getting the temperature when using the Thermostat example.

You must be logged in to vote
0 replies
Comment options

@FrankX0 1. Can You factory reset Zigbee stack in your Thermostat example (or upload it with Erase flash enabled).
2. Then while network is open run pairing in TS 0201 (needle in the hole for > 5 seconds, confirmed by blinking blue LED).
3. Send here output (set Core output to Verbose in Arduino IDE, please).
4. Don't pair C6 temperature sensor (best switch it off).

You must be logged in to vote
0 replies
Comment options

@FrankX0 1. Can You factory reset Zigbee stack in your Thermostat example (or upload it with Erase flash enabled). 2. Then while network is open run pairing in TS 0201 (needle in the hole for > 5 seconds, confirmed by blinking blue LED). 3. Send here output (set Core output to Verbose in Arduino IDE, please). 4. Don't pair C6 temperature sensor (best switch it off).

@lsroka76 thanks for helping out!
This is the result:

.[ 13049][I][ZigbeeCore.cpp:298] esp_zb_app_signal_handler(): New device commissioned or rejoined (short: 0x91da)
[ 13049][V][ZigbeeCore.cpp:302] esp_zb_app_signal_handler(): Device capabilities: 0x80
[ 13167][I][ZigbeeThermostat.cpp:48] findCb(): Found temperature sensor
[ 13168][D][ZigbeeThermostat.cpp:55] findCb(): Temperature sensor found: short address(0x91da), endpoint(1)
[ 13168][D][ZigbeeThermostat.cpp:59] findCb(): Request temperature sensor to bind us
[ 13169][D][ZigbeeThermostat.cpp:65] findCb(): Bind temperature sensor
[ 13169][I][ZigbeeThermostat.cpp:72] findCb(): Request temperature sensor to bind us
[ 13170][I][ZigbeeThermostat.cpp:88] findCb(): Bind temperature sensor
[ 13173][I][ZigbeeThermostat.cpp:35] bindCb(): The temperature sensor originating from address(0x91da) on endpoint(1)
[ 13241][I][ZigbeeThermostat.cpp:163] getSensorSettings(): Sending 'read temperature' command
[ 13490][V][ZigbeeThermostat.cpp:38] bindCb(): Local binding success
[ 13497][V][ZigbeeHandlers.cpp:82] zb_cmd_read_attr_resp_handler(): Read attribute response: from address(0x91da) src endpoint(1) to dst endpoint(5) cluster(0x402)
[ 13498][V][ZigbeeHandlers.cpp:91] zb_cmd_read_attr_resp_handler(): Read attribute response: status(0), cluster(0x402), attribute(0x1), type(0x29), value(106)
[ 13499][V][ZigbeeHandlers.cpp:91] zb_cmd_read_attr_resp_handler(): Read attribute response: status(0), cluster(0x402), attribute(0x2), type(0x29), value(33)
[ 13499][V][ZigbeeHandlers.cpp:91] zb_cmd_read_attr_resp_handler(): Read attribute response: status(134), cluster(0x402), attribute(0x3), type(0x0), value(0)
[ 14471][V][ZigbeeCore.cpp:339] esp_zb_app_signal_handler(): ZDO signal: ZDO Device Authorized (0x2f), status: ESP_OK
[ 14547][I][ZigbeeCore.cpp:326] esp_zb_app_signal_handler(): Network(0x9df9) is open for 180 seconds

Note that the sketch hangs at getSensorSettings(), although the sensor seems to respond (4x Read attribute response)?

You must be logged in to vote
0 replies
Comment options

I've added endpoints, clusters and cluster attributes discovery to my code and here is result for TS0201:

22:10:28.194 -> [ 44607][I][ZigbeeHandlers.cpp:181] zb_core_cmd_disc_attr_resp_handler(): Attribute Discovery Message - attribute id 0, data type 41 22:10:28.194 -> [ 44607][I][ZigbeeHandlers.cpp:181] zb_core_cmd_disc_attr_resp_handler(): Attribute Discovery Message - attribute id 1, data type 41 22:10:28.236 -> [ 44608][I][ZigbeeHandlers.cpp:181] zb_core_cmd_disc_attr_resp_handler(): Attribute Discovery Message - attribute id 2, data type 41

and in Your logs we can see:

[ 13499][V][ZigbeeHandlers.cpp:91] zb_cmd_read_attr_resp_handler(): Read attribute response: status(134), cluster(0x402), attribute(0x3), type(0x0), value(0)

which confirms above discovery - TS0201 doesn't have attribute id 3 (temperature tolerance).

So try to change this code first:

uint16_t attributes[] = { ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MIN_VALUE_ID, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MAX_VALUE_ID, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_TOLERANCE_ID };

to

uint16_t attributes[] = { ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MIN_VALUE_ID, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MAX_VALUE_ID};

and this code:

if (attribute->id == ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_TOLERANCE_ID && attribute->data.type == ESP_ZB_ZCL_ATTR_TYPE_U16) { uint16_t tolerance = attribute->data.value ? *(uint16_t *)attribute->data.value : 0; _tolerance = 1.0 * tolerance / 100; read_config++; } if (read_config == 3) { read_config = 0;

to that

_tolerance = 0; if (read_config == 2) { read_config = 0;

and show Your logs.

You must be logged in to vote
0 replies
Comment options

Thanks! The first part is working now:

[ 13130][D][ZigbeeThermostat.cpp:65] findCb(): Bind temperature sensor
[ 13131][I][ZigbeeThermostat.cpp:72] findCb(): Request temperature sensor to bind us
[ 13131][I][ZigbeeThermostat.cpp:88] findCb(): Bind temperature sensor
[ 13135][I][ZigbeeThermostat.cpp:35] bindCb(): The temperature sensor originating from address(0x42cd) on endpoint(1)
[ 13247][I][ZigbeeThermostat.cpp:164] getSensorSettings(): Sending 'read temperature' command
[ 13307][V][ZigbeeThermostat.cpp:38] bindCb(): Local binding success
[ 13363][V][ZigbeeHandlers.cpp:82] zb_cmd_read_attr_resp_handler(): Read attribute response: from address(0x42cd) src endpoint(1) to dst endpoint(5) cluster(0x402)
[ 13364][V][ZigbeeHandlers.cpp:91] zb_cmd_read_attr_resp_handler(): Read attribute response: status(0), cluster(0x402), attribute(0x1), type(0x29), value(103)
[ 13364][V][ZigbeeHandlers.cpp:91] zb_cmd_read_attr_resp_handler(): Read attribute response: status(0), cluster(0x402), attribute(0x2), type(0x29), value(33)
Temperature sensor settings: min 16.39°C, max 20.81°C, tolerance 0.00°C
[ 14436][V][ZigbeeCore.cpp:339] esp_zb_app_signal_handler(): ZDO signal: ZDO Device Authorized (0x2f), status: ESP_OK
[ 14559][I][ZigbeeCore.cpp:326] esp_zb_app_signal_handler(): Network(0xe4fe) is open for 180 seconds

So getSensorSettings is working now.
But still no automatic reporting by the sensor.
setTemperatureReporting also likely needs modification. Not sure if this will trigger the automatic sensor updates?

Thanks again for your help.

You must be logged in to vote
0 replies
Comment options

@FrankX0 Try to comment out these two lines in Zigbee_Thermostat.ino:

zbThermostat.getSensorSettings();

zbThermostat.setTemperatureReporting(0, 10, 2);

You must be logged in to vote
0 replies
Comment options

Already tried that: nothing changes.

Result of following commands:

zbThermostat.getTemperature();
[ 46088][I][ZigbeeThermostat.cpp:145] getTemperature(): Sending 'read temperature' command
[ 46385][V][ZigbeeHandlers.cpp:134] zb_cmd_default_resp_handler(): Received default response: from address(0x6426), src_endpoint(1) to dst_endpoint(5), cluster(0x402) with status 0x84
zbThermostat.setTemperatureReporting(0, 1, 0);
[ 23636][I][ZigbeeThermostat.cpp:200] setTemperatureReporting(): Sending 'configure reporting' command
[ 23974][V][ZigbeeHandlers.cpp:134] zb_cmd_default_resp_handler(): Received default response: from address(0xaf45), src_endpoint(1) to dst_endpoint(5), cluster(0x402) with status 0x84

In both cases the response is 0x84 (unsupported command?).

So, after the sensor is bound there are no sensor updates received.
Once bound, should the sensor start sending updates automatically, or should it be configured first to do so?
And if so, how? The setTemperatureReporting apparently is not supported.

You must be logged in to vote
0 replies
Comment options

In my setup TS0201 starts to send reporting just after joining network and sends reports after each temp/hum change.
Maybe don't invoke any commands?

You must be logged in to vote
0 replies
Comment options

Try to compile Z2S_Gateway example from my library:
Z2S Library

You must be logged in to vote
0 replies
Comment options

Try to compile Z2S_Gateway example from my library: Z2S Library

I had some compilation errors:

C:\Users\Frank\OneDrive\Documents\Arduino\Zigbee_Gateway_2\ZigbeeGateway.cpp:228:20: error: cannot convert 'esp_zb_zcl_cmd_direction_t' to 'esp_zb_zcl_report_direction_t' in initialization
 228 | .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, //0x00, //ESP_ZB_ZCL_REPORT_DIRECTION_SEND, ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV

Changed it to ESP_ZB_ZCL_REPORT_DIRECTION_SEND, which resolved the error.
Then:

c:\Users\Frank\OneDrive\Documents\Arduino\libraries\Zigbee\src\ep\ZigbeeThermostat.h:62:8: error: 'void ZigbeeThermostat::zbAttributeRead(uint16_t, const esp_zb_zcl_attribute_t*)' marked 'override', but does not override
 62 | void zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_attribute_t *attribute) override;

I removed the override. Then it compiled.

The sensor gets bound and reports temperature and humidity!

You must be logged in to vote
0 replies
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Status: Community help needed Issue need help from any member from the Community. Area: Zigbee Issues and Feature Request about Zigbee
Converted from issue

This discussion was converted from issue #10808 on March 12, 2025 18:13.

AltStyle によって変換されたページ (->オリジナル) /