Xiaomi MiFlower Care avec intégration Bluetooth BLE

Vos plantes se meurent, vous n’avez pas la main verte ? Vous souhaitez prendre soin de vos plantes et installer ce qu’il faut pour faire fonctionner les capteurs Xiaomi Mi Flower Care, ce tutoriel est fait pour vous !
Xiaomi MiFlower Care avec intégration Bluetooth BLE

Sommaire

Introduction

Si vous avez pas mal de plantes à la maison, Xiaomi propose un capteur de sol très abordable : le MIFlower Care. Malheureusement, le capteur est Bluetooth Low Energy (BLE), et l'intégration n'est pas immédiate. Nous vous présentons comment intégrer ce capteur à Home Assistant à l'aide d'un ESP32 qui fera passerelle Bluetooth.

Matériel nécessaire

Les capteurs

Tout d ’abord, il vous faut des capteurs pour mesurer l’humidité, la lumière, les engrais nécessaires à vos plantes.
Les capteurs Xiaomi Mi Flower Care sont fait pour ça, le grand modèle fonctionne sur batterie, le petit sur pile.

Voici les liens où on peut en trouver chez TechPunt :

Xiaomi Mi Flower Care Plant Sensor - TechPunt
Le capteur de plantes de Xiaomi indique tous les besoins de vos plantes et fleurs : avez-vous besoin d’eau, de soleil ou d’engrais ? Le capteur de plantes le…
Xiaomi HHCC Mi Flower Care Plant Sensor Max - TechPunt
Prenez soin de vos grandes plantes facilement avec le Xiaomi HHCC Plant Sensor Max. Simple avec bluetooth ! Vos plantes ne manqueront plus jamais d’eau ou de no

Voilà le matériel :

Le proxy Bluetooth

Le proxy Bluetooth permet le dialogue entre les capteurs Xiaomi Mi Flower Care et Home-Assistant.
En effet, si vous ne faites pas tourner HA sur un NUC ou un PC équipé du Bluetooth, une passerelle Bluetooth est indispensable.

Il est conseillé d’utiliser un ESP32 comme proxy Bluetooth. Pour cela, le module ESP32 suivant fait parfaitement l’affaire :

Carte de développement ESP32 WROOM-32 TYPE-C CH340C/CP2102, WiFi + Bluetooth, consommation d’énergie Ultra faible, Module sans fil double cœur - AliExpress 502
Smarter Shopping, Better Living! Aliexpress.com

Carte ESP32 sur AliExpress

Pour ce module, il n’y a pas de boîtier, mais si vous avez une imprimante 3D, ce modèle à imprimer fait tout à fait l’affaire :

Esp32 wroom case by guillermohor
Esp32 wroom case with a window for a heat sink.Update top case without hole.Caja para esp32 38pines con una ventana para instalar un disipador.Modelo de 38 pines:https://s.click.aliexpress.com/e/_ADuDoC

Boitier ESP32 à imprimer sur Thingiverse

Voilà ce que ça donne :

Pour ceux qui ne disposent pas d’une imprimante 3D, le module ATOM Lite ESP32 peut tout aussi bien convenir.

ATOM Lite ESP32 IoT Development Kit
Atom Lite is a compact development board of 24*24mm, with an ESP32-PICO chip that is integrated with Wi-Fi and has 4MB SPI flash memory. It provides more GPIOs for user customization which is very suitable for embedded smart home devices and in making smart toys. It can be used as an IoT controller and node.

Carte ATOM Lite ESP32 sur M5STACK

Une plante

Un citronnier et quelques autres plantes feront l'affaire.

Mon citronnier avec son capteur

ESP Home - Bluetooth Proxy sur un ESP32

Installer ESP Home Builder

Pour ceux qui sont sous HA OS (VM ou NUC), sous Home Assistant, allez dans Paramètres / Modules complémentaires et installer ESPHome Device Builder.
Pour ceux qui sont sous HA container (docker), vous devrez installer ESPHome dans un nouveau conteneur.

Pour cette étape, vous pouvez aller voir ce tutoriel qui est très bien réalisé :

