Aufzeichnung von Sensordaten und grafische Auswertung mit Highcharts

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Aufzeichnung von Sensordaten und grafische Auswertung mit Highcharts

      Mahlzeit,

      da mir weder die Grafiken von rrdtool noch die vom Volkszähler zusagen, habe ich mich die Tage mal mit Highcharts beschäftigt.
      Ich wollte die Threads hier und hier nicht kapern, da diese ziemlich Volkszähler-lastig sind, deshalb dieser neue Thread.
      Die Grafiken gefallen mir wesentlich besser und auch die Installation ist wesentlich einfacher als beispielsweise der Volkszähler. Für den privaten/nichtkommerziellen Gebrauch steht die Bibliothek unter einer Creative Commons-Lizenz kostenlos zur Verfügung.
      Weitere, für mich relevante, Vorteile sind unter anderem eine lokale Installation ohne Aufwand (einfach in ein Verzeichnis entpacken und fertig), quasi kinderleichte Bedienung und Anpassung aller nur erdenklichen Parameter, Anzeigeoptionen, einfacher Datenimport aus allen erdenklichen Quellen (bei mir eine mySQL-Datenbank), offline (zum Erzeugen der Diagramme müssen keine Daten von irgendwelchen Servern geladen werden) und noch einmal: wundervolle Grafiken :)

      Da ich im SHC das Dark-Hive-Theme nutze, sind meine Anpassungen daran angelehnt. Die Optik lässt sich aber leicht ändern, der angehängte Screenshot soll nur als Beispiel dienen, wie ich mir das vorstelle ;)

      Momentan habe ich nur Beispieldaten manuell in die Datenbank eingefügt. Die Daten werden später von diversen ESP8266 in die Datenbank eingepflegt. Momentan bin ich gerade dabei, die Konfiguration der Diagramme im Script zu dokumentieren, eine Anpassung sollte dann jedem leichtfallen, selbst ohne Doku der API von Highcharts.

      Falls Interesse besteht, werde ich die Scripte hier veröffentlichen, aber das braucht noch etwas Arbeit. Hier mal der aktuelle Stand:

      Bildschirmfoto von »2016-09-04 13-31-02«.png

      The post was edited 1 time, last by groovy ().

    • So, ich hab das ganze jetzt noch etwas verfeinert und im Script dokumentiert, aber das meiste ist ziemlich selbsterklärend.

      Voraussetzung für die aktuellen Scripte ist eine mySQL-Datenbank. In meinem Fall gibt es eine Datenbank "Sensoren" mit einer Tabelle für jeden Raum/Sensor.
      Das vorliegende Script liest den Raum "Bad" aus. Jeder Datensatz besteht bei mir aus 4 Werten, das kann bei Bedarf und je nach verwendeten Sensoren angepasst werden.
      Das ist nur erstmal eine Beispielkonfiguration, die sich jeder dann an seine Bedürfnisse anpassen muss.

      Die Scripte kommen in ein eigenes Verzeichnis, zB. sensors, die Highcharts-Bibliotheken sind unterhalb dieses Verzeichnisses in charts entpackt.
      Es gib 3 Scripte:

      dht22.php wartet auf HTTP-Requests von den Sensoren und schreibt die empfangenen Werte in die Datenbank.

      datatemphumi.php holt die Daten aus der Datenbank und bereitet sie für Highcharts vor

      temphumi.php ist schliesslich das Script, welches die Daten von datatemphumi.php abfragt und das Diagramm zeichnet.

      Die mySQL-Zugangsdaten und IP-Adresse müssen in dht22.php und datatemphumi.php noch angepasst werden.

      Wenn die Datenbank "Sensoren" erstellt ist, kann das angehängte SQL-Dump mit den Beispieldaten zum Testen verwendet werden.

      Falls Fragen oder Probleme auftauchen, meldet euch :)
      Files
      • scripte.zip

        (3.87 kB, downloaded 94 times, last: )
    • Hallo groovy,

      sehr schön, ich denke das ist genau was ich suche.
      Wenn Du mir als Raspberry NOOB noch sagen könntest,
      was ich machen muss um eine SQL Datenbank wie Deine anzulegen,
      und um sie auch gleich automatisch mit den Werten meines ersten Sensors zu füttern,
      wäre das mehr als ich erwartet hätte, als ich den Thread angeklickt habe.
      Suche nämlich schon lange nach einer grafischen Dartsellungsmöglichkeit meiner Sensorwerte.
    • Die Datenbank legst du so an:

      An mySQL anmelden:

      mysql -u root -p

      Datenbank erstellen:

      create database Sensoren;

      neuen Benutzer erstellen und Passwort vergeben:

      create user BENUTZER@localhost;
      set password for BENUTZER@localhost = password('PASSWORT');

      dem neuen Benutzer Berechtigungen für die neue Datenbank erteilen:

      grant all on DATENBANK.* to BENUTZER@localhost;

      Beispieldaten importieren:

      use Sensoren;
      source Sensoren.sql;

      Falls du die Beispieldaten nicht verwenden, sondern dir nur eine leere Datenbank anlegen willst, schau dir mal die Sensoren.sql in einem Texteditor an. Wenn du die Datei editierst, den Absatz mit "INSERT INTO" weglässt und dir dann für jeden deiner Sensoren einen Textblock nach dem Schema:

      CREATE TABLE `Bad` (
      `Temperatur` varchar(255) NOT NULL,
      `Luftfeuchte` varchar(255) NOT NULL,
      `Spannung` varchar(255) NOT NULL,
      `Zeit` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


      ALTER TABLE `Bad`
      ADD UNIQUE KEY `Zeit` (`Zeit`);

      anlegst und diese Datei dann importierst, hast du eine leere Datenbank mit den entsprechenden Tabellen. Je nach Sensor(en) ist das auch nicht auf die Werte für Temperatur, Luftfeuchte etc. limitiert, sondern kann an eigene Bedürfnisse angepasst werden, wenn du zum Beispiel Luftdrucksensoren betreibst oder ähnliches.
    • groovy wrote:

      ALTER TABLE `Bad`
      ADD UNIQUE KEY `Zeit` (`Zeit`);
      Super vielen Dank, das ist doch mal wieder ein Thread wo man richtig was lernen kann.
      Habe die Datenbank soweit fertig,
      jetzt muss ich es noch hinbekommen die Werte von meinem DHT22, angeschlossen an einem anderen PI,
      in diese Datenbank des Haupt PI zu schreiben, und danach die Werte mit dem Highcharts und Deinen Scripten auszulesen.
      Bin damit schonmal weiter als je zuvor was die Auswertung anbelangt.
      Allerdings finde ich keine kostenlose Version auf der Seite von Highcharts, oder nimmt man die Kaufversion und nutzt sie einfach?

      Danke nochmal für die superausführliche Beschreibung :)
    • Wenn du dir ein Script schreibst (bash, python etc.), das auf dem Pi die Sensoren ausliest und die Werte an den Server sendet, bist du schon fast am Ziel.
      Die Daten werden per HTTP an den Server gesendet. Das kannst du zum Beispiel mit cURL, da gibt's tausende Tutorials im Netz (ja, etwas Arbeit musst du dir schon auch selbst machen ;))

      Die URL sieht dann etwa folgendermaßen aus:

      192.168.x.x/sensors/dht22.php?temp=28.1&humi=41.3
    • Sowas hier habe ich gefunden und soweit mir möglich war,
      an meine Bedürfnisse angepasst.

      Shell-Script

      1. #!/bin/bash
      2. mySQLserver="192.168.1.68"
      3. mySQLport="3306"
      4. mySQLuser="pi" #hier war es nicht möglich einen anderen User zu erstellen, also ist der Datenbankhauptuser angegeben.
      5. mySQLpass="pass"
      6. mySQLdatabase="Sensoren"
      7. mySQLtable="Keller"
      8. # /home/pi/sensor ausführen um Werte zu erhalten
      9. WERTE=$(sudo /var/www/shc/ADA/Adafruit_Python_DHT/examples/AdafruitDHT.py 22 11)
      10. TEMP=( $(echo $WERTE | awk '{print $13}'))
      11. LUFT=( $(echo $WERTE | awk '{print $17}'))
      12. # WERTE in Datenbank eintragen
      13. INSERT="INSERT INTO $mySQLdatabase.$mySQLtable (Temperatur,Luftfeuchte,,Zeit) VALUES ("$TEMP","$LUFT",,"$(date +%s)")"
      14. echo $INSERT | mysql -h $mySQLserver -P $mySQLport -u $mySQLuser -p"$mySQLpass" $mySQLdatabase
      15. exit 0
      Display All
      Bekomme aber einen Fehler und kann nichts damit anfangen. Kommando nicht gefunden.
      wobei der Teil hier für sich alleine funktioniert:
      sudo /var/www/shc/ADA/Adafruit_Python_DHT/examples/AdafruitDHT.py 22 11

      Auf dem kleinen PI der die Werte sammelt ist der mysql Client installiert worden.
      Naja, ich muss auch mal was arbeiten, also für heute erstemal muss ich das Basteln einstellen :(
    • in der Tat hatte ich es ohne ./ ausgeführt.

      Jetzt, unzählige Änderungen und versuche später,
      ich komme wenigstens schonmal in die Datenbank und die Tabelle von einem anderen PI aus,
      habe ich das Problem, das mir ein mysql Syntax Error ausgegeben wird.
      ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
      ---
      Line 1 wäre für mysql wahrscheinlich der Part hier???
      INSERT="INSERT INTO $mySQLdatabase.$mySQLtable (Temperatur,Luftfeuchte,"",Zeit) VALUES ("$TEMP","$LUFT","","$(date +%s)")"
      Die "" für Spalte 3 sollen einfach nur Platzhalter sein, für den Fall das ich da noch Werte reinschreiben will.
      Die tun aber auch nix zur Sache, wenn ich den Teil weg lasse, geht es auch nicht.
      Anscheinend klappt was mit der Abfrage nicht... Ich weiß nicht mehr weiter.
      Trotzdem lese ich die ganzen google Ergebnisse und probiere rum, hänge jetzt aber..-
    • Habe jetzt das Script nochmal etwas erweitert.
      Die X-Achse hat jetzt korrekte Datums- und Zeitstempel und unter der Legende werden jeweils die minimal- und maximal-Werte angezeigt.
      Beim Ändern der Größe des Browser-Fensters wird das Diagramm neu gezeichnet, um Darstellungsfehler zu vermeiden.

      highchart.png
      Files
    • Soooo, was lange braucht, kann manchmal was werden.
      Das mySQL script funktioniert endlich und trägt werte in die DB ein.

      ich habe aber immernoch die Frage, wie das mit der Lizenz von dem Highcharts funktioniert.
      Sehe da nur Kaufversionen, und wo man das dann speichern muss, damit man nachher eine Webseite aufrufen kann.
      Dazu muss der ganze php Kram doch in einem Verzeichnis liegen wo beispielsweise auch das shc installiert ist oder?
    • mastadook wrote:

      ich habe aber immernoch die Frage, wie das mit der Lizenz von dem Highcharts funktioniert.
      Die letzte Version, ganz unten auf dieser Seite:

      Highcharts JS

      sagt:

      Non-commercial
      Do you want to use this product for a personal or non-profit project? Then you can use it for free under the [url='http://creativecommons.org/licenses/by-nc/3.0/']Creative Commons Attribution-NonCommercial 3.0 License.[/url]

      Also kostenlos für den privaten Gebrauch.

      Die Installation besteht nur im Entpacken in einen Ordner, erstmal unabhängig vom SHC, da die Diagramme nicht ohne Weiteres im SHC eingebunden werden können. Da müsste man dann später mal den agent involvieren.
      In den Scripten sind relative Pfade zu den Bibliotheken von Highcharts hinterlegt. Wenn du also Highcharts an anderer Stelle installierst, musst du die anpassen.
      Meine Scripte liegen bei mir unter "sensors" und Highcharts liegt unterhalb von "sensors" in "charts".
    • mastadook wrote:

      Dazu muss der ganze php Kram doch in einem Verzeichnis liegen wo beispielsweise auch das shc installiert ist oder?
      Mit dem Teil meinte ich eigentlich, das es wo liegen muss wo man auch von außen dran kommt?
      Ich habe es jetzt jetzt so: /var/www/sensoren/charts
      in sensoren habe ich die php Scripts von Dir und in charts habe ich die Charts
      Wenn ich nun folgenden Link aufrufe: IP/sensoren/temphumi.php bekomme ich eine weiße Seite,
      aber wenigstens schon mal keine Fehlermeldung.
      Sollte da aber nicht das Chart aufgehen?
      Den Cronjob der alle 15 min laufen soll, macht das auch noch nicht...
      Manuell pumpt er Daten in die Tabelle.

      Aber ich finde, ich bin schon weit gekommen, auch dank Dir.
      Danke nochmal dafür.
    • groovy wrote:

      mastadook wrote:

      Wenn ich nun folgenden Link aufrufe: IP/sensoren/temphumi.php bekomme ich eine weiße Seite
      Mach mal (sofern du firefox nutzt) einen Rechtsklick auf die weisse Seite und wähle "Seitenquelltext anzeigen".Siehst du da deinen Quelltext?
      Error_reporting PHP ändern. Eine weisse Seite ist ja oft ein unterdrückter Fehler. Oder Log Dateien schauen, was "angemeckert" wird.
      Produktiv: RPi 2 B SHC 2.2.8 -- Netzwerk BananaPi R1 ipFire
    • mastadook wrote:

      Dazu muss der ganze php Kram doch in einem Verzeichnis liegen wo beispielsweise auch das shc installiert ist oder?

      groovy wrote:

      mastadook wrote:

      Wenn ich nun folgenden Link aufrufe: IP/sensoren/temphumi.php bekomme ich eine weiße Seite
      Mach mal (sofern du firefox nutzt) einen Rechtsklick auf die weisse Seite und wähle "Seitenquelltext anzeigen".Siehst du da deinen Quelltext?
      Ja, der Seitenquelltext wird korrekt angezeigt.


      Bkm wrote:

      groovy wrote:

      mastadook wrote:

      Wenn ich nun folgenden Link aufrufe: IP/sensoren/temphumi.php bekomme ich eine weiße Seite
      Mach mal (sofern du firefox nutzt) einen Rechtsklick auf die weisse Seite und wähle "Seitenquelltext anzeigen".Siehst du da deinen Quelltext?
      Error_reporting PHP ändern. Eine weisse Seite ist ja oft ein unterdrückter Fehler. Oder Log Dateien schauen, was "angemeckert" wird.
      So weit bin ich nicht, das sagt mir leider so nichts.
    • Schau mal in die /etc/php5/apache2/php.ini
      Die Einstellung "error_reporting" kannst du anpassen, schalte soviele Warnungen wie möglich ein und teste nochmal.
      Rufe auch mal die Datei datatemphumi.php direkt auf, dann kannst du sehen, ob die Werte aus der Datenbank korrekt ausgelesen werden.

      Edit: Hab das gerade mal getestet. Wenn keine Verbindung zur Datenbank besteht, bleibt die Seite auch leer.

      The post was edited 3 times, last by groovy ().

    • Wenn ich IPdesServers/sensoren/datatemphumi.php aufrufe,
      dann wird mir nur der Text der php Datei angezeigt.

      Wenn ich IPdesServers/sensoren/temphumi.php aufrufe,
      dann wird wie gesagt eine weiße Seite angezeigt.

      Ich sehe gerade, das die Tabelle ja totaler Käse ist.
      Keine Ahnung wie ich das trennen kann vor der Übertragung:
      mysql> select * from Keller;
      +---------------------------+---------------------------+----------+---------------------+
      | Temperatur | Luftfeuchte | Spannung | Zeit |
      +---------------------------+---------------------------+----------+---------------------+
      | Temp=21.2* Humidity=70.0% | Temp=21.2* Humidity=70.0% | | 2016-09-09 13:03:05 |
      | Temp=21.2* Humidity=70.0% | Temp=21.2* Humidity=70.0% | | 2016-09-09 13:03:14 |
      | Temp=21.2* Humidity=70.0% | Temp=21.2* Humidity=70.0% | | 2016-09-09 13:04:48 |
      | Temp=21.2* Humidity=70.1% | Temp=21.2* Humidity=70.1% | | 2016-09-09 13:10:59 |
      | Temp=21.1* Humidity=67.0% | Temp=21.1* Humidity=67.0% | | 2016-09-09 17:06:49 |

      Irgendwie müsste ich die Werte vor der Übertragung separieren, so ist das ja Quatsch.
      Also wieder auf Anfang und probieren.

      edit:
      So,prima, die Tabelle hab ich gesäubert und das Script ordentlich eingestellt:
      mysql> select * from Keller;
      +------------+-------------+----------+---------------------+
      | Temperatur | Luftfeuchte | Spannung | Zeit |
      +------------+-------------+----------+---------------------+
      | 21.5 | 68.9 | | 2016-09-10 23:22:51 |
      | 21.5 | 69.0 | | 2016-09-10 23:22:54 |
      | 21.5 | 69.0 | | 2016-09-10 23:22:56 |
      | 21.5 | 69.1 | | 2016-09-10 23:22:58 |
      | 21.5 | 68.9 | | 2016-09-10 23:23:01 |
      +------------+-------------+----------+---------------------+
      5 rows in set (0.00 sec)

      Das Problem von oben mit der weißen Seite habe ich aber immernoch.
      Gruß
      Clemens

      The post was edited 2 times, last by mastadook: Neue Infos ().