Per lokaler MySQL Datenbank zum Raspberry Pi Datenlogger

16. July 2017
9 Comments

Der Raspberry Pi eignet sich nicht nur zum Erfassen von Sensordaten, sondern auch um diese zu speichern und anschließend auszuwerten. In Projekten wie Wetterstationen oder in Verbindung mit einem ESP8266 kann ein solcher Raspberry Pi Datenlogger als zentrale Speicherstation für jegliche Daten dienen.

In einem der vorherigen Tutorials haben wir bereits Daten auf der Online-Platform ThingSpeak gespeichert. Bei sensiblen Daten oder fehlendem Internetzugriff ist dies allerdings keine Option. Daher soll es in diesem Tutorial darum gehen seine analogen oder digitalen Sensordaten in einer lokalen MySQL Datenbank zu speichern.

 

Zubehör

Neben einem Raspberry Pi ist im Grunde kein weiteres Zubehör zum Loggen der Daten notwendig (exkl. Stromversorgung und microSD Karte). Allerdings können verschiedene Sensoren ausgelesen werden, deren Werte gespeichert werden. Ich nutze in dieser Anleitung folgendes zum Verdeutlichen:

Darüber hinaus können auch Daten anderer Sensoren in der Datenbank gespeichert werden. Hier ein paar Beispiele zu bereits vorhandenen Tutorials. Der Code dieser Anleitungen muss nur minimal verändert bzw. erweitert werden, sodass die Daten geloggt werden. Wie erfährst du im Laufe dieses Artikels:

Auch in Projekten wie dem automatischen Gewächshaus kann das Datenloggen nützlich zur Überwachung sein.

Als Sprache nutze ich übrigens in diesem Tutorial ebenfalls Python. Du kannst auf die SQL Datenbank aber auch mittels jeder anderen Programmiersprache bzw. Umgebung (PHP, Node.JS, etc.) zugreifen.

 

Installation

Beginnen wir mit der Installation der benötigten Pakete. In einem vorherigen Tutorial, welches die Webserver Einrichtung betraf, haben wir bereits einmal MySQL installiert. Sofern du weitere Informationen möchtest, kannst du dir jenes Tutorial einmal ansehen.

Ansonsten beginnen wir von Null mit der Installation aller Softwarepackages. Öffne ein Terminal:

sudo apt-get install mysql-server python-mysqldb --yes

Du wirst nach einem Passwort gefragt:

Raspberry Pi Datenlogger MySQL

Vergib hier ein sicheres Passwort und merke dir dies. Wir benötigen es später, um uns mit der Datenbank zu verbinden.

Exkurs: Was sind Datenbanken / Tabellen?

Falls du damit noch nicht all zu sehr vertraut bist, hier eine kurze Erläuterung zu Datenbanken und Tabellen: Unsere Daten (IDs, Uhrzeiten, Texte, Zahlen, usw.) werden in eigenständigen Tabellen gespeichert. Ein Eintrag einer solchen Tabelle hat einen definierten Aufbau (bspw. eine ID, ein Datum und einen Wert). Da lauter solcher Einträge gespeichert werden, definiert man eine Tabelle mit jenen Spalten.

Nun kann man verschiedenene Tabellen haben, die zum gleichen Projekt gehören. Diese können auch in gewisser Weise untereinander verknüpft sein. Um diese Tabellen unter einen Hut zu bringen, definiert man sog. Datenbanken, welche viele verschiedene Tabellen enthalten.

Konkretes Beispiel gefällig? Angenommen wir haben zwei kleine Projekte mit einem DHT22 (Wetterstation, Überwachungssensor im Haus) auf unserem Raspberry Pi laufen. Beide Projekte sollen die gleichen zwei Tabellen haben und zwar mit folgenden Spalten:

  • Temperaturtabelle: ID, Datum, Uhrzeit, Temperaturwert (in °C)
  • Feuchtigkeitstabelle: ID, Datum, Uhrzeit, Luftfeuchte (in %), Kommentar (optimal)

Wir würden also zunächst zwei separate Datenbanken (haus, wetterstation) anlegen und in jede dieser die beiden oben genannten Tabellen. Die Daten würden wir dann in der entsprechenden Datenbank und Tabelle ablegen.