Home Assistant : vos premiers pas avec ESPHome
Si la domotique vous passionne, il est tentant de créer vos propres objets connectés. C’est ce que propose ESPHome. Cet article permet de comprendre à quoi sert ESPHome, comment l’installer et l’utiliser, ce que sont les micro-contrôleurs ESP32 et ESP8266.

Création de l’appareil

Cliquez sur + NEW DEVICE

Une fenêtre s’affiche : appuyez sur CONTINUE.

Puis, vous êtes invité à entrer le nom de l’appareil.
Pour ce tutoriel, on choisit Mi Flower 1. Plus tard, un autre ESP32 pourrait être ajouté avec un nom Mi Flower 2 permettant de les identifier mais vous pouvez mettre ce que vous voulez.

Puis cliquez sur Next.
Vous êtes invité à sélectionner votre type d'ESP, dans notre cas, ESP32 est choisi, mais cela dépend du type d'ESP que vous avez en votre possession.

Une fois l’ESP32 choisi, vous avez ce message :

Choisissez SKIP car on va faire la configuration manuellement. Si vous cliquez maintenant sur INSTALL l’ESP32 ne sera pas correctement configuré. Vous verrez un appareil qui n’aura pas le bon nom et certainement pas en proxy Bluetooth. C’est une erreur facile lorsque l’on débute et je l’avais faite la première fois.

Une fois le bouton SKIP appuyé, on a désormais un nouveau appareil nommé Mi Flower 1.

Configuration de l'appareil

Il faut maintenant éditer le fichier de configuration de cet appareil en cliquant sur EDIT.

Il est possible d'éditer le fichier yaml, Ce fichier de configuration, en yaml, va déterminer les comportement et la configuration (Wifi notamment mais cela a déjà été réalisé dans une étape précédente) de l’ESP32.

Edition du fichier yaml mi-flower-1.yaml

esphome:
  name: mi-flower-1
  friendly_name: Mi Flower 1

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "iP2S48aci2xFggyC6JaOzCvX0n2FuuHyQKhr64Cp3jY="

ota:
  - platform: esphome
    password: "74721810d8d8618c7247cb694cf61641"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Mi-Flower-1 Fallback Hotspot"
    password: "UoJPZ6VIExvW"

captive_portal:

Pour activer le Bluetooth proxy, il faut ajouter les lignes suivantes :

# Activate Bluetooth proxy
esp32_ble_tracker:
  scan_parameters:
    interval: 1100ms
    window: 1100ms
    active: true
bluetooth_proxy:
  active: true

Il est possible d’ajouter les lignes ci-dessous pour ajouter des capteurs comme la qualité du signal Wifi, la température de l’ESP32, etc.

Pour l’aide sur le contenu de ce fichier, voir ESPHome - Bluetooth.

Configuration : ajouter d’autres éléments à remonter via ce capteur :

#
# Manually configuration
#
sensor:
  # Qualité du signal
  - platform: wifi_signal
    name: "WiFi Signal dB"
    id: wifi_signal_db
    update_interval: 60s
    internal: true

  - platform: copy
    source_id: wifi_signal_db
    name: WiFi Signal
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
    unit_of_measurement: "%"
    entity_category: "diagnostic"
    device_class: ""

# Temps de fonctionnement
  - platform: uptime
    id: uptime_sec
    update_interval: 60s
    internal: true

# Température interne de fonctionnement
  - platform: internal_temperature
    name: "Internal Temperature"
    entity_category: "diagnostic"

# Bouton de redémarrage
switch:
  - platform: restart
    name: Redémarrage
    entity_category: "diagnostic"

binary_sensor:
  - platform: status
    name: Statut
    entity_category: "diagnostic"

  - platform: gpio
    pin:
      number: 39
      inverted: true
    name: Button

