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: 68
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: 68
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: 13117
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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
kiaralle
User
Beiträge: 68
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: 4195
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: 68
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: 4195
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: 68
Registriert: Donnerstag 19. August 2021, 19:11

Ok, da muss ich noch mal ran.
Wird ein spannendes Projekt :)
Antworten