Mi Flora Bluetooth LE
Are you always killing plants? Then you should have a look at the Xiaomi Mi Flora sensor (a.k.a. Xiaomi Flower Mate), a cheap bluetooth Low Energy plant sensor that measures the moisture in the soil, the temperature, and even the light intensity. It's coin cell battery can last about a year if you only take one measurement a day.
Luckily, some clever people have reverse engineered the protocol it uses.
Be careful, this device uses Bluetooth LE (Low Energy) and therefore, it's not compatible with old bluetooth adapters. Raspberry Pi 3 Bluetooth is Ok.
- 1 Linux
- 1.1 Preparing Domoticz
- 1.2 Installing Bluetooth on Raspberry Pi 2/3 - Debian 8 Jessie
- 1.3 Option A: Direct connection via a Python script
- 1.4 Option B - Connecting via MQTT via Python
- 2 More sources
The only way to talk to MiFlora at the moment is if you are running Domoticz on a linux system. Here you have two ways to connect to the MiFlora from Domoticz
- Directly, via a Python script.
- Indirectly, by talking through a MQTT server via a Python script.
In both cases you'll have to start by installing Bluetooth, and enable Python to access Bluetooth trough the so called 'Gatt tool', a very simple but robust piece of software.
We'll need to create some virtual sensors in Domoticz. We'll then fill in their values via the python script.
First, if you haven't already done this before, go to hardware, add new hardware, and choose 'dummy' as the type. All the other setting don't matter, you can keep their defaults.
Next, create 4 virtual sensors by clinking the "create virtual sensors" button on the hardware page, under the dummy hardware device. We'll need to make four of them:
# type percentage (moisture)
# type temperature
# type lux
# type custom (fertility)
Installing Bluetooth on Raspberry Pi 2/3 - Debian 8 Jessie
Before doing anything, make sure your server is up-to-date by issues these commands in the terminal:
sudo apt-get update and
sudo apt-get upgrade
On to Bluetooth. At the moment of writing this, the Raspberry Pi's Apt-get tools could install a pretty old version of Bluez (5.23-2+rpi2), but that doesn't support Bluetooth Low Energy. You need at least version 5.3 for that.Note: Bluez version 5.44 does not compile gatttool on a Raspberry Pi by default (deprecated tool), so we must add
So for now we'll have to make a new version and NOT install it 'manually' over the existing one, but only using the tool we need : gatttool. To compile Bluez 5.44, which is full of nice bugfixes for Bluetooth Low Energy, basically type in commands below and grab a cup of tea during "make all". You should check if a newer version of Bluez 5.44 is available, and replace the newer version number in all the commands below (and edit this page, too).
sudo apt-get install libglib2.0-dev libdbus-1-dev libical-dev libreadline-dev libudev-dev
cd /home/pi wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.44.tar.gz tar -xvf bluez-5.44.tar.gz cd bluez-5.44 sudo ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-tools --disable-test --disable-systemd --enable-deprecated sudo make all sudo apt-get install python-bluez python-requests
If all goes well, one last thing is to copy the Gatt tool to the directory where your linux version keeps its programs. It's location is different for different Linux flavours. Try:
sudo cp attrib/gatttool /usr/bin/ ( or
sudo cp attrib/gatttool /usr/local/bin/ )
And just to be safe try
If all goes well you'll have installed Bluetooth. Time to reboot the server.
sudo shutdown -r now
Option A: Direct connection via a Python script
The direct-connection script was written in Python 3, so let's grab that.
Download the Python3 script with
git command : (if it isn't installed, you can install it by
sudo apt-get install -y git-core
cd ~ && git clone https://github.com/Tristan79/miflora.git
Copy the folder miflora to your Domoticz python scripts directory.
cp -R ~/miflora/ ~/domoticz/scripts/python/miflora
Next, Install Python3 and the required Python3 libraries that let Python script talk to Bluetooth.
sudo aptitude install python3 python3-pip
sudo pip3 install pygatt
sudo pip3 install requests
Finding the sensor's Bluetooth Address
Now it's time to find your sensor's address, because we'll need to add in into the script soon.
Make sure Bluetooth LE is on. From the bluez folder type:
sudo tools/btmgmt le on
sudo tools/btmgmt connectable on
sudo tools/btmgmt power on
Then scan for your device. The toggling off-on at the start is on purpose)
sudo hciconfig hci0 down
sudo hciconfig hci0 up
sudo hcitool lescan
Write down the address (something like 12:34:56:78:90:AB), and press ctrl-z to exit
Alternatively, you can also try to scan this way:
Edit the domoticz.py script
Add the Domoticz server IP address at the top, as well as any login information (if necessary).
Next, add your device's Bluetooth address into the appropriate 'update' call at the bottom of the script. Also add the four IDX codes (the unique numbers) of the Domoticz switches that you created earlier. You can find those IDX numbers in the devices list in Domoticz. If you made them in the correct order above this should be easy:
Schedule the polling
To enable this script to runs, say, every 12 hours, we'll need to create a Cron task:
sudo crontab -e
And then add this line:
0 0,12 * * * /usr/bin/python3 /home/pi/domoticz/scripts/python/miflora/domoticz.py
This runs the script twice a day, at noon and at midnight.
Option B - Connecting via MQTT via Python
This version uses a MQTT server as a man in the middle. It's the long way around, but it's nice if you have multiple smart home platforms and devices that you would like to have access to the Mi Flora sensor data. MQTT is a good standard for that.
Download the script here: https://github.com/marcelrv/miflora
This script uses an older version of Python, so make sure you have it installed.
sudo apt-get install python sudo apt-get install python-pip sudo pip install gattlib sudo pip install requests
optional: sudo pip install pygatt
Place the script in the domoticz/scripts/python folder.
Someone who has tried this route will have to update this part.