/xiaomi_mi_scale

Connector for Xiaomi Mi Scale

Primary LanguagePython

Xiaomi Mi Scale

Code to read weight measurements from Mi Body Composition Scale (aka Xiaomi Mi Scale V2)

Mi Scale

Also works with Mi Body Composition Scale 2 (Model # XMTZC05HM)

Mi Scale_2

Note: Framework is present to also read from Xiaomi Scale V1, although I do not own one to test so the code has not been maintained

Getting the Mac Address of your Scale:

  1. Retrieve the scale's MAC Address using this command:
$ sudo hcitool lescan | grep -i MIBCS

LE Scan ...
C4:D3:8C:12:4C:57 MIBCS
[...]
  1. Note down your MIBCS mac address - we will need to use this as part of your configuration...

Setup & Configuration:

Running script with Docker:

  1. Supported platforms:
    1. linux/amd64
    2. linux/arm32v6
    3. linux/arm32v7
    4. linux/arm64v8
  2. Open docker-compose.yml (see below) and edit the environment to suit your configuration...
  3. Stand up the container - docker-compose up -d

docker-compose:

version: '3'
services:

  mi-scale:
    image: lolouk44/xiaomi-mi-scale:latest
    container_name: mi-scale
    restart: always

    network_mode: host
    privileged: true

    environment:
    - MISCALE_MAC=00:00:00:00:00:00 # Mac address of your scale
    - MQTT_HOST=127.0.0.1  # MQTT Server (defaults to 127.0.0.1)
    - MQTT_PREFIX=miScale
    - MQTT_USERNAME=       # Username for MQTT server (comment out if not required)
    - MQTT_PASSWORD=       # Password for MQTT (comment out if not required)
    - MQTT_PORT=           # Defaults to 1883
    - TIME_INTERVAL=30     # Time in sec between each query to the scale, to allow other applications to use the Bluetooth module. Defaults to 30

      # Auto-gender selection/config -- This is used to create the calculations such as BMI, Water/Bone Mass etc...
      # Up to 3 users possible as long as weights do not overlap!

    - USER1_GT=70            # If the weight is greater than this number, we'll assume that we're weighing User #1
    - USER1_SEX=male
    - USER1_NAME=Jo          # Name of the user
    - USER1_HEIGHT=175       # Height (in cm) of the user
    - USER1_DOB=1990-01-01   # DOB (in yyyy-mm-dd format)

    - USER2_LT=35            # If the weight is less than this number, we'll assume that we're weighing User #2
    - USER2_SEX=female
    - USER2_NAME=Serena      # Name of the user
    - USER2_HEIGHT=95        # Height (in cm) of the user
    - USER2_DOB=1990-01-01   # DOB (in yyyy-mm-dd format)

    - USER3_SEX=female
    - USER3_NAME=Missy       # Name of the user
    - USER3_HEIGHT=150       # Height (in cm) of the user
    - USER3_DOB=1990-01-01   # DOB (in yyyy-mm-dd format)

Running script directly on your host system (if your platform is not listed/supported):

  1. Install python requirements (pip3 install -r requirements.txt)
  2. Open wrapper.sh and configure your environment variables to suit your setup.
  3. Add a cron-tab entry to wrapper like so:
@reboot bash /path/to/wrapper.sh

NOTE: Although once started the script runs continuously, it may take a few seconds for the data to be retrieved, computed and sent via mqtt.

Home-Assistant Setup:

Under the sensor block, enter as many blocks as users configured in your environment variables:

  - platform: mqtt
    name: "Example Name Weight"
    state_topic: "miScale/USER_NAME/weight"
    value_template: "{{ value_json['Weight'] }}"
    unit_of_measurement: "kg"
    json_attributes_topic: "miScale/USER_NAME/weight"
    icon: mdi:scale-bathroom

  - platform: mqtt
    name: "Example Name BMI"
    state_topic: "miScale/USER_NAME/weight"
    value_template: "{{ value_json['BMI'] }}"
    icon: mdi:human-pregnant

Mi Scale

Mi Scale

Acknowledgements:

Thanks to @syssi (https://gist.github.com/syssi/4108a54877406dc231d95514e538bde9) and @prototux (https://github.com/wiecosystem/Bluetooth) for their initial code

Special thanks to @ned-kelly for his help turning a "simple" python script into a fully fledge docker container

Thanks to @bpaulin for his PRs and collaboration