DHT22 Werte mittels Adafruit_DHT Libary in SQLITE DB schreiben

  • Hallo zusammen,


    ich wollte die Messwerte meines DHT22 in eine kleine SQlite DB über Python einlesen. Da ich in Programmierung eher unbedarft bin, versuche ich mir das Programmieren selber beizubringen und habe mir dazu Python ausgesucht. Man möge mir also bitte verzeihen, wenn der Quellcode nicht dem Standard entspricht.


    Der Teil bei dem die Werte ausgelesen werden, habe ich aus dem Tutorial von Adafruit genommen. Das klappt auch irgendwie, aber irgendwie werden die Daten aus den Variablen temp u. humidity nicht eingetragen.


    Weiß jemand zufällig wo mein Fehler liegt, das keine Werte in die DB eingetragen werden?



    Danke vorab für eine eventuelle Hilfe! :danke_ATDE:

    Edited once, last by Schmitho ().

  • Hiho Schmitho (5€ in die schlechte-Reimkasse) :)


    dein Programm macht um genau zu sein nicht mehr als als eine Verbindung zur DB erstellen und versuchen eine Tabelle anzulegen.


    Du hast eine funktion "sensor" angelegt, welche nie aufgerufen wird (Und selbst wenn, würdest du in Fehlermeldungen laufen ;). soll ich dir das mal halbwegs zurechtbauen oder möchtest du es selber probieren?

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().

  • Also, ich habe die Funktion jetzt rausgenommen und den Quellcode etwas eingerückt.



    Die Temperatur wird jetzt ausgegeben:



    Gib mir mal bitte den nächsten Tipp, sonst lerne ich es ja nie. ;)

  • Wenn du du jetzt die werte hast sollte einem schreiben in die db nichts im wege stehen.


    dieser punkt hier ist allerdings höchstgradig unsinnig (nicht böse gemeint).
    [code=php]
    try:
    for i in sensor:
    temp = row[0]
    humidity = row[1]
    sql = ("INSERT INTO Temperatur (Temperatur, Feuchtigkeit) VALUES (temp, humidity)")
    cursor.execute(sql, data)
    connection.commit()
    [/php] Ich erklär dir auch warum:

    • for i in sensor | was ist sensor? die varibale gibt es nicht, ergo kannst du nicht darüber iterieren
    • row[0],row[1]| row im allgmeinem gibt es nicht, warum sollten dort temp und hum drin stehen? die stehen doch in temp und humidity
    • data gibt es auch nicht


    ein
    [code=php]
    cursor.execute("""INSERT INTO Temperatur (Temperatur, Feuchtigkeit) VALUES (%d, %d)""" % (temp, humidity))[/php]
    sollte für erste schreibversuche reichen.


    Edit: Warum soll er eigentlich 3s warten wenn er nichts gefunden hat? das continue hat dort auch nichts zu suchen ;) wenn er mit dem if fertig ist, macht er so oder so weiter

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().

  • Hi,


    das


    Quote


    cursor.execute("""INSERT INTO Temperatur (Temperatur, Feuchtigkeit) VALUES (%d, %d)""" % (temp, humidity))


    geht nicht. Hat das vielleicht was damit zu tun, da ich ja eine Timestamp row habe, oder ist das bei dem Insert egal!?



    Zum Thema 3 Sekunden: Der Sensor kann nur alle 3 Sekunden nach einer Datenabfrage Daten liefern soweit wie ich weiß.

  • Stimmt schon, wenn du eine timestamp als NOT NULL definierst musst du ihn natürlich mit angeben (und vorher generieren und in das richtige format umwandeln). ;)


    Btw "geht nicht" ist keine gültige Fehlermeldung :)

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • Ich denke, ich lasse es vorerst mit dem Zeitstempel und versuche im ersten Schritt die Temperatur und die Feuchtigkeit in die Tabelle zu bringen. :D


    Ich habe mal die test.py Datei mit Deinem Insert Statement angehangen. Mit "geht nicht" meinte ich eher, dass bis Zeile 41 alles zu funktionieren scheint....Das war´s dann auch schon. :irre:




    P.S


    Deine bemängelten Punkten müssen drin bleiben, ansonsten werden die Werte nicht ermittelt.


    • print output
    • time.sleep(3)
    • continue

    Files

    • test.py

      (1.24 kB, downloaded 131 times, last: )

    Edited once, last by Schmitho ().

  • Ich sag ja nicht, das du nicht 3 sekunden warten sollst, allerdings wartet das script nur 3sekunden wenn er keine Treffer hat und fängt dann von vorne an, was ich persönlich verwirrend finde. Ich würde generell 3sek. warten. ;)


    Zum testen würde ich auch auf try:/excepts verzichten, so gehen einem wichtige Fehlermeldungen verloren. Grade bei SQL statements schleichen sich gerne mal fehler ein

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • Also, das mit den Daten in die Tabelle einfügen habe ich mittlerweile hinbekommen.


    Ich hätte abschließen eine Frage zum Thema Zeitstempel:


    Eine Zeitstempel habe ich mit einer Funktion definiert:


    Code
    # Zeitstempel erzeugen
    def TimeStamp():
            stamp=time.strftime("%d.%m.%Y-%H:%M:%S", time.localtime())
            return(stamp)
    stamp=TimeStamp()
    print "Datum/Uhrzeit: [%s]" % (stamp)


    Als Ergebnis bekomme ich folgendes Ergebnis: Datum/Uhrzeit: [14.10.2013-11:36:17].


    Als SQL Statement benutze ich folgende Sysntax:


    Code
    cursor.execute("""INSERT INTO Temperatur (Zeit, Temperatur, Feuchtigkeit) VALUES (%s, %s, %s)""" %(stamp, temp, humidity))
    connection.commit()


    Und während der Ausführung erhalte ich folgende Meldung:



    Quote


    Message File Name Line Position
    Traceback
    <module> <module1> 28
    "OperationalError: near "".2013"": syntax error"


    Die Tabellen Spalte ist mit "Zeit INTEGER NOT NULL" definiert.

  • Warum nimmst du Integer für Zeit? Dafür ist doch timestamp da ;)

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().

  • Ich habe jetzt das Feld auf "TimeStamp" geändert, dennoch erhalte ich den oben genannten Fehler. Hast du noch eine Idee?

  • probier mal

    Code
    cursor.execute("""INSERT INTO Temperatur (Zeit, Temperatur, Feuchtigkeit) VALUES ("%s", "%s", "%s")""" %(stamp, temp, humidity))


    hast du mal probiert das Datum manuell in die DB zuschreiben? Kannst du so das datum in der gewünschten notation reinschreiben?

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • Deine Hochkomma waren die Lösung! An so kleinen Dinge scheitert das Leben. :bravo2:



    P.S Vielen Dank für die Hilfe und Geduld! :thumbs1:

    Edited once, last by Schmitho ().

  • Hallo,


    ich habe auch vor mit den DHT22-Sensoren etwas zu programmieren und als blutiger Pi-Anfänger habe ich mich auf die Suche begeben Codeschnipsel zusammenzusuchen.


    Grundkenntnisse im Programmieren sind vorhanden - mit Python ist dies aber mein erstes Projekt...


    So nun aber zum eigentlichen Thema:


    Ich habe mir das Auslesen der Sensoren aus der test.py Datei dieses Beitrags abgeschrieben (Ich hoffe der Autor nimmt es mir nicht übel...).
    Aber ich bekomme immer eine Fehlermeldung. Das Auslesen des Sensors über shell funktioniert, aber die Abfrage mittels Python will einfach nicht klappen.


    Was mache ich falsch? Kann mir hier jemand helfen?
    Als Ergebnis benötige ich die Messwerte von zwei DHT22-Sensoren. Temperatur und Feuchte sollen in Variablen abgelegt werden. Mit diesen Werten möchte ich dann einige Berechnungen anstellen und dann abschließen je nach Rechenergebnis unterschiedliche Relais schalten.
    Das wäre das Endziel, aber bislang bekomme ich nicht mal ein Messwertepaar in Variablen abgelegt...


    Kann jemand helfen?
    Code und Fehlermeldung können dem Screenshot entnommen werden.


    Gruß
    Matze


  • Deine Hochkomma waren die Lösung! An so kleinen Dinge scheitert das Leben. :bravo2:



    P.S Vielen Dank für die Hilfe und Geduld! :thumbs1:


    Hallo Schmitho,


    auch wenn dein Post hier schon drei Jahre alt ist, so stehe ich gerade an genau der gleichen Stelle wie du vor drei Jahren. ich versuche Daten eines DHT22 Sensors in eine SQLite Datenbank zu schreiben, stoße aber hier und da auf Probleme. Jetzt ist eure Diskussion hier ziemlich hilfreich, allerdings fällt es mir schwer die Kommentare nach und nach in dein anfänglich gepostetes Script einzubauen bzw. nachzuvollziehen. Könntest du dein fertiges Script hier posten?
    Danke

  • Ich habe genau dasselbe gemacht. Die Datenbank wurde vorher mit sqlite erstellt und mit phpliteadmin hab ich die Tabellen dazu eingerichtet. Dann braucht es nur noch diesen python Code (der über crontab alle 5 Min ausgeführt wird) um die Datenbank zu befüllen.