Zum Inhalt springen

[Tutorial] Low-Budget Webcam mit Wettervorhersage und Twitterbot mit dem RasPi (2/2)

Quelle:  http://www.nordlandcamper.de/?page_id=1530

 

——————————————–

Beschreibung des Projekts

Ziel ist es, mithilfe eines Raspberry Pi und montierter RaspiCam eine Webcam zu bauen, die automatisch (z.B. alle 15 Minuten) ein Foto macht, ein Wasserzeichenund ein Textfeld hinzufügt, mit den aktuellen Wetterdaten, der Vorhersage der nächsten Tage versieht und dann auf einen selbstgehosteten Webspace via FTP hochläd. Da die Fotos nachts aufgrund der doch nur mäßigen Qualität der RasPiCam nur schwarz wären, soll der Raspi abhängig von der Geoposition Sonnenauf- und untergang berechnen und Fotos nur in diesem Zeitfenster aufnehmen. Weiterhin soll er in ebenso frei definierbaren Zeitabständen ein Foto auf dem eigenen Twitter-Account posten, also quasi als kleiner Twitterbotfunktionieren.

Benötigte Hardware und Software

  • Raspberry Pi (jedes Modell ab Raspberry Pi 2 ist ausreichend – 1. Generation geht auch, es benötigt dafür aber zusätzlich einen aktiven USB-Hub wegen dem WLAN-Stick)
  • RasPi-Cam
  • WLAN-Stick (nicht bei RasPi 3, da ist es schon mit dabei), evtl. mit USB-Verlängerung (wegen dem „Geblinke“ das sonst auf den Bildern zu sehen ist)
  • Usb-Stick für die Speicherung der Daten
  • Netzteil für Micro-USB
  • Micro-SD-Karte (8GB reichen locker)
  • Twitter-Account
  • Kostenloser Entwickler-Account bei Wunderground.com
  • Eigener Webspace, auf den das Foto der RasPiCam über das FTP-Protokoll hochgeladen werden kann (z.B. bei Strato oder anderen Anbietern).
  • Ein Wasserzeichen für das Webcam-Foto im PNG-Format mit transparentem Hintergrund, „watermark.png“, das sich im Ordner /home/pi/Pictures auf dem Pi befindet.

Voraussetzungen

Diese Anleitung setzt folgendes Szenario voraus:

Die Komponenten sind zusammengesetzt, Raspbian installiert, mittels raspi-config die korrekten Land- und Zeiteinstellungen vorgenommen und das Filesystem expandiert. GUI benötigen wir nicht, wir booten in die Textkonsole und stellen den Speicher für die GUI auf das Minimum 16MB. Weiterhin sollte das WLAN-Modul aktiviert sein und der RasPi in das heimische Netz eingebunden und über eine feste IP erreichbar sein (wie das geht steht z.B. hier). Der USB-Stick wurde angesteckt, mit FAT32 formatiert und im RasPi eingebunden.

Vorarbeiten

Zunächst führen wir ein paar Standard-Vorarbeiten aus und installieren nötige Pakete:

RAM-Disk anlegen

Um die SD-Karte des RasPi zu schonen, installieren wir eine RAM-Disk für die Logfiles und die temporären Fotos:

Inhalt der /etc/fstab:

Der Ordner für die RAMDisk und den USB-Stick muss auch noch angelegt werden:

Dann RasPi neu starten um alle Änderungen wirksam werden zu lassen:

Watchdog installieren

Der Hardware-Watchdog sorgt dafür, dass sich der RasPi selbstständig neu startet wenn er doch mal hängen sollte. So wird ein reibungsloser 24/7-Betrieb gewährleistet.

Kernelmodul laden und Daemon installieren:

Konfiguration des Watchdog anpassen:

Nun Raute-Zeichen vor diesen beiden Zeilen entfernen:

Nur für Raspbian Jessie:

Nun diese Einträge am Ende ergänzen:

 Watchdog neu starten

Für Wheezy

Für Jessie:

Regelmäßig WLAN auf Verbindung testen

Ich habe auch bei anderen Projekten schon die Erfahrung gemacht, dass der RasPi gerne mal die Verbindung zum WLAN verliert. Möglicherweise liegt das an der schlechten Stromversorgung der USB-Ports vor allem bei den ersten Pi´s, ich weiß es aber nicht genau. Daher noch dieses Script, dass regelmäßig überprüft, ob die WLAN-Verbindung noch besteht. Ansonsten wird die Schnittstelle neu gestartet und die Verbindung automatisch wieder hergestellt.

Inhalt des Scripts:

Das Script noch in die Crontab eintragen:

Diese beiden Zeilen am Ende der Datei ergänzen:

Nun habt Ihr eine sichere Netzwerk-Verbindung.

Wetterdaten von Wunderground.com holen

Zunächst muss hierfür ein kostenloser Entwickler-Account registriert werden, der 500 Abfragen/Tag zuläßt – für unsere Zwecke völlig ausreichend. Am Ende der Prozedur erhält man einen API-key, der im nächsten Script angegeben werden muss. Zu beachten ist, dass bei Verwendung der API ein Logo von Wundergroundauf der Website platziert werden muss.