# Transformation de la durée d'utilisation en texte
text_sensor:
  - platform: template
    id: lite_uptime
    name: "Allumé depuis"
    lambda: |-
      int seconds = (id(uptime_sec).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600); 
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      if ( days > 3650 ) {
        return { "Démarrage" };
      } else if ( days ) {
        return { (to_string(days) +"d " + to_string(hours) +"h " + to_string(minutes) +"m "+ to_string(seconds) +"s ").c_str() };
      } else if ( hours ) {
        return { (to_string(hours) +"h " + to_string(minutes) +"m "+ to_string(seconds) +"s ").c_str() };
      } else if ( minutes ) {
        return { (to_string(minutes) +"m "+ to_string(seconds) +"s ").c_str() };
      } else {
        return { (to_string(seconds) +"s ").c_str() };
      }
    icon: mdi:clock-start
    update_interval: 60s
    entity_category: "diagnostic"

Appuyez sur SAVE pour enregistrer vos modifications :

Compilation du programme pour l’ESP-32

la compilation puis le flashage peut se réaliser en une seule étape, toutefois je détaille ici toutes les étapes a des fins pédagogiques.
Il est temps de brancher votre ESP32 sur le port USB de votre ordinateur.

  • Cliquer sur INSTALL.
  • Choisir Manual Download
  • La compilation commence :
  • Une fois la compilation terminée, on obtient :
  • Choisir Factory format (Previously Modern) et sauvegarder le fichier bin. ATTENTION : Google Chrome peut parfois bloquer le téléchargement de ce fichier, vérifier qu’il n’est pas bloqué par la sécurité du navigateur.
  • Cliquer sur CLOSE

Flash de l'appareil

Fermer toutes les fenêtres et revenir à l’écran d’accueil ESPHome.
Cliquer sur les trois petits points et choisir Install (vous pouvez aussi utiliser Validate précédemment pour valider le fichier yaml que vous avez modifié).

Ceci ouvre la fenêtre suivante, choisir Plug into this computer :

Ça prend un peu de temps.

Cliquez sur Open ESPHome Web, cela ouvre un nouvel onglet.

Cliquer sur CONNECT :

Choisir le port et cliquer sur Connexion. On se retrouve sur cette page :

Cliquer sur INSTALL

Cliquez sur le bouton Choisir un fichier et télécharger le fichier bin sauvegardé précédemment.

Appuyer sur INSTALL, vous allez voir les messages suivants : Connecting / Erasing / Installing / Configuration installed!

Appuyer sur CLOSE. Retour sur la page précédente :

PREPARE FOR FIRST USE n’est pas utile, il va vous flasher un firmware de base qui ne correspond pas au vôtre et vous allez vous retrouver avec deux devices :

Vous ne devez pas avoir ça :

Test : appuyez sur "…" pour configurer le Wifi.

Appuyez sur Configure Wi-Fi : en fait, vous devriez avoir ce message d’erreur :

💡
Si vous avez flashé l’ESP32 avec PREPARE FOR FIRST USE, si une erreur survient, il est certainement nécessaire de débrancher / rebrancher l’ESP32 et de s’y reconnecter. Vous devrez ensuite re-flasher votre ESP32 OTA avec le bon firmware.

Pour vérifier que tout se passe bien, connectez vous au port USB et appuyez sur LOGS, vous verrez si votre ESP démarre correctement ou pas.

On peut remarquer que lors du test, l'ESP met du temps à se connecter au wifi.
Ouvrez une console DOS (ou autre sur d’autres systèmes) et tentez de faire un ping sur l’ip de l’ESP, normalement il doit répondre. Dans cet exemple, il y a des pertes de trames.

Envoi d’une requête 'Ping'  192.168.0.71 avec 32 octets de données :
Délai d’attente de la demande dépassé.
Réponse de 192.168.0.71 : octets=32 temps=2321 ms TTL=255
Réponse de 192.168.0.71 : octets=32 temps=63 ms TTL=255
Réponse de 192.168.0.71 : octets=32 temps=1144 ms TTL=255

Statistiques Ping pour 192.168.0.71:
    Paquets : envoyés = 4, reçus = 3, perdus = 1 (perte 25%),
Durée approximative des boucles en millisecondes :
    Minimum = 63ms, Maximum = 2321ms, Moyenne = 1176ms

Vous pouvez soit définir l’adresse IP de chaque ESP dans son fichier de configuration (IP fixe) ou faire un bail permanent dans votre serveur DHCP afin d’éviter qu’ils ne se « baladent » sur votre réseau local.

