Daten von Arduino UNO mittels Python in Postgres schreiben

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
linuxubuntu
User
Beiträge: 9
Registriert: Freitag 28. Dezember 2018, 11:48

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?
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

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)])
habanero
User
Beiträge: 7
Registriert: Donnerstag 15. November 2018, 04:02

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.

Code: Alles auswählen

CREATE TABLE sensors (
   id SERIAL,
   data ...   
);
Und statt '1234567' solltest du einfach den wert in s1 übergeben.

Mit freundlichen Grüßen
habanero

PS: da war einer schneller als ich :)
linuxubuntu
User
Beiträge: 9
Registriert: Freitag 28. Dezember 2018, 11:48

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

Code: Alles auswählen

print(s1)
gemacht. vermute dass das die Probelmatik aufzeigt. und zwar liefert der Print folgende Ausgabe:

"b'23.00\r\n'"
Benutzeravatar
__blackjack__
User
Beiträge: 13007
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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. ;-)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
linuxubuntu
User
Beiträge: 9
Registriert: Freitag 28. Dezember 2018, 11:48

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()
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Antworten