Wie dir bestimmt aufgefallen ist, sind die Datentypen auch unterschiedlich. In einem ID-Feld wird normalerweise immer nur eine Ganzzahl gespeichert, wohingegen ein Kommentar einen längeren Text enthält. Aber auch bei Zahlwerten gibt es Unterschiede. Bei einer ID möchten wir keine Nachkommastellen, bei der Angabe in Prozent hingegen schon. All diese Datentypen müssen bei der Erstellung einer SQL-Tabelle angegeben werden.

Genug der Worte. Legen wir los.

 

Einrichtung – Erstellen der Datenbank + Tabellen

Nachdem alles installiert wurde, können wir uns per MySQL-Client direkt per Kommandozeile verbinden. Dazu reicht folgendes:

mysql -u root -p

Gib nun das gewählte Passwort ein. Danach kannst du bereits beliebige SQL Kommandos eingeben.

Wir starten anschließend damit, indem wir eine neue Datenbank (nehmen wir das Beispiel von oben: haus) anlegen:

CREATE DATABASE haus;

Anschließend können wir die Tabellen erstellen. Bevor wir das tun, müssen wir aber noch angeben, welche der (unter Umständen vielen) Datenbanken wir in dieser Session verwenden. Das geht mit:

USE haus;

Nun geht es ans Erstellen. Ich werde in diesem Beispiel nur die erste Tabelle vom obrigen Beispiel anlegen, da das äquivalent abläuft.

CREATE TABLE temperatur_tb (
    id int NOT NULL AUTO_INCREMENT,
    datum DATE,
    uhrzeit TIME,
    wert FLOAT,
    PRIMARY KEY(id)
);

Nun haben wir die Struktur erstellt, aber die Tabelle hat noch keine Einträge. Dies werden wir gleich mittels dem SQL Befehlt Insert ändern. Natürlich ist es auch möglich direkt per MySQL-Shell die Daten einzutragen, aber normalerweise soll dies ja automatisiert ablaufen, weshalb ich die Nutzung per Python Skript in diesem Tutorial zeige.

Um aus dem MySQL Terminal zurück zur normalen Bash zu kehren, reicht es exit einzugeben.

 

Raspberry Pi Datenlogger für Temperatur und analoge Werte

Als Beispiel nehmen wir wieder einen DHT22 Sensor, mit dem wir Temperatur und Luftfeuchte messen können. Mit ein wenig Anpassung des Skriptes kannst du auch jeden anderen Sensor verwenden. Ich gehe davon aus, dass die Adafruit Bibliothek zum Auslesen des DHT22 bereits installiert und angeschlossen ist (GPIO4).

Zunächst erstellen wir eine neue Datei:

sudo nano temp_logger.py

Hier kommt folgendes hinein (mit STRG+O speichern):

Die Angaben in Zeile 7 musst du entsprechend anpassen (ggf. User, Passwort, Datenbankname).

Besonders die Zeile 12 ist interessant. Hier wird einfach ein SQL-Query ausgeführt. In diesem Fall führt es dazu, dass ein neuer Eintrag in der oben erstellen Tabelle mit den nachfolgend angegeben Werten angelegt wird.

Führen wir die Datei nun aus:

sudo python temp_logger.py

Sofern alles geklappt hat, können wir die Daten auch auslesen. Entweder wir verbinden uns wie oben wieder zur MySQL Shell, oder führen den SQL Befehl per Python aus:

SELECT * FROM temperatur_tb;

Per SQL-Terminal ergibt es eine solche Ausgabe:

mysql> SELECT * FROM temperatur_tb;
+----+------------+----------+---------+
| id | datum      | uhrzeit  | wert    |
+----+------------+----------+---------+
|  1 | 2017-08-23 | 20:59:15 |   23.30 |
+----+------------+----------+---------+
1 row in set (0.00 sec)

 

Du kannst auch über Python über die Einträge eines Queries iterieren. Der relevante Teil (abgesehen von Verbindung, etc.) sähe so aus:

Mehr Informationen zum dem Python-MySQLdb Paket, findest du hier. Falls du mehr über (My)SQL erfahren möchtest, so ist ein Blick in die offizielle Dokumentation sicher ein guter Ratgeber.

 

