Home > Hausautomatisierung > Raspberry Pi Funksensoren und Empfänger selber bauen – Teil 6 Ausgabe der Daten

Raspberry Pi Funksensoren und Empfänger selber bauen – Teil 6 Ausgabe der Daten

Anleitung zum Selbstbau Übersicht

Status

Aktuell arbeite ich noch an einer passenden Lösung zur Datenhaltung und Darstellung, diese werde ich sobald sie fertig ist hier vorstellen. Eventuell werde ich auch ein ausführliches Tutorial zu einem Home Automation Tool wie FHEM o.ä. erstellen, das habe ich noch nicht entschieden. Bis dahin wird euch sicherlich auch die Ausgabe auf einer einfacheren Webseite reichen, ihr könnt diese natürlich anpassen.

Update: Ich habe mich für das EmonCMS unter dem OpenEngeryMonitor Projekt entschieden, das System läuft schon länger stabil und zuverlässig. Die Visualisierung in Dashboards ist super! Hier der Artikel zum EmonCMS

Webseite

 

Ausgabe der Daten auf einer Webseite

Update: Als Alternative zu dieser Anleitung können die Diagramme auch mit Google Charts generiert werden, Infos gibt es im Beitrag Temperatur Diagramme mit Google Charts erstellen.

Wir haben nun Sender gebaut, den Empfänger am Raspberry Pi angeschlossen und unser Setup via Minicom getestet. Die gesammelten Daten möchten wir natürlich nun noch schön anschaulich auf einer Webseite ausgeben.

Dafür benötigen wir folgendes auf dem Raspberry Pi:

  • Eine Datenbank zum langfristigen Speichern der Temperatur und Feuchtigkeit-Daten, da es sich im wesentliche um nur eine Tabelle handeln wird eignet sich SqlLite (ich verzichte hier aufs Normalisieren)
  • Einen Webserver der für uns die Ausgabe übernimmt. Zum Beispiel Apache oder Lighttpd
  • Passende PHP Scripte / Libraries die für uns den Inhalt der Datenbank verarbeiten und ausgeben
  • Eine Schnittstelle zum Auslesen der Daten bzw. zum Speichern der Daten in der Datenbank, das übernimmt ein Perl Script für uns.
  • Einen Wachhund der prüft ob der Datensammler läuft und diesen ggf. startet
  • Der RasPi muss ins Internet kommen um sich regelmäßig die aktuelle Uhrzeit abzuholen (konfiguriert eure Zeit Einstellungen via raspi-config).

Falls euer RasPi noch auf den Desktop bootet solltet ihr das via raspi-config wieder ändern, der Bootvorgang verzögert sich nur unnötig. Ebenfalls den Split Memory Wert für die Grafikkarte auf 16MB runterstellen.

Wir beginnen mit der Installation unseres Webservers und der Datenbank. In diesem Fall habe ich mich der Einfachheit halber für Apache entschieden, wer möchte kann auch den leichtgewichtigen Lighttpd verwenden. Apt Installiert in meinem Fall den Webserver Apache2, PHP5, die PHP Library GD zur Handhabung von Grafiken, SQLLite zum Speichern unserer Daten und das Tool screen um unseren Datensammler im Hintergrund laufen zu lassen.

Zusätzlich benötigen wir noch einige Perl Libraries für das Script welches die Daten des Empfängers via UART abholt und einen Neustart des Pi

Um euch die Copy und Paste´s zu ersparen habe ich den unten stehenden Code für euch zusammengepackt, diesen könnt ihr jetzt wie folgt installieren. Enthalten ist folgendes:

  • Die PHP Scripte und Style Sheets
  • Die Library JpGraph 3.5.0b1 zum erstellen der Grafiken
