Seite 1 von 1
Daten von Arduino UNO mittels Python in Postgres schreiben
Verfasst: Freitag 28. Dezember 2018, 11:57
von linuxubuntu
Hallo Zusammen
Ich bin neu hier im Forum, falls ich etwas falsch machen sollte bitte mitteilen.
Ich habe auf meinem Arduino UNO einen Temperatursensor DS18B20 verkabelt und die Daten werden über die serielle Schnittstelle auf den Computer übertragen. Dies funktioniert soweit auch. Zusätzlich habe ich mittels Docker Postgres installiert. Mit dem Python Script funktioniert der Zugrif auch bereits auf die Datenbank und habe bereits Testdaten mit dem Script auf die DP geschrieben.
Hier der Code:
Code: Alles auswählen
import serial
import psycopg2
con = psycopg2.connect(user="postgres", password="mysecretpassword", host="127.0.0.1", port="5432", database="mydb")
ser = serial.Serial('/dev/ttyACM3', 9600)
cur = con.cursor()
s1 = ser.readline()
insert_query = "INSERT INTO sensors VALUES {}".format("(2, '1234567')")
cur.execute(insert_query)
con.commit()
Die Daten vom Arduino werden jede Minute gesendet. Nun möchte ich automatisiert in die erste Spalte wo jetzt die nummer "2" steht eine fortlaufende Nummerierung und dort wo die Zahl"1234567" steht die Daten vom Sensor "s1" reinschreiben. Folglich wird jede Minute eine fortlaufende Nummer und der Istwert des Sensors eingetragen.
Kann mir hier jemand weiterhelfen?
Re: Daten von Arduino UNO mittels Python in Postgres schreiben
Verfasst: Freitag 28. Dezember 2018, 15:22
von Sirius3
Man formatiert keine Daten in SQL-Statements, man benutzt Platzhalter.
Wie sieht denn Deine Tabelle aus? Wenn das erste Feld ein Primary-Key mit autoincrement ist, dann wird die Fortlaufende Nummer automatisch generiert. Und für die Zahl mußt Du halt die Daten nehmen, wenn das nur eine Zahl ist, die übertragen wird, könnte da so ähnlich aussehen:
Code: Alles auswählen
cur.execute("INSERT INTO sensors (temperatur) VALUES (?)", [float(s1)])
Re: Daten von Arduino UNO mittels Python in Postgres schreiben
Verfasst: Freitag 28. Dezember 2018, 15:25
von habanero
Moin!
Also die fortlaufende Nummerierung würde ich mithilfe von AUTOINCREMENT/SERIAL der DB-Engine überlassen, das ist bei der ID eigentlich immer zu Empfehlen.
Und statt '1234567' solltest du einfach den wert in s1 übergeben.
Mit freundlichen Grüßen
habanero
PS: da war einer schneller als ich

Re: Daten von Arduino UNO mittels Python in Postgres schreiben
Verfasst: Freitag 28. Dezember 2018, 16:44
von linuxubuntu
Hallo Zusammen danke erstmal für die schnellen Antworten.
Also meine Tabelle (habe diese nun neu gemacht und in temperature definiert) sieht wie folgt aus:
- Erste Spalte Primary Key
- zweite Spalte data
Irgendetwas mache ich noch falsch. Sorry arbeite noch nicht so lange mit Python:
Code: Alles auswählen
import serial
import psycopg2
con = psycopg2.connect(user="postgres", password="mysecretpassword", host="127.0.0.1", port="5432", database="mydb")
ser = serial.Serial('/dev/ttyACM3', 9600)
cur = con.cursor()
while True:
s1 = ser.readline()
cur.execute("INSERT INTO temperature (data) VALUES (?)", [float(s1)])
con.commit()
Ich habe noch einen
gemacht. vermute dass das die Probelmatik aufzeigt. und zwar liefert der Print folgende Ausgabe:
"b'23.00\r\n'"
Re: Daten von Arduino UNO mittels Python in Postgres schreiben
Verfasst: Freitag 28. Dezember 2018, 17:12
von __blackjack__
@linuxubuntu: Wieso denkst Du das Du was falsch machst? Was passiert denn?
Man kann direkt mit einer ``for``-Schleife über das `Serial`-Exemplar iterieren um die Zeilen auszulesen. Die Namen könnten allesamt besser sein. Es gibt keine Längenbeschränkung auf drei Zeichen.

Re: Daten von Arduino UNO mittels Python in Postgres schreiben
Verfasst: Samstag 29. Dezember 2018, 11:55
von linuxubuntu
Hallo Zusammen für alle die es intressiert. Habe es hinbekommen und die Daten werden in die Datenbank geschrieben wie gewünscht:
Code: Alles auswählen
import serial
import psycopg2
con = psycopg2.connect(user="postgres", password="mysecretpassword", host="127.0.0.1", port="5432", database="mydb")
ser = serial.Serial('/dev/ttyACM3', 9600)
cur = con.cursor()
while True:
s1 = ser.readline()
cur.execute(f"INSERT INTO temperature (data) VALUES ({float(s1)})")
con.commit()
Re: Daten von Arduino UNO mittels Python in Postgres schreiben
Verfasst: Samstag 29. Dezember 2018, 13:19
von Sirius3
@linuxubuntu: nein, man formatiert immer noch nicht Werte in SQL-Statements. `s1` ist ein schlechter Variablenname.
Code: Alles auswählen
for temperature in ser:
cur.execute("INSERT INTO temperature (data) VALUES (%s)", [float(temperature)])
con.commit()
Aber was soll eine Tabelle mit nur einem Wert? Zumindest der Zeitpunkt wäre noch eine gute Information.