ESP32, BLE, RF Plant Sensor Roundup and Home Assistant Dashboard
Table Of Contents
Overview⌗
My partner and I have quite a few plants. I’ve been wanting to add a sensor network to them so we could more closely monitor their health. My requirements were as follows:
- Long battery life. I didn’t want wires running to every plant and I didn’t want to be changing batteries every week.
- Must-have sensors were soil moisture and ideally fertilization rate/level.
Nice-to-haves:
- Additional sensors for things like illumination, temperature, etc.
- An auto-watering system.
Contenders⌗
| Model | Price | Soil Moisture | Soil Fertilization | Other Sensors | Protocols | Notes | 
|---|---|---|---|---|---|---|
| Ecowitt WH51 Wireless Soil Moisture Sensor | $16.99 | ✅ | ❌ | Temperature, Humidity | RF | Requires a base station. Each base station can only handle 8 sensors. | 
| Xioami Mijia BLE Flower Monitor | $12-20 | ✅ | ✅ | Temperature, Luminosity | BLE | There are two versions of this sensor. It’s important to get the HHCCJCY01rather than theHHCCJCY10 | 
| ESP32 Soil Moisture Sensor | $10-15 | ✅ | ❌ | Temperature, Humidity | WiFi, BLE | Battery doesn’t last very long. Max is 5-7 days. Deep sleep support required soldering. | 
| LILYGO TTGO T-Higrow ESP32 Soil Sensor | $9.85 | ✅ | ✅ | Temperature, Humidity, Luminosity | WiFi, BLE | They offer a nice case and a water pump attachment. | 
Setup⌗
I decided to go with a blended setup:
- 3x LILYGO TTGO T-Higrow ESP32s – These will form the backbone of the system by being the proxies for the BLE sensors and watering the plants. I am running full-time power to these and treating them as “zones” essentially.
- Xioami Mijia BLE Flower Monitor – These are powered CR2032 batteries that last a year. They ended up having the most sensors, the most effective sensors, and were pretty cheap. I found them in bulk for $12on AliExpress.
I ended up arranging the plants into zones like so:
- 3x zones with a LILYGO TTGO T-Higrow serving as a BLE hub.
- Xioami Mijia BLE Flower Monitors for all of the other plants in a zone.
- Each zone of plants will be a mixture of plants that require almost no watering (e.g. cactuses) and plants that have similar watering characteristics.
Hardware⌗
- LILYGO® TTGO T-Higrow ESP32 WiFi And Bluetooth Battery And DHT11 Soil Temperature And Humidity Photometric Electrolyte Sensor
- T-Higrow Motor - You will want the hat/case as well.
- Xiaomi Mijia Flora Sensor - The BLE signal from these will be monitored by the LILYGO® TTGO T-Higrow ESP32.
Software⌗
- Open Plantbook – You’ll need an API key.
- Alternative Plant Component – This sets up plants as devices.
- Open Plantbook Integration - This is a “backend” sensor for the plant device and card.
- lovelace-flower-card - Fancy plant card for Lovelace.
- ESPHome – Used to manage the LILYGO® TTGO T-Higrow.
Assembling the Hardware⌗
Soldering the Motor Connector⌗
The motor comes with a five pin connector that needs to be soldered to the LILYGO® TTGO T-Higrow ESP32. This connector needs to be soldered to the 5V and GPOI19 pins. See the photo below:

Here is a photo of mine after having soldered the connector to the board:

Here is the sensor with the motor mounted using the plastic hat you can purchase from AliExpress:

Configuring ESPHome⌗
Base Configuration⌗
The LILYGO® TTGO T-Higrow ESP32 comes in two configurations:
Both of them have the following base configuration for soil moisture, soil conductivity, and illuminance.
esphome:
  name: soil-sensor
esp32:
  board: lolin_d32
api:
  encryption:
    key: "0GamOcw/LFuS2HYcvVRkj88OUl17WEH/Grf9G3nWdxI="
