Python + Mysql + Webserver = Veranschaulichung mit Graphen!

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Tag!

    Wahrscheinlich ist dieser Thread hier der 100 :blush: .

    Nun zum Problem:

    Ich habe ein Script, welches mir die Bodenfeuchtigkeit misst und ausgibt, nun möchte ich gerne diese Werte in eine Datenbank schreiben, MysQL? Die wiederum in einer Website Grafisch Dargestellt werden sollen. Brauche ich überhaupt eine Datenbank? Oder ließe sich das direkt realisieren?

    Intressant (für mich) wie schreibe ich generell Python "Print" Ausgaben in eine Datenbank?

    Außerdem wie bekomme ich diese Daten noch für andere Ersichtlich? Also Graphisch. Ja Klar mit einem Webserver, dies sollte auch kein Problem sein, das Problem (für mich) ist aber die Daten des Scripts
    in die Website zu bekommen!

    Ich habe dieses PHP System gefunden, jedoch weiß ich einfach nicht wie ich die ganzen Zusammenhänge zusammenkriege :D :D .

    Ich"erwarte" KEINE "Eierlegendewollmilchsau", sondern eher Denkanstöße;) Ich möchte nich einfach nur Copy and Paste haben, sondern es auch verstehen!


    Danke im voraus für die Tipps!

    mfg

    Wenn's brennt 112 hilft weiter!

  • Python + Mysql + Webserver = Veranschaulichung mit Graphen!? Schau mal ob du hier fündig wirst!

  • Eine Datenbank brauchst du dann wenn du einen Verlauf einsehen willst, also zum Beispiel die Messwerte der letzten Wochen. Man könnte das auch ohne extra Datenbank realisieren aber nur solange das Script läuft/aktiv ist.

    "print" Ausgaben schreibt man nicht in Datenbanken. Wenn dann spricht man explizit eine Datenbank an.

    Da du Python für den Webserver verwendest oder verwenden willst/kannst, brauch man kein PHP. Du brauchst nur einen JavaScript Graphen ala HighCharts

    Siehe dazu:
    FAQ => Nützliche Links / Linksammlung => [Python] Webserver, Websocket und ein bisschen AJAX
    FAQ => Nützliche Links / Linksammlung => HighCharts
    => Google Suche nach: Python SQL

    Daraus musste dir was zurecht basteln - hab grad nicht die Zeit dir das ausführlicher zu beschreiben, sorry.

  • Schneller als der Schall:D So schnell habe ich ja nicht mit antworten gerechnet!

    @meigraf

    Das geht genau in die richtige Richtung Danke! Werde ich mich mit befassen!

    Zentris
    Werde ich auf jeden FALL ausprobbieren! Das sieht genauso aus wie ich es mir vorgestellt habe! Ich benutze den Bodenfeuchtigkeitssensor von Sparkfun!
    KLICK.

    Jedoch würde ich gerne alle Aufgaben einen Pi erledigen lassen!

    Messung --> Relai schalten --> Speichern --> Datenbank anlegen (optional) --> Auf der Website anzeigen lassen!

    Wenn's brennt 112 hilft weiter!

  • Zentris: Anstatt den Thread voll zu kotzen (*würg*) wärs schöner wenn du schreibst wieso der Sensor von Sparkfun nicht so toll ist :fies:


    BTW: Aufwischen musste dein *würg* auch selber! :D

  • Moin meigraf,

    Wenn du mal die Zeit finden solltest , mir das kurz zu erläutern wäre das echt super!

    Ich habe deine links schon angeguckt:)
    Ich weiß aber nicht wo ich jetzt anfangen muss:(
    Das mit den HighCharts kommt zum Schluss, da ja erstmal das Script laufen muss!

    Mfg

    Wenn's brennt 112 hilft weiter!

    Einmal editiert, zuletzt von raspbastler (29. Oktober 2016 um 09:56)

  • Na, setz erst mal "Zu Abschnitt 1" um dann haste schon mal einen funktionierenden Webserver via Python. Der Rest sollte dann eigentlich recht einfach sein - Du springst dann einfach nur zum Punkt "Zu Abschnitt 3"

    ...Du musst nur die javascript Dateien vom HighCharts ins static Verzeichnis tun, in die index.html einbinden und dann halt die Messwert-Daten als JSON übergeben. Anstatt die data.php aufzurufen machst du das dann halt über die URI /data/

    Versuch das erst mal und frag dann gezielter ;)

  • So,

    Was habe ich hinbekommen:
    Python Webserver aus Abschnitt 1 (mit Bottle)
    Python Webserver aus Abschnitt 3 läuft alles soweit!
    MYSQL installiert und "testweise" 2 Benutzer angelegt!
    Apache installiert!

    Was fehlt:
    Bekomme keine Vernüftige Website beim Python Webserver siehe Attachmend!
    Bekomme die *js files nicht eingebunden!

    Ich werde jetzt das System neu aufsetzen und werde es nochmal Probieren!
    Brauche ich überhaupt apache?

    Außerdem, wird bei dem Python Webserver immer eine index.html verwendet und nicht wie bei den HighCharts eine index.php.
    Habe ich jetzt irgendwo einen Denkfehler, oder bin ich einfach nur auf dem "Holzweg"? :denker:

    Vielen :danke_ATDE:

  • Du brauchst kein apache. Du hast doch nun einen Webserver über python, dann brauchst du keinen weiteren Webserver. bottle ist ein Web-Framework. Quasi ein apache nur eben in python ;)

    Das was du im attachment hast ist PHP Code aber PHP kannst du über Python nicht mehr verwenden - brauchst du auch nicht. apache2 würde *.php Dateien dem PHP Interpreter übergeben. Den Part von PHP übernimmt aber nun python.


    Also noch mal von vorne:

    Folgst du meiner "Python Webserver" Anleitung müsstest du folgende Struktur haben:
    /home/pi/web_bottle.py

    /home/pi/templates/index.html

    /home/pi/static/jquery.min.js

    ...keine einzige *.php


    Da ja kein PHP mehr da ist um die Daten aus der Datenbank zu holen und für HighCharts aufzubereiten, muss diesen Part nun Python übernehmen - soweit eigentlich klar.
    Allerdings basiert mein HighCharts Projekt ja darauf eine bestimmte URL anzusprechen: /data.php?type=temp&period=2w
    Das muss man anpassen, was ich jetzt in einem ersten Versuch auch bereits umgesetzt habe... So wie ich das nun gelöst habe ist es nicht unbedingt perfekt, funktioniert aber soweit sehr gut. (UPDATE: Siehe dazu Beitrag#12)

    Im Prinzip läuft das nun so ab:

    - Die Links im Menü auf der linken Seite zeigen auf eine URL wie zB: /cmd?period=30mi
    In dem Fall soll also eine Period (Zeitraum) von 30 Minuten angezeigt werden. Über bottle passiert dann folgendes:

    Python
    @bottle.route('/cmd')
    def CommandHandler():
        setting['period'] = bottle.request.query.period or chart.keys()[-1]
        # remove all numbers from period string (eg. from 12h so only h is left)
        setting['periot_unit'] = ''.join([i for i in setting['period'] if not i.isdigit()])
        # remove the Unit from period string so only numbers are left
        setting['periot_num'] = ''.join([i for i in setting['period'] if i.isdigit()])
        printD("Period Request: {}".format(setting['period']))
        return bottle.redirect("/")

    Es wird also eine Einstellung in einem Dictionary gesetzt und zurück auf die Index Seite umgeleitet. Auch werden wie den Kommentaren zu entnehmen ist, aus 30mi ein mal nur die Buchstaben (Unit) als auch nur die Zahlen (Num) extrahiert, was ich für die spätere Auswertung benötige.
    Ab diesem Zeitpunkt kann man die Seite ruhig neu laden (F5 bzw reload) und kriegt dann trotzdem weiterhin die selbe Period angezeigt.
    Das Dictionary wurde übrigens zuvor ausserhalb jeglicher Funktion initialisiert und ist somit global.
    Diese Period Angabe bezieht sich auf die Datenbank-Einträge nicht auf die aktuell reelle Zeit. Wenn man also 30mi auswählt dann werden die in der Datenbank verfügbaren Datensätze der letzten 30 Minuten angezeigt... Wenn zuletzt gestern um 12Uhr ein Datensatz geschrieben wurde zeigt er also 11:30Uhr bis 12 Uhr von Gestern an, danach existieren ja keine Daten mehr also könnte er dann auch nichts mehr anzeigen...
    Dann habe ich mich daran gesetzt und die data.php in Python umzusetzen und dabei ist nun folgendes rausgekommen:

    Die Besonderheit hierbei ist der Mix aus list() und dict() damit die Daten im korrekten json Format für HighCharts ausgegeben werden.
    Eine weitere Besonderheit stellt meine DB Klasse dar und dass wir hier wirklich 2 verschiedene Verbindungen zur MySQL Datenbank benötigen denn sonst wird "cursor" überschrieben und man kann keine Verketteten Daten abrufen.
    Das alleine reicht aber natürlich noch nicht aus.


    Zu guter letzt muss man auch die index.html anpassen sodass nicht mehr die data.php angesprochen wird und eben allgemein keinerlei php Code mehr enthalten ist.
    Die Daten werden jetzt über die folgende URL abgerufen:
    /data?type=temp

    /data?type=hum
    Das kann man übrigens auch automatisieren indem man den jeweiligen $.getJSON() Abschnitt im JavaScript innerhalb eines setInterval() setzt... Dann könnten sich die Graphen zum Beispiel alle 10 Sekunden automatisch erneuern.
    Ins Template bzw index.html kann man Python Code integrieren, dann eben nur explizit als solchen gekennzeichnet. Dadurch kann man zB Variablen aus dem PythonScript in die index.html einfügen bevor diese dem Client angezeigt wird. Auch steuer ich darüber das der HighChart-Code nur dann angezeigt wird wenn setting['period'] gesetzt wurde.

    Siehe dazu https://bottlepy.org/docs/dev/stpl.html#embedded-python-code

    Ich werde versuchen das Projekt demnächst auf mein github Repo hochzuladen... So ganz perfekt sind die Benennungen aber noch nicht :fies:

    Was du also benötigst, ist bereits erwähnter "Abschnitt 3", nur die control.js brauchst du nicht.
    web_bottle.py ersetzt du hiermit => http://codepad.org/ovLq5jnp
    templates/index.html ersetzt du hiermit => http://codepad.org/z8A0DKTy
    Dann benötigst du natürlich noch die gewohnte Struktur meines HighCharts Projekts:

    Code
    `- static/
     `- jquery.min.js
     `- stylesheet.css
     `- highcharts/
    |- templates/
     `- index.html

    ...siehe dazu auch im Anhang...


    PS: Im späteren Betrieb nicht vergessen DEBUG auf 0 zu stellen.

  • Hab das Projekt nun auf Github veröffentlicht => https://github.com/meigrafd/HighCharts__python

    Ein paar kleinere Änderungen habe ich vorgenommen:

    • /cmd gibt es nicht mehr.
      Das gefiel mir eh nicht aber mir viel auch kein besserer Name ein... Stattdessen wird ?period nun direkt ans Index übergeben: /?period=30mi
      Wenn man die Seite das erste mal ansurft wird setting['default_chart'] aufgerufen, was im aktuellen Zustand '1y' entspricht.
    • Damit 1. funktioniert musste die index.html auch etwas angepasst werden, genauer gesagt das Menü auf der linken Seite.


    Viel Vergnügen damit ;)

  • Moin Meigraf,

    RESPEKT! VIELEN DANK! Jetzt genug "geschrien" , melde mich erst jetzt da ich sehr stark eingebunden war. Sowie den Thread nicht Aboniert hatte:( Da ich jetzt aber sehe wie es läuft bin ich sehr erstaunt darüber!
    Ich baue gerade das Script, welches mir die Sensorwerte in die Tabelle schreibt! Villeicht magst du mir dabei ein wenig "unter die Arme" greifen! Bekomme das irgendwie nicht so richtig hin. Bon halt doch nicht so der Python Crack!
    Ich glaube ich muss mich doch mal näher mit dem allgemeinen Thema Python beschäftigen.... Hast du da ein paar tipps? Also Lektüren oder ähnliches?
    Die nächsten Tage werde ich erstmal deine Dokumentation durcharbeiten. Da gehen bestimmt ein paar Minuten drauf wenn nicht sogar Stunden:D

    Was hälts du von RRDTool?

    Anbei mein spärlicher Code;)

    Mir fehlt immer noch, dass die Daten in die Datenbank geschrieben werden:(

    VIELEN Dank

    mfg

    Wenn's brennt 112 hilft weiter!

    Einmal editiert, zuletzt von raspbastler (15. November 2016 um 21:24)


  • Zentris: Anstatt den Thread voll zu kotzen (*würg*) wärs schöner wenn du schreibst wieso der Sensor von Sparkfun nicht so toll ist :fies:

    Sry. für die späte Reaktion, bin derzeit etwas seltener hier und hab den Thread aus den Augen verloren, will aber keine Antwort schuldig bleiben:

    Um jetzt hier nicht unnötig Text zu erzeugen, verweise ich mal auf das Wiki meines Erdfeuchte-Git-Reposities (Abschnitt "Sensoren"), gleich die erste Sensorbesprechung handelt von dieser Art des Sensors und über die "Für" und "Wider" bzgl. des Einsatzes.

    Das Thema wurde auch im Erdfeuchtethread schon länglich diskutiert...


    BTW: Aufwischen musste dein *würg* auch selber! :D

    Nix da, *würg* ist nicht *kotz* und somit eine besondere Form der Körperbeherrschung :lol:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!