Zunächst mal Ordner anlegen um etwas Ordnung in die Sache zu bringen:

Dann legen wir die Datei „get_weather.py“ im Verzeichnis „Wetter“ an:

Der Inhalt der Datei ist wie folgt:

Wie immer wird das Script ausführbar gemacht:

Letztlich holt das Script die Wettervorhersage in Form einer JSON-Datei. Diese wird ausgelesen und die Daten in zwei Dateien geschrieben:

  • eine „Wetterdatei“, die die aktuellen Bedingungen im CSV-Format enthält. Die aktuellen Bedingungen werden jeweils als neue Zeile an die Datei angehängt. So sind in der Zukunft statistische Auswertungen und grafische Darstellungen über einen längeren Zeitraum möglich. Von dieser Datei wird einmal am Tag automatisch ein Backup angelegt.
  • Eine „Vorhersagedatei“, die jeweils die bereits bestehende überschreibt und die Vorhersage der nächsten 3 Tage enthält.

Beide Dateien werden später vom Script, welches die Fotos schießt, ausgelesen und die Daten verwendet.

Bash-Dateien für die Fotos

Nun erstellen wir die Scripts für die RasPiCam um endlich mal Fotos schießen zu können.

Script für die Fotoaufnahme (Webcam)

Das folgende Script arbeitet so:

  • Wetterdaten aus beiden oben angelegten Dateien auslesen
  • Foto in geringerer Größe für die Webcam aufnehmen
  • Schlusszeile ergänzen
  • Wetterdaten aus den beiden o.g. Dateien ergänzen
  • Wasserzeichen einfügen
  • Upload auf den Webspace via FTP
  • Foto wieder von der RAM-Disk löschen

Hier der Inhalt der Datei:

Nun noch die Datei ausführbar machen:

Script für die Fotoaufnahme auf den USB-Stick (TimeShift-Aufnahme)

Die TimeShift-Aufnahme soll in guter Qualität erfolgen. Dabei soll der Zeitintervall kürzer sein, als bei der Aufnahme für die Webcam. Zur Durchführung der Aufnahme dienst folgendes Script:

Zunächst legen wir einen passenden Ordner auf dem USB-Stick an:

Und wieder ausführbar machen:

Script für die Fotoaufnahme und Upload auf den FTP-Server (z.B. Synology-Diskstation)

Das folgende Script erledigt die Fotoaufnahme und den Upload eines qualitativ guten Fotos auf einen FTP-Server:

Und wieder ausführbar machen:

Zentrales Script für die Steuerung der Fotoaufnahme

Was uns nun noch fehlt, ist das zentrale Script für die Steuerung der Fotoaufnahme aus welchem heraus alle anderen Scripts aufgerufen werden. Für die Berechnung der Zeit des Sonnenaufgang und -untergangs habe ich ein tolles Script gefunden (herzlichen Dank an dieser Stelle an den Autor für die genialen Berechnungen, die ich nicht ansatzweise verstehe…), dass ich für meine Zwecke entsprechend abgeändert habe. Letztlich werden die aktuelle Tageszeit, Sonnenauf- und -untergang in einen Sekundenwert umgerechnet. So ist eine einfache Vergleichsabfrage möglich, ob ein Foto gemacht werden soll, oder eben nicht.

Mit dem Script wird abhängig von der Geoposition der Webcam Sonnenauf- und Untergang berechnet. Angepaßt werden muss lediglich die Geoposition der Webcam, die über Google einfach erfahren werden kann. Durch die Veränderung der drei Arrays „time_webcam“, „time_usbstick“ und „time_ftp“ kann die jeweilige Aufnahmezeit angepaßt werden.

Nun noch die Datei ausführbar machen:

Crontab anpassen

Um das Scripts z.B. alle 15 Minuten auszuführen, muss wieder ein Eintrag in der Crontab erstellt werden:

Unten ergänzen:

Sicherheitshalber habe ich noch ein Zeitfenster in der Crontab eingetragen, was aber eigentlich nicht nötig wäre.

Webcam-Foto twittern

Nun sind wir schon fast am Ziel. Was nun noch fehlt, ist ein Twitterbot, der z.B. einmal am Tag ein Foto der Webcam auf dem eigenen Twitter-Account postet. Das ist gar nicht so schwer und funktioniert so:

Das Script

Zunächst das Script, welches ein Foto für Twitter schießt und aufbereitet (wie zuvor):

Inhalt des Scripts:

Nun wieder die Datei ausführbar machen:

Anwendung bei Twitter regististrieren

Einen eigenen Twitter.Account vorausgesetzt, registriert man hier seine geplante Anwendung. Das Ergebnis sind dann 4 Codes, die in dieses Script ergänzt werden:

Inhalt des Scripts:

Auch dieses Script wieder ausführbar machen:

