Home

Awesome

Custom firmware for BLE thermometers on the Telink chipset.

Warning: Firmware LYWSD03MMC version 2.1.1_0159 is temporarily not supported!

Please post questions about using and setting up Home Assistant integrations on the appropriate resources!

This repository contains custom firmware for several Bluetooth Thermometer & Hygrometer devices. The download of the appropriate firmware for your device will be presented automatically in TelinkMiFlasher.html. Downloading files from this repository is not required. Alternative firmware and configurator from ATC1441 (variant ATC_Thermometer.bin) can be found here: atc1441/ATC_MiThermometer. Custom firmware is not supported in MiHome. But it is possible to work LYWSD03MMC with 'Xiaomi Gateway 3' by first registering in MiHome on the official firmware, flashing to custom firmware with restoring the binding key from MiHome, replacing the device name with "LYWSD03MMC" and setting the advertising type to "MIJIA (MiHome)" marked "encrypted".<br>

Support for Zigbee firmware is in the ZigbeeTLc repository.<br>

Support for BLE-Zigbee firmware is in the BZdevice repository.<br>

There is an alternative firmware from Ivan Belokobylskij for LYWSD03MMC to work in Zigbee 3.0 mode.

The custom firmware can be flashed via a modern browser and over-the-air (OTA) without opening the device and unlocks several customization options. You can go back to the original firmware at any time. OTA and configuration main page - TelinkMiFlasher.html.

Key features

b2z.gif

Supported models:

(!) It is not recommended to buy Tuya thermometers with CHT8305 sensors and/or BL55028 LCD driver chips. They have increased consumption and are not compatible with battery operation. This is a dummy thermometer from Tuya.

Xiaomi Mijia (LYWSD03MMC)<br>6 HW versionsXiaomi Miaomiaoce (MHO-C401)<br>2 HW versionsQingping Temp & RH Monitor (CGG1-Mijia) <br>2 HW versionsCGDK2 Qingping Temp & RH Monitor LiteXiaomi Mijia MJWSD05MMC
<img src="https://pvvx.github.io/ATC_MiThermometer/img/LYWSD03MMC.png" alt="Xiaomi Mijia (LYWSD03MMC)" width="120"/><img src="https://pvvx.github.io/MHO_C401/img/MHO-C401.png" alt="Xiaomi Miaomiaoce (MHO-C401)" width="120"/><img src="https://pvvx.github.io/CGG1/img/CGG1-M.jpg" alt="E-ink CGG1 'Qingping Temp & RH Monitor', Xiaomi Mijia DevID: 0x0B48" width="120"/><img src="https://github.com/pvvx/pvvx.github.io/blob/master/CGDK2/img/CGDK2.jpg" alt="CGDK2 Qingping Temp & RH Monitor Lite" width="120"/><img src="https://pvvx.github.io/MJWSD05MMC/img/MJWSD05MMC.png" alt="Xiaomi Mijia (MJWSD05MMC)" width="120"/>
OTAOTAOTAOTAOTA
BLE and ZigbeeBLE and ZigbeeBLEBLE and ZigbeeBLE
MHO-C122 (2AWMOMHOC122)Tuya ZigBee TH03Tuya ZigBee LKTMZL02
<img src="https://pvvx.github.io/MHO_C122/img/MHO-C122.png" alt="MHO-C122 (2AWMOMHOC122)" width="120"/><img src="https://pvvx.github.io/ATC_MiThermometer/img/LYWSD03MMC.png" alt="Xiaomi Mijia (LYWSD03MMC)" width="120"/><img src="https://pvvx.github.io/LKTMZL02/img/LKTMZL02.png" alt="LKTMZL02" width="120"/>
ProgrammatorZigbee OTA, OTAZigbee OTA, OTA
BLE and ZigbeeBLE and ZigbeeBLE and Zigbee
Not recommended for purchase!
Tuya ZigBee TS0201 TZ3000Tuya ZigBee TH03ZTuya ZigBee ZTH01Tuya ZigBee ZTH02
<img src="https://pvvx.github.io/TS0201_TZ3000/img/ts0201.jpg" width="120"/><img src="https://raw.githubusercontent.com/pvvx/pvvx.github.io/master/TH03Z/img/TH03Z.jpg" width="120"/><img src="https://raw.githubusercontent.com/pvvx/pvvx.github.io/master/TS0601_TZE200_zth01/img/ZTH01.jpg" width="120"/><img src="https://raw.githubusercontent.com/pvvx/pvvx.github.io/master/TS0601_TZE200_zth02/img/zth02.jpg" width="120"/>
Programmator/Zigbee OTA, OTAProgrammator/Zigbee OTA, OTAProgrammator/Zigbee OTA, OTAProgrammator/Zigbee OTA, OTA
BLE and ZigbeeBLE and ZigbeeBLE and ZigbeeBLE and Zigbee
Tuya devices on SoC PHY62x2<br> 7 types
<img src="https://pvvx.github.io/ATC_MiThermometer/img/phy62x2.jpg" alt="Tuya PHY62x2" width="120"/>
PHY62x2BTHome