Wir benötigen nun noch das Perl Script welches uns die Daten vom UART holt und in unsere SQL Datenbank schreibt. Die Scripte Sensor.pl und Watchdog.pl  sind ebenfalls unten einzusehen.
Dann müssen wir den Watchdog noch in die Crontab eintragen. Da ich lieber nano benutzen definiere ich das vorher und rufe anschließend den Befehl zur bearbeiten von Crontab auf.
Ich füge am Ende folgenden Job ein, dieser Startet alle 5 Minuten (*/5) das Script Watchdog.sh und leitet die Ausgabe ins Nirvana. Das Watchdog Script wiederum prüft ob unser Datensammler läuft und startet diesen falls nötig. Speichern wie immer bei Nano mit STRG+X, Y und Enter.
Der Zeitpunkt wäre jetzt günstig unseren RasPi einmal zu rebooten (falls der Apache noch nicht läuft). Wer dann nicht 5 Minuten warten will kann den Datensammler auch von Hand starten oder einen Eintrag in der rc.local anlegen.
Falls euer sender noch nichts sendet könnt ihr für einen Test auch einen Eintrag manuell in die Datenbank schreiben um diese zu initialisieren. Das erledigen wir über die Schnittstelle in dem wir diese einfach via Browser aufrufen und ein paar Dummy Daten übergeben.
Wenn alles geklappt hat könnt ihr nun eure gesammelten Temperatur Daten jetzt via http://<ip-raspberry-pi>/Sensor/ einsehen.

Folgende Hinweiße:

  • In der Daten config.php könnt ihr euren Node IDs Namen zuordnen, das solltet ihr für jede neue Node tun. Nodes 19,20, 21 sind schon mit Beispielnamen eingetragen.
  • Ändert nachträglich den Security Key in der /root/Sensor.pl und in /var/www/Sensor/config.php das verhindert das jemand unbefugtes via add.php in die Datenbank schreiben kann
  • In dieser Webserver Konfiguration sollte der RasPi aus dem Internet erreichbar sein
  • In der Ursprünglichen Version liegt die Datenbank und das Verzeichnisse für die Grafiken in einer RAM Disk um den SD-Karte zu schonen, darauf habe ich hier zu Gunsten der Einfachheit verzichtet

Viel Spaß!

Die Webseite – Code

Unser Hauptseite zum Anzeigen der Temperatur und Luftfeuchtigkeit (index.php)

Dieses Script ist der Anlaufpunkt für unseren Browser. Es generiert zum einen die Grafiken für uns und zeigt uns zum anderen die letzten gemessenen Werte der einzelnen Sensoren an.

Perl Script zum Werte auslesen und in die Datenbank schreiben (Sensor.pl)

Dieses Script liest die Daten, welche der Empfänger erhalten hat, vom UART aus übergibt diese an die add.php welche die Daten wiederum in der SQLite Datenbank speichert. Wichtig ist das der Secret Key mit dem in der Config.php übereinstimmt da sonst keine Daten gespeichert werden.

Watchdog Script (Watchdog.sh)

Das Shell Script wird als Cronjob eingerichtet und prüft ob das Datensammler Script Sensor.pl läuft, falls nicht wird es gestartet.

Script zum Speichern der Daten in der Datenbank (add.php)

Dieses PHP Script ermöglicht uns zwei Funktionen:

1. Es Speichert WErte die es übergeben bekommt in der SQL Lite Datenbank
2. Es erstellt uns die einfache SQLight Datenbank falls sie noch nicht vorhanden ist mit folgender Struktur:

Tabellen Name: werte
Tabellen Zellen: id (int), time (int), nodeID (int), place (text), supplyV (text), temp (text), hum (text)

Dabei ist die ID immer eindeutig (Primary Key),

 Konfigurationsdatei (config.php)

In dieser Datei verwalten wir die Konfiguration unserer Webanwendung, der Security Key muss mit dem im Perl-Script übereinstimmen, sonst werden keine Daten in der Datenbank gespeichert. Ebenfalls wird hier der Pfad zur SQL-Lite Datenbank definiert.

Funktionen (functions.php)

Allgemeine Funktionen die wir in unseren anderen Skripten wiederverwenden, zum Beispiel den Aufbau der Datenbankverbindung und die Erstellung der Grafiken.

 Das Style Sheet (style.css)

Formatierungen für die Webseiten sind hier zentral gespeichert.

 

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Keine Votes bis jetzt)
Loading...

Über raspberry.tips

