Überwachung der Gesundheit unserer Pflanzen mit Home Assistant

In diesem Kapitel lernen wir, wie wir die Gesundheit unserer Pflanzen auf einfache und kostengünstige Weise kontrollieren können. Wo wir Parameter wie die Luftfeuchtigkeit kennen können, die Temperatur, die Lichtmenge, oder Dünger unter anderem.

gut, Ich denke, dass fast jeder diese Sensoren irgendwann gehört hat, Ich denke, es gibt viele Marken, und am Ende sind sie meistens dasselbe, Ich kenne es als Xiaomi Mi Plant, obwohl Sie es mit jedem Namen wie Flower Care finden können… in Banggood Sie gewähren normalerweise einen Rabatt und für ungefähr 10 € haben Sie ihn.

Die übliche Verwendung ist die App des Schichtherstellers, die die Daten jedes Mal per Bluetooth sammelt, wenn sie mit Ihrem Handy angezeigt werden. In diesem Fall mit einem Home Assistant ohne Bluetooth, da es in meinem Fall als virtuelle Maschine läuft, weil es schwierig ist, mit dem Sensor von früher zu sprechen. Also, indem mehrere Himbeer-Pi im Haus verstreut sind, auf jedem Himbeer-Pi, der der betreffenden Pflanze am nächsten liegt, Dies ist derjenige, der mit dem Sensor verbunden ist, Daten per Bluetooth sammeln, und ich habe sie in einer Datenbank gespeichert, die ich dort von MySQL / MariaDB habe; Es ist auch wahr, dass Sie die Daten per MQTT senden können, wenn Sie die Datenbank überspringen möchten, aber ich bin ein Vermächtnis, st Es hängt ein wenig von der Idee ab, die Sie haben. Ich bin sicher, dieser Beitrag wird Ihnen helfen.

sudo hcitool lescan

LE Scan ...
0EIN:4D:49:BA:19:XX (unbekannte)
0EIN:4D:49:BA:19:XX (unbekannte)
54:5F:A0:C4:A5:XX (unbekannte)
0EIN:4D:49:BA:19:XX (unbekannte)
C4:7C:8D:6B:25:XX (unbekannte)
C4:7C:8D:6B:25:XX Blumenpflege
0A:4D:49:BA:19:XX (unbekannte)
54:5F:A0:C4:A5:XX (unbekannte)
...

Jetzt werden wir auf diesem Raspberry Pi das installieren Buchhandlung vom Xiaomi Mi Pflanzensensor für Python, und übrigens den MySQL-Client, den wir brauchen werden:

sudo pip3 installiere miflora
sudo pip3 installiere mysqlclient

Und jetzt fertig, Alles was Sie tun müssen, ist dieses Skript herunterzuladen, Ich erinnere mich nicht gut, woher ich es habe, um ihm für immer zu danken. Wenn Sie sich die Linie genau ansehen 47 Ich habe einige Zeilen hinzugefügt, damit die gesammelten Daten auf dem MySQL-Server gespeichert werden, Geben Sie Ihre Daten ein, sowie den Namen der Pflanze.

#!/usr / bin / env python3
"""Demo-Datei zur Verwendung der Miflora-Bibliothek."""

Argparse importieren
import re
Protokollierung importieren
sys importieren
MySQLdb importieren

aus btlewrap import available_backends, BluepyBackend, GatttoolBackend, PygattBackend

aus miflora.miflora_poller MiFloraPoller importieren, \
    MI_CONDUCTIVITY, MI_MOISTURE, MI_LIGHT, MI_TEMPERATURE, MI_BATTERY
aus miflora importieren miflora_scanner

