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.

Mi9.jpg

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

Mi10.jpg

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

Mi11.jpg

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.

Mi3 1.jpg


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.

M13.png

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
M14.png


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
Mi12.png


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 = <pinable address into our home network>
sens_1 = <mac of first sensor>
sens_2 = <mac of second sensor>
...

Die InfluxDB Zugangsdaten:

influxHost = <IP of your influx DB>
influxUser = <our admin user>
influxPassword = <our admin password>
influxDbName = <our influx db name for the measurement data>
influxDbUser = <our influx db user for the measurement data>
influxDbPassword = <our influx db password for the measurement data>
influxMeasurement = <our influx measurement section name>

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.

Mi15.png

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.

M16.png

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 :)

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

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.

M17.png


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

Hier mal die Daten über eine Woche.

M18.png

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.

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. 

Lesenswerte Links zu dem Thema “was für Daten bekomme ich da eigentlich”

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.

M20.png

Cheers,
Ori