Suche Programmierer. Datenbank auslesen und visualisieren per Highcharts.

  • Hallo,


    ich suche jemanden der mir das folgende neu bzw. um schreibt. Im Grunde ist im Netz und auch hier alles vorhanden, aber ich habe keine Zeit mehr (Arbeit/Familie) um mich weiter in die Materie/den Code einzulesen.
    Für einen der sich auskennt sollte das allerdings fix gehen.
    Nicht unentlohnt versteht sich!





    Kurzbeschreibung:
    Datenerfassung von etwa 9 Temperatursensoren DS18B20 und 2x DHT22. Geschrieben wird in eine Datenbank, kein RRDTool.
    Visualisierung mittels Highcharts.
    Erfassungszeitraum ist etwa 4x 4 Monate (immer ein anderer Ort)
    Sich füllende Datenbank (MySQL) ist vorhanden.



    Beschreibung IST-Zustand:
    Mit diesem Thema hab ich begonnen (http://www.forum-raspberrypi.d…it-rrdtool-und-highcharts)
    und festgestellt das ich RRDTool nicht möchte. Die Grafik und die Zeitauswahl aber schon.


    Hier hab ich weitergemacht und konnte mit der optischen Web-Ausgabe der Highcharts (ab Version 0.5?) gut leben:
    http://www.forum-raspberrypi.d…wire-sensor-mit-datenbank (liegt auch au GitHub=https://github.com/ThomasH-W/avrio)
    Letzte Aktuallisierung auf GitHub!


    Allerdings hagelts bei bei den *.php Dateien nur Fehler und die Zeiten passen nicht. (Aber wie ich sagte, mein Zeitbudget fürs Script ist erschöpft)
    Das füllen der MySQL-Datenbank klappt hingegen bis jetzt sehr gut.
    Ob mir SQLite lieber ist kann ich aus mangelder Erfahrung nicht sagen. Es liest sich hier und im Netz aber als ob es besser für den Raspberry wäre.
    Zumindest fällt mir MySQL noch nicht negativ auf.


    Es ist eine Tabelle (11 Spalten in MySQL) vorhanden welche mit Daten gefüllt werden (Script avrio.py von ThomasH > siehe Link oben)


    9x Temperatursensor vorhanden.
    4 sammeln zur Zeit Daten. 5 laufen also erst mal "blind" mit.
    2x Feuchte-Sensoren DHT-22 kommen noch dazu.



    Gewünscht und Gebraucht:
    Die passende Ausgabe mit Highcharts.
    Diese soll wie von Tafkas sein! ->Link
    Edit: Nur eine Stelle nach dem Komma (Beispiel: 22.357 Grad -> 22.3 Grad C)


    Allerdings diese zeitlichen Ausgaben:

    Letzten 12 Std.
    24 Std.
    48 Std.
    72 Std.
    1 Woche
    2 Wochen
    1 Monat
    3 Monate
    6 Monate


    Und mit dieser Ausgabe




    Datei/Skript soll natürlich ordentlich geschrieben sein. "Zukunftssicher" in PDO_MySQL bzw MySQLi
    Nachvollziehbar & mit Kommentaren. Also Edirbar für mich. (Bildet ja auch weiter)




    Vorhanden und läuft:
    -Temperatursensoren DS18B20
    -Datenbank MySQL
    -Skript zum Füllen der DB mittels Cronjob



    Wer kann / macht das?
    Kann oder möchte das wer aus dem Forum tun? Natürlich nicht für umsonst!
    Wen könnte ich anschreiben / ansprechen?





    Ich bin für jede Hilfe dankbar!

  • Interessant wäre das Script welches du zum erfassen der Sensor-Daten verwendest, um daraus ableiten zu können ob zumindest die Datenbank-Einträge brauchbar wären oder auch noch verändert werden müssten.


    Grundsätzlich sollte das aber eigentlich kein großer Aufwand sein - das einzige wäre die von Dir gewünschte "Zeitliche Ausgabe", wie diese aussehen soll; Auswählbar oder jeweils einzelne Graphen etc.
    Je nach dem wie die Datensätze aussehen kann dies aufwendiger sein oder aus dem Ärmel geschüttelt werden :D


    Auch schreibst du das der Standort sich ändern könnte - also sollte das ja auch noch irgendwie mit in die Datenbank mit rein, damit man evtl. auch noch auf spätere Datensätze zugreifen könnte um somit auch Vergleiche zu betrachten... Hier wäre dann denk ich auch eine gewisse Flexibilität für das "Sensor auslese"-Script erforderlich, also auch eine kleine Anpassung nötig.


    //EDIT: Achso, hab das überlesen: (Script avrio.py von ThomasH > siehe Link oben) ... Also https://github.com/ThomasH-W/avrio/blob/master/avrio.py
    Aber für die DHT22 wirds ja ein anderes sein.. ;)
    avrio.py würde ich aber nicht unbedingt verwenden - man kann es als Vorlage nutzen aber das meiste was das kann brauchst du imho gar nicht - beinhaltet aber auch einiges was man besser/anders machen könnte und scheint ja auch sein erstes Python Script gewesen zu sein also noch recht unerfahren :fies:
    Frage bleibt aber offen, wie deine Datenbank-Tabelle aussieht ... Da das im avrio.py ja Flexibel einstellbar ist.


  • Grundsätzlich sollte das aber eigentlich kein großer Aufwand sein - das einzige wäre die von Dir gewünschte "Zeitliche Ausgabe", wie diese aussehen soll; Auswählbar oder jeweils einzelne Graphen etc.


    Bin mir nicht sicher ob ich deine Frage jetzt richtig verstehe. Aber ich möchte es so wie das von Tafkas.
    Klick auf "24 Std.", dann werden die Messungen der letzten 24 Std von allen Sensoren in der Grafik gezeigt.
    Klick auf "2 Wochen", dann werden die Messungen der letzten 2 Wochen angezeigt. U.s.w.


    Quote


    Auch schreibst du das der Standort sich ändern könnte - also sollte das ja auch noch irgendwie mit in die Datenbank mit rein, damit man evtl. auch noch auf spätere Datensätze zugreifen könnte um somit auch Vergleiche zu betrachten...


    Das ist nicht nötig. Da der ganze Aufbau dann wieder weg kommt und es andere Messpunkte gibt.
    Die Szenarien haben nicht viel gemein. Jeder Aufbau sollte seine eigene Datenbank bekommen.
    Oder meinst du das nur eine php-Datei auf die Datenbanken zugreift?
    Messung_Projekt1 Messung_Projekt2 Messung_Projekt3
    Letzten 12 Std.
    24 Std.
    48 Std.
    72 Std.
    1 Woche
    2 Wochen
    1 Monat
    3 Monate
    6 Monate




    Quote

    Aber für die DHT22 wirds ja ein anderes sein.. ;)


    Richtig. Da les ich mich aber erst an einem freien Wochenende ein.


    Quote


    avrio.py würde ich aber nicht unbedingt verwenden - man kann es als Vorlage nutzen aber das meiste was das kann brauchst du imho gar nicht - beinhaltet aber auch einiges was man besser/anders machen könnte ...


    Warum genau? Für ein erstes Script kanns aber schon viel.
    avrio.py schreibt alles in die Datenbank
    avrio --setup erstellt eine Datenbank und Tabelle
    avrio --get liest bzw erkennt neue Sensoren und schreibt sie in die Config
    Konnte die avrio.py soweit bearbeiten das es namentlich an meine bedürfnisse angepasst war.
    Wie könnte man das noch machen? Wenn es denn klappt ist ok.
    Ob ich die Sensor-ID von Hand eintrage ist mir relativ.


    Quote

    Frage bleibt aber offen, wie deine Datenbank-Tabelle aussieht ... Da das im avrio.py ja Flexibel einstellbar ist.


    Hier mal ein Beispielbild mit 4 Spalten. Falls du das meinst.


    Was mir mir grad wieder aufgefallen ist, die Werte z.B. von 22.347 Grad C. Eine Stelle nach dem Komma langt voll aus.

  • Die Tabelle an sich würde Ich anders aufbauen - ich mag es nicht wenn dattime verwendet wird, da der Umgang damit umständlicher ist. Besser finde ich timestamp bzw Unixtime, also einfach ein int(11) als Typ - das kann man dann ziemlich einfach ohne großen Aufwand in alle mögliche Formate und Zeitzonen konvertieren und man kann auch mit SQL Querys besser damit hantieren.


    Auch würde ich den komplett ermittelten Sensor-Wert eintragen, ohne Kürzung. Also nicht bereits auf ein oder 2 Stellen hinter dem Kommata kürzen = 22.562 sondern nur 22562 eintragen und den Rest macht man dann via PHP. Das Python Script teilt den ausgegeben Wert halt bereits durch 1000 und somit muss der Spalten-Typ float bieten.


    Das alles frisst Performance und Datenbank-Platz. Auf "richtigen Rechnern" macht sich das kaum bemerkbar, aber gerade auf dem vergleichsweise schwachen PI ist das nicht unbedingt vorteilhaft ;)


    Ich guck mir das in den nächsten Tagen mal genauer an - vielleicht kann ich ein anderes Projekt von mir dafür "missbrauchen" wodurch ich dann nicht so viel Programmieraufwand hätte :fies:

  • Die Datenbank sollte "normalisiert" werden, denn so ist sie nicht wie gewollt zukunftssicher. Was passiert zum Beispiel, wenn ein Ort dazukommt? Die Datenbank sollte mindestens 2 Tabellen haben.
    1. Tabelle Sensoren: ID|ORT|NAME
    2. Tabelle Daten: ID|ID_SENSOR|DATUM|WERT
    Das wäre der richtige (nicht fertige) Weg. So könnt Ihr jederzeit Sensoren und Orte hinzufügen, ohne die Tabellen ändern zu müssen.
    Im Programm macht Ihr dann aus jeder Tabelle ein Datenbankobjekt und aus den Sensoren ebenfalls eine Klasse und das ganze wird schön übersichtlich!

  • Man könnte das auch mit nur einer Tabelle und schreibt dann einfach den ORT mit dem WERT in eine Spalte und nutzt ein eindeutiges Trennzeichen - das wäre auch sehr flexibel :fies:


    ID | TIMESTAMP | DATA


    1 | 134526475 | WOHNZIMMER;;2263;;4637
    2 | 134526475 | KUECHE;;2263


    erster Wert wäre Temperatur und zweiter Wert wäre Luftfeuchte falls vorhanden.

  • Noch ein paar Fragen:


    - Welchen Browser wirst du verwenden? Sofern du keinen IE nutzen wirst könnte man nämlich jQuery 2.x verwenden...
    - Sollen sich die Charts von selbst aktualisieren während sie betrachtet werden? (ajax)
    - Sollen mehrere Charts pro ORT angezeigt werden oder alle in einem Chart? Insbesondere wenn sowohl Temperatur als auch Luftfeuchte mit angezeigt werden soll könnte das in nur einem Chart problematisch werden - das würde ich zunächst trennen also Temperatur-Werte in einem Chart und Luftfeuchte in einem anderen.
    - Möchtest du die Charts auch mit einem Tablet/Handy betrachten können?
    - Soll die Seite übers Internet zugänglich gemacht werden und soll nur für berechtigte User einsehbar sein? (also Login erforderlich)


  • Die Tabelle an sich würde Ich anders aufbauen - ich mag es nicht wenn dattime verwendet wird, da der Umgang damit umständlicher ist. Besser finde ich timestamp bzw Unixtime, also einfach ein int(11) als Typ - das kann man dann ziemlich einfach ohne großen Aufwand in alle mögliche Formate und Zeitzonen konvertieren und man kann auch mit SQL Querys besser damit hantieren.


    OK, wahrscheinlich gibts deswegen die Fehler mit der Zeit im anderen Script.


    Quote

    Auch würde ich den komplett ermittelten Sensor-Wert eintragen, ohne Kürzung. Also nicht bereits auf ein oder 2 Stellen hinter dem Kommata kürzen = 22.562 sondern nur 22562 eintragen und den Rest macht man dann via PHP. Das Python Script teilt den ausgegeben Wert halt bereits durch 1000 und somit muss der Spalten-Typ float bieten.


    Ob das so sinnig ist weiß ich nicht. Wie siehts denn dann mit dem Export der Daten für Exel aus?
    Aber Hauptsache es klappt am Ende sauber.



    Die Datenbank sollte "normalisiert" werden, denn so ist sie nicht wie gewollt zukunftssicher. Was passiert zum Beispiel, wenn ein Ort dazukommt? Die Datenbank sollte mindestens 2 Tabellen haben.
    1. Tabelle Sensoren: ID|ORT|NAME
    2. Tabelle Daten: ID|ID_SENSOR|DATUM|WERT
    .....


    Das habe ich jetzt schon öfters gelesen. Es klingt auch vernüftig.
    Wie sieht es denn hier mit einem Export aus?
    Ich bevorzuge zwar den grafischen Ausdruck am Ende, aber neugierig bin ich schon.




    Noch ein paar Fragen:


    Frage: Welchen Browser wirst du verwenden? Sofern du keinen IE nutzen wirst könnte man nämlich jQuery 2.x verwenden...
    Antwort: Wir verwenden den IE nicht. Firefox, Chrome, Safari.


    Frage: Sollen sich die Charts von selbst aktualisieren während sie betrachtet werden? (ajax)
    Antwort:
    Nein, brauchts nicht. Die Messintervalle bewegen sich ohnehin zwischen 15und 25 Minuten


    Frage: Sollen mehrere Charts pro ORT angezeigt werden oder alle in einem Chart? Insbesondere wenn sowohl Temperatur als auch Luftfeuchte mit angezeigt werden soll könnte das in nur einem Chart problematisch werden - das würde ich zunächst trennen also Temperatur-Werte in einem Chart und Luftfeuchte in einem anderen.
    Antwort: Temperatur und Feuchte trennen macht wohl Sinn. 2Charts (Feuchte & Temperatur) untereinander würden gehen?
    Oder ist das zuviel für einen Browser? Ansonst alle Messpunkte in eine Chart.


    Frage: Möchtest du die Charts auch mit einem Tablet/Handy betrachten können?
    Antwort: Nein. Es wird stationär abgefragt. Evtl wird mal, wenn man im Netzwerk ist, das Handy genommen. Ist aber völlig egal.
    Wäre doch auch zuviel unötiger Aufwand.


    Frage: Soll die Seite übers Internet zugänglich gemacht werden und soll nur für berechtigte User einsehbar sein? (also Login erforderlich)
    Antwort: Nein. Keine Verbindung zur Ausenwelt ;) .


    Vorlage wäre wirklich das von Tafkas.
    Die optische Aufteilung eben in 12 Std.
    Die Zeit-Auswahl links.
    Sensorwahl unter der Chart.


  • Man könnte das auch mit nur einer Tabelle und schreibt dann einfach den ORT mit dem WERT in eine Spalte und nutzt ein eindeutiges Trennzeichen - das wäre auch sehr flexibel :fies:


    ID | TIMESTAMP | DATA


    1 | 134526475 | WOHNZIMMER;;2263;;4637
    2 | 134526475 | KUECHE;;2263


    Machen kann man das, aber normalerweise schreibt man keine zwei Werte in eine Zelle. Normalisierung bedeutet (sehr) sehr einfach gesagt, dass Du nur noch einen Wert in einer Tabellenzeile (3. Normalform) hast. Aber da muss man eine Menge Gehirn reinstecken, weil das sehr abstrakt wird. Und wer die 3. Normalform begriffen hat, ist schon echt gut dabei!

  • Ich hab damit bereits gestern angefangen und nutze " id,sensor_type,sensor_place,timestamp,temp,hum "


    Ist soweit auch schon fast fertig, nur Highcharts sträubt sich noch ein bissal :(


    Es gibt eine config.php in der alles nötige eingestellt werden kann und sieht zZt so aus:

  • Du bist ja fix. ;)
    Macht es eigentlich eine großen Unterschied ob man dann MySQL oder SQLite verwendet?
    Wie schreibst du für die Tabelle?
    So, wie ich es schon habe? (Quasi avrio-Skript)
    Oder so wie es Jörg meine?
    Beides ist OK. Nur das mit den 2 Werte in einer Zelle möchte ich nicht.
    Mal abgesehen davon das die Messpunkte ja garnicht zusammenliegen.

  • Ob MySQL oder SQLite oder PostgreSQL ist meistens eine Frage der zur Verfügung stehenden Performance, der Datenmenge und die spätere Kompatibilität.


    Für MySQL und PostgreSQL läuft halt permanent ein Dienst im Hintergrund, der trotz aktueller nicht-Verwendung dennoch CPU+RAM verbraucht.
    MySQL ist vergleichsweise langsam(er) aber am besten unterstützt sowie problemlos Netzwerkfähig, was auch PostgreSQL wäre.. MySQL verbraucht aber im Vergleich zu den anderen auch mehr RAM.
    SQLite sind aber nur Dateien und somit nicht ohne weiteres Netzwerkfähig, zudem anfälliger für Dateifehler... Dafür läuft aber nicht ständig ein Dienst und verbraucht somit auch weitaus weniger RAM..


    Da du die Daten aber auch in Excel importieren bzw exportieren willst, bietet sich MySQL schon irgendwie an - es gibt soweit ich weiß nämlich ein PlugIn direkt für Excel...



    Aktuell verwende ich nur eine Tabelle 'data' mit den Spalten: id, location, timestamp, temp, hum


    Mehr als wie folgt gibt's aber noch nicht zu sehen, da ich immer noch an der Übergabe der Werte an Highcharts kämpfe - das verschlingt mehr Zeit als der ganze Rest :(


    -> http://RaspberryPI.RoXXs.org/charts/



    Mit dem Script zum erfassen und einfügen habe ich mich noch nicht befasst, werde aber denk ich das avrio-Script verwenden, nur leicht modifiziert ;)

  • Ich bin jetzt schon ein ganzes Stück weiter - habe allerdings noch ein etwas komisches Problem mit der Tooltip Anzeige für die Kennlinien :( Also die Detail-Anzeige wenn man mit der Maus über einer der Punkte geht..


    -> http://raspberrypi.roxxs.org/charts/?period=1y


    Wenn ich das noch gelöst kriege sollte die Web-Oberfläche fertig sein ;)
    Sieht zufällig jmd den Fehler? :huh:

  • Oh wie schön!
    Es kommt nur keine Tooltip-Anzeige, wenn du das meintest.
    Kanns an der Zeichenkodierung liegen? (Umlaute gehen nicht)


    Küche und Wohnzimmer unter Feuchte gehen nicht.
    Evtl ist dort etwas faul und der Wurm drin.


    Leider kann ich da ja nicht weiter helfen

  • Wohnzimmer und Badezimmer haben aber keine Umlaute, also müssten zumindest diese Tooltips gehen - aber Küche hat auch kein Umlaut da es bereits als 'K?che' in der Datenbank steht, da ging bereits was beim Adden schief :D


    Küche und Wohnzimmer haben auch hum-Werte aber Küche hat nur einen also bildet sich nur keine Linie... Die Datensätze sind nur zum testen - Hauptsache es steht was drin... Und das mit dem abwählen ist nur wegen dem z-index des Footers, das lässt sich ja schnell ändern.


    :denker: Hm naja muss ich morgen mal weiter gucken - hab zZt auch nicht sooo viel Zeit



    //EDIT: Habs :cool:


    Welcher Tooltip gefällt dir besser? Der vom "temp" oder der vom "hum" ?


    Aber die Probleme reißen nicht ab... Trotz korrekter Zeit im MySQL und useUTC: false Option, zeigt der Chart 2h zu wenig an - also z.B. um 23:43 insert'ed aber der Chart zeigt 21:43 ... :denker:

  • Sehr schön! :thumbs1:
    Der Tooltip von "hum" passt.


    Das wegen der Zeit hab ich auch erst gelesen.
    2 Dinger hab ich grad noch hier Link_1 und Link_2
    Das andere find ich eben nicht.



    Hab gesehen das Tafkas ein Script für Sunset/Sunrice drin hat. Ich dachte der Hintergrund wechselt "nur" alle 12 Std. und er hätte es etwas verschoben.
    Wie auch immer. Ist der Code überhaupt so vollständig?
    http://blog.tafkas.net/2012/11…and-sunset-in-highcharts/
    In der HTML steht ja auch noch etwas drin was in der Beschreibung nicht ist.
    Fehlt da nun was oder reichts mit dem Code?



    #Edit
    Kannst bitte noch die Schriftgröße für die ältere Generation anpassen? :daumendreh2:

  • Gute Frage.
    Du hast aber schon, ne? Kleines bisschen evtl noch?


    Schade das es nicht mit GMT CEST ging.


    Ich lintz immer mal, vorallem auf Arbeit, mit dem Handy ins Netz. Das zeigt mir aber keine Chart.
    Ein bestimmter Grund? (Browser Dolphin/Chrome)
    Nur so aus Neugier.

  • Hm ich versteh grad leider nur die Hälfte von dem was du geschrieben hast


    - Das Zeit-Anzeige-Problem habe ich gelöst, lag an den globalen Highcharts Options die er zuvor nicht gefressen hatte.
    - font-size vom Menü und auch der xAxis sowie yAxis habe ich einheitlich auf 10pt hoch gesetzt.
    - Die Charts werden jetzt auch mit dem Theme 'grid' angezeigt, was ich persönlich besser finde - lässt sich einfach und schnell ändern da man nur das jeweile theme File laden muss (oder eben nicht). Ich finde allerdings den Tooltip des oberen Charts besser da die Werte besser zuzuordnen sind vor allem wenn sich Werte von mehreren Tagen anzeigen lässt... Das ist btw der default Tooltip.
    - Man kann fürs Tooltip einstellen das die Werte auf nur 2 Decimals (nach dem Kommata) gekürzt werden. Somit kann man weiterhin in die Datenbank längere Werte eintragen und brauch auch beim Auslesen hierfür keinen Aufwand betreiben.
    - Der obere Chart hat auch eine kleine Verzögerung beim zeichnen der Linien (animation duration) was ich persönlich auch schöner finde ;)



    Noch ein paar Details bevor ich das vergesse...:


    Bei der Gelegenheit poste ich auch gleich den derzeitigen Code, damit vielleicht jetzt bereits Kritik/Verbesserungen einfließen, oder Fragen beantwortet werden könnten.


    Ich habe mich bemüht das ganze möglichst Modular aufzubauen mit folgender Struktur:

    • index.php
      Hauptdatei


    • data.php
      Ruft die Daten von der MySQL Datenbank ab und gibt diese als JSON Werte aus.
      Wird in der index.php im Menü etwas ausgewählt wird mithilfe von jQuery ein Aufruf der data.php mit Übergabe des Zeitraums (period) und dem Type (temp oder hum) durchgeführt, erst für temp um diesen Chart zu generieren und anschließend noch mal für den hum Chart.


    • include/config.php
      Einzige Datei in der Einstellungen vorgenommen werden müssten.


    • include/functions.php
      Globale Funktionen - zum Beispiel fürs verbinden zum MySQL sowie absetzen von Query's.


    • include/global.php
      Globale Variablen sowie Einbindungen von weiteren PHP Dateien.


    • js/functions.js
      Globale JavaScript Funktionen - aktuell nur für die Sunset Geschichte


    • js/jquery-1.11.3.min.js
      compressed jQuery...


    • highcharts/js/highcharts.js
      HighCharts Dateien wie sie auch im Archive zu finden sind..


    • highcharts/js/modules/exporting.js
      HighCharts Dateien wie sie auch im Archive zu finden sind..


    • highcharts/js/themes/grid.js
      HighCharts Dateien wie sie auch im Archive zu finden sind..


    Ich werde mich bemühen noch ein paar mehr Kommentare einzufügen sobald ich fertig bin, sowie den Source auf meinem Github ablegen um es einfacher herunterladen zu können.

  • Klasse!
    Es wird. Und ja, Fragen hab ich. :thumbs1:



    Quote

    - Der obere Chart hat auch eine kleine Verzögerung beim zeichnen der Linien (animation duration) was ich persönlich auch schöner finde undefined


    Finde ich persönlich jetzt nicht. Wo kann man das denn alles einstellen? OK
    In welchem Abschnitt werden denn eigentlich die Tooltip bearbeitet? OK



    Könntest du noch bitte kurz das PHP in der Index-Datei erklären?
    Warum die DIVs als Echo usw. Kenne das so nicht.