Raspberry Pi als Füllstandsmesser

Aus Laub-Home Wiki
Raspberry Pi zero w mit einem HC-SR04 Sensor

Mit diesem Python3 Script, einem Raspberry Pi zero w und einem HC-SR04 Ultraschallsensor kann man sich für eine wunderbare Füllstandsüberwachung bauen. Dafür muss lediglich der Sensor an den Pi geschlossen werden und das Script aus meinem Distance_Check GitHub Repository genommen werden. Das Script sendet die aktuellen Daten an einen MQTT Broker (Homie MQTT Standard) und kann so wunderbar in euer Smart Home eingebunden werden. Zusätzlich bietet das Script die Möglichkeit eine E-Mail zu versenden, wenn ein konfigurierbarer Wert unterschritten wird. Wie das im Detail geht, erkläre ich in diesem Artikel.

Verwendete Hardware

Ich habe für den Aufbau die folgende Hardware benutzt.

Vorbereitung

Wir benötigen als erstes einen installierten Raspberry Pi mit Raspberry Pi OS. dies könnt ihr am besten nach dieser Anleitung machen:

Ich habe zum konfigurieren das Script benutzt und alles auf Standard gelassen nur das Passwort habe ich festgelegt. Es wird kein Interface benötigt, bei den Tuningmaßnahmen könnt ihr selbst entscheiden, was ihr konfigurieren möchtet.

Ich nutze hier einen Raspberry Pi zero w. Sollte aber auch für alle anderen Raspberry Pis umsetzbar sein. Wenn ihr einen gebooteten Raspberry Pi habt, loggt euch via SSH und dem root user an.

Den HC-SR04 Ultraschall Sensor bitte nach dieser Anleitung anschließen (Ich habe die Version ohne Widerstände im Einsatz):

Falls ihr die Werte an einen MQTT Broker senden wollt und ihr noch keinen am laufen habt:

distance.py Script

Um das Script lauffähig zu bekommen müssen als erstes die Abhängigkeiten installiert werden:

apt install python3-pip libgpiod2 python3-systemd python3-paho-mqtt -y
pip3 install adafruit-circuitpython-hcsr04

Dann laden wir uns das Script herunter und konfigurieren im oberen Teil die Variablen:

cd /usr/local/sbin
wget https://raw.githubusercontent.com/alaub81/distance_check/main/distance.py
nano distance.py

Bitte nach euren Wünschen anpassen. Solltet ihr auch das senden der Werte an einen MQTT Broker benötigen, aber keinen bereits eingerichteten haben, schaut hier.

### Variables
# Define the GPIO Pins (Dx)
sonar = adafruit_hcsr04.HCSR04(trigger_pin=board.D5, echo_pin=board.D6)
# Measurement every x Seconds
wait = 180
# How many measurements should be used for mean value
measurements = 30
# Warning when mean value is smaller then x cm
warning = 100

# Mailserver configuration
# Mail Server Port
smtp_port = 587
# SMTP Server address
smtp_server = "your.mailserver.tld"
# Sender E-Mail address (also used for authentification)
sender_email = "yourmailaddress"
# Receiver E-Mail address
receiver_email = "receivermailaddress"
# Your E-Mail account password
smtp_password = "YourPassWord"

# MQTT Connection
# Enable / Disable MQTT Connection (True / False)
mqttconnection = False
# MQTT connection facts...
broker = "FQDN / IP ADDRESS"
mqtt_port = 8883
mqttclientid = "clientid-hcsr04-homie"
clientid = "clientid-hcsr04"
clientname = "Clientname HC-SR04 Sensor"
nodes="hcsr04"
mqtt_username = "mosquitto"
mqtt_password = "password"
insecure = True
qos = 1
retain_message = True
# Retry to connect to mqtt broker
mqttretry = 5

Nun vergeben wir noch das Execute Recht.

chmod +x /usr/local/sbin/distance.py

Dann können wir einen ersten Versuch starten und testen ob A, bei Alarm eine Mail versendet wird und B, ob die Werte am MQTT Broker, sofern gewünscht ankommen.

sudo -u pi distance.py

Hier der Output via MQTT Explorer:

MQTT Explorer Output


Systemd Service

Nun installieren wir das Ganze noch mit einem systemd Daemon, damit das Script im Hintergrund läuft und es beim Reboot auch wieder startet. Dafür legen wir zuerst das Service File an.

Download hier möglich: https://github.com/alaub81/distance_check/raw/main/distance.service

cd /etc/systemd/system
wget https://github.com/alaub81/distance_check/raw/main/distance.service

Nun lesen wir das Service File ein und starten es. Zum Abschluss aktivieren wir den Service noch, damit auch bei einem Reboot des Pi, dieser aktiv wird.

systemctl daemon-reload
systemctl start distance.service
systemctl enable distance.service
# prüfen ob alles läuft
systemctl status distance.service

Ausgabe sollte dann so aussehen:

● distance.service - Python Distance Sensor Service
   Loaded: loaded (/etc/systemd/system/distance.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-11-04 17:33:38 CET; 3s ago
 Main PID: 4366 (python3)
    Tasks: 4 (limit: 877)
   CGroup: /system.slice/distance.service
           ├─4366 /usr/bin/python3 /usr/local/sbin/distance.py
           └─4369 /usr/local/lib/python3.7/dist-packages/adafruit_blinka/microcontroller/bcm283x/pulseio/libgpiod_pulsein --pulses 2 --queue 1524 gpiochip0 6

Nov 04 17:33:36 laub-iot02 systemd[1]: Starting Python Distance Sensor Service...
Nov 04 17:33:38 laub-iot02 systemd[1]: Started Python Distance Sensor Service.
Nov 04 17:33:38 laub-iot02 python3[4366]: MQTT Connection established, Returned code= 0

Zum Schluss kann auch hier wieder geprüft werden, ob A die Mail ankommt und B ob die Daten am MQTT Broker ankommen.

Tuning

Wenn alles soweit konfiguriert ist und läuft, kann man das Dateisystem in den Read Only Mode schalten, das erhöht die Lebensdauer der SD Karte und sorgt auch dafür, das nach einem Stromausfall kein inkonsistentes Dateisystem entstehen kann. Wie das geht findet ihr hier: