Code to read weight measurements from Xiaomi Body Scales.
An MQTT broker is needed as the counterpart for this daemon. Even though an MQTT-less mode is provided, it is not recommended for normal smart home automation integration. MQTT is huge help in connecting different parts of your smart home and setting up of a broker is quick and easy.
Body Composition Scale 2 (XMTZC05HM)
ESP32 (BLE SCANNER), see ESP32 Application
Raspberry or Linux computer
Python 3 (min)
MQTT broker
Libs see requirements.txt
Optional Homeassistant, see Settings & Views Homeassistant
Optional influxdb, see Influx DB & Grafana Dashboard
On a modern Linux system just a few steps are needed to get the daemon working. The following example shows the installation under Debian/Raspbian below the /opt
directory:
$ su -
$ cd /opt/
$ git clone https://github.com/zibous/ha-miscale2.git
$ cd /opt/ha-miscale2
$ sudo pip3 install -r requirements.txt
To match personal needs, all operation details can be configured using the file conf.py The file needs to be created first:
$ cd /opt/ha-miscale2
$ cp conf.py.dist conf.py
# edit configuration settings
$ nano conf.py
$ chmod +x app.py
$ chmod +x mqttservice.py
$ chmod +x service.sh
$ chmod +x service_mqtt.sh
## tests
$ python3 app.py
$ ./app.py
$ ./app.py && tail -f /var/log/syslog | grep MIBCS2
$ python3 mqttservice.py
$ ./mqttservice.py && tail -f /var/log/syslog | grep MIBCS2
Read Xiaomi Mi Body Composition Scale data from a Raspberry Pi in Python 3.
python3 app.py
A simple Python script which provides a MQTT gateway for ESP Devices, easily extensible via custom workers. Application for ESP Devices see:
Details see : ESP 32 Appliciaton
You most probably want to execute the program continuously in the background. This can be done either by using the internal daemon or cron.
Systemd service for - on systemd powered systems the recommended option
$ sudo cp /opt/ha-miscale2/service_app.template /etc/systemd/system/ha-miscale.service
$ sudo systemctl daemon-reload
$ sudo systemctl start ha-miscale.service
$ sudo systemctl stop ha-miscale.service
$ sudo systemctl status ha-miscale.service
$ sudo systemctl enable ha-miscale.service
$ sudo cp /opt/ha-miscale2/service_mqtt.template /etc/systemd/system/ha-miscale-mqtt.service
$ sudo systemctl daemon-reload
$ sudo systemctl start ha-miscale-mqtt.service
$ sudo systemctl status ha-miscale-mqtt.service
$ sudo systemctl enable ha-miscale-mqtt.service
The calculation results are saved once as a history in the data folder, published as an MQTT payload and optionally saved in the defined InfluxDB.
Sample MQTT Payload
Topic: tele/miscale2/Peter/measured
These data are published by the "ESP32 Application" and can either be processed directly in another application. In my case, this data is evaluated via the Python application and the additional data is calculated and then published (Infuxdb, Homeassistant).
{
"user": "Peter",
"sex": "male",
"athletic": true,
"age": 64.85,
"weight": 68.2,
"unit": "kg",
"impedance": 539,
"bmi": 22.27,
"water": 43.11,
"fat": 18.4,
"timestamp": "2020-10-05 06:23:03",
"version": "1.0.1",
"icon": "mdi:scale-bathroom",
"attribution": "Data provided by Peter Siebler"
}
Topic: tele/miscale2/Peter/data
This data is published by the "calc module"
{
"measured":70.65,
"calcweight":70.65,
"unit":"kg",
"impedance":485,
"timestamp":"2020-09-18T06:34:29Z",
"scantime":"2020-09-18 08:34:29",
"user":"Peter",
"sex":"male",
"athletic":true,
"age":64.8,
"metabolic_age":40.39,
"bmi":23.07,
"bodytype":"balanced",
"weight":70.65,
"idealweight":66.5,
"lbm":55.76,
"fat":13.14,
"fattype":"to_gain",
"idealfat":1.98,
"visceral":7.39,
"water":55.72,
"bone":3.64,
"muscle":52.17,
"protein":20.47,
"bmr":1222.9,
"targetweight":68.0,
"icon":"mdi:scale-bathroom",
"attribution":"Data provided by Peter Siebler"
}
Topic: tele/miscale2/Peter/scores
This data is published by the "calc module"
{
"user": "Peter",
"score": 90.0,
"deltas": {
"weight": -0.8,
"fat": -0.21,
"water": 0.0,
"muscle": 0.0,
"visceral": -0.4,
"protein": 0.02
},
"states": {
"weight": "Abgenommen",
"fat": "Abgenommen",
"water": "Keine Ver\u00e4nderung",
"muscle": "Abgenommen",
"protein": "Zugenommen"
},
"scores": {
"bmi": 0.0,
"fat": 10.0,
"visceral": 0.0,
"muscle": 0.0,
"water": 0.0,
"bones": 0.0,
"bmr": 0.0,
"protein": 0.0
},
"caloric": {
"caloricmin": 2100,
"caloricmax": 2400,
"deficitmin": 1677,
"deficitmax": 1923
},
"engergieexp": 2491,
"macronut": { "protein": 872.0, "carbohydrates": 1246.0, "fat": 374.0 },
"version": "1.0.1",
"timestamp": "2020-10-05 06:23:03",
"icon": "mdi:scale-bathroom",
"attribution": "Data provided by Peter Siebler"
}