Daten online visualisieren

Nun wirst du vielleicht denken, dass bei ThingSpeak die Daten doch direkt auch visualisiert angezeigt wurden. Das ist richtig und kann natürlich auch auf unserem Raspberry Pi geschehen. Hierbei könntest du entweder ein Python Programm mit GUI erstellen oder aber – falls die Daten auch von einem anderen Computer leicht abrufbar sein sollen – über einen Webserver.

Es gibt dafür verschiedene Varianten, wie beispielweise Node.JS. Alternativ könnte auch ein Apache2 Server mit PHP installiert werden.

Darüber hinaus gibt es unterschiedliche Javascript Bibliotheken wie bspw. ChartJS, welche zum Visualisieren genutzt werden können. Andernfalls ist es auch möglich HTML Canvas zum Anzeigen zu verwenden.

9 Kommentare

  1. Servus Felix,

    Vielen Dank für die vielen hilfreichen Tutorials.
    Hier bleibt ein Punkt unberücksichtigt, nämlich die begrenzten Schreibt Klebeband der SD-Karte.
    Durch die vielen Datenbank Schreibzugriffe sinkt die Lebensdauer der Karte deutlich. Mir ist es schon passiert, das meine Wetterstation nach 2Jahre auf Grund dieses Fehlers nicht mehr wollte.
    Daher ggf. die DB auf einen USB-Stick, etc Auslagerung.

    Grüße
    Flo

    Antworten
  2. Auch von mir zuerst einen Dank für die Arbeit. Ich habe solch einen Datenlogger schon seit Jahren laufen, musste aber sehr schnell feststellen, dass es ohne Festplatte nicht funktioniert, da bereits nach 3 Monaten die SD zerschossen war.

    Antworten
  3. Moin Felix und Flo !
    Ist die Problematik bei USB nicht ähnlich ?
    Meien Idee wäre eher, einen RAM-Baustein dazwischen zu schalten, der zum Beispiel 100 Datensätze und nach den 100 Messungen werden diese Daten in einem Rutsch auf die SD-Karte geschrieben …
    Das würde die Schreibzugriffe auf die SD-Karte deutlich verringern.
    Gruß, Andreas

    Antworten
    • Warum schließen Sie ein USB Platte an der RPi. Spart ein Menge SD Zugriffe – insbesondere
      für DB Zugriffe oder Daten die oft ändert?

      Antworten
  4. Sali Felix.
    Betrachte deinen Blog schon lange. Jeweils Top-Leistung. Mache weiter so.
    Zu diesem Tutorial habe ich einen kleinen Zusatz.
    Die Administration der DB geht mit phpmyadmin easy und auch das „anschauen“ der Daten ist komfortabler.
    Selber habe ich mehrere Anwendungen im Einsatz welche auf die mySQL-DB zugreifen (Wetterstation, zur Speicherung aller Werte, ein Ausschnitt inkl. Verdichtung fürs Internet geht über Rrd | div Sensor Werte (Zustand) | Zustände vom Pi selber)
    Gruss Dani

    Antworten
  5. hallo,
    ich würde eher auf eine sqlite db zurückgreifen.
    aktuelle daten in den ram und die älteren daten dann auf die sd karte, einmal am tag umspeichern.

    Antworten
  6. Hallo,
    mySQL auf der SD-Karte ist wohl eher sub-optimal. USb-Stick oder USB-Drive sind da eindeutig vorzuziehen.
    Fürs Datalogging gibt es sogenannte round-robin-datenbanken, die sind für ein Langzeitlogging sehr viel geeigneter, da die Temperaturunterschiede zwischen zwei Dekundenmessungen von vor einem Jahr niemanden mehr wirklich interessieren. Die Granularität der Daten wird mit zunehmendem Alter der Daten immer unwichtiger.
    Deshalb lohnt sich ein näherer Blick auf das rrdb-tool (apt-get rrdtool) wobei auch hier die USB-Speicherung klar vorzuziehen ist.
    @Felix – eventuell ein Thema für ein weiteres deiner tollen Tutorials.

    Antworten

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!