homebridge-mi-hygrothermograph2.2.1 • Public • Published
Homebridge plugin for exposing measured temperature and humidity from the Xiaomi Mi Bluetooth Temperature and Humidity Sensor as a HomeKit accessory.
Make sure your system matches the prerequisites. You need to have a C compiler and Node.js newer or equal to version 8.6.0 installed.
These libraries and their dependencies are required by Noble package and provide access to the kernel Bluetooth subsystem:
sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
For more detailed information and descriptions for other platforms please see the Noble documentation.
Install homebridge and this plugin
[sudo] npm install -g --unsafe-perm homebridge [sudo] npm install -g --unsafe-perm homebridge-mi-hygrothermograph
Note: depending on your platform you might need to run
npm install -g with root privileges.
See the Homebridge documentation for more information.
If you are running Homebridge as another user than
root (you should) then some additional configuration needs to be made to allow Node.js access to the kernel Bluetooth subsystem without root privileges.
Please see the Noble documentation for instructions.
Update your Homebridge
config.json file. See config-sample.json for a complete example.
||Mandatory. The name provided to Homebridge. Must be "Hygrotermograph".|
||Mandatory. The name of this accessory. This will appear in your Home-app.|
||Optional. The address of the device. Used when running multiple devices.|
||Time in minutes after last contact when the accessory should be regarded as unreachable. If set to
||Name of the humidity sensor as it will appear in your Home-app.|
||Name of the temperature sensor as it will appear in your Home-app.|
||If historical data should be reported to the Elgato Eve App.|
||Optional. Custom path where to save fakegato history.|
||Optional. Configuration for publishing values to an MQTT-broker. See the MQTT section for details.|
||Retry start scanning for devices when stopped. For some users scanning will be stopped when connecting to other BLE devices. Setting
||The delay for when to start scanning again when stopped. Only applicable if
||By default values will be updated as they come in. Often this is once per second, if this is not desired
||At what battery percentage Homekit should start warning about low battery.|
When running just one Hygrotermograph accessory there is no need to specify the address of the BLE device. But if you want to run multiple Hygrotermograph accessories you need to specify the BLE address for each of them. If the address is not specified they will interfere with each other.
The easiest way to find the address of the device is to use
[sudo] hcitool lescan.
It will start a scan for all advertising BLE peripherals within range. Look for
MJ_HT_V1 and copy the address.
The address is in the format of
Update your Homebridge
config.json and specify the
Note that this step is also required when running Mi Flora devices in the same location as they use the same protocol and their data will be intercepted by this plugin.
hcitool can't be used since MacOS does not provide a way to read the MAC-address of a BLE device.
Instead MacOS assigns a device unique identifier for each BLE device in the format of
This identifier can be found using iOS apps like nRF Connect
or MacOS tools like Bluetooth Explorer. Use this identifier as
address in the configuration file.
If the accessory has not received an updated value from the sensor within the specified timeout it will inform Homekit that the accessory is not responsive by returning an error until it receives an updated value.
The default timeout is 15 minutes but can be changed by specifying the number of minutes under the
timeout parameter in
timeout parameter is set to
0 timeouts are disabled and and devices will not be reported as unresponsive to Homekit.
By default the Humidity and Temperature accessories visible in the Home-app will have the names "Humidity" and "Temperature". They can be changed in the Home-app if wanted.
It is also possible to set custom initial values by specifying the
temperatureName parameters in
When restarting Homebridge the Eve app will show the Accessories as having 0% battery until the sensor actually reports its battery status. This can sometimes take a couple of minutes. Just be patient and the actual battery status will show up.
To enable the Elgato Eve feature set
fakegato-history caches historical values into a json-file.
Usually located in
~/.homebridge. To customise this one can set
fakeGatoStoragePath to the desired path:
The plugin can be configured to publish temperature/humidity/battery values to an MQTT-broker.
If one is interested in only publishing a specific value just skip configuring the topics wished to ignore:
To enable authentication specify the
For more options see the MQTT.js documentation.
Everything set in
mqtt will be passed to the
options argument on
The plugin scans for Bluetooth Low Energy peripherals and check the broadcast advertisement packets.
By only reading the advertisement packet there is no need to establish a connection to the peripheral.
Inside each packet discovered we look for Service Data with a UUID of
0xfe95. If found we start trying to parse the actual Service Data to find the temperature and humidity.
By using a Bluetooth LE Sniffer it is possible to see that the peripheral advertises 3 different sized Service Data:
Some bytes stay the same and some bytes change over time. By placing the peripheral in different temperated places it could be established that the last bytes contain the sensor data.
These were the observations:
- In the first example the last two bytes
8a:01contains the humidity data.
8a:01as an little endian 16-bit integer is equal to
394as in 39.4 % relative humidity. If we check the next two bytes
cc:00they equal to
204as in 20.4 celsius.
- In the second example
388as in 38.8 % relative humidity. No temperature could be found in this data, more on that later.
- In the shortest and third example
93and this very much looks like the charge level on the battery in percent.
- If we start looking at the other bytes in order the next one looks like a length indicator for the following bytes with
- The following two bytes almost always stays the same for each sized packet except for the 16 bytes sized data here they alterate between
04:10. After some investigation it is established that these bytes indicate what type of sensor data that will follow.
06:10will have humidity data and
04:10will have temperature data.
0d:10indicate that both humidity and temperature data will follow and
0a:10that battery data is to be expected.
So we actually have 4 different packets that contains the sensor data:
After some investigation and thanks to node-xiaomi-gap-parser it is probable that the data of
50:20:aa:01:be:64:ae:d0:a8:65:4c:0d:10:04:cc:00:8a:01 represents the following:
|1-2||Frame control||bit field|
|12-13||Type of data||uint16LE|
Bytes 1-14 have the same function for all 4 variations but the following bytes contain different sensor data.
Xiaomi and Mi are registered trademarks of BEIJING XIAOMI TECHNOLOGY CO., LTD.
This project is in no way affiliated with, authorized, maintained, sponsored or endorsed by Xiaomi or any of its affiliates or subsidiaries.