Living in an urban city without a garden, I have been exercising my green thumb by accumulating more and more houseplants. I have them tucked away in every light-filled corner, hanging from every rafter in my tall ceilings. Which is a problem, because I have to get a ladder out to water most of them!
Using some cheap plant soil sensors and a simple Python script, I will have Home Assistant check all of my plants and make a list of which need my attention. Then when more than a few need to be watered, I can be notified or have the voice assistant give me an update.
HARDWARE
You could use the Xiaomi plant sensors I’ve linked here, they occasionally go on sale on aliexpress.com. A cheaper option would be to build them yourself (no soldering required) with an esp8266 board. Here’s a shopping list, you don’t need all the sensors but these are the sensors supported by the plant platform.
- Wemos D1 Mini
- Dupont Cables if you don’t want to solder
- DHT22 temperature / humidity sensor
- Moisture Sensor analog output
- BH1750 Digital light level sensor
Building this is beyond this post, but it is fairly simple. Flash the Wemos D1 Mini with ESP Easy firmware, hook up the sensors, and configure them in the ESP Easy web menu to publish to MQTT. Home Assistant can then create sensors via the MQTT Sensor platform.
(Also if anyone knows of a DIY conductivity sensor, please comment, as I’m not aware of one).
PLANTS IN HASS
The plant platform allows us to combine these sensors into one plant entity & set thresholds for alerts for that plant. Here is an example YAML config
plants.yaml
giant_pothos: sensors: moisture: sensor.giant_pothos_moisture battery: sensor.giant_pothos_battery temperature: sensor.giant_pothos_temperature conductivity: sensor.giant_pothos_conductivity brightness: sensor.giant_pothos_light_intensity min_moisture: 10 max_moisture: 100 min_battery: 15 min_conductivity: 200 min_temperature: 45
And here’s the resulting plant entity in the Home Assistant UI
This is wonderful, but I bought a dozen of these Xiaomi sensors when they were on sale. Wouldn’t it be great if, once I’m up on the ladder with a watering can, I could yell out to Alexa to list off which ones need it?
PYTHON SCRIPT
This script uses the python script platform in Home Assistant. I’m going to trigger it anytime my plants update their status, like so:
automations.yaml
- alias: 'Update Plant Problems' trigger: - platform: state entity_id: plant.giant_philodendron, plant.giant_pothos, plant.hanging_red_pothos, plant.hanging_spider_plant, plant.kitchen_pothos, plant.palm, plant.projector_pothos, plant.rubber_plant, plant.small_philodendron, plant.window_spider_plant action: - service: python_script.plant_problems
And now for the script itself. It’s going to create 3 new entities:
- sensor.water_plants_number
- sensor.fertilize_plants_number
- sensor.problem_plants
The last one will contain a number of attributes that will be useful for automations, including lists in human readable form.
python_scripts/plant_problems.py
Pastebin link: https://pastebin.com/yCbbJ6uA
And here you have it:
TALK TO ME, PLANTS
This is a Home Assistant script, you will need to have a text-to-speech platform configured.
scripts.yaml
tts_plant_info: alias: Announce Plant Info sequence: - service: tts.amazon_polly_say data_template: entity_id: media_player.vlc_tts message: > {% if is_state_attr('sensor.plant_problems','water_number',0) %} No plants need watering. {% elif states.sensor.plant_problems.attributes.water_number | float > 0 %} {{states.sensor.plant_problems.attributes.water}} need to be watered. {% endif %} {% if is_state_attr('sensor.plant_problems','fertilize_number',0) %} No plants need fertilizer. {% elif states.sensor.plant_problems.attributes.fertilize_number | float > 0 %} These plants {{states.sensor.plant_problems.attributes.fertilize}} need fertilizing. {% endif %}
And now your plants talk to you. Welcome to the future. I have added some additional functionality to my set up with Node-Red: Mine also tweet to the world when I’ve ignored them too long. Follow at @diyfuturism.
Brad, thanks. Your setup is inspiring!
For me, I’m adding things here and there. I’m currently having trouble with my plant sensor in Hass.io. Works from the android app, but not visible to HA. I’m running .60 which broke a bunch of stuff so I am hoping that it comes to life once some of the .60 kinks are worked out. If not, then I think I might have a problem with BT on my PI.
Thanks again for the blog…YOU ARE AMAZING!
Love it! I just sumbled upon this. I am already using it and its working like a charm!
This is great! Thanks for sharing. Do you have a pointer to the node red flow to show how you’ve improved it?
great….
i’m trying to use your script but running it from the terminal (in hassio) it shows:
➜ python_scripts python3 plant_problems.py
Traceback (most recent call last):
File “plant_problems.py”, line 23, in
for entity_id in hass.states.entity_ids(‘plant’):
NameError: name ‘hass’ is not defined
i have seen that it’s a common mistake running Py script “outside” hassio…my fault… but I’m trying to check if the script has some problems with my configuration because it run when the state of a plant changes… but i can’t find in the entity page the 3 new entities called :
sensor.water_plants_number
sensor.fertilize_plants_number
sensor.problem_plants