ota:
  password: "45c182089a39e49022f4316cad690a2f"
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
captive_portal:
logger:
esp32_ble_tracker:
i2c:
  sda: 25
  scl: 26
  scan: True
  id: bus_a
sensor:
  - platform: adc
    pin: GPIO32
    name: "Soil Moisture"
    update_interval: 15min
    attenuation: 11db
    unit_of_measurement: '%'
    filters:
      - calibrate_linear:
          # Map 0.0 (from sensor) to 0.0 (true value)
          - 3.08 -> 0.0
          - 1.42 -> 100.0
  - platform: adc
    pin: GPIO34
    name: "Soil Conductivity"
    update_interval: 15min
    accuracy_decimals: 4    
    unit_of_measurement: 'µS/cm'
    filters:
      - calibrate_linear:
          # Map 0.0 (from sensor) to 0.0 (true value)
          - 0.0 -> 0.0
          - 1.1 -> 100.0
  - platform: bh1750
    i2c_id: bus_a
    name: "BH1750 Illuminance"
    address: 0x23
    update_interval: 15min
    setup_priority: -300BME280⌗
If you have the LILYGO TTGO T-Higrow with the BME280 sensor add the following to your sensor section:
- platform: bme280
  i2c_id: bus_a        
  temperature:
    name: "BME280 Temperature"
    oversampling: 1x
  pressure:
    name: "BME280 Pressure"
  humidity:
    name: "BME280 Humidity"
  address: 0x77
  update_interval: 120sDHT11⌗
If you have the LILYGO TTGO T-Higrow with the DHT11 sensor add the following to your sensor section:
- platform: dht
  pin: 16
  model: dht11
  temperature:
    name: "Temperature"
    unit_of_measurement: "°C"
    icon: "mdi:thermometer"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1            
  humidity:
    name: "Humidity"
    unit_of_measurement: "%"
    icon: "mdi:thermometer"
    device_class: "humidity"
    state_class: "measurement"      
  update_interval: 120s
  setup_priority: -100Motor/Water Pump⌗
The motor/water pump can be turned on/off with GPIO19 as a switch:
switch:
  - platform: gpio
    pin: GPIO19
    name: "Water Pump"
    id: waterConfiguring the Xiaomi Mijia Flora Sensor⌗
The Xiaomi Mijia Flora Sensors emit sensor data via BLE. They have fantastic battery life and report data in a straightforward manner. To configure them, you need to first follow the logs of a configured sensor that has esp32_ble_tracker enabled. After a while you will see the esp32_ble_tracker logs emit an entry for the Xiaomi Mijia Flora Sensor:
[19:56:41][D][esp32_ble_tracker:809]: Found device C4:7C:8D:6D:5D:F5 RSSI=-102
[19:56:41][D][esp32_ble_tracker:830]:   Address Type: PUBLIC
[19:56:41][D][esp32_ble_tracker:832]:   Name: 'Flower care'Note the MAC address: C4:7C:8D:6D:5D:F5. We will use it to define a xiaomi_hhccjcy01 sensor:
sensor:    
  - platform: xiaomi_hhccjcy01
    mac_address: 'C4:7C:8D:6D:5D:F5'
    temperature:
      name: "Xiaomi HHCCJCY01-01 Temperature"
    moisture:
      name: "Xiaomi HHCCJCY01-01 Moisture"
    illuminance:
      name: "Xiaomi HHCCJCY01-01 Illuminance"
    conductivity:
      name: "Xiaomi HHCCJCY01-01 Soil Conductivity"
    battery_level:
      name: "Xiaomi HHCCJCY01-01 Battery Level" Configuring a Dashboard⌗
Once you have configured all of the HACS add-ons, you can add a few plants using the Plant Monitor integration. These will show up as plant devices. They can be used with the custom:flower-card.
Lovelace Plant Card⌗
- type: custom:flower-card
  entity: plant.philodendron_birkin
  show_bars:
    - illumination
    - moisture
    - conductivity
    - temperature
    - dliPlant Dashboard⌗
