Monitorare lo stato di salute delle nostre piante con Home Assistant

In questo capitolo impareremo come controllare la salute delle nostre piante in modo semplice ed economico. Dove possiamo conoscere parametri come l'umidità che ha, Temperatura, La quantità di luce, o fertilizzante tra gli altri.

Non male, Penso che quasi tutti voi abbiate sentito questi sensori ad un certo punto, Penso che ci siano molti marchi e di solito sono la stessa cosa alla fine, Lo conosco come Xiaomi Mi Plant, anche se puoi trovarlo con qualsiasi nome come Flower Care… in Banggood Di solito mettono uno sconto e per circa 10€ ce l'hai.

L'utilizzo abituale sarebbe con l'app del produttore di turno che raccoglie i dati tramite bluetooth ogni volta che viene visto con il tuo cellulare. In questo caso avendo un Home Assistant che non dispone di bluetooth, poiché nel mio caso funziona come una macchina virtuale perché è difficile parlare con il sensore. Quindi, avendo diversi Raspberry Pis sparsi per casa, su ogni Raspberry Pi che si avvicina di più alla pianta in questione, che sarà quello che si collegherà con il sensore, Raccogli dati tramite Bluetooth, e memorizzarli in un database che ho in giro da MySQL/MariaDB; è anche vero che se si vuole saltare il database si potrebbero inviare i dati tramite MQTT, Ma io sono un'eredità, di memorizzare le cose in BD tradizionale 🙂 Dipende un po 'dall'idea che hai, sono sicuro che questo post ti aiuterà.

sudo ha fatto strumento inutile lescan LE Scan ...
0A:4D:49:BA:19:XX (sconosciuto)
0A:4D:49:BA:19:XX (sconosciuto)
54:5F:A0:C4:A5:XX (sconosciuto)
0A:4D:49:BA:19:XX (sconosciuto)
C4:7C:8D:6B:25:XX (sconosciuto)
C4:7C:8D:6B:25:XX Cura dei fiori 0A:4D:49:BA:19:XX (sconosciuto)
54:5F:A0:C4:A5:XX (sconosciuto)
...

Ora stiamo per installare su quel Raspberry Pi il libreria Sensore per piante Mi di Xiaomi per Python, E già che ci sei, il client MySQL di cui avremo bisogno:

Sudo PiP3 Installa Miflora Sudo PiP3 Installa MySQLCLIENT

E ora è tutto, Tutto ciò che ti resta da fare è scaricare questo script, Non ricordo da dove l'ho preso per ringraziarlo eternamente. Se guardi attentamente la linea 47 Ho aggiunto alcune righe in modo che i dati raccolti vengano memorizzati su quel server MySQL, Inserisci i tuoi dati, così come il nome della pianta.

#!/usr/bin/env python3
"""File dimostrativo che mostra come utilizzare la libreria miflora."""

import argparse import re import logging import sys import MySQLdb da btlewrap import available_backends, BluepyBackend, GatttoolBackend, PygattBackend da miflora.miflora_poller importazione MiFloraPoller, \
    MI_CONDUCTIVITY, MI_MOISTURE, MI_LIGHT, MI_TEMPERATURE, MI_BATTERY da Miflora import miflora_scanner Def valid_miflora_mac(Mac, pat=re.compile(r"80:EA:Corrente alternata:[0-9F]{2}:[0-9F]{2}:[0-9F]{2}")):
    """Verificare la presenza di indirizzi mac validi."""
    se non pat.match(mac.upper()):
        Solleva argparse. ArgumentTypeError('The MAC address "{}" seems to be in the wrong format'.format(Mac))
    ritorna il poll mac def(argomenti):
    """Interroga i dati dal sensore."""
    backend = _get_backend(argomenti)
    poller = MiFloraPoller(argomenti.mac, di backend)
    #Stampare("Ottenere dati da Mi Flora")
    #Stampare("FW: {}".formato(poller.firmware_version()))
    Stampare("Nome: {}".formato(poller.name()))
    Stampare("Temperatura: {}".formato(poller.parameter_value(MI_TEMPERATURE)))
    Stampare("Umidità: {}".formato(poller.parameter_value(MI_MOISTURE)))
    Stampare("Leggero: {}".formato(poller.parameter_value(MI_LIGHT)))
    Stampare("Conduttività: {}".formato(poller.parameter_value(MI_CONDUCTIVITY)))
    Stampare("Batteria: {}".formato(poller.parameter_value(MI_BATTERY)))
    nombre = (poller.name())
    temperatura = (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))
    Stampare (nome)
    Stampare (temperatura)
    Stampare (umidità)
    Stampare (Leggero)
    Stampare (condotto)
    Stampare (Batteria)
    nombre = "NOMBRE_DE_LA_PLANTA"
    db = MySQLdb.connect("DIRECCION_IP_SERVIDOR_MYSQL","USUARIO_BD","CONTRASEÑA_BD","NOMBRE_BD")
    cursore = db.cursore()
    cursore.execute("""INSERIRE NELLE plantas (nome,temperatura,umidità,Leggero,condotto,Batteria) VALORI (%s,%s,%s,%s,%s,%s) """,(nome,temperatura,umidità,Leggero,condotto,Batteria))
    db.commit()