Warnings

  1. Home Assistant SSD TBW. Using the Home Assistant with Bluetooth leads to rapid wear of the data carrier due to constant database recording and overwriting of small Bluez files in '/var/lib/bluetooth/'.

With a couple dozen BLE devices, a 256GB SSD is only enough for 2 years.

  1. If you have many BLE devices, the adapter must be able to receive BLE advertisements every 3 ms.

UART speeds of 921600 baud and even USB1.1 are not enough to transfer information in binary form in the HCI format.

Requires BT adapter with USB2.0 HS. Otherwise, there will be many gaps in the reception. Do not use ESP32xxx - it cannot work with BLE at normal speed and drains the batteries of all BLE devices when connected! ESPHome does not work with Bluetooth 5.0 and misses a lot of advertising packets from BLE devices.

  1. For reliable connection and refirmware on LYWSD03MMC, the battery level must be more than 40%. This is a design feature - a cheaper version of the hardware from Xiaomi.

On devices with missing power capacities, do not set 'Connect latency' to more than 1000 ms!

  1. Home Assistant in "Bluetooth" integration does not full support Bluetooth 5.0 and is not implied.

How to switch the USB-BT5.0+ adapter to work in LE Long Range in Home Assistant under Linux:

On thermometers with a button, if the button function is set to Connect, then a short application on the button for 80 seconds enables connection in BT4.0 mode.

If you accidentally set the 'LE Long Range' on the thermometer, and your device does not support BT5.0, remove and insert the battery - the thermometer will switch to BT4.2 support mode.

If you have a smartphone with BT5.0+ and the nRFConnect program, then you can reset all settings to default by connecting to a thermometer and sending the 0x56 command, as shown in the screenshot:

img nRFConnect_set_default.png

To disable only the 'Long Range' option, use the code 0xDD.

The Web Bluetooth API in Chrome does not yet allow scanning for Bluetooh 5.0+ devices.

  1. On Linux, when installing large advertising intervals, change the file '/etc/bluetooth/main.conf', variables: LEScanIntervalAutoConnect= LEScanWindowAutoConnect=. Value in ms.

Table of content

<!-- TOC depthFrom:2 depthTo:3 --> <!-- /TOC -->

Getting Started

You can conveniently flash, update and configure the bluetooth thermometers remotely using a bluetooth connection and a modern web browser.

Flashing or Updating the Firmware (OTA)