⚠️
ATTENTION, l’adresse IP ne devra plus changer au risque de voir l’appareil inaccessible.

Voilà, l'appareil est flashé, vous devriez pouvoir le mettre à jour en OTA (Over The Air) sans plus avoir besoin de le laisser brancher sur l’ordinateur.

⚠️
Note : le flashage depuis le browser ne fonctionne qu’avec Chrome/Chromium.

Ajouter l'intégration ESP Home - Bluetooth Proxy

Normalement à cette étape, il devrait y avoir une notification automatique dans HA pour l’ajouter automatiquement. Toutefois si cela ne se produit pas, vous pouvez le faire manuellement en suivant les étapes suivantes.

Ajouter ESPHOME

Pour que cet Esp32 puisse remonter les données des capteurs, Il faut ajouter son intégration. Pour ce faire, aller dans Paramètres / Appareils et services, onglet Intégrations : cliquer en bas à droite sur le bouton AJOUTER UNE INTÉGRATION.et choisir ESPHome.

Ajouter le nœud ESP Home

Aller dans Paramètres / Appareils et services :

Dans intégrations, vous devriez voir votre device :

Cliquez sur AJOUTER : Home Assistant va vous demander de l’ajouter, validez.

Si c’est un échec :

Si vous avez cette fenêtre, redémarrez votre ESP (ou le bouton de gauche (RESET)) et examinez les logs.
Lors de ce test, le wifi est un poil loin du PC, la connexion n’est pas optimale.
Après avoir déplacé l’ESP32, un nouvel essai est effectué.

Si c’est un succès :

Et voici l’appareil :

Visualisation des entités

On peut désormais voir les entités que l’on avait configurées dans le yaml :

Installer Xiaomi BLE

Ajouter dans Home Assistant le Xiaomi BLE

Il faut désormais installer le Bluetooth Xiaomi, il faut aller sur la page : Xiaomi BLE

Cliquez sur :

Une petite question :

Et là, ce lien ouvre Home Assistant, demande de valider.

Découverte des capteurs dans Home Assistant :

Grand moment, il me trouve mes capteurs Xaomi Flower Care (un grand et un petit pour le moment).

Choisir le premier, celui-ci va être ajouté l’autre sera ajouté ultérieurement.

On valide, succès !

Les deux sont trouvés !

Identifier les capteurs dans Home Assistant

Mais qui est qui ? Il faut retirer la pile du plus petit et rafraîchir la page, il est ainsi possible de détecter lequel a quel code série.

Le petit, c'est donc le 7D31 et le grand 59E6.
Remettre la pile attendre un peu que ça se reconnecte.

Ajouter le suivant le 59E6. Les deux capteurs sont désormais ajoutés.

Il y a deux intégrations :
La première, c'est ESPHome avec la configuration qui a été ajoutée dans le yaml.

La deuxième, c'est le Xaomi BLE avec les deux entités

Et les capteurs remontés par le BLE : les informations Mi Flower Care

Attention, ici on peut remarquer que le capteur d’humidité de l’air n’est pas remonté par l'appareil, il faudra utiliser un autre appareil (un thermomètre Zigbee par exemple).

Il s’est avéré que le grand à batterie a mis plus de temps à remonter l’indication de niveau de batterie, j’ai cru un moment qu’il ne remontait pas le niveau de batterie. Mais si, les deux capteurs (petits et grands) remontent le niveau de leur batterie.

Renommer vos Intégrations et vos capteurs

💡
NB : Cette section permet d’expliquer comment renommer les éléments d’intégrations ainsi que les capteurs. Si vous comptez changer les capteurs de plantes régulièrement ce n’est peut-être pas la meilleur solution, chacun fait comme il le souhaite.

Donc, vous pouvez désormais renommer vos capteurs pour que ça soit plus simple pour les identifier.

Renommer les éléments d’intégration

Dans l’intégration Xiaomi, cliquer sur les trois petits points des éléments de l’intégration.

Puis choisir le nom, dans ce tutoriel : Plant Sensor Citronnier.

Et voilà le résultat :

Renommer les appareils

