Raspberry Pi zero w als Webcam Server

Aus Laub-Home.de Wiki
Zur Navigation springen Zur Suche springen
Baustelle-100px.png Work in Progress:
Diese Seite wird erst noch aufgebaut. Bitte noch keine Änderungen vornehmen, ohne mit dem ursprünglichen Author zu sprechen!
Vielen Dank.

Der Raspberry Pi zero w eignet sich hervorragend als IoT Device, bestückt mit dem Camera Modul v2, dem DHT22, für Temperatur und Luftfeuchtigkeit und einem Helligkeitssensor BH1750. Die Daten werden dann mittels MQTT Protokoll an die openHAB Smart Home Zentrale geschickt und ausgewertet. Zusätzlich wird das Webcam Bild noch um die Sensoren Werten erweitert und mittels Webservice verfügbar gemacht. Ein weiterer Nebeneffekt wird sein das die Bilder gespeichert werden und dann als TimeLapse dienen können.

Vorrausetzungen

Die folgende Hardware kam bei mir zum Einsatz:

des Weiteren nutze ich meine openHAB Docker Installation auf einem anderen Raspberry Pi. Ansonsten Bedarf es nur noch einem WLAN Netz in das wir den Raspberry Pi zero w einbinden können.

Stromverbrauch des Raspberry Pi zero w

Wie immer bei solchen Projekten ist es interessant zu wissen wieviel Strom verbraucht wird:

  • Netzteil ohne Raspberry Pi: 0,1 Watt
  • Raspberry Pi zero w IDLE: 0,7 Watt
  • Raspberry Pi zero w unter Volllast (stress --cpu 1): 1,3 Watt
  • Raspberry Pi zero w inkl. aller Sensoren IDLE: 0,7 Watt
  • Raspberry Pi zero w inkl. aller Sensoren IDLE - Bluetooth disabled: 0,6 Watt
  • Raspberry Pi zero w inkl. aller Sensoren IDLE - Bluetooth disabled & HDMI disabled: 0,4 Watt
  • Raspberry Pi zero w beim Auslesen der Sensoren: 1,1 Watt
  • Raspberry Pi zero w beim Zugriff auf das Camera Modul: 2,6 Watt

Installation Raspbian

Als erstes nehmen wir die microSD Karte und bespielen diese mit Raspbian Linux. Hierzu könnt ihr einfach nach folgendem Artikel vorgehen:

Nachdem wir nun eine via SSH over Wifi verfügbare Installation haben und mittels SSH Client auf dem neuinstallierten Raspberry Pi sind, können wir fortfahren.

ASCI Art als Begrüßung

Als kleines Nice2Have habe ich noch ein kleines ASCI Art mit dem Hostname als Begrüßung eingebunden. Das ASCI Art bekomme ich hier: http://ascii.mastervb.net/. Ich habe hier einfach die Standard.flf ausgewählt. Dies kann dann in die folgenden beiden Dateien angehängt werden:

/etc/motd und /etc/motd.tail

Beim Login sollte dann das ASCI Art erscheinen. So weiß man immer auf welchem System man sich eingeloggt hat.

Mail Versand

Da ich gerne sehe, wenn zum Beispiel ein cronjob schief läuft oder damit ich sehe ob mein Systembackup einwandfrei lief, habe ich noch mittels MSMTP den Mailversand konfiguriert. Hier die Anleitung dafür:

Python3, Pip3, Paho-MQTT installieren

Die Scripte die ich hier verwenden werde sind zum größten Teil python3 Scripte, deshalb installieren wir direkt, falls noch nicht installiert, python3, pip3 und python3-paho-mqtt nach.

apt install python3 python3-pip python3-paho-mqtt -y

Raspbian automatisch aktualisieren

Da ich mich nicht manuell um die installation der System Updates kümmern möchte, habe ich hierfür das automatische Aktualisieren via cron-apt eingerichtet:

apt install -y cron-apt

/etc/cron-apt/config

APTCOMMAND="/usr/bin/apt-get"
MAILON="changes"

/etc/cron-apt/action.d/9-notify

-q -q --no-act upgrade

/etc/cron-apt/action.d/4-upgrade

autoclean -y dist-upgrade -y -o APT::Get::Show-Upgraded=true

Mehr Informationen zu cron-apt findet ihr hier:

Python Libraries automatisch aktualisieren

Nicht nur das System möchte ich gerne aktuell halten, sondern auch die Python Libraries, die ich manuell via pip3 installiert habe. Der folgende Befehl liest alle installierten Pakete ein und übergibt diese dann richtig formatiert an den pip3 Upgrade Befehl.

pip3 freeze --user | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip3 install --user -U

diesen packen wir einfach in einen cronjob, der einmal die Woche nachts um 5 Uhr läuft und keine Ausgabe produziert:

/etc/cron.d/pip3-upgrade

# this cronjob starts the pip3 upgrade of all installed python3 libraries
0 5 * * 1 pip3 freeze --user | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip3 install --user -U > /dev/null

Falls es zu Update Fehlern kommt, könnte es sein, das diese Pakete fehlen:

apt install -y libglib2.0-dev libgirepository1.0-dev libcairo2-dev

Zusammenbau und Anschluss der Sensoren

Für einen ersten Test schließen wir als erstes zusammen, bevor wir es in das Gehäuse packen. Ganz mutige können aber auch gerne schon alles komplett zusammenbauen :-) Hier auf jeden Fall die Anleitungen wie es am Ende auch komplett zusammengebaut sein wird.

GPIO "Hammer" Header

Ich nutze vom Paket den Female Header und mache ihn verkehrt herum an den Pi Zero, damit er auf der Gegengesetzten Seite aus dem Gehäuse schaut. Den Female Header habe ich gewählt, weil man mit diesem das Gehäuse besser abdichten kann.

GPIO Hammer Header 1.jpgGPIO Hammer Header 2.jpg

Ich konnte den Female Header ganz einfach mit ein wenig Kraft auf den Pi zero drücken und musste nicht wie in der Anleitung steht einen Hammer nutzen.

Raspberry Pi Camera Modul v2

Das Raspberry Pi camera Modul wird mittels dem beim Gehäuse beiliegendem Kabel ganz einfach an den Pi angeschlossen. Die Kontaktflächen zeigen immer zur Platine:

Raspberry Pi camera Modul Connection.jpg

Sensoren

Die beiden Sensoren werden nun am GPIO Header angeschlossen. Hierfür habe ich Jumper Kabel benutzt, die Male auf Female sind. Einfach für den DHT22 Sensor 3 Kabel zusammen lassen und dann noch einen 5er Pack für den BH1750 Sensor.

Jumperkabel Male Female.jpg

Die Pin Belegung ist dann wie folgt:

Raspberry Pi GPIO Pin Sensor Pin Sensor
2 + DHT22
7 (GPIO4) out
9 -
1 (3v3 power) VCC BH1750
6 (Ground) GND
5 (GPIO3 / SCL) SCL
3 (GPIO2 / SDA) SDA
14 (Ground) (kann auch weg bleiben) ADDR

hier die Pinbelegung des Raspberry Pi zero w

Raspberry pi zero w pinout.png

Das Ergebnis sieht dann so aus:

Gehäuse

Nun bauen wir alles in das Gehäuse ein. Dafür werden der Pi und das Kamera Modul ganz einfach in das Gehäuse eingeklickt. Die SD Karte sollte hierbei allerdings schon bespielt sein, da man diese nicht wechseln kann, wenn der Pi zero im Gehäuse steckt. Das ist im Vorangegangen Kapitel bereits beschrieben: Installation Raspbian

Raspberry Pi zero Cage.jpgRaspberry Pi zero with Camera.jpg

Micro USB Stromzufuhr

Zu guter Letzt packen wir alles noch an den Strom. Hierfür wird der MicroUSB Port verwendet, aber Vorsicht. es ist der, der zum Kamera Modul zeigt, also der äußere von beiden.

Raspberry Pi zero Power.jpg

Installation Camera Modul v2

Das Raspberry Pi camera Modul v2 muss zuerst via raspi-config aktiviert werden:

raspi-config

hier gehen wir dann nach:

3 Interface Options    Configure connections to peripherals

-->

P1 Camera      Enable/disable connection to the Raspberry Pi Camera

-->

<Yes>

-->

Would you like to reboot now?

<Yes>

Nach dem Neustart installieren wir dann noch die Python Library:

apt install -y python3-picamera

Einen ersten Test kann man mit dem folgenden Befehl ausführen. Das test.jpg dann einfach via SCP auf euren Rechner ziehen.

raspistill -o test.jpg

Raspberry Pi Camera Modul fokussieren

Da das Raspberry Pi camera Modul v2 keinen Autofokus hat, muss man diesen manuell auf die Bedürfnisse einstellen. Dafür ist a) Geduld und b) Fingerspitzengefühl benötigt.