Das Script wird automatisch über da zentrale Script in der Crontab aufgerufen(ist dort schon entsprechend eingetragen). Es wird (falls kein Offset eingetragen wird) passend zum Sonnenuntergang und Sonnenaufgang jeweils ein Foto geschossen und gepostet. Das Ergebnis des Ganzen sieht auf Twitter dann so aus.

Die Crontab

Der Übersicht halber hier nochmal ein Abdruck der gesamten Crontab:

Samba-Server installieren

Damit wir nun bequem vom Computer aus auf den angeschlossenen USB-Stick Zugriff haben, installieren wir noch einen Samba-Server auf dem RasPi:

Nun erstellt man ein Passwort für den User „pi“. Hiermit kann man sich dann vom PC/Mac aus einloggen:

Nun evtl. noch die Berechtigungen für den USB-Stick setzen (User pi wird als Besitzer eingetragen):

An die Konfigurationsdatei vom Samba-Server nun noch ein paar Zeilen Code anhängen:

In einem letzten Schritt den Samba-Server neu starten:

Nun kann man auf dem PC/Mac eine neue Freigabe „smb://IP des Pi“ erstellen, gibt die o.g. Zugangsdaten ein und hat ab sofort bequemen Zugriff auf die Fotos auf dem USB-Stick.

Die Krönung des Ganzen: Grafische Darstellung der Wetterdaten

Wer sich bis hierhin tapfer durchgearbeitet hat, möchte vielleicht noch die Wetterdaten, welche wir in die beiden log-Dateien geschrieben haben, grafisch auswerten und z.B. auf seinem Webspace präsentieren. Hierzu bietet sich GnuPlot für den RasPi an. Dem Plot-Programm kann man ein Script übergeben, welches dann zeilenweise abgearbeitet wird und das Aussehen des Plots sowie die Output-Datei bestimmt.

Aussehen wird das Ganze dann z.B. so:

4-Wochen Übersicht

Zunächst installieren wir GnuPlot:

Dann legen wir auf dem RasPi und dem USB-Stick weitere Ordner an:

Anlegen des zentralen Scripts für die Generierung der Plots:

Und ausführbar machen:

In diesem Beispielscript werden die Wetterdaten aus Log-Dateien von zwei Orten verwendet, das PLT-Script von GnuPlot angepaßt, dann der Plot ausgeführt, die Grafiken mit Wasserzeichen versehen und auf den Webspace geladen. Für jeden Ort legt man ein PLT-Script an. Hier folgen meine beiden Beispiele:

Und die PLT-Datei für den zweiten Ort:

Beide PLT-Dateien sollten von der Zeilenposition her nicht verändert werden, da einzelne Zeilen automatisch abgeändert werden um die Plots für den 4-Wochen-, 6-Monats- und Jahresverlauf zu berechnen. Weiterhin müssen in folgendem Ordner die Wasserzeichen abgelegt werden (in meinem Beispiel eine PNG von Wunderground sowie meine eigene:

Nun benötigen wir noch jeweils ein Script, welches uns einmal am Tag die Wetterdaten von Underground holt und in eine Log-Datei einträgt.

Hier das erste Script:

Das Ganze natürlich wieder ausführbar machen. Dann das zweite Script:

Aus dieses Script wieder ausführbar machen.

Was nun noch fehlt, sind entsprechende Einträge in der Crontab:

Nun müsst Ihr nur noch die JPG´s der Plots auf Eurer Webseite einbinden. Wie die Plots aussehen, wenn es viele Werte gibt kann ich allerdings noch nicht sagen. Mal sehen, ob man noch alles gut erkennen kann!

Befestigung der Cam

Ich habe mich wie auf dem Beitragsbild zu sehen für eine Bastellösung mithilfe einer ausgemusterten Handhalterung fürs Auto entschieden. Hatte ich noch zu Hause rumliegen und funktioniert mithilfe zweier Kabelbinder wunderbar. Den WLAN-Stick habe ich an ein Verlängerungs-USB-Kabel gehängt, damit das Blinklicht des Sticks in der Dämmerung nicht die Aufnahme kaputtmacht (Spiegelung in der Fensterscheibe). Als Case für den RasPi dient diese Hülle mit integriertem Halter für die RasPiCam. Am Fenster hält das Ganze bombig.

RaspiCam

Fazit

So, dass wars. Mit wenig Aufwand habt Ihr ein eine tolle Webcam, die komplett autark arbeitet, automatisch Fotos twittert, mit der aktuellen Wettervorhersage versieht, auf den WebSpace hochläd und Euch Aufnahmen für die Erstellung einer Zeitrafferaufnahme liefert. Ein kostenloses Programm, um aus den Einzelbildern ein Video zu basteln ist auf dem Mac „Time Lapse Assembler„. Selbstverständlich könnte man die Fotos auch auf einen USB-Stick speichern und vom Raspberry in ein Video umwandeln lassen. Aber das überlasse ich Eurer Fantasie… Viel Spaß beim Basteln!

Hat hoffentlich alles funktioniert? Ich freue mich auf Euer Feedback (da gibt´s leider viel zu wenig davon…)!