On vient donc de renommer les éléments de l’intégration Xiaomi mais les appareils ne sont pas renommés pour autant.

Cliquez sur l’appareil :

Cliquez sur le stylo pour éditer cet appareil. On voit en haut à gauche que le nom est différent du nom que l’on a tapé précédemment (Plant Sensor Citronnier) :

On peut éditer le nom :

On change le nom en Citronnier Sensor 7D31, le choix est fait de conserver 7D31 afin de garder cet identifiant matériel qui pourrait servir plus tard (ou pas).

Cliquez sur METTRE À JOUR :

⚠️
Attention : Un message d’avertissement vous avertit que cela va impacter les automatisations / scripts / scènes / tableaux de bord.
Cela pose aussi problème lorsque l’intégration plante a déjà été créé
et les capteurs déjà affectés à une plante. Voir les explications suivantes.

Avec les détails :

Cliquez sur RENOMMER.
Et voilà le résultat une fois renommé :

Et dans les entités, on peut voir le résultat ;

On peut voir que les nouvelles entités ont un point rouge. Après redémarrage de Home Assistant + redémarrage de l’ESP32, les points rouges ont disparu.
Il faut changer l’entité Citronnier conductivity en remplaçant l’appareil Plant Sensor 7D31 Conductivity par Citronnier Sensor 7D31 Conductivity. Ceci est expliqué dans le chapitre "Changer le capteur d’une plante".
Attention, comme mentionné précédemment, l'humidité de l'air n'est pas remontée par le capteur, il faudra en utiliser un autre.

Une fois l’appareil renommé pour la plante, on a :

Puis, une fois que tous les capteurs ont été renommés, on a :

Et la carte reprend vie.

Mais la batterie n’est plus présente. Il faut aussi éditer la carte :

Après correction :

Bon, il est clair qu’il vaut mieux le faire avant de créer la plante sinon ça demande quand même plus de travail.

Gestion intelligente des plantes

Voici une plante, un petit citronnier qui ne demande qu’à grandir sans mourir !
On lui plante son capteur (pas certain qu’il soit suffisamment grand).

On va maintenant utiliser cette intégration non officielle (tout est expliqué sur le site en lien) :
GitHub - Olen/homeassistant-plant: Alternative Plant component of home assistant

Installer OpenPlantbook


Aller sur la page Open Plantbook | Login et créer un compte (gratuit).

Naviguer vers Open Plantbook | Login et générer une clef API (bouton Generate).
Copier les clefs Client ID et Client Secret.
Installer l’intégrationOpenPlantbook : https://github.com/Olen/home-assistant-openplantbook
Cliquer sur les trois petits points en haut à droite de HACS et ajouter un dépôt personnalisé.

Ajouter GitHub - Olen/home-assistant-openplantbook: Integration to search and fetch data from Openplantbook.io dans un nouveau repository de type Intégration :

Valider. Puis télécharger OpenPlantBook :

Puis redémarrer Home Assistant.

Allez dans Paramètres / Appareils et services et cliquez sur AJOUTER UNE INTÉGRATION

Chercher OpenPlantbook et l’installer !
Il vous demande Client ID et Secret que vous aviez copié précédemment :

Une nouvelle fenêtre s’affiche, pour plus de sécurité tout a été coché.
Puis valider.

Si vous faites la reconfiguration de l’intégration, une nouvelle option apparaît, il propose de télécharger les images des plantes, cochez et validez (attention, il faut créer le répertoire indiqué s’il n’existe pas, on peut le réaliser facilement avec Studio Code Server).

Installez homeassistant-plan avec le repo : https://github.com/Olen/homeassistant-plant

Télécharger, puis redémarrer Home Assistant.

Installer la carte lovelace-flower-card avec le repo https://github.com/Olen/lovelace-flower-card/ et de type Tableau de bord puis cliquez sur AJOUTER :

Puis télécharger en cliquant sur Télécharger :

Et voilà, vous êtes prêts à faire de belles cartes.

Créer les plantes

Il faut désormais créer les plantes, pour cela, il faut créer une entité plante :

Et remplir les informations 

Valider, il recherche et propose différents choix. Je choisis Citrus limon :