Raspberry Pi camera Modul v2.jpg

An den beiden roten Markierungen ist die Linse mit etwas Klebstoff fixiert worden. Diesen kann man ganz vorsichtig mit einem scharfen, spitzen Messer wegkratzen. Wenn man dies getan hat, kann man die Linse auch wieder ganz behutsam mit einer Pinzette mit und gegen den Uhrzeigersinn herausdrehen.

  • Gegen den Uhrzeigersinn = Nähere Objekte werden scharfgestellt
  • Im Uhrzeigersinn = Entfernte Objekte werden fokussiert, bzw. scharfgestellt

Vorsicht ist geboten, nicht zu weit gegen den Uhrzeigersinn drehen, da sonst die Linse komplett ab geht und sehr schwer ist wieder einzubauen. Ebenfalls Achtung das ihr die Linse nicht verkratzt. Man braucht definitiv keinen Kraftaufwand um die Linse zu drehen!

Das Ergebnis schaut ihr euch am besten immer mit dem oben Stehendem raspistill Befehl an. Oder aber ihr macht einen Livestream mittels Python Script und Flask auf.

System Status auslesen

um die Systemdaten auszulesen benutze ich die Python Libraries gpiozero und psutil. Da diese leider in der Raspbian Version noch nicht die System Load unterstützt update ich diese direkt im Anschluss mittels pip3.

apt install -y python3-psutil python3-gpiozero
pip3 install --user -U psutil

Einen ersten Test kann man dann mit dem folgenden Script machen:

Installation der Sensoren

Um die beiden Sensoren auslesen zu können benötigen wir zusätzlich ein paar Python Libraries:

apt install libgpiod2 python3-rpi.gpio python3-smbus i2c-tools -y
pip3 install --user adafruit-circuitpython-bh1750 adafruit-circuitpython-dht Adafruit_DHT adafruit-blinka

Dann müssen wir noch den i2c im raspi-config aktivieren:

raspi-config

dort gehen wir dann nach:

5 Interfacing Options  Configure connections to peripherals  

-->

P5 I2C         Enable/Disable automatic loading of I2C kernel module

-->

<Yes>   

Dann verlassen wir die raspi-config

Nun können wir einen ersten Test wagen. Hierfür einfach die folgenden Scripte downloaden und ausführen:

Für den Lichtsensor:

bh1750-adafruit.py

cd /usr/local/sbin
wget https://raw.githubusercontent.com/alaub81/scripts/master/bh1750-adafruit.py
chmod +x bh1750-adafruit.py
bh1750-adafruit.py

Ausgabe sollte so aussehen:

7.50 Lux

Für den Temperatur/Luftfeuchtigkeits Sensor:dht22-adafruit.py (hier bitte falls ein anderer GPIO Pin als GPIO4 verwendet wird im Script dementsprechend anpassen.)

cd /usr/local/sbin
wget https://raw.githubusercontent.com/alaub81/scripts/master/dht22-adafruit.py
chmod +x dht22-adafruit.py
dht22-adafruit.py

Ausgabe sollte so aussehen:

23.70 °C  44.90 %

Mehr Informationen zu den beiden Sensoren findet ihr hier:

iot.py

apt install python3-pil

Tuning

Ich habe mich nun noch ein wenig mit der Optimierung des Systems auseinander gesetzt. Als erstes, da es sich um ein 24/7 System handelt natürlich um den Stromverbrauch. Der Bluetooth Chip kostet tatsächlich fast 0,1 Watt. Ich habe irgendwo den wert 0,088 Watt gelesen, jedoch ist mein Messgerät nicht ganz so genau. HDMI bringt weitere 0,2 Watt.

Nun kann man noch die Status LED deaktivieren. Da ich den Pi sowieso nicht in Sichtweite habe und man die LED im Gehäuse nicht sieht, deaktiviere ich diese über die config.txt.

/boot/config.txt

# Disable the ACT LED on the Pi Zero.
dtparam=act_led_trigger=none
dtparam=act_led_activelow=on

USB Power deaktivieren wie bei den anderen Pis ist beim zero leider nicht möglich.

Nun kümmern wir und noch um die Dienste die auf dem Pi laufen und reduzieren diese auf das Nötigste.

Backup

Möchte man am ende das System sichern, kann man das folgende verwenden.

openHAB / HABPanel Integration


Quellen