def valid_miflora_mac(Mac, pat = re.compile(r"80:SIE:CA:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}")):
    """Suchen Sie nach gültigen Mac-Adressen."""
    wenn nicht pat.match(mac.upper()):
        argparse.ArgumentTypeError auslösen('Die MAC-Adresse "{}" scheint im falschen Format zu sein(Mac))
    Mac zurückgeben

def Umfrage(args):
    """Daten vom Sensor abfragen."""
    backend = _get_backend(args)
    poller = MiFloraPoller(args.mac, Backend)
    #drucken("Daten von Mi Flora abrufen")
    #drucken("FW: {}".Format(poller.firmware_version()))
    drucken("Name: {}".Format(poller.name()))
    drucken("Temperatur: {}".Format(poller.parameter_value(MI_TEMPERATURE)))
    drucken("Feuchtigkeit: {}".Format(poller.parameter_value(MI_MOISTURE)))
    drucken("Licht: {}".Format(poller.parameter_value(MI_LIGHT)))
    drucken("Leitfähigkeit: {}".Format(poller.parameter_value(MI_CONDUCTIVITY)))
    drucken("Batterie: {}".Format(poller.parameter_value(MI_BATTERY)))
    name = (poller.name())
    Temperatur = (poller.parameter_value(MI_TEMPERATURE))
    Luftfeuchtigkeit = (poller.parameter_value(MI_MOISTURE))
    Licht = (poller.parameter_value(MI_LIGHT))
    Leitfähigkeit = (poller.parameter_value(MI_CONDUCTIVITY))
    Batterie = (poller.parameter_value(MI_BATTERY))
    drucken (Name)
    drucken (Temperatur)
    drucken (Luftfeuchtigkeit)
    drucken (Licht)
    drucken (Leitfähigkeit)
    drucken (Schlagzeug)
    name = "PFLANZENNAME"
    db = MySQLdb.connect("MYSQL_SERVER_IP_ADDRESS","USER_BD","PASSWORD_BD","NAME_BD")
    cursor = db.cursor()
    cursor.execute("""INSERT IN plantas (Name,Temperatur,Luftfeuchtigkeit,Licht,Leitfähigkeit,Schlagzeug) WERTE (%s,%s,%s,%s,%s,%s) """,(Name,Temperatur,Luftfeuchtigkeit,Licht,Leitfähigkeit,Schlagzeug))
    db.commit()

def scan(args):
    """Nach Sensoren suchen."""
    backend = _get_backend(args)
    drucken('Scannen nach 10 Sekunden ... ')
    Geräte = miflora_scanner.scan(Backend, 10)
    drucken('Gefunden {} Geräte:'.Format(nur(Geräte)))
    für Gerät in Geräten:
        drucken('  {}'.Format(Gerät))

def _get_backend(args):
    """Extrahieren Sie die Backend-Klasse aus den Befehlszeilenargumenten."""
    if args.backend == 'gatttool':
        backend = GatttoolBackend
    elif args.backend == 'bluepy':
        backend = BluepyBackend
    elif args.backend == 'pygatt':
        backend = PygattBackend
    sonst:
        Ausnahme auslösen('unbekanntes Backend: {}'.Format(args.backend))
    Backend zurück


def list_backends(_):
    """Listen Sie alle verfügbaren Backends auf."""
    Backends = [b .__ name__ für b in available_backends()]
    drucken(' n'.join(Backends))


def Geschichte(args):
    """Lesen Sie den Verlauf vom Sensor."""
    backend = _get_backend(args)
    drucken("Geschichte vom Sensor abrufen ...")
    poller = MiFloraPoller(args.mac, Backend)
    history_list = poller.fetch_history()
    drucken('Die Geschichte kehrte zurück {} Einträge. '. Format(nur(history_list)))
    für den Eintrag in history_list:
        drucken('Geschichte von {}'.Format(entry.wall_time))
        drucken("    Temperatur: {}".Format(Eintragstemperatur))
        drucken("    Feuchtigkeit: {}".Format(entry.moisture))
        drucken("    Licht: {}".Format(entry.light))
        drucken("    Leitfähigkeit: {}".Format(entry.conductivity))


def clear_history(args):
    """Löschen Sie den Sensorverlauf."""
    backend = _get_backend(args)
    drucken('Sensorverlaufsdaten löschen ...')
    poller = MiFloraPoller(args.mac, Backend)
    poller.clear_history()


def main():
    """Hauptfunktion.

    Meistens werden die Befehlszeilenargumente analysiert.
    """
    parser = argparse.ArgumentParser()
    parser.add_argument('--backend', Auswahlmöglichkeiten =['gatttool', 'bluepy', 'pygatt'], default = 'gatttool')
    parser.add_argument('-v', '--verbose', action = 'store_const', const = True)
    subparsers = parser.add_subparsers(help = 'Unterbefehlshilfe', )

    parser_poll = subparsers.add_parser('Umfrage', help = 'Daten von einem Sensor abfragen')
    parser_poll.add_argument('Mac', type = valid_miflora_mac)
    parser_poll.set_defaults(func = Umfrage)

    parser_scan = subparsers.add_parser('Scan', help = 'Nach Geräten suchen')
    parser_scan.set_defaults(func = scan)

    parser_scan = subparsers.add_parser('Backends', help = 'Liste der verfügbaren Backends')
    parser_scan.set_defaults(func = list_backends)

    parser_history = subparsers.add_parser('Geschichte', help = 'Geräteverlauf abrufen')
    parser_history.add_argument('Mac', type = valid_miflora_mac)
    parser_history.set_defaults(func = geschichte)

    parser_history = subparsers.add_parser("klare Geschichte", help = 'Geräteverlauf löschen')
    parser_history.add_argument('Mac', type = valid_miflora_mac)
    parser_history.set_defaults(func = clear_history)

    args = parser.parse_args()

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

    wenn nicht hasattr(args, "func"):
        parser.print_help()
        sys.exit(0)

    args.func(args)

if __name__ == '__main__':
    Main()

Wenn Sie möchten,, Ich überlasse Ihnen den Code, den Sie in MySQL benötigen, um diese Tabelle zu erstellen, was am Ende sehr einfach ist, Sie haben 7 Felder, wo der Pflanzenname gespeichert ist, die Temperatur, Feuchtigkeit, Licht in Lux, Leitfähigkeit, Was ist von der Batterie übrig und das Datum, an dem Sie die Prüfung durchgeführt haben?.

TABELLE ERSTELLEN `plantas` (
    `name` CHAR(20) NULL COLLATE 'utf8mb4_general_ci',
    `temperatura` FLOAT NULL,
    `humedad` FLOAT NULL,
    `luz` FLOAT NULL,
    `Leitfähigkeit` FLOAT NULL,
    `bateria` FLOAT NULL,
    `fecha` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
COLLATE = 'utf8mb4_general_ci'
ENGINE = InnoDB
ROW_FORMAT = COMPACT
;

Gesamt, Wir programmieren den Raspberry Pi so, dass dieses Skript mit einer geplanten Aufgabe ausgeführt wird, Zum Beispiel, mit denen Sie jeweils die Daten sammeln 1 Zeit für mich, füge cron mit 'crontab -e' hinzu, und am Ende die Bluetooth-MAC-Adresse Ihres Sensors:

0 * * * * python3 /home/pi/miflora_jardin.py -v Umfrage C4:7C:8D:6B:1E:XX
0 * * * * python3 /home/pi/miflora_portulaca.py -v Umfrage 80:SIE:CA:88:E4:XX

Jetzt müssen wir diese Daten mit Home Assistant sammeln, Wie? sehr einfach, ¡con consultas mysql! Así que en nuestro configuration.yaml podemos añadir de cada planta las siguientes consultas:

Sensor:
...
  - Plattform: sql
    db_url: mysql://USER_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD
    queries:
      - Name: "Ciclamen - Temperatur"
        query: "SELECT temperatura FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        column: 'temperatura'
        unit_of_measurement: 'ºC'

  - Plattform: sql
    db_url: mysql://USER_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD
    queries:
      - Name: "Ciclamen - Feuchtigkeit"
        query: "SELECT humedad FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        column: 'humedad'
        unit_of_measurement: '%'

  - Plattform: sql
    db_url: mysql://USER_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD
    queries:
      - Name: "Ciclamen - Luz"
        query: "SELECT luz FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        column: 'luz'
        unit_of_measurement: 'lux'

  - Plattform: sql
    db_url: mysql://USER_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD
    queries:
      - Name: "Ciclamen - Conductividad"
        query: "SELECT conductividad FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        column: 'conductividad'
        unit_of_measurement: 'Ω'

  - Plattform: sql
    db_url: mysql://USER_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD
    queries:
      - Name: "Ciclamen - Schlagzeug"
        query: "SELECT bateria FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        column: 'bateria'
        unit_of_measurement: '%'
...

Y ahora sí llegó el momento de añadir el componente de Plant para integrar estos valores que estamos recogiendo, e indicando a qué le corresponden, así que añadiríamos algo como lo siguiente en configuration.yaml:

plant:
  # Cyclamen
  ciclamen:
    Sensoren:
      moisture: sensor.ciclamen_humedad
      battery: sensor.ciclamen_bateria
      temperature: sensor.ciclamen_temperatura
      conductivity: sensor.ciclamen_conductividad
      brightness: 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

gut, ¿y qué valores corresponden con los de nuestra planta? Aquí os dejo eine Google-Tabelle Hier können Sie Informationen über eine Pflanze erhalten, Wenn nicht ungefähr, können Sie sie angeben, indem Sie ein wenig in San Google suchen.

wie immer, nach dem Berühren der Konfigurationsdatei, Wir starten unseren Home Assistant neu und können über die Lovelace-Benutzeroberfläche jetzt unsere Karten mit unseren Pflanzen oder Blumen hinzufügen, oder Garten oder Baum oder was auch immer wir kontrollieren wollen. Wir wählen eine Anlagenstatuskarte’ und wir geben die Entität der Pflanze an und wow! Arbeit erledigt. Wir können den Zustand unserer Pflanzen bereits jederzeit kennen.

Und jetzt haben wir das i-Tüpfelchen, Gehen Sie das, wenn etwas passiert, das uns alarmiert, zum Beispiel, wenn die Luftfeuchtigkeit niedrig ist, Nun, das ist die Pflanze, die austrocknet, Was gibt es Schöneres, als ein Telegramm oder eine Warnung über unsere Heimlautsprecher zu senden, um uns dies mitzuteilen.

wie immer, Vielen Dank, wenn Sie am Ende angekommen sind und hoffen, helfen zu können, und vielen Dank vor allem für das Teilen in sozialen Netzwerken und dergleichen!