100 Modbus-Werte in Mysql ablegen.

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
kiaralle
User
Beiträge: 148
Registriert: Donnerstag 19. August 2021, 19:11

Hallo,

aktuell arbeite ich mit cvs-Dateien.
Mein Ziel ist es Daten für 12h zu sammeln und diese später auszuwerten. Braucht keiner, macht man aber :-)
Spaß am programmieren.

Wie man Werte in die Tabelle ablegt weiß ich. Funktioniert und ich bin glücklich.

Code: Alles auswählen

statement = "INSERT INTO messwandler (haus, mess_2, garage, warmwasser) VALUES (%s, %s, %s, %s)"
messung = (haus, mess_2, mess_garage, mess_heizung)
cursor.execute(statement, messung)
connection.commit()
Nur bei 100Stück, wird das nicht mehr schön. Zu viele %s und Variablen

Ich habe:
master_result.registers ... enthält 91 Modbuswerte, beginnend bei 0, also 0-90

Eine Tabelle mit Feldern reg_1 bis reg_90, da hinein sollten jetzt meine Werte aus master_result.registers.

Wie löst man das? Mit einer Schleife?

Gruß Ralf
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da mag eine Schleife vorkommen, aber vor allem löst man das nicht mit einer Monster Tabelle mit so vielen Spalten. Stattdessen eine Tabelle mit Spalte Name und Spalte wert. Ggf muss das Schema noch ausgefeilter werden, wenn die Werte verschiedene Typen haben.
kiaralle
User
Beiträge: 148
Registriert: Donnerstag 19. August 2021, 19:11

Ok,
ich könnte ja in 9 Tabellen mit ja 10 Spalten aufteilen.
So etwas wäre sicher einfacher und übersichtlicher.
Alle Werte haben int(6)

Oder in was für eine Richtung würdest du gehen?
Benutzeravatar
__blackjack__
User
Beiträge: 14184
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kiaralle: Das ändert nichts. Das Problem ist die Struktur, nicht dass es zu viele Spalten sind. Das ist wahrscheinlich eine Tabelle mit ca. 4 Spalten. ID, Zeitstempel, Messwertname bzw. -ID, und Messwert.

Eine Tabelle in einer relationalen Datenbank ist was anderes als eine Tabelle in einer Tabellenkalkulation.
“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
kiaralle
User
Beiträge: 148
Registriert: Donnerstag 19. August 2021, 19:11

@blackjack

Du meinst so ähnlich wie bei Influxdb?

Da wird alles untereinander geschrieben und es wird nach Zeit, ID, Value die Daten aus der Tabelle gezogen.
Benutzeravatar
sparrow
User
Beiträge: 4577
Registriert: Freitag 17. April 2009, 10:28

Nein, __blackjack__ meint wie bei Relationalen Datenbanken üblich.
Mach dich gerne mit dem Konzept vertraut.
kiaralle
User
Beiträge: 148
Registriert: Donnerstag 19. August 2021, 19:11

Kurz angelesen... Wenn ich das jetzt richtig verstanden habe.

Jeder Parameter hat seine eigene Tabelle.

Tabelle VvP1
ID = z.B. 1 , Value
....
Tabelle UvP1
ID = z.B. 1 , Value
...
ID könnte dann auch timestamp sein.

Ich kann dann aus allen Tabellen nach ID und den Werten filtern.

So etwas ich hatte mal als Chemielager-Datenbank. Jeder Stoff seine eigene Tabelle.
Benutzeravatar
sparrow
User
Beiträge: 4577
Registriert: Freitag 17. April 2009, 10:28

Nee, falsch eingelesen.

Du hast zwei Tabellen (oder besserer Name: Relationen. Sonst ist man gedanklich immer bei der Tabellenkalkulation).
Eine Relation, welche die Messung repräsentiert und eine Relation, die alle Werte aller Messungen enthält.
Jede Messung bekommt eine ID, die wird dann als Fremdschlüssel in der Relation der Werte verwendet. Und deren Aufbau ist wie von __blackjack__ oben beschrieben.

Jede Messung hat dann einen Eintrag in der Relation für Messungen und n Einträge in der Relation der Werte.

Wobei wahrscheinlich noch eine dritte Relation die verschiedene Messwerttypen enthält.
Daher die Unterscheidung bei __blackjack__ ob man den Namen oder die ID des Messwerttypen speichert.

Das Stichwort ist Normalisierung.
kiaralle
User
Beiträge: 148
Registriert: Donnerstag 19. August 2021, 19:11

Ok, da muss ich noch mal ran.
Wird ein spannendes Projekt :)
oldboyJR
User
Beiträge: 69
Registriert: Donnerstag 28. März 2024, 16:19

Ein Array mit 101 Elementen und das erste der Index und der Rest die Elemente die in die jeweilige Tabelle eingetragen werden?
Benutzeravatar
Dennis89
User
Beiträge: 1618
Registriert: Freitag 11. Dezember 2020, 15:13

Nö.
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
DeaD_EyE
User
Beiträge: 1275
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Eine relationale Datenbank zur Speicherung von vielen Messwerten, ist einfach die falsche Wahl.
Genau aus dem Grund gibt es zeitbasierte Datenbanken, wie z.B. InfluxDB.

Messwerte schreibt man einfach dann, wenn sie verfügbar sind und jeder Messwert bekommt einen Zeitstempel. Man kann auch mehre Messwerte zusammenfassen, wenn man z.B. via Modbus mehrere discrete-inputs/coils/register liest.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
sparrow
User
Beiträge: 4577
Registriert: Freitag 17. April 2009, 10:28

SCNR: Das geht auch mit PostgreSQL und timescaleDB. Wenn man eh schon PostgreSQL im Einsatz hat (weil man zum Beispiel Transaktionen braucht) dann ist es unnötig da noch ein DMBS zu betreiben.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1275
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

sparrow hat geschrieben: Dienstag 7. Oktober 2025, 11:10 SCNR: Das geht auch mit PostgreSQL und timescaleDB. Wenn man eh schon PostgreSQL im Einsatz hat (weil man zum Beispiel Transaktionen braucht) dann ist es unnötig da noch ein DMBS zu betreiben.
Ich habe erst kürzlich gelernt, dass PostgreSQL so ziemlich alles kann. z.B. auch Message-Queues und PUB-SUB.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
sparrow
User
Beiträge: 4577
Registriert: Freitag 17. April 2009, 10:28

PostgreSQL ist mein allerliebstes Betriebssystem!

Bei NOTIFY/LISTEN darauf achten, dass darauf nicht so einfach Rechte zu vergeben sind (daher am besten hinter Triggern verbergen) und dass dafür jeder Client die ganze Zeit eine Verbindung offen halten muss. :ugeek:
Antworten