To flash or update the firmware, use a Google Chrome, Microsoft Edge or Opera Browser.

  1. Go to the Over-the-air Webupdater Page TelinkMiFlasher.html *
  2. If using Android, Windows, Linux: Ensure you enabled "experimental web platform features". Therefore copy the according link (i.e. chrome://flags/#enable-experimental-web-platform-features for Chrome), open a new browser tab, paste the copied URL. Now sten the Experimental Web Platform features flag to Enabled. Then restart the browser.
  3. For all sensors with a button, before activation, it is necessary to reset the past bindings by holding the button for a long time.
  4. In the Telink Flasher Page: Press Connect: The browser should open a popup with visible Bluetooth devices. Choose the according target device (i.e. LYWSD03MMC) to pair.
  5. After connection is established a Do Acivation button appears. Press this button to start the decryption key process.
  6. Now you can press the Custom Firmware ver x.x button to directly flash the custom firmware. Alternatively you can choose a specific firmware binary (i.e. the original firmware) via the file chooser
  7. Press Start Flashing.

Configuration

After you have flashed the firmware, the device has changed it's bluetooth name to something like ATC_F02AED. Using the TelinkMiFlasher.html you have various configuration options.

General process:

  1. Press Connect
  2. Select the according device to connect/pair (i.e. ATC_F02AED)
  3. Several configuration options appear
  4. Choose Send Config to send changed value to the device. Or press Set default and then Send config to revert to the Defaults
OptionDescription
Temperature and Humidity offsetEnter a value to correct the offset of the Temperature or Humidity displayed: For example -1.4 will decrease the Temperature by 1.4°
Smiley or ComfortChoose a static smiley or check the "Comfort" Radio box to change the smiley depending on current Temperature and Humidity.
Comfort ParametersDefines the Lower (Lo) and Upper (Hi) Range for Temperature and Humidity interpreted as comfort zone. In the default configuration a smiley will appear.
Advertising TypeType of supported Bluetooth Advertising Formats.
Set timesends the current time to the device
Comfort, Show batt, ClockTicking the according boxes you can enable interval rotation between different LCD screens. See the example video below.

Example of LCD display modes

You can configure different LCD Display modes using Comfort, Show batt and Clock configuration checkboxes. The enabled LCD Display Modes will appear one-by-one in a loop.

YoutubeVideo

Battery and clock display are enabled in the settings. The rest of the settings is kept default. The video contains 2 cycles.

  1. Temperature and humidity
  2. Temperature and % of battery
  3. Temperature and humidity
  4. Hours and minutes

Firmware

Firmware Binaries

You can directly update/flash the firmware without downloading the binaries below.

Custom Firmware Versions:

The download of the appropriate firmware for your device will be presented automatically in TelinkMiFlasher.html. Downloading files from this repository is not required.

Original Manufacturer Firmware Version

In case you want to go back to the original firmware, you can download them here:

Firmware version history

VersionChanges
1.2Bind, Set Pin-code, Support MHO-C401
1.3Get/Set comfort parameters
1.4Get/Set device name, Get/Set MAC
1.5Add Standard Device Information Characteristics
1.6Fix alternation of Advertising in mi mode
1.7Authorization and encryption in permissions to access GAP ATT attributes, if pin code is enabled
1.8Time display (instead of a blinking smile)
1.9Recording measurements to flash memory (cyclic buffer for 20000 measurements)
2.0Recording measurements with averaging to flash memory
2.1Periodic display refresh for MHO-C401 <br> 'Erase mi-keys' option to return to original firmware
2.2Added parameter "Encrypted Mi Beacon"
2.3Added "Delete all records"
2.4Added parameter "Clock time step"
2.5Remove TRG/FLG errors, minor optimization
2.6Expanding the ranges of threshold parameters (TRG)
2.7Reducing power consumption of MHO-C401 (EDP update), adding version for CGG1-M 2020-2021
2.8Added saving bindkey to EEP if mi-keys are erased, reduced TX power to 0 dB for defaults
2.9Added additional id flags to advertising packages
3.0Added toggle support for advertising package structures for third-party software
3.1Fix security attributes (for pincode)
3.2Added new encrypted beacon formats, reed switch maintenance
3.3Added autodetection for LYWSD03MMC hardware versions B1.6 and B1.9. For CGG1-M and MHO-C401 - autodetection of SHTV3 or SHT4x sensors
3.4Correct Hardware Version Setting for LYWSD03MMC B1.7
3.5Correction of moisture readings for SHT4x sensors. Rounding off sensor values on display.. Saving HW string B2.0 on LYWSD03MMC. Eliminated battery voltage noise in CGG1-M. CGG1 - correction of the battery charge display. Added CGDK2 and modified (DIY) variant of CGDK2-2.
3.6Additional parameters: Support BT5.0 PHY, Channel Selection Algorithm 2, Correct RF-TX Power in suspend
3.7Added format 'HA BLE', reed switch operation mode: Switch and Count. Full support for "HA BLE" encryption. Speed correction I2C for LCD controller LYWSD03MMC HW:1.9. Support for CGG1-M hardware version 2022.
3.8Fix clear_memo, renaming 'HA BLE' format to 'BTHome'
3.9Changed the calculation of battery readings in %, optimization of consumption for the solar battery when the voltage drops below 2V (deep-sleep), added option to invert event for reed switch, small optimizations.
4.0Improved stability in connected mode. I2C bus CLK and PullUp correction.
4.1Changed "connection latency" for stability in connected.
4.2Option Increasing Communication Distance: Bluetooth 5.0 LE Long Range (Advertising Extensions: primary and secondary Coded PHY S=8, Connectable). Added support MHO-C401 (2022.11) and MJWSD05MMC. Added function key: Connect
4.3Increasing the degree of averaging (x64) of the sent values over the battery. Added "Screen Off" option. Check LYWSD03MMC HW: B1.5. Added MHO-C122 (2AWMOMHOC122) test support. LCD display stabilization LYWSD03MMC HW:B1.9
4.4Adding an option to display only external data. Only the value from the "EEP BindKey" is now taken as the BindKey.
4.5Replacing BTHome ver1 (HA_BLE) with BTHome ver2. Moving firmware after recovery to BLE from Zigbee OTA. Fixed a bug where the date was not displayed correctly for MJWSD05MMC.
4.6All thermometers support EXT OTA. Flashing third party Zigbee OTA files (*.zigbee).
4.7Changing sensor settings: Added slope factor, zero offset in 0.01 units.
4.8Reorganization of program code. Combining code with "BLE_THSensor". Option added: One MY18B20 on PD2 TS0201S1, ZTH01S1; Two MY18B20 on PD2 and PD4 TS0201S2, ZTH01S2. Temperature from MY18B20 is transmitted in BTHome format.
Added "Tuya TH03", "LKTMZL02"

Applications

Reading Measurements from Flash

GraphMemo.html

To record the measurement results, a cyclic buffer in the flash memory for 20000 measurements is used. The recording step interval is set in the interface. With the default settings, the recording step is 10 minutes, which gives a recording depth of 4 and a half months. During the step period, the sensor data and battery voltage are averaged, time stamped, and written to flash memory.

Setting the value to 0 disable logging to internal storage.

FlashData

Reading Measurements in Connected Mode

GraphAtc.html GraphAtc1.html GraphAtc2.html DevPoint.html

GraphAtc_html

Reading Measurements in Advertising Mode

This requires the Experimental Web Platform Features flag enabled in your browser. See Flashing or Updating the Firmware (OTA).

Advertising.html

Technical specifications

Average power consumption

Xiaomi Mijia (LYWSD03MMC B1.4)

Using the default settings for advertising interval of 2.5 seconds and measurement interval of 10 seconds:

PowerAdvInt

PowerLife.gif

Xiaomi Mijia (MJWSD05MMC)

Using the default settings for advertising interval of 5 seconds and measurement interval of 20 seconds:

Xiaomi Miaomiaoce (MHO-C401)

Using the default settings for advertising interval of 2.5 seconds and measurement interval of 20 seconds:

Xiaomi Miaomiaoce (MHO-C401N)

Using the default settings for advertising interval of 2.5 seconds and measurement interval of 20 seconds:

Qingping (CGDK2)

Using the default settings for advertising interval of 2.5 seconds and measurement interval of 20 seconds:

Qingping (CGG1)

Using the default settings for advertising interval of 2.5 seconds and measurement interval of 20 seconds:

Qingping (CGG1N)

Using the default settings for advertising interval of 2.5 seconds and measurement interval of 10 seconds:

Tuya TH03

Using the default settings for advertising interval of 5 seconds and measurement interval of 20 seconds:

(!) TH03 power consumption is twice as much as LYWSD03MMC. The reason is the LCD driver chip and T/H sensor. Not recommended for purchase. The developers of this device under the Tuya brand used all components that are not suitable for power supply from CR2032... The goal was one - to sell.

Tuya ZL02-ZX (LKTMZL02)

Using the default settings for advertising interval of 5 seconds and measurement interval of 20 seconds:

Bluetooth Advertising Formats

The Firmware can be configured to support one of four different Bluetooth advertisements data formats:

Xiaomi, ATC, Custom, BTHome and encrypted options.

Supports bindkey beacon encryption.

Advertising formats.

Test program of used Bluetooth Advertising formats provided by Ircama.

Only the BTHome and Xiaomi support the native HA Xiaomi Integration, for the others use the Custom Component Passive BLE.

atc1441 format:

UUID 0x181A - size 16 (temperature in 0.1 °C, humidity in 1 %): atc1441 format

Custom format (all data little-endian):

UUID 0x181A - size 19: Custom extended format in 0.01 units (all data little-endian):

uint8_t     size;   // = 18
uint8_t     uid;    // = 0x16, 16-bit UUID
uint16_t    UUID;   // = 0x181A, GATT Service 0x181A Environmental Sensing
uint8_t     MAC[6]; // [0] - lo, .. [6] - hi digits
int16_t     temperature;    // x 0.01 degree
uint16_t    humidity;       // x 0.01 %
uint16_t    battery_mv;     // mV
uint8_t     battery_level;  // 0..100 %
uint8_t     counter;        // measurement count
uint8_t     flags;  // GPIO_TRG pin (marking "reset" on circuit board) flags: 
                    // bit0: Reed Switch, input
                    // bit1: GPIO_TRG pin output value (pull Up/Down)
                    // bit2: Output GPIO_TRG pin is controlled according to the set parameters
                    // bit3: Temperature trigger event
                    // bit4: Humidity trigger event

'BTHome' format

The 'BTHome' format

Encrypted beacon formats (uses bindkey):

Xiaomi Battery Charge

  1. UUID 0xFE95 - 0x0A: Xiaomi - battery charge level 0..100%, battery voltage in mV

Xiaomi Temperature & Humidity

  1. UUID 0xFE95 - 0x0D: Xiaomi - temperature x0.1C, humidity x0.1%

Xiaomi Encrypted (bindkey enable)

  1. UUID 0xFE95 - 0x0A, 0x04, 0x06 Xiaomi - battery charge level 0..100%, temperature x0.1C, humidity x0.1% (All data are averaged over a period of 16 measurements)

Bluetooth Connection Mode

Temperature or humidity trigger (GPIO PA5 LYWSD03MMC label on the "reset" pin)

Xiaomi LYWSD03MMC has a PCB soldering test point. Available without disassembling the case and marked "Reset". Use as a trigger output with adjustable temperature and / or humidity hysteresis. Hysteresis and thresholds are set in TelinkMiFlasher.html. The output status is displayed in the advertising package.

trg_menu

trg_grf

Hysteresis:

Setting the pin to "1" or "0" works if both hysteresis are set to zero (TRG off).

OnOff

ESP01Relay

Trigger and reed switch status receiver on JDY-10 module ($1).

Reed switch or button functions

For CGG1, MHO_C401, CGDK2, MJWSD05MMC, a button on the case is used.

It is possible to solder a reed switch on the LYWSD03MMC board to the pins marked "P8" (GPIO PA6) and GND.

RS_LYWSD03MMC_1.jpg

The button on the body can turn the light on and off when creating a scenario in an external program...

The state of the reed switch or button is transferred to the advertising packet and events are sent in the "Switch" and "Counter" modes.

Setting the "Connect" option has several functions:

  1. Short press for 80 seconds turns on the ability to connect with a device in BLE 4.2 format
  2. Long press toggles temperature display to C or F.
  3. Holding more than 20 seconds will reset the device settings to default.

Interface for receiving and displaying data on the LCD.

ShowData

The USB-COM adapter writes the firmware in explorer. Web version.

USBCOMFlashTx.html - Uses a partial imitation of the Telink 1-Wire protocol on a USB-UART adapter, but only for transmission to the chip.

For programming and debugging, the chip uses a special hardware protocol Telink 1-Wire (not even close to UART!).

To match the frequencies of the Telink 1-Wite bus, no change in Baud-rate is required.

While the chip is sleeping and when the SWS pin is reassigned, there is no access to programming.

You can restore communication via “Telink 1-Wire” by rebooting the chip and sending a command to stop the CPU. This is called "Activation".

The USBCOMFlashTx.html program does not have feedback - it does not receive data from the chip. This is a simplified version and only works if all connections are made correctly.

USBCOMFlashTxHtml

webpgm.png

In difficult cases, when the chip contains an unknown FW, it is necessary to use a chip reset or power supply during "activation".

atime.png

At the same time, take into account that the chip can be powered from the TX output. This is solved by connecting TX and +Vbat during "activation".

Alternative programmers:

  1. TLSR825xComFlasher.py - partial simulation of Telink 1-Wire on a USB-UART adapter.
  2. TlsrComProg - uses a bootloader with the transition to working via the UART protocol.
  3. TLSRPGM - full hardware option Telink 1-Wire up to 2 mbit/s

Chipset LYWSD03MMC HW:B1.4

LYWSD03MMC B1.4 B1.5 BoardPinout

TabPins

For LYWSD03MMC, the HW version is determined by the display and sensor addresses on I2C:

HWLCD I2C addrSHTxxx I2C addrNote
B1.40x3C0x70 (SHTC3) 
B1.5UART0x70 (SHTC3) 
B1.6UART0x44 (SHT4x) 
B1.70x3C0x44 (SHT4x)Test original string HW
B1.90x3E0x44 (SHT4x) 
B2.00x3C0x44 (SHT4x)Test original string HW

Version 1.7 or 2.0 is determined at first run by reading the HW line written in Flash. Display matrices or controllers are different for all versions, except B1.7 = B2.0.

Building the firmware

Windows:

  1. Go to wiki.telink-semi.cn and get the IDE for TLSR8 Chips.
  2. Install the IDE and import the 'ATC_MiThermometer' project
  3. Compile the project

Ubuntu:

  git clone https://github.com/pvvx/ATC_MiThermometer.git
  cd ATC_MiThermometer
  make

Related Work

ATC_MiThermometer is based on the original work of @atc1441, who developed the initial custom firmware version and the web-based OTA flasher (Source).

Resources & Links

CJMCU-2557 BQ25570

CJMCU-2557

Control function ID when connected

Primary Service UUID 0x1F10, Characteristic UUID 0x1F1F

IDCommand
0x01Get/Set device name
0x02Get address of internal devices
0x03I2C scan
0x04I2C Universal TRansaction (UTR)
0x05Get sensor ID
0x06Get Flash JEDEC ID
0x10Get/Set MAC
0x11Get/Set Mi key: DevNameID
0x12Get/Set Mi keys: Token & Bind
0x13Mi cfg data, [size][data]
0x14Mi marked as deleted keys, [size][data]
0x15Get all Mi keys
0x16Restore prev mi token & bindkeys
0x17Delete all Mi keys
0x18Get/set binkey in EEP
0x20Get/Set comfort parameters
0x22Get/Set show LCD ext.data
0x23Get/Set Time
0x24Get/set adjust time clock delta
0x25Get/Set TH sensor config
0x26Set default TH sensor config
0x26Get/Set sensor MY18B20 config
0x27Set default sensor MY18B20 config
0x28Get/Set sensor RH config
0x29Calibrate sensor RH
0x33Start/Stop notify measures in connection mode
0x35Read memory measures
0x36Clear memory measures
0x44Get/Set TRG config
0x45Set TRG output pin
0x49Get/Set HX71X config
0x55Get/Set device config
0x56Set default device config
0x5AGet/Set device config (not save to Flash)
0x60Get/Set LCD buffer
0x61Start/Stop notify LCD buffer
0x70Set PinCode (0..999999)
0x71Request MTU Size Exchange (23..255)
0x72Set Reboot on disconnect
0x73Extension BigOTA (Zigbee, MJWSD05MMC)
0xDDReset LE Long Range mode