Puis, il affiche tous les paramètres :
Je coche : c’est la plante que je cherchais.

Je valide et je mets dans la pièce « jardin ».

On peut ajouter toutes les plantes que l’on souhaite. C’est un peu fastidieux, il faut avoir les noms scientifiques en anglais de nos plantes. Mais une simple rechercher Internet te permettra de trouver les noms adéquats.

Réaliser de belles cartes plantes

Il ne reste plus qu’à créer nos cartes : dans nos panneaux, cliquer sur ajouter une carte et sélectionner la carte Flower Card :

Remplir le champ batterie (pour les petits Mi Flower) et le Display Type :

Et voilà le résultat :

Et ben, elle ne va pas très bien cette plante !
Le capteur est là pour ça, afin qu'elle aille mieux par la suite.

Les notifications

Pour être notifié en cas de problèmes avec une plante, il est possible d’être averti pour chaque capteur incorrect, chacun fait comme il veut, mais je n’ai pas fait ce choix. J’ai plutôt utilisé l’état de santé de la plante qui prend en compte l’ensemble des capteurs qui composent la surveillance de la plante.

Nous allons créer une notification persistante + une notification envoyée sur tous les appareils connectés à HA (les portables de la famille par exemple). À vous de voir ce qui vous semble judicieux et de modifier ce code.

Ça donne ça :

Et le code est le suivant :

alias: Notification état de santé du Citronnier
description: ""
triggers:
  - trigger: state
    entity_id:
      - plant.citronnier
    from: ok
    to: problem
    for:
      hours: 0
      minutes: 10
      seconds: 0
conditions: []
actions:
  - action: notify.persistent_notification
    metadata: {}
    data:
      message: Le citronnier a besoin de soin.
      title: Plante
  - action: notify.notify
    metadata: {}
    data:
      message: |
        Le citronnier a besoin de soin.

        Veuillez vérifier l'état de santé du Citronnier !
      title: Plante
mode: single

Surveiller le Proxy Bluetooth

Il est aussi possible d’ajouter le proxy pour pouvoir le surveiller, le redémarrer, etc.
Voici ce que ça donne :

Le code est le suivant :

type: entities
entities:
  - entity: switch.mi_flower_1_red_marrage
    name: Redémarrage
  - entity: sensor.mi_flower_1_allum_depuis
    name: Allumé depuis
  - entity: sensor.mi_flower_1_internal_temperature
    name: Internal Temperature
  - entity: binary_sensor.mi_flower_1_statut
    name: Statut
  - entity: sensor.mi_flower_1_wifi_signal
    name: WiFi Signal
title: Proxy Bluetooth
state_color: true

Changer le capteur d’une plante

Lorsque la plante est ajoutée, on se rend compte que l’humidité n’est pas donnée par le capteur (déjà mentionné à plusieurs reprises). Il faut donc utiliser un autre capteur, comme un capteur de température Zigbee par exemple.

Mais que faire si la plante est dans le jardin ou dans la maison (pour un citronnier en région parisienne, l'hiver il est nécessaire de la rentrer dans nos habitations pour éviter qu'elle ne gèle) ?
Après avoir cherché, impossible de changer facilement le capteur d’humidité de la plante (ni aucun autre capteur d’ailleurs).
Le problème peut se poser aussi si on change le Xiaomi Mi Flower par un autre (par exemple un petit par un grand lorsque la plante pousse ou si le capteur devient HS).

Mais en fait, c'est tout à fait possible, il faut se rendre dans Outils de développement / ACTIONS, il y a une action qui permet de changer un capteur par un autre :

  • Replace sensor (plant.replace_sensor).
  • Choisir le nouveau capteur par lequel il faut le remplacer (en haut).
  • Cocher :☑ Sensor entity
  • Choisir le nouveau capteur par lequel il faut remplacer.
  • Appuyez sur Executer l'action.

Et voilà le capteur est remplacé. On peut le faire pour tous les capteurs de la plante, notamment lorsque l'on renomme celle-ci !

Conclusion

Et voilà le résultat final (avec surveillance du Proxy Bluetooth) :

Bonnes plantations.