sqlite Datenbankzugriff geht nicht - Ziel Klimalogger mit grafischer Auswertung

  • Hallo zusammen,

    ich habe einige Pi's Zuhause und habe bisher immer einfache Projekte damit umgesetzt. Nun wollte ich mich ans Thema Klimalogger wagen. Python, PHP, MySql , usw. war bis dahin alles komplett Neuland für mich. Durch learning by doing bin ich bisher auch gut weiter gekommen, doch nun mit dem Latein am Ende und hoffe ihr könnt mir vielleicht ein paar Tips geben die mich weiter bringen.

    Was bisher geht:

    - Temperatur und Feuchtigkeit über DHT22 Sensor messen

    - die Messwerte mit Datum und Zeit in 3 verschiedene Datenbanken schreiben

    - Datenbank bzw. Messwerte über PhpLiteAdmin ansehen

    Was nicht geht:

    - Sich mit der Datenbank zu verbinden um die Werte auf einer PHP Seite anzeigen zu lassen

    Was weiter geplant ist:

    - Die Messwerte grafisch anzeigen

    - diverse Durchschnittswerte bilden und anzeigen

    Hier mein Python Code mit dem die Datenbank gefüttert wird.

    Meine Datenbank wurde mit sqlite3 erstellt und mit phpLiteAdmin habe ich die Tabellen definiert. Über MariaDB wird sie nicht angezeigt und ich kann sie dort auch nicht hinzufügen. Probiert habe ich dies über den Befehl

    Code
    sudo mysql -u root

    Über diesen PHP Code hab ich mit unterschiedlichsten Benutzernamen und Passwörtern probiert Zugriff zu bekommen. Immer vergeblich

    Aber ich denke ich bin nun beim Schreiben von diesem Beitrag hier auf die Lösung gestoßen. Ich habe nebenher noch etwas recherchiert .... und dann fiel mir auf, die Lösung steckt ja schon in meinem Python Code. Dort greife ich ja schon auf meine Datenbank zu um sie dann zu beschreiben . Zum Auslesen und weiter verarbeiten brauche ich dann wohl nur anderen sqlite3 Code... :wallbash: manchmal sieht man den Wald vor lauter Bäumen nicht.

    Oder gibt es doch eine Möglichkeit sich über den mysqli_connect Befehl auf die sqlite3 Datenbank zu verbinden?

  • sqlite Datenbankzugriff geht nicht - Ziel Klimalogger mit grafischer Auswertung? Schau mal ob du hier fündig wirst!

  • Sorry, ich hab keine Ahnung worin der Unterschied zwischen MySQL und MySQLi besteht oder warum es MySQLi heißt anstatt sqlitei. Ich weiß nur, dass sqlite wohl einfacher zu handeln ist und auch weniger ressourcen braucht.

    Und die von mir angedachte Lösung ist auch quatsch, da das eine Python ist, das andere PHP. Ich tappe weiter im Dunkeln und hab schon überlegt alles neu aufzusetzen und dann mit rrdtool zu realisieren

  • mysql und sqlite sind 2 verschiedene Datenbanksysteme, die zwar beide ein Subset der SQL-Befehle kennen, aber nicht einfach so austauschbar sind. Deswegen kannst du per mysqli-Erweiterung nicht auf eine sqlite-DB zugreifen. Dafür gibt es die php-sqlite Funktionen, zu deren Dokumentation obiger Link auf php.net führt. Diese solltest du lesen und anwenden.

    Wenn du nichts zu sagen hast, sag einfach nichts.

  • ich hatte mal wieder etwas Zeit zum probieren mit python usw.


    Datenbank mit python befüllen und auch auslesen diverser Werte klappt. Nun möchte ich das ganze gerne mit matplotlib auswerten. die Fortschritte sind mühsam ...

    aber hier erst mal meine bisherigen Codeschnipsel zum auslesen einiger Werte aus der Datenbank:


    Dies bringt folgendes Ergebnis:

    (u'2019.02.13', u'14:55', 70.9, 20.2)

    (u'2019.02.13', u'14:50', 70.8, 20.2)

    (u'2019.02.13', u'14:45', 70.6, 20.2)

    (u'2019.02.13', u'14:40', 70.5, 20.2)

    (u'2019.02.13', u'14:35', 70.4, 20.2)

    Wie man sehen kann, ist dem Wert für Datum und Zeit ein "u" voran gestellt. Keine Ahnung warum. Dies macht mir nun aber das Leben schwer, weil ich die Werte nun nicht in das nötige matplotlip format umwanden kann. Warum beide Werte noch in einem Hochkomma stehen ist mir auch schleierhaft. In der Datenbank werden sie eigentlich als String abgespeichert

    Mein Code für matplotlib bzw die Umwandlung der Zeit sieht wie folgt aus:

    Das bringt mir wegen dem komischen Zeit und Datumsformat folgenden Fehler:

    ValueError: time data "[u'14:55']" does not match format '%H %M'

    Kann mir vielleicht jemand sagen woher das "u" kommt und warum die Zeit in Hochkomma steht?

  • Das u steht wohl für Unicode

    Versuche mal die Zeitvariablen in ein Datetime objekt vor der Übergabe umzuwandeln.

    Hast du dir schon mal Pandas in Kombination mit mathplot angeschaut (ja ich hatte/hab auch davor immer noch ein grauß. Aber es macht auch oft vieles einfacher.

  • Die Fehlermeldung kommt davon, weil du ein Leerzeichen zwischen den Platzhaltern hast.

    strinng,"%H %M"

    Edit:

    - eine Variablenbenennung ist auch nicht gut gewählt (auch nicht Deutsch/Englisch mischen)

    - strinng=str(Zeit) :conf:

    - verwende Python3.x wenn du eh schon die print-Funktion schreibst

    https://docs.python.org/3/tutorial/

    https://py-tutorial-de.readthedocs.io/de/python-3.3/

  • danke für eure schnellen Antworten. Hab ich inzwischen auch gemerkt, dass der : zwischen %H %M für das u in der Ausgabe sorgt.

    Pandas will ich mir erst mal nicht anschauen. Es ist als Anfänger schon sehr mühsälig überhaupt voran zu kommen. Wenn ich dauernd was neues probiere wird das dann nie was ;)

    Ich hab eben mit datetime rumgespielt. seh ich das richtig, wenn ich dieses format verwende, dass ich dann nur 1 feld in meiner datenbank brauche? oder macht es auch hier sinn 2 felder zu nutzen und diese entsprechend zu formatieren?

  • Schreib einen timestamp (SQL kennt den Datentyp TIMESTAMP) in die DB.

    Edit:

    Hab das mal ausgegraben

    Meswert in Datenbank einfügen

    https://forum-raspberrypi.de/forum/thread/32938-diagramme-mit-bokeh-aus-sqlite-erstellen/?postID=270658#post270658

    Edit2:

    also per Suchfunktion findest du eigentlich alles...

  • ich nutze sqlite3. und rufe nun über zeit=datetime.datetime.now() alles ab und übergebe es in die Datenbank. Da kommt das so an :

    2019-02-13 16:12:21.817760

    Der Typ des feldes ist dort datetime. wollte gerade ausprobieren ob mein obiger code zum plotten einer Grafik sich nun mit %H%M ausführen lässt.

  • interessanter Ansatz mit "detect_types=sqlite3.PARSE_DECLTYPES" beim verbinden der Datenbank. nur muss ich für motplotlib diesen timestamp auch erst in eine Zeit umwandeln damit matplotlip die handeln kann

  • Hab ich inzwischen auch gemerkt, dass der : zwischen %H %M für das u in der Ausgabe sorgt.

    Das ist so sicher nicht richtig. Für das 'u' sorgt vermutlich der Umstand, daß SQLite strings standardmässig als Unicode codiert. Der Doppelpunkt sorgt nur dafür, daß der string nicht zu Deinem Formatcode passt.

  • > plt.plot(timme,Feuchte)

    > plt.savefig('datend.png')

    Das gehoert sicher nicht in den Loop, das soll nur einmal aufgerufen werden!

    Ich muss gerade mit matplotlib ueben ;) und der Code scheint schon recht weit zu sein.

    Ohne Garantie fuer irgendwelche Ergebnisse: Datenbank und Code in ein ZIP stecken und hier posten...

  • Ohne Garantie fuer irgendwelche Ergebnisse: Datenbank und Code in ein ZIP stecken und hier posten...

    das Angebot nehm ich doch gern an ;) vielleicht lernen wir beide noch was.

    kann sein dass in den einzelnen Codes der Name der Datanbanken immer anders ist, da ich wie wild hin und her probiere und die laufende Datenerfassung nicht stören will.

    ich hab nun mal folgendes in das Zip gepackt:

    - Datenbank_fuellen.py (damit füll ich seit Monaten alle 5 Minuten meine Datenbank)

    - Datenbank_fuellen_NEU.py (ein Versuch um das datetime Format nutzen zu können)

    - versuch_zu_plotten.py (hier hab ich den Zeitformat Fehler)

    - zeitTypen.py (damit wollte ich mir mal verdeutlichen was ZEIT eigentlich so alles sein kann)

    - sensordaten_Bad_2019-02-13.dump.sql (Beispieldatanbank wie ich sie seit Monaten fülle)

    - sensordaten_xxx_2019-02-13.dump.sql (Beispieldatanbank in anderem Zeitformat)

    Ich denke ich komme dem Fehler immer näher und er liegt im Format meiner Zeitangabe. hab noch nicht rausgefunden wie ich das umwandle damit es matplotlib lesen kann.

  • so, beim schreiben meiner Zeitwerte in die Datenbank nutze ich nun

    zeit = int (time.time())

    das speichert z.B. den Wert: 1550086739 ab

    dieser Wert lässt sich direkt mit matplotlib ausplotten. Sieht dann aus wie im Bild. nun darf ich rausfinden wie ich die X-Achse umwandeln muss, damit auch hier ein vernünftiges Datum/Uhrzeit angezeigt wird.

  • Hallo,

    wenn du Probleme mit den Datentypen hast (sooo viele kennt SQLite ja auch nicht): nimm' eine ORM wie SQLAlchemy oder PeeWee. Das macht für die transparent die Umwandlung von Python Datentype / Objekten und dem, was die DB versteht vor. Plus eine ORM macht auch andere Sachen einfacher.

    Und natürlich direkt auf Python 3 wechseln, Python 2 ist Ende des Jahres EOL.

    Gruß, noisefloor

  • Für deine DB mit einer Tabelle und vier Spalten halte ich eine zusätzlich eingebaute Schicht à la SQLAlchemy oder PeeWee etc. für mehr als nur übertrieben.

    @mischtkrabb

    Ich würde wie bereits erwähnt den Zeitstempel direkt in die DB eintragen lassen:

    conn.execute("INSERT INTO xxx VALUES (datetime(CURRENT_TIMESTAMP, 'localtime'), ?, ?)", (humidity,temperature)

    und dann hast du nur noch drei Spalten...

    Edit oder:

    DATETIME('now', 'localtime')

  • Vielen Dank erstmal an alle die hier versucht haben mir zu helfen!

    Mit learning by doing kommt man schon gut voran. Aber manchmal fehlt einem als Anfänger halt einfach das Hintergrundwissen bzw. das Verständnis für die Zusammenhänge. Das hat mir für die diversen Anzeigeformate von "Zeit" , "Datum" oder "timestamp" doch sehr den Kopf zerbrochen.

    Dank Tell kam ich hier endlich voran und konnte meine Werte mit matplotlib plotten. Dann war ich wieder ewig auf der Suche wie ich die Zeitachse (X-Achse) entsprechend skalieren kann. Ich dachte ich muss dazu meine Werte aus der Datenbank verändern damit matplotlib das so anzeigt wie ich möchte. Dann hab ich durch Zufall rausgefunden, dass matplotlib hier entsprechende Befehle hat.

    Mit myFmt = DateFormatter("%H:%M") und ax.xaxis.set_major_formatter(myFmt) war mein Problem gelöst.

    Denn matplotlib ist eigentlich egal in welchem Zeitformat man sein Datum oder die Zeit abspeichert. Wichtig ist nur, dass man matplotlib sagt in welchem Format man es abgespeichert hat:

    Z.b. Zeit.append(datetime.strptime(row[0],"%Y-%m-%d %H:%M:%S.%f"))

    Ich möchte mich an meinen ersten Beitrag anlehnen und ein Zwischenfazit geben, was nun der Stand der Dinge ist bzw. was ich weiter plane.

    Was bisher geht:

    • Temperatur und Feuchtigkeit über DHT22 Sensor messen
    • die Messwerte mit Datum und Zeit in Datenbanken schreiben
    • Datenbank bzw. Messwerte über PhpLiteAdmin ansehen
    • Werte der Datenbank über python mit diversen Filtern auslesen
    • Bild zur grafischen Auswertung mit matplotlib erstellen


    Was weiter geplant ist:

    • automatisierte Auswertungsbilder erstellen
    • eine lokale PHP Webseite mit aktuellen Messwerten
    • über Webseite ein Zimmer auswählen, in dessen zugehörige Datenbank Messdaten geschrieben werden
    • über lokale Webseite diverse Filter auswählen und Bilder auf klick erstellen und anzeigen
    • diverse Durchschnittswerte bilden und anzeigen
    • Min Max Bilder erzeugen
    • usw.

    Ihr seht es gibt momentan nichts was nicht geht - Ziel erstmal erfüllt!!! Nun kommt das finetuning und dann die weiteren geplanten Schritte. Wenn ich meinen Code bereinigt hab, stell ich den auch gern hier wieder zur Verfügung für andere die an sowas basteln.

Jetzt mitmachen!

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