scansione def(argomenti):
    """Cerca i sensori."""
    backend = _get_backend(argomenti)
    Stampare('Scanning for 10 seconds...')
    dispositivi = miflora_scanner.scan(di backend, 10)
    Stampare('Found {} Dispositivi:'.format(Len(Dispositivi)))
    per dispositivo nei dispositivi:
        Stampare('  {}'.format(dispositivo))

def _get_backend(argomenti):
    """Estrarre la classe back-end dagli argomenti della riga di comando."""
    if args.backend == 'gatttool':
        backend = GatttoolBackend
    elif args.backend == 'bluepy':
        backend = BluepyBackend
    elif args.backend == 'pygatt':
        backend = PygattBackend altro:
        sollevare l'eccezione('unknown backend: {}'.format(args.backend))
    ritorno backend def list_backends(_):
    """Elenca tutti i backend disponibili."""
    backend = [b.__name__ per b in available_backends()]
    Stampare('\n'.join(back-end))


Storia della def(argomenti):
    """Leggi la cronologia dal sensore."""
    backend = _get_backend(argomenti)
    Stampare('Getting history from sensor...')
    poller = MiFloraPoller(argomenti.mac, di backend)
    history_list = poller.fetch_history()
    Stampare('History returned {} entries.'.format(Len(history_list)))
    per l'ingresso in history_list:
        Stampare('History from {}'.format(entry.wall_time))
        Stampare("    Temperatura: {}".formato(di ingresso.temperatura))
        Stampare("    Umidità: {}".formato(entrata.umidità))
        Stampare("    Leggero: {}".formato(ingresso.luce))
        Stampare("    Conduttività: {}".formato(di entrata.conduttività))


def clear_history(argomenti):
    """Cancella la cronologia del sensore."""
    backend = _get_backend(argomenti)
    Stampare('Deleting sensor history data...')
    poller = MiFloraPoller(argomenti.mac, di backend)
    poller.clear_history()


def principale():
    """Funzione principale.

    Principalmente l'analisi degli argomenti della riga di comando.
    """
    parser = argparse. ArgumentParser()
    parser.add_argument('--backend', scelte=['gatttool', 'bluepy', 'pygatt'], default='gatttool')
    parser.add_argument('-v', '--verbose', action='store_const', const=Vero)
    sottoparser = parser.add_subparsers(help='sub-command help', )

    parser_poll = subparsers.add_parser('poll', help='poll data from a sensor')
    parser_poll.aggiungi_argomento('mac', tipo=valid_miflora_mac)
    parser_poll.set_defaults(func=sondaggio)

    parser_scan = subparsers.add_parser('scan', help='scan for devices')
    parser_scan.set_defaults(func=scansione)

    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.aggiungi_argomento('mac', tipo=valid_miflora_mac)
    parser_history.set_defaults(func=storia)

    parser_history = subparsers.add_parser('clear-history', help='clear device history')
    parser_history.aggiungi_argomento('mac', tipo=valid_miflora_mac)
    parser_history.set_defaults(func=clear_history)

    argomenti = parser.parse_args()

    if args.verbose:
        logging.basicConfig(level=logging. DEBUG)

    se non hasattr(argomenti, "func"):
        parser.print_help()
        sys.exit(0)

    args.func(argomenti)

if __name__ == '__main__':
    principale()

Si queréis, os dejo el código que necesitaréis en MySQL para crear esta tabla, que al final es muy sencilla, Ha 7 Campi, Donde se almacena el nombre de la planta, Temperatura, La Humedad, la luz en luxes, la conductividad, Lo que le queda de batería y la fecha de cuando hizo el chequeo.