11 Kommentare

  1. Vielen Dank für die Arbeit, doch hier funtkionerit so gut wie nichts, ab dem dritten Befehl geht nichts mehr, “Scheme missing” … eine Idee was zu tun ist?

    • Diese Befehle sind tatsächlich alle fehlerhaft:
      wget /wp-content/uploads/2014/11/www.tar.gz
      sudo mkdir -p /var/www/
      sudo tar -zxf http://www.tar -C /var/www/
      sudo chown -R www-data:www-data /var/www/Sensor

      Aber man kann die Dateien durch die unten befindlichen Codes selbst erstellen und in /root bzw die phps und css in die /var/www/Sensor schreiben

      geht über jeweil den Befehl
      sudo su
      cd /root
      nano .pl

      und ebenso:

      mkdir /var/www/Sensor
      cd /var/www/Sensor
      sudo nano .php

      • Selbst wenn ich das alles befolge und die Scripte mit CopyPaste selbst erstelle geht es auch nicht,
        der Befehl:
        http:///Sensor/add.php?key=23338d373027ce83b1f81b9e9563b629&node=20&v=4578&t=1410&h=5410
        (JA habe meine IP Adresse des Raspi eingegeben)

        kommt auf dieser Seite folgender Fehler:
        Fatal error: Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY000] [14] unable to open database file’ in /var/www/Sensor/functions.php:14 Stack trace: #0 /var/www/Sensor/functions.php(14): PDO->__construct(‘sqlite:/var/www…’) #1 /var/www/Sensor/add.php(14): db_con(‘/var/www/Sensor…’) #2 {main} thrown in /var/www/Sensor/functions.php on line 14

        Bekomme den Fehler auch nicht behoben!
        Eine Idee was zu tun ist?

        Ach und die Seite http:///Sensor/ (Auch wieder mit meiner IP)
        ist leer!

      • Also ich bekomme es auch nicht zum laufen … habe immer diesen Fehler und komme nicht weiter:

        Fatal error: Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY000] [14] unable to open database file’ in /var/www/Sensor/functions.php:13 Stack trace: #0 /var/www/Sensor/functions.php(13): PDO->__construct(‘sqlite:/var/www…’) #1 /var/www/Sensor/add.php(14): db_con(‘/var/www/Sensor…’) #2 {main} thrown in /var/www/Sensor/functions.php on line 13

  2. raspberry.tips

    Hallo zusammen,

    ich habe das Tutorial gerade selbst auf einem frischen RasPi 2B mit aktuell Raspbian durchgearbeitet, es waren tatsächlich im oberen Teil 1-2 Tippfehler in den Kommandozeilen enthalten welche die Funktion verhindert haben. Dem geübten Linux Auge fallen die Fehler direkt auf :)

    Diese habe ich angepasst und das Tutorial noch mal durchgespielt, bei mir klappt alles, entschuldigt!

  3. Hi Leute, Danke für das Tutorial, auch wenn du anscheinend recht aktuell es noch einmal versucht hast bekomme ich es auch nicht hin… leider. Serh schade hätte mich gefreut! Danke

    • Habe es nun noch einmal versucht und bekomme es trotzdem nicht hin: Zuerst steht immer da: “Need input :)” und wenn das nach ein paar Minutenb weg ist steht da: “Select Sensor to show: 2015-07-08 (bis 01)” ich kann alles auswählen bekomme aber nie was angezeigt… Bitte um Hilfe! Danke

  4. Hallo Raspi-Tipps, vielen Dank für das Tutorial habe es relativ schnell hinbekommen und funktioniert auch ganz gut.
    Ich würde jetzt gern weiter machen und die Daten die wir nun erfassen auch nutzen, komme aber leider nicht wirklich weiter…

    Wie kann ich die Daten denn aus der Datenbank jetzt verwenden oder kann mir jemand einen Code erklären mit dem ich in der Sensor.pl zeitgleich eine CSV Ausgabe generieren kann?

    Ich möchte jetzt entsprechend der Temperatur die ich lese, meine Klima-anlage Ein/Ausschalten lassen… Würde mich sehr über Hilfe freuen. Vielen Dank!

  5. Hi,

    vielen Dank für die super Anleitung!
    Ich habe jedoch noch eine Frage und zwar ob man die Messwerte auch über Python auslesen kann.

    Vielen Dank schonmal
    Paul

  6. Die index.php hat Probleme mit Fließkommazahlen ohne Nachkommawert, also biespielsweiße glatte 22,00°C. Das Array arrayTemp enthält dann nur eine Zelle. Mit number_format() kann die Ausgabe der Nachkommastellen und damit eine zweite Zelle erzwingen.

    while ($res = $q->fetch(PDO::FETCH_ASSOC)) {

    $temp = floatval($res[‘temp’] / 100.0);
    $arrayTemp = explode(“.”, number_format($temp,2,’.’,”));

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.