Flowerberry

July 4, 2020 in debian, linux ‐ 5 min read

Flowerberry ist der von mir frei erfundene Name für dieses Projekt.

Es geht darum Pflanzensensoren über einen Raspberry Pi auszulesen und die Daten in eine InfluxDB zu packen.

Diese wird dann an ein Garafana angeschlossen um die Daten zu visualisieren und Alarm zu schlagen, sollten die Sensoren erkennen, dass der Boden zu trocken ist oder die Pflanze zu kalt.

Diese Anleitung und das Projekt selbst basieren auf diesem Blogbeitrag.

Einkaufsliste

1x Raspberry Pi Zero W

(bis zu) 20x Flower Care Xiaomi Mi Flora 

Vorbereitung

Den Sensor einschalten

Packt die Sensoren aus und öffnet den ersten vorsichtig.

Nehmt einen Fingernagel, eine Plastikkarte oder ein Spezialwerkzeug und hebt den Deckel des Sensors leicht an.

Fahrt dann an der Kante entlang, bis ihr die Kappe abnehmen könnt.

Zieht dann an der Plastiklasche, um den Sensor zu aktivieren.

Raspberry Pi

Gruneinrichtung

Zunächst installiert Ihr das Raspberry Pi OS (ehemals raspbian) Lite image.

dd if if=/Downloads/2020-05-27-raspios-buster-lite-armhf.zip of=/dev/YOUR_SD_CARD bs=1M status=progress

Sorgt dafür, dass er sich mit eurem Wifi verbindet und Ihr euch per SSH mit ihm verbinden könnt.

Wenn Ihr fault seit, schließt einfach einen Monitor und eine Tastatur an den Raspberry an.

Mit dem commandlet raspi-config bekommt Ihr eine leicht verständliches pseudo-grafisches Konfigurationsmenü. 

Findet raus, welche IP Adresse der Pi in eurem Netzwerk bekommen hat und gebt ihm einen statischen Lease.

Meldet euch dann per SSH auf dem Gerät an, ändert das Passwort des Users, ladet euren SSH Key hoch, das übliche halt.

Benötigte Software installieren

Wir benutzten den XaiomiMi-Data-Collector um die Daten einzusammeln.

Klont euch also das Repository.

sudo apt update -y ; sudo apt upgrade -y; sudo apt autoremove -y; apt install git openvpn git clone https://github.com/Zentris/XaiomiMi-Data-Collector

Installiert dann die benötigten Python bibliotheken.

sudo apt install python3-pip sudo pip3 install paho-mqtt sudo pip3 install influxdb sudo pip3 install PyMySQL

Jetzt installieren wir eine lokale Datenbank, mit der das script arbeiten kann.

sudo apt install mariadb-server

SQL Datenbank einrichten

Meldet euch an der Datenbank an legt eine SQL Datenbank, einen User an und gebt dem User Rechte auf die Datenbank.

CREATE DATABASE flowerberry; CREATE USER ‘floweradmin’@’localhost’ IDENTIFIED BY ‘YOUR_PASSWORD_HERE’; GRANT ALL PRIVILEGES ON flowerberry.* TO ‘floweradmin’@’localhost’ IDENTIFIED BY ‘YOUR_PASSWORD_HERE’; FLUSH PRIVILEGES;

Dafür sorgen, dass der Pi mit der InfluxDB reden kann

Sollten sich die InfluxDB und der Pi im gleichen Netzwerk befinden, kann dieser Punkt übersprungen werden.

Da das bei mir allerdings nicht der Fall ist, dokumentiere ich ihn mit.

An dieser Stelle möchte ich das Geniale Script openvpn-install empfehlen.

Es richtet auf einem Linux Server ein OpenVPN Gateway ein und bringt eine Zertifikatsverwaltung mit.

Verschiebt dieses Zertifikat dann auf dem Pi nach /etc/openvpn/ und nennt es client.conf

sudo mv /home/pi/flowerchan.ovpn /etc/openvpn/client.conf

Legt dann die Datei /etc/systemd/system/multi-user.target.wants/openvpn@client.service mit folgendem Inhalt an, um ein systemd unit file zu erzeugen.

[Unit] Description=OpenVPN connection to %i PartOf=openvpn.service ReloadPropagatedFrom=openvpn.service Before=systemd-user-sessions.service After=network-online.target Wants=network-online.target Documentation=man:openvpn(8) Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO

[Service] Type=notify PrivateTmp=true WorkingDirectory=/etc/openvpn ExecStart=/usr/sbin/openvpn –daemon ovpn-%i –status /run/openvpn/%i.status 10 –cd /etc/openvpn –config /etc/openvpn/%i.conf –writepid /run/openvpn/%i.pid PIDFile=/run/openvpn/%i.pid KillMode=process ExecReload=/bin/kill -HUP $MAINPID CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE CAP_AUDIT_WRITE LimitNPROC=100 DeviceAllow=/dev/null rw DeviceAllow=/dev/net/tun rw ProtectSystem=true ProtectHome=true RestartSec=5s Restart=on-failure

[Install] WantedBy=multi-user.target

Anschießend starten wir den service und schauen uns seinen Status an.

sudo systemctl start openvpn@client.service sudo systemctl status openvpn@client.service

Zuletzt müsst Ihr noch in /etc/default/openvpn die Zeile “AUTOSTART=ALL” einkommentieren:

Damit ist sichergestellt, dass der Pi sich wieder ins VPN einwählt, sollte er neu gestartet werden.

Konfiguration anpassen

Den Sensor finden

Meldet euch bei eurem Raspberry an und sucht nach der MAC Adresse eures Sensors.

1 sudo hcitool lescan

Schreibt euch diese MAC auf und markiert euch den Sensor, damit ihr ihn später irgendwie zuordnen könnt.

Wiederholt diesen Vorgang für alle Sensoren.

Konfigurationsdatei anpassen

Ändert in der Datei /home/pi/XaiomiMi-Data-Collector/Raspi/config.cfg folgende Werte:

Eine IP die in eurem LAN erreichbar ist und die MAC Addressen der Sensoren.

pingip = sens_1 = sens_2 =

Die InfluxDB Zugangsdaten:

influxHost = influxUser = influxPassword = influxDbName = influxDbUser = influxDbPassword = influxMeasurement =

Die Datenbank Zugangsdaten:

DbHost = 127.0.0.1 DbUser = floweradmin DbPassword = YOUR_PASSWORD_HERE DbName = flowerberry DbTableName = Sensordaten

Sensordaten manuell auslesen

Geht nach /home/pi/XaiomiMi-Data-Collector/Raspi/ und ruft das python script XiaomiMiReader.py auf.

ACHTUNG: es ist wichtig, dass ihr vorher in das Verzeichnis wechselt. Das script ist da sehr penibel und ihr könnt keinen absoluten oder relativen Pfad verwenden.

Sensordaten automatisiert auslesen

Wegen der grade beschrieben Problematik, wenden wir allerdings einen kleinen Hack an.

Erzeugt die Datei /home/pi/XaiomiMi-Data-Collector/Raspi/hack.sh mit folgendem Inhalt.

#!/bin/sh

cd /home/pi/XaiomiMi-Data-Collector/Raspi python3.7 XiaomiMiReader.py

Dann fügen der Datei /etc/crontab eine Zeile hinzu, mit der das Script einmal pro Minute ausgeführt und unsere Daten in die InfluxDB gepusht werden.

#Get all the flowery data :)

** * * * root /home/pi/XaiomiMi-Data-Collector/Raspi/hack.sh > /dev/null 2>&1

Grafana

Daten auslesen

Um die Daten nun anzeigen zu lassen, bauen wir uns ein Board in Grafana.

Hier wäre mal eine View die alle verfügbaren Daten für zwei Sensoren ausliest.

Bachtet, dass in der Fusszeile ein Zeitintervall von 1m ausgewählt ist.

Für eine Vergleichsübersicht ist das ganz nett.

Hier mal die Daten über eine Woche.

Allerdings vergleichen wir hier, wie mein Mathelehrer immer sagte “Äpfel mit Birnen”.

Also bauen wir uns für alle Werte eigene Boards. 

Daten interpretieren

Hier mal beispielhaft die Query für Feuchtigkeit.

image

Auf der Linken Seite ist der Reiter “Visualsation” ausgewählt und ich habe die Achsbeschriftung auf “percent(0-100) gestellt.

Damit ergibt der Graph auch Sinn. Er zeigt den Feuchtigkeitsgehalt des Bodens in Prozent an. 

https://blog.endaq.com/how-light-sensors-work
https://www.lampenwelt.de/ratgeber/lux-einfach-erklaert.html
http://citrusindustry.net/2017/07/10/understanding-soil-moisture-sensor-data/

Alarme definieren

Damit Ihr eine Mail bekommt, wenn eure Blumen durstig sind, könnt Ihr folgendermaßen einen Alarm definieren.

Das sind Erfahrungswerte. Ich habe bei den Werten bereits mehrfach nachjustiert.

Cheers,
Ori