CREA TABELLA 'piante' (
    'nome' CHAR(20) NULL COLLATE 'utf8mb4_general_ci',
    'temperatura' GALLEGGIANTE NULLO,
    GALLEGGIANTE 'umidità' NULL,
    'leggero' GALLEGGIANTE NULLO,
    'conducibilità' FLOAT NULL,
    'batteria' GALLEGGIANTE NULLO,
    'date' TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
;

Totale, che quello che faremo è programmare sul Raspberry Pi per eseguire questo script con un'attività pianificata, ad esempio, con cui raccoglie i dati ogni 1 Ora non mi importa, Aggiungiamo cron usando 'crontab -e', e alla fine l'indirizzo MAC bluetooth del tuo sensore:

0 * * * * python3 /home/pi/miflora_jardin.py -v sondaggio C4:7C:8D:6B:1E:XX
0 * * * * python3 /home/pi/miflora_portulaca.py -v poll 80:EA:Corrente alternata:88:E4:XX

Ora dobbiamo raccogliere questi dati con Home Assistant, come? Molto semplice, Con le query MySQL! Quindi nel nostro configuration.yaml possiamo aggiungere le seguenti query per ogni piano:

sensore:
...
  - Piattaforma: SQL db_url: Mysql://USUARIO_BD:Query CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD:
      - Nome: "Ciclamen - Temperatura"
        quesito: "SELECT temperatura FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        colonna: 'temperatura'
        unit_of_measurement: 'ºC'

  - Piattaforma: SQL db_url: Mysql://USUARIO_BD:Query CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD:
      - Nome: "Ciclamen - Humedad"
        quesito: "SELECT humedad FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        colonna: 'humedad'
        unit_of_measurement: '%'

  - Piattaforma: SQL db_url: Mysql://USUARIO_BD:Query CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD:
      - Nome: "Ciclamen - Luz"
        quesito: "SELECT luz FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        colonna: 'luz'
        unit_of_measurement: 'lux'

  - Piattaforma: SQL db_url: Mysql://USUARIO_BD:Query CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD:
      - Nome: "Ciclamen - Conductividad"
        quesito: "SELECT conductividad FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        colonna: 'conductividad'
        unit_of_measurement: 'Ω'

  - Piattaforma: SQL db_url: Mysql://USUARIO_BD:Query CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD:
      - Nome: "Ciclamen - Batteria"
        quesito: "SELECT bateria FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        colonna: 'bateria'
        unit_of_measurement: '%'
...

E ora è arrivato il momento di aggiungere la componente Plant per integrare questi valori che stiamo raccogliendo, e indicando a cosa corrispondono, Quindi aggiungeremmo qualcosa di simile al seguente in configuration.yaml:

Pianta:
  # Ciclamino ciclamino:
    sensori:
      Umidità: sensor.ciclamen_humedad batteria: sensor.ciclamen_bateria temperatura: sensor.ciclamen_temperatura conducibilità: 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

Non male, E quali valori corrispondono a quelli del nostro impianto?? Qui ti lascio un foglio di Google Spreadsheet Dove puoi ottenere informazioni su una pianta, se non approssimativamente puoi indicarli cercando un po' su San Google.

Come al solito, Dopo aver toccato il file di configurazione, riavviamo il nostro Home Assistant e dall'interfaccia utente di Lovelace possiamo aggiungere le nostre carte con le nostre piante o fiori, o giardino o albero o qualsiasi cosa vogliamo controllare. Scegliamo una carta "Stato dell'impianto"’ e indichiamo l'entità dell'impianto e! Lavoro svolto. Ora saremo in grado di conoscere in ogni momento lo stato dei nostri impianti.

E ora abbiamo la ciliegina sulla torta, quando succede qualcosa che ci allerta, Per esempio, se l'umidità è bassa, Bene, questo perché la pianta si sta prosciugando, cosa c'è di meglio che inviare un Telegram o un avviso attraverso i nostri altoparlanti di casa per dircelo.

Come al solito, Grazie se sei arrivato alla fine e spero di essere stato in grado di aiutare, E grazie soprattutto per la condivisione sui social network e quei like!

Post consigliati

Autore

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, Non esitate a contattarmi, Cercherò di aiutarti ogni volta che potrò, Condividere è vivere ;) . Goditi i documenti!!!