Überwachung der Gesundheit unserer Pflanzen mit Home Assistant

Druckfreundlich, PDF & Email

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, Temperatur, Die Lichtmenge, oder Dünger unter anderem.

Nicht schlecht, Ich denke, fast jeder von Ihnen hat diese Sensoren schon einmal gehört, Ich denke, es gibt viele Marken und sie sind am Ende meist das Gleiche, Ich kenne es als Xiaomi Mi Plant, obwohl Sie es unter jedem Namen wie Flower Care finden können… in Knallgut Sie setzen in der Regel einen Rabatt und für ca. 10 € haben Sie es.

Die übliche Nutzung wäre mit der App des diensthabenden Herstellers, die die Daten jedes Mal per Bluetooth sammelt, wenn sie mit Ihrem Handy gesehen werden. In diesem Fall mit einem Home Assistant, der nicht über Bluetooth verfügt, da es in meinem Fall wie eine virtuelle Maschine läuft, weil es schwierig ist, mit dem Sensor zu kommunizieren. Indem Sie also mehrere Raspberry Pis im Haus verstreut haben, auf jedem Raspberry Pi, der der betreffenden Pflanze am nächsten ist, Das ist derjenige, der mit dem Sensor verbunden ist, Sammeln Sie Daten über Bluetooth, und speichere sie in einer Datenbank, die ich von MySQL/MariaDB herumliegen habe; Es ist auch wahr, dass Sie, wenn Sie die Datenbank überspringen möchten, die Daten per MQTT senden können, Aber ich bin ein Vermächtnis, der Aufbewahrung von Dingen in traditioneller 🙂 BD Es hängt ein wenig von der Idee ab, die Sie haben Ich bin sicher, dass dieser Beitrag Ihnen helfen wird.

sudo did nutzloses Tool lescan LE Scan ...
0An:4D:49:BA:19:XX (unbekannt)
0An:4D:49:BA:19:XX (unbekannt)
54:5F:A0:Nr. C4:A5:XX (unbekannt)
0An:4D:49:BA:19:XX (unbekannt)
Nr. C4:7C:8D:6B:25:XX (unbekannt)
Nr. C4:7C:8D:6B:25:XX Blumenpflege 0A:4D:49:BA:19:XX (unbekannt)
54:5F:A0:Nr. C4:A5:XX (unbekannt)
...

Jetzt installieren wir auf diesem Raspberry Pi die Buchhandlung Xiaomis Mi-Pflanzensensor für Python, Und wenn Sie schon dabei sind, der MySQL-Client, den wir brauchen:

Sudo PiP3 Miflora installieren Sudo PiP3 MySQLCLIENT installieren

Und das war's jetzt, Alles, was Sie noch tun müssen, ist, dieses Skript herunterzuladen, Ich weiß nicht mehr, woher ich es hatte, ihm ewig zu danken. Wenn man sich die Linie genau anschaut 47 Ich habe ein paar Zeilen hinzugefügt, damit die gesammelten Daten auf diesem MySQL-Server gespeichert werden, Geben Sie Ihre Daten ein, sowie den Namen der Pflanze.

#!/usr/bin/env python3
"""Demo-Datei, die zeigt, wie man die miflora-Bibliothek benutzt."""

import argparse import re import logging import sys import MySQLdb from btlewrap import available_backends, BluepyBackend, GatttoolBackend, PygattBackend aus miflora.miflora_poller MiFloraPoller importieren, \
    MI_CONDUCTIVITY, MI_MOISTURE, MI_LIGHT, MI_TEMPERATURE, MI_BATTERY von miflora import miflora_scanner def valid_miflora_mac(mac, pat=re.compile(r"80:EA:WECHSELSTROM:[0-9F]{2}:[0-9F]{2}:[0-9F]{2}")):
    """Überprüfen Sie, ob gültige MAC-Adressen vorhanden sind."""
    Wenn nicht, pat.match(mac.upper()):
        raise argparse. ArgumentTypeError('The MAC address "{}" seems to be in the wrong format'.format(mac))
    MAC DEF-Umfrage zurückgeben(Argumente):
    """Fragt die Daten vom Sensor ab."""
    Backend = _get_backend(Argumente)
    poller = MiFloraPoller(args.mac, Backend)
    #drucken("Abrufen von Daten von Mi Flora")
    #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)))
    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))
    drucken (nombre)
    drucken (temperatura)
    drucken (Feuchtigkeit)
    drucken (Licht)
    drucken (conductividad)
    drucken (Batterie)
    nombre = "NOMBRE_DE_LA_PLANTA"
    db = MySQLdb.connect("DIRECCION_IP_SERVIDOR_MYSQL","USUARIO_BD","CONTRASEÑA_BD","NOMBRE_BD")
    cursor = db.cursor()
    cursor.execute("""IN plantas EINSETZEN (nombre,temperatura,Feuchtigkeit,Licht,conductividad,Batterie) WERTE (%s,%s,%s,%s,%s,%s) """,(nombre,temperatura,Feuchtigkeit,Licht,conductividad,Batterie))
    db.commit()

