
Surveillance de la santé de nos plantes avec Home Assistant
Dans ce chapitre, nous allons apprendre à contrôler la santé de nos plantes de manière simple et peu coûteuse. Où nous pouvons connaître des paramètres tels que l’humidité qu’il a, Température, La quantité de lumière, ou engrais entre autres.
Pas mal, Je pense que presque tous d’entre vous ont entendu ces capteurs à un moment donné, Je pense qu’il y a beaucoup de marques et c’est généralement la même chose au final, Je le connais sous le nom de Xiaomi Mi Plant, bien que vous puissiez le trouver avec n’importe quel nom tel que Flower Care… dans Banggood Ils mettent généralement une réduction et pour environ 10 €, vous l’avez.
L’utilisation habituelle serait avec l’application du fabricant en service qui collecte les données par Bluetooth chaque fois qu’elle est vue avec votre mobile. Dans ce cas, en ayant un assistant à domicile qui n’a pas de bluetooth, puisque dans mon cas il fonctionne comme une machine virtuelle car il est difficile de parler au capteur. Donc, en ayant plusieurs Raspberry Pi éparpillés dans la maison, sur chaque Raspberry Pi le plus proche de l’usine en question, Ce sera celui qui se connectera au capteur, Collectez des données via Bluetooth, et les stocker dans une base de données que j’ai de MySQL/MariaDB; il est également vrai que si vous voulez sauter la base de données, vous pouvez envoyer les données par MQTT, Mais je suis un héritage, de stocker des choses dans des BD traditionnels 🙂 Cela dépend un peu de l’idée que vous avez Je suis sûr que cet article vous aidera.
sudo did outil inutile lescan LE Scan ... 0À:4D:49:BA:19:XX (inconnu) 0À:4D:49:BA:19:XX (inconnu) 54:5F:A0:C4:A5:XX (inconnu) 0À:4D:49:BA:19:XX (inconnu) C4:7C:8D:6B:25:XX (inconnu) C4:7C:8D:6B:25:XX Soins des fleurs 0A:4D:49:BA:19:XX (inconnu) 54:5F:A0:C4:A5:XX (inconnu) ...
Maintenant, nous allons installer sur ce Raspberry Pi le librairie Capteur de plantes Mi de Xiaomi pour Python, Et tant que vous y êtes, le client MySQL dont nous aurons besoin:
Sudo PiP3 Installer Miflora Sudo PiP3 Installer MySQLCLIENT
Et maintenant, c’est tout, Il ne vous reste plus qu’à télécharger ce script, Je ne me souviens pas d’où je l’ai prise pour le remercier éternellement. Si vous regardez attentivement la ligne 47 J’ai ajouté quelques lignes pour que les données qu’il collecte soient stockées sur ce serveur MySQL, Entrez vos coordonnées, ainsi que le nom de la plante.
#!/usr/bin/env python3 """Fichier de démonstration montrant comment utiliser la bibliothèque miflora.""" import argparse import re import logging import sys import MySQLdb from btlewrap import available_backends, BluepyBackend, GatttoolBackend, PygattBackend de miflora.miflora_poller import MiFloraPoller, \ MI_CONDUCTIVITY, MI_MOISTURE, MI_LIGHT, MI_TEMPERATURE, MI_BATTERY de Miflora Import miflora_scanner def valid_miflora_mac(Mac, pat=re.compiler(r"80:EA:CA:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}")): """Vérifiez les adresses mac valides.""" Si ce n’est pas pat.match(mac.upper()): Soulevez argparse. ArgumentTypeError('The MAC address "{}" seems to be in the wrong format'.format(Mac)) Sondage MAC def de retour(args): """Interrogez les données du capteur.""" backend = _get_backend(args) poller = MiFloraPoller(args.mac, Arrière-plan) #imprimer("Obtenir des données de Mi Flora") #imprimer("FW: {}".format(poller.firmware_version())) imprimer("Nom: {}".format(poller.name())) imprimer("Température: {}".format(poller.parameter_value(MI_TEMPERATURE))) imprimer("Humidité: {}".format(poller.parameter_value(MI_MOISTURE))) imprimer("Lumière: {}".format(poller.parameter_value(MI_LIGHT))) imprimer("Conductivité: {}".format(poller.parameter_value(MI_CONDUCTIVITY))) imprimer("Pile: {}".format(poller.parameter_value(MI_BATTERY))) nombre = (poller.name()) température = (poller.parameter_value(MI_TEMPERATURE)) humedad = (poller.parameter_value(MI_MOISTURE)) luz = (poller.parameter_value(MI_LIGHT)) conductividad = (poller.parameter_value(MI_CONDUCTIVITY)) bateria = (poller.parameter_value(MI_BATTERY)) imprimer (nombre) imprimer (Température) imprimer (Humedad) imprimer (lumière) imprimer (conductividad) imprimer (Bateria) nombre = "NOMBRE_DE_LA_PLANTA" db = MySQLdb.connect("DIRECCION_IP_SERVIDOR_MYSQL","USUARIO_BD","CONTRASEÑA_BD","NOMBRE_BD") curseur = db.cursor() curseur.exécuter("""INSÉRER DANS les plantes (nombre,Température,Humedad,lumière,conductividad,Bateria) VALEURS (%s,%s,%s,%s,%s,%s) """,(nombre,Température,Humedad,lumière,conductividad,Bateria)) db.commit() Balayage DEF(args): """Recherchez des capteurs.""" backend = _get_backend(args) imprimer('Scanning for 10 seconds...') appareils = miflora_scanner.scan(Arrière-plan, 10) imprimer('Found {} Dispositifs:'.format(Len(Dispositifs))) pour appareil dans les appareils: imprimer(' {}'.format(appareil)) def _get_backend(args): """Extrayez la classe backend des arguments de la ligne de commande.""" if args.backend == 'gatttool': backend = GatttoolBackend elif args.backend == 'bluepy': backend = BluepyBackend elif args.backend == 'pygatt': backend = PygattBackend else: raise Exception('unknown backend: {}'.format(args.backend)) Retour du backend def list_backends(_): """Répertoriez tous les backends disponibles.""" backends = [b.__name__ pour B dans available_backends()] imprimer('\n'.join(Moteurs)) Histoire de la DEF(args): """Lisez l’historique à partir du capteur.""" backend = _get_backend(args) imprimer('Getting history from sensor...') poller = MiFloraPoller(args.mac, Arrière-plan) history_list = poller.fetch_history() imprimer('History returned {} entries.'.format(Len(history_list))) pour l’entrée en history_list: imprimer('History from {}'.format(entry.wall_time)) imprimer(" Température: {}".format(entrée.température)) imprimer(" Humidité: {}".format(entrée.humidité)) imprimer(" Lumière: {}".format(entrée.lumière)) imprimer(" Conductivité: {}".format(entrée.conductivité)) def clear_history(args): """Effacez l’historique du capteur.""" backend = _get_backend(args) imprimer('Deleting sensor history data...') poller = MiFloraPoller(args.mac, Arrière-plan) poller.clear_history() def main(): """Fonction principale. Principalement l’analyse des arguments de la ligne de commande. """ parser = argparse. ArgumentParser() parser.add_argument('--backend', choix=['gatttool', 'bluepy', 'pygatt'], default='gatttool') parser.add_argument('-v', '--verbose', action='store_const', const=Vrai) sous-analyseurs = parser.add_subparsers(help='sub-command help', ) parser_poll = subparsers.add_parser('poll', help='poll data from a sensor') parser_poll.add_argument('mac', type=valid_miflora_mac) parser_poll.set_defaults(func=sondage) parser_scan = subparsers.add_parser('scan', help='scan for devices') parser_scan.set_defaults(func=balayage) parser_scan = subparsers.add_parser('backends', help='list the available backends') parser_scan.set_defaults(func=list_backends) parser_history = subparsers.add_parser('history', help='get device history') parser_history.add_argument('mac', type=valid_miflora_mac) parser_history.set_defaults(func=histoire) parser_history = subparsers.add_parser('clear-history', help='clear device history') parser_history.add_argument('mac', type=valid_miflora_mac) parser_history.set_defaults(func=clear_history) args = parser.parse_args() if args.verbose: logging.basicConfig(level=journalisation. DÉBOGUER) Si ce n’est pas Hasattr(args, "Fonctions"): parser.print_help() sys.exit(0) args.func(args) if __name__ == '__main__': principal()
Si tu veux, Je vous laisse le code dont vous aurez besoin dans MySQL pour créer cette table, ce qui, en fin de compte, est très simple, A 7 Champs, l’endroit où le nom de la plante est entreposé ;, Température, Humidité, Lumière dans les luxes, Conductivité, ce qu’il reste de la batterie et la date à laquelle elle a été vérifiée.
CRÉER UNE TABLE 'PLANTES' ( 'name' CHAR(20) NULL COLLATE 'utf8mb4_general_ci', 'température' FLOAT NULL, 'humidité' FLOAT NULL, 'light' FLOAT NULL, 'conductivité' FLOAT NULL, 'batterie' FLOAT NULL, 'date' horodatage non null CURRENT_TIMESTAMP PAR DÉFAUT LORS DE LA MISE À JOUR CURRENT_TIMESTAMP ) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB ROW_FORMAT=COMPACT ;
Total, que ce que nous allons faire, c’est programmer sur le Raspberry Pi pour exécuter ce script avec une tâche planifiée, par exemple, avec laquelle elle collecte les données tous les 1 Maintenant, cela n’a plus d’importance pour moi, Nous ajoutons dans cron en utilisant 'crontab -e', et à la fin l’adresse MAC bluetooth de votre capteur:
0 * * * * python3 /home/pi/miflora_jardin.py -v sondage C4:7C:8D:6B:1Et:XX 0 * * * * python3 /home/pi/miflora_portulaca.py -v sondage 80:EA:CA:88:E4:XX
Nous devons maintenant collecter ces données avec Home Assistant, comment? Très simple, Avec des requêtes MySQL! Ainsi, dans notre configuration.yaml, nous pouvons ajouter les requêtes suivantes pour chaque étage:
capteur: ... - Plateforme: SQL db_url: Mysql://USUARIO_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD requêtes: - Nom: "Cyclamen - Température" requête: "SELECT temperatura FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;" colonne: 'temperatura' unit_of_measurement: 'ºC' - Plateforme: SQL db_url: Mysql://USUARIO_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD requêtes: - Nom: "Cyclamen - Humidité" requête: "SELECT humedad FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;" colonne: 'humedad' unit_of_measurement: '%' - Plateforme: SQL db_url: Mysql://USUARIO_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD requêtes: - Nom: "Cyclamen - Lumière" requête: "SELECT luz FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;" colonne: 'luz' unit_of_measurement: 'lux' - Plateforme: SQL db_url: Mysql://USUARIO_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD requêtes: - Nom: "Cyclamen - Conductivité" requête: "SELECT conductividad FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;" colonne: 'conductividad' unit_of_measurement: 'Ω' - Plateforme: SQL db_url: Mysql://USUARIO_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD requêtes: - Nom: "Cyclamen - Pile" requête: "SELECT bateria FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;" colonne: 'bateria' unit_of_measurement: '%' ...
Et maintenant, le moment est venu d’ajouter le volet Végétal pour intégrer ces valeurs que nous collectons, et en indiquant à quoi ils correspondent, Nous ajouterions donc quelque chose comme ce qui suit dans configuration.yaml:
Planter: # Cyclamen cyclamen: Capteurs: Humidité: sensor.ciclamen_humedad batterie: sensor.ciclamen_bateria température: conductivité sensor.ciclamen_temperatura: sensor.ciclamen_conductividad luminosité: sensor.ciclamen_luz min_moisture: 15 max_moisture: 75 min_battery: 10 min_conductivity: 250 max_conductivity: 2000 min_temperature: 1 max_temperature: 35 min_brightness: 2000 max_brightness: 40000 check_days: 3
Pas mal, Et quelles valeurs correspondent à celles de notre plante ?? Ici je vous laisse une feuille de calcul Google Où vous pouvez obtenir des informations sur une plante, si ce n’est pas approximativement, vous pouvez les indiquer en cherchant un peu sur San Google.
Comme d'habitude, Après avoir appuyé sur le fichier de configuration, nous redémarrons notre Home Assistant et depuis l’interface utilisateur de Lovelace, nous pouvons ajouter nos cartes avec nos plantes ou fleurs, ou un jardin ou un arbre ou tout ce que nous voulons contrôler. Nous choisissons une carte « Statut de l’usine »’ et nous indiquons l’entité de la plante et! Travaux réalisés. Nous serons désormais en mesure de connaître l’état de nos plantes à tout moment.
Et maintenant, nous avons la cerise sur le gâteau, quand quelque chose se passe qui nous alerte, Par exemple, si l’humidité est faible, Eh bien, c’est parce que la plante se dessèche, quoi de mieux que d’envoyer un Télégramme ou une alerte via nos haut-parleurs domestiques pour nous dire.
Comme d'habitude, Merci si vous êtes arrivé jusqu’au bout et j’espère avoir pu aider, Et merci surtout pour le partage sur les réseaux sociaux et ces likes!