# ZigbeeTLc: Zigbee firmware for Telink based sensors and thermostats

> ZigbeeTLc is custom Zigbee 3.0 firmware for a family of TLSR825x based IoT devices, built from Telink's own SDK example and merged with the author's ZBdevice project. It is firmware for hardware you already own, which means the interesting part is the flashing procedure and the compatibility warning, not an API.

**pvvx/ZigbeeTLc** — Custom firmware for Zigbee 3.0 IoT devices on the TLSR825x chip

- Repository: https://github.com/pvvx/ZigbeeTLc
- Stars: 809 · Forks: 66
- Language: C
- License: NOASSERTION
- Published: 2026-10-20 · Updated: 2026-10-20 · Language: en
- Canonical page: https://hysenlabs.com/projects/pvvx-zigbeetlc

## Firmware for chips you already have in a drawer

ZigbeeTLc is custom firmware for Zigbee 3.0 IoT devices on the Telink chipset, and the supported chipset list is TLSR8250, TLSR8251, TLSR8253, TLSR8258, TLSR8359, TLSR8656 and Z2. It is based on an example from Telink's Zigbee SDK, and the repository carries the makefiles for both variants, make_z/ and make_zb/, with a merged version alongside, plus firmware_z.json and firmware_zb.json describing each build. This is not a library you call, it is a replacement firmware image for hardware that shipped with something else. The devices in question are the small Bluetooth sensors and thermostats that people have already bought, chiefly the Xiaomi LYWSD03MMC line of temperature and humidity sensors, and the whole point of the project is that Zigbee is a better radio for a mesh of low power sensors than Bluetooth is. The list of supported devices lives outside the repository, in the author's pvvx.github.io repository, and the README says the firmware is merged with a separate ZBdevice project.

## The compatibility warning is the part to read twice

The README carries a Warning section, and it is unusually specific. New versions check that the configuration written to the device is compatible with the one updated for the new SDK, that is, compatible with version 0.1.2.5. If it is not compatible, all settings, including bindings, are deleted, and in that case the Zigbee coordinator sees a device with the same IEEE number and a rebinding is performed. So a firmware upgrade is not a like for like replacement. It is possible that your device keeps its identity, keeps its network, and loses every setting you had configured. That is a normal consequence of a device being re-registered, not a corruption, but it means an upgrade has a real cost, and the cost lands on whoever has to redo the bindings. The README also notes that when changing the firmware over Zigbee OTA, if there were changes in the firmware functionality, re-registration of the device is required, and that this is actual for any Zigbee device.

## Flashing starts from a browser, not a programmer

The procedure is unusual and worth understanding before you try it. You flash the Zigbee firmware from the BLE firmware using Google Chrome, Microsoft Edge or Opera. You go to the over-the-air Webupdater page TelinkMiFlasher.html. If you are on Android, Windows or Linux you have to enable experimental web platform features, which in Chrome means copying the chrome://flags/#enable-experimental-web-platform-features URL, opening a new tab, pasting it, setting the Experimental Web Platform features flag to Enabled and restarting the browser. Then in the flasher page you press Connect, the browser opens a popup listing visible Bluetooth devices, and you choose the target device to pair. After the connection is established a Do Activation button appears, and pressing it starts the decryption key process, with a separate description provided for original firmware versions 2.1.1_0159 and higher. You then install the BLE firmware, use Reconnect, select and install the Zigbee firmware, and the device should show up in your Zigbee bridge if joining is enabled.

## A button with four meanings on a coin cell

The button behaviour is documented in detail because on these devices the button is the only user interface. A short press sends temperature, humidity and battery data. Holding for 2 seconds switches the temperature between Celsius and Fahrenheit, and the change appears on the screen immediately. Holding for 7 seconds resets the binding, and the screen displays ooo on devices with a fast screen refresh, meaning not E-Ink, after which the thermometer waits forever for registration, and twitching the battery changes nothing. Holding for 15 seconds resets bindings and all user settings, and the screen no longer displays ooo but shows temperature and humidity, again waiting for registration. On the LYWSD03MMC the equivalent of a button press is shorting the reset contact to gnd. After flashing from BLE the thermometer is already in standby mode for registration in the Zigbee network. The power budget explains a lot of this, because due to high consumption the transmit power is limited to +2 dBm, since a moderately discharged CR2032 battery cannot withstand higher power, and the README cites an average consumption of about 15 uA for the LYWSD03MMC hardware revision B1.4.

## The Zigbee clusters are documented attribute by attribute

The additional settings section is a cluster reference, and it is the part a home automation user actually configures. Cluster 0x0000, Basic, carries the model identifier as a character string with a 3 to 23 character name. Cluster 0x0204, Thermostat User Interface Configuration, carries the Celsius or Fahrenheit enum, a show-smiley toggle, temperature and humidity offsets in 0.01 steps with a range of -32767 to +32767 and a default of 0, comfort temperature minimum and maximum defaulting to 20.00 and 25.00 degrees, comfort humidity minimum and maximum defaulting to 40.00 and 60.00 percent, a display-off toggle, and a measurement interval attribute with a range of 3 to 255 seconds and a default of 10. The README notes that turning off the display leads to a significant reduction in consumption on some hardware variants, and that better results come from increasing the measurement interval. Default report settings are also given per cluster, with the power configuration battery voltage and percentage on intervals of 360 to 3600 seconds, temperature and humidity measurement on 30 to 180 second intervals, and their stated tolerances. Custom quirks are made with the ZHA Quirk Builder.

## Zigbee OTA updates need the manufacturer code to match

The OTA section tells you how to update the firmware from inside ZHA, using the ZHA Firmware Manager. The instruction that matters is a check, not a command: before flashing, verify the compliance of the Manufacturer Code and Image Type between the OTA file and those issued by the Zigbee device. The sample file name given is 1141-020a-01233001-Z03MMC.zigbee, and the table decodes it. Manufacturer Code 1141 is Telink, Image Type 020a is the TLSR825x platform combined with the Xiaomi LYWSD03MMC, File Version 0123 is app release 0.1 and app build 2.3, and Stack Version 3001 is Zigbee v3.0 release 0.1, with the name Z03MMC and Ext OTA present. That table is the check itself, and getting it wrong means flashing an image a coordinator will refuse or misinterpret. There is also a note about restoring to BL, which is truncated in the copy available here, so the return path to the original Bluetooth firmware is documented upstream rather than here.

## Where support questions actually belong

The README is explicit about the boundary of what this repository answers. Questions regarding use and configuration in ZHA, in Zigbee2MQTT and in Home Assistant should be directed to the appropriate resources, and the project links to each of them. That is a sensible division, because those are the integration surfaces where most of the confusion lives, and a firmware repository is the wrong place to debug a coordinator. The project also points to alternative firmware options for some TLSR825x devices, naming github.com/slacky1965 and doctor64/tuyaZigbee, which is a useful thing to know before flashing anything, since a device you own might be better served by firmware that matches your Zigbee stack more closely. On maintenance, the repository is not archived, the last push was on 2026-10-19 and v0.1.4.0 carries the same timestamp, with v0.1.3.9 from 2026-08-25 and v0.1.3.8 from 2026-05-22 before it. The licence is a custom one that GitHub cannot classify, with the terms in the LICENSE file, and for firmware that replaces the vendor image on your hardware, the terms are worth reading before you install it.

## Conclusion

Adopt ZigbeeTLc if you own a supported Telink based sensor or thermostat, you want it to speak Zigbee rather than Bluetooth, and you are prepared to reflash it from a browser. Do not adopt it if your device is not on the supported chipset list, because the firmware is built per chip family, and be aware that upgrading the firmware can wipe your settings and bindings, forcing a rebind with the coordinator. Before you commit, check the full list of supported devices and the ZBdevices.md file, confirm the firmware version on your device matches the configuration format of the release you intend to flash, and read the compatibility warning in the README before pressing anything.

## FAQ

### What is ZigbeeTLc?

It is custom firmware for Zigbee 3.0 IoT devices built on the Telink chipset, supporting TLSR8250, TLSR8251, TLSR8253, TLSR8258, TLSR8359, TLSR8656 and Z2. It is based on an example from Telink's Zigbee SDK and is merged with the author's ZBdevice project.

### How do I flash ZigbeeTLc onto a device?

You flash it from the BLE firmware using Chrome, Edge or Opera. Open the TelinkMiFlasher page, enable experimental web platform features if you are on Android, Windows or Linux, press Connect and pick the device, press Do Activation to start the decryption key process, install the BLE firmware, then Reconnect and install the Zigbee firmware.

### What happens to my settings when I upgrade the ZigbeeTLc firmware?

New versions check whether the configuration written to the device is compatible with the configuration format of the new SDK. If it is not, all settings including bindings are deleted, the coordinator sees the same IEEE number and a rebinding is performed.

### What do the button presses do on a ZigbeeTLc device?

A short press sends temperature, humidity and battery data. Holding for 2 seconds switches between Celsius and Fahrenheit, holding for 7 seconds resets the binding and shows ooo on the screen, and holding for 15 seconds resets bindings and all user settings.

## Sources

- [Issues](https://github.com/pvvx/ZigbeeTLc/issues)
- [pvvx/ZigbeeTLc on GitHub](https://github.com/pvvx/ZigbeeTLc)
- [README](https://github.com/pvvx/ZigbeeTLc/blob/master/README.md)
- [Releases](https://github.com/pvvx/ZigbeeTLc/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/pvvx-zigbeetlc