DEF-Scan(Argumente):
    """Nach Sensoren suchen."""
    Backend = _get_backend(Argumente)
    drucken('Scanning for 10 seconds...')
    devices = miflora_scanner.scan(Backend, 10)
    drucken('Found {} Geräte:'.format(Len(Geräte)))
    für Gerät in Geräten:
        drucken('  {}'.format(Gerät))

def _get_backend(Argumente):
    """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('unknown backend: {}'.format(args.backend))
    return backend def list_backends(_):
    """Listet alle verfügbaren Backends auf."""
    backends = [b.__name__ für b in available_backends()]
    drucken('\n'.join(Backend))


def Geschichte(Argumente):
    """Lesen Sie die Historie vom Sensor aus."""
    Backend = _get_backend(Argumente)
    drucken('Getting history from sensor...')
    poller = MiFloraPoller(args.mac, Backend)
    history_list = poller.fetch_history()
    drucken('History returned {} entries.'.format(Len(history_list)))
    für die Einreise in history_list:
        drucken('History from {}'.format(entry.wall_time))
        drucken("    Temperatur: {}".Format(Eingang.Temperatur))
        drucken("    Feuchtigkeit: {}".Format(entry.moisture))
        drucken("    Licht: {}".Format(Eingang.Licht))
        drucken("    Leitfähigkeit: {}".Format(entry.leitfähigkeit))


def clear_history(Argumente):
    """Löschen Sie den Sensorverlauf."""
    Backend = _get_backend(Argumente)
    drucken('Deleting sensor history data...')
    poller = MiFloraPoller(args.mac, Backend)
    poller.clear_history()


def main():
    """Hauptfunktion.

    Hauptsächlich Parsen der Befehlszeilenargumente.
    """
    parser = argparse. ArgumentParser()
    parser.add_argument('--backend', choices=['gatttool', 'bluepy', 'pygatt'], default='gatttool')
    parser.add_argument('-v', '--verbose', action='store_const', const=Wahr)
    Subparser = 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=Umfrage)

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

    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=Geschichte)

    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)

    Argumente = parser.parse_args()

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

    Wenn nicht hasattr(Argumente, "func"):
        parser.print_help()
        sys.exit(0)

    args.func(Argumente)

if __name__ == '__main__':
    hauptsächlich()

Si queréis, os dejo el código que necesitaréis en MySQL para crear esta tabla, que al final es muy sencilla, Hat 7 Felder, Donde se Almacena el nombre de la planta, Temperatur, La Humedad, La Luz en Luxes, la conductividad, Was ist von der Batterie übrig geblieben und das Datum, an dem sie überprüft wurde.

TABELLE 'Pflanzen' ERSTELLEN (
    'name' ZEICHEN(20) NULL COLLATE 'utf8mb4_general_ci',
    'Temperatur' FLOAT NULL,
    'Feuchtigkeit' FLOAT NULL,
    'light' FLOAT NULL,
    'Leitfähigkeit' FLOAT NULL,
    'Batterie' FLOAT NULL,
    'date' TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
;

Gesamt, dass wir auf dem Raspberry Pi programmieren werden, um dieses Skript mit einer geplanten Aufgabe auszuführen, zum Beispiel, mit dem es die Daten alle 1 Jetzt ist es mir egal, Wir fügen cron mit 'crontab -e' hinzu, und am Ende die Bluetooth-MAC-Adresse Ihres Sensors:

0 * * * * python3 /home/pi/miflora_jardin.py -v Abfrage C4:7C:8D:6B:1Und:XX
0 * * * * python3 /home/pi/miflora_portulaca.py -v Abfrage 80:EA:WECHSELSTROM:88:E4:XX

Jetzt müssen wir diese Daten mit Home Assistant sammeln, wie? Sehr einfach, Mit MySQL-Abfragen! In unserer configuration.yaml können wir also die folgenden Abfragen für jedes Stockwerk hinzufügen:

Sensor:
...
  - Bahnsteig: SQL db_url: MySQL (Englisch)://USUARIO_BD:Abfragen CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD:
      - Name: "Alpenveilchen - Temperatur"
        Frage: "SELECT temperatura FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        Spalte: 'temperatura'
        unit_of_measurement: 'ºC'

  - Bahnsteig: SQL db_url: MySQL (Englisch)://USUARIO_BD:Abfragen CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD:
      - Name: "Alpenveilchen - Feuchtigkeit"
        Frage: "SELECT humedad FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        Spalte: 'humedad'
        unit_of_measurement: '%'

  - Bahnsteig: SQL db_url: MySQL (Englisch)://USUARIO_BD:Abfragen CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD:
      - Name: "Alpenveilchen - Licht"
        Frage: "SELECT luz FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        Spalte: 'luz'
        unit_of_measurement: 'lux'

  - Bahnsteig: SQL db_url: MySQL (Englisch)://USUARIO_BD:Abfragen CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD:
      - Name: "Alpenveilchen - Leitfähigkeit"
        Frage: "SELECT conductividad FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        Spalte: 'conductividad'
        unit_of_measurement: 'Ω'

  - Bahnsteig: SQL db_url: MySQL (Englisch)://USUARIO_BD:Abfragen CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD:
      - Name: "Alpenveilchen - Batterie"
        Frage: "SELECT bateria FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;"
        Spalte: 'bateria'
        unit_of_measurement: '%'
...

Und jetzt ist es an der Zeit, die Pflanzenkomponente hinzuzufügen, um diese Werte, die wir sammeln, zu integrieren, und geben an, worauf sie sich beziehen, Wir würden also etwas wie das Folgende in configuration.yaml hinzufügen:

Pflanze:
  # Alpenveilchen Alpenveilchen:
    Sensoren:
      Feuchtigkeit: sensor.ciclamen_humedad Akku: sensor.ciclamen_bateria Temperatur: sensor.ciclamen_temperatura Leitfähigkeit: sensor.ciclamen_conductividad Helligkeit: 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

Nicht schlecht, Und welche Werte entsprechen denen unserer Anlage?? Hier verlasse ich dich ein Google Spreadsheet-Blatt wo Sie Informationen über eine Pflanze erhalten können, wenn nicht annähernd, können Sie sie angeben, indem Sie ein wenig bei San Google suchen.

Wie gewöhnlich, Nachdem Sie auf Konfigurationsdatei getippt haben, Wir starten unseren Home Assistant neu und über die Lovelace-Benutzeroberfläche können wir unsere Karten mit unseren Pflanzen oder Blumen hinzufügen, oder Garten oder Baum oder was auch immer wir kontrollieren wollen. Wir wählen eine "Plant Status"-Karte’ und wir geben die Entität der Pflanze an und! Geleistete Arbeit. Wir werden nun jederzeit in der Lage sein, den Status unserer Anlagen zu kennen.

Und jetzt haben wir das i-Tüpfelchen, Wenn etwas passiert, das uns alarmiert, Zum Beispiel, wenn die Luftfeuchtigkeit niedrig ist, Nun, das liegt daran, dass die Pflanze austrocknet, was gibt es Besseres, als ein Telegramm oder eine Benachrichtigung über unsere Heimlautsprecher zu senden, um uns mitzuteilen.

Wie gewöhnlich, Vielen Dank, wenn Sie es bis zum Ende geschafft haben und hoffen, dass Sie helfen konnten, Und danke vor allem für das Teilen in sozialen Netzwerken und dergleichen!

Empfohlene Beiträge

Verfasser

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, Zögern Sie nicht, mich zu kontaktieren, Ich werde versuchen, dir zu helfen, wann immer ich kann, Teilen ist Leben ;) . Genießen Sie Dokumente!!!