Forum: PC Hard- und Software Datenlogger Software für RaspberryPi gesucht


von Tom (Gast)


Lesenswert?

Hallo ich will mittels DMM den Stromverlauf eines selbstgebauten Geräts 
überwachen.
Hierfür suche ich eine Software für den Pi, der mit dem DMM über RS232 
verbunden ist. Es sollen sekündlich Werte geloggt und später auf einer 
grafischen Oberfläche angezeigt werden können.
Kennt da jemand schon was fertig dafür?

von Jack V. (jackv)


Lesenswert?

GNU DataExplorer, wenn’s voll aufgeblasen sein soll.

Der eigentliche Job, jede Sekunde ein Datum zu lesen und es zusammen mit 
einem Timestamp an eine Datei zu hängen (oder in eine Datenbank zu 
schreiben, oder was auch immer), ließe sich mit einem Shell-Einzeiler 
erledigen.

: Bearbeitet durch User
von Le X. (lex_91)


Lesenswert?

Du hast eigentlich zwei Teilaufgaben:
- Abholen der Daten vom Messgerät (+ eventuelle Aufbereitung)
- Ablegen der Daten

Ich bezweifle dass es eine SW gibt die genau das für genau dein Gerät 
schon kann.

Ich würde mit einem Pythonskript die Daten abholen (das Skript per cron 
zyklisch triggern oder gleich als systemd-service laufen lassen) und 
dann entweder in eine Datenbank deines Vertrauens (z.B. influxDb) oder 
in ein text-/csv-File schreiben.

Graphische Aufbereitung / Visualisierung zum Beispiel mit Graphana (kann 
dann vom PC/Tablet im Browser geöffnet werden), gnuplot oder 
Excel-Magic.

von Le X. (lex_91)


Lesenswert?

Tom schrieb:
> und später auf einer
> grafischen Oberfläche angezeigt werden können

Hat dein Pi einen Bildschirm oder läuft er headless?
Falls letzteres: dann würde ich die Kombi Pythonskript/influxDb/Graphana 
einsetzen.

Graphana läuft als Dienst auf deinem Pi und stellt eine konfigurierbare 
Web-Oberfläche bereit. Du kannst deine Daten also von jedem PC / Tablet 
/ Handy im Netzwerk anschauen.

von Sascha W. (sascha-w)


Lesenswert?

Für das abholen vom DMM, aufbereiten und in die Datenbank schreiben käme 
auch Node Red in Frage.

Sascha

von Zeno (Gast)


Lesenswert?

Jack V. schrieb:
> ließe sich mit einem Shell-Einzeiler
> erledigen.

Für so etwas gibt es cron.

Ansonsten wäre für den TO RRD zu empfehlen. Um die Daten vom 
Ausleseprogramm in Datenbank zu bekommen, kann man dann ein kleines 
Shellscript bemühen.

von 100Ω W. (tr0ll) Benutzerseite


Lesenswert?

Tom schrieb:
> Hallo ich will mittels DMM den Stromverlauf eines selbstgebauten
> Geräts überwachen.
> Hierfür suche ich eine Software für den Pi, der mit dem DMM über RS232
> verbunden ist. Es sollen sekündlich Werte geloggt und später auf einer
> grafischen Oberfläche angezeigt werden können.
> Kennt da jemand schon was fertig dafür?

Spricht das DMM Modbus als Protokoll?

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
vielen Dank für eure Tipps, ich werde mir das mal ansehen. Ja ich werde 
dann wohl ein Skript schreiben was die Werte in eine datenbank oder in 
eine csv schreibt. CSV wäre vielleicht noch einfacher zum Händeln.

>Spricht das DMM Modbus als Protokoll?
Ich glaube nicht, ist ein altes Grundig DM100. Mir fehlt noch der 
RS232-USB-Adapter..

von Tom (Gast)


Lesenswert?

Hallo Grafana und influxDb laufen. Ein Dashboard konnte ich auch 
erstellen, auch wenn es noch sehr ungewohnt ist für mich.
Gibt es ein ähnliches Programm wie phpmyadmin für mySQL, um die 
Datenbank direkt einsehen und verwalten zu können?

Ich habe diesen Befehl gefunden, um einen Eintrag erstellen zu können in 
der db
curl -i -XPOST 'http://192.168.1.44:8086/write?db=home'; --data-binary 
'sensor,ort=kueche temperatur=6.7'

und würde gerne verstehen was "sensor,ort=kueche" macht

von Nano (Gast)


Lesenswert?

Zeno schrieb:
> Jack V. schrieb:
>> ließe sich mit einem Shell-Einzeiler
>> erledigen.
>
> Für so etwas gibt es cron.

Er könnte auch systemd verwenden, das hat eine umfangreiche Logging 
Funktion.

von Nano (Gast)


Lesenswert?

Schau dir dazu mal systemd-cat an:
https://www.freedesktop.org/software/systemd/man/systemd-cat.html

In der Bash also:

deinprogramm | systemd-cat

Deinprogramm muss also ne Ausgabe an die Konsole machen und dann wird es 
durch die Pipe zu systemd geschoben.

Angucken kannst du es dann mit:
journalctl -f

Wie die Daten aus der RS238 Schnittstelle ausgelesen werden muss 
deinprogamm erfüllen.


Ansonsten kannst du systemd-cat noch prioritätstufen wie info, warning 
usw. zuweisen.

von Nano (Gast)


Lesenswert?

Nano schrieb:
> Deinprogramm muss also ne Ausgabe an die Konsole machen und dann wird es
> durch die Pipe zu systemd geschoben.

Korrektur, meinte zu systemd-cat und da macht den Rest.

> Wie die Daten aus der RS238 Schnittstelle ausgelesen werden muss
> deinprogamm erfüllen.

Meinte natürlich RS232

von Jack V. (jackv)


Lesenswert?

Du schlägst allen Ernstes vor, das Ergebnis einer sekündlichen Abfrage 
in das Journal zu schreiben, um die Daten dann später zum Zweck der 
Visualisierung wieder da herauszupopeln? Das ist ja noch ein Ende weiter 
vom Vernünftigen weg, als die Idee weiter oben, für eine sekündliche 
Abfrage cron heranzuziehen …

Wie gesagt: es ist ein simpler Shell-Einzeiler, die Daten zu lesen und 
sie $irgendwohin zu schreiben. Wobei $irgendwohin hier eine Textdatei 
sein kann (gerne auch in einem CSV-Format), eine sqlite3-Datenbank, eine 
ausgewachsene Datenbank, oder noch was Anderes.

: Bearbeitet durch User
von Tom (Gast)


Lesenswert?

Wie gesagt letzter Stand ist:
-ich habe Grafana installiert
-und influxdb

D.h mein Skript müsste einfach nur ein http request ausführen und das 
war’s
Ist nur die Frage wie ich das mache, in einer Schleife per Timer bzw 
time.sleep
Mir ist noch nicht bekannt, ob das DMM von sich den Messwert liefert, 
vermutlich muss ich ihn aber anfordern..sehe ich Montag wenn der 
RS232-USB-Adapter kommt

von Nano (Gast)


Lesenswert?

Jack V. schrieb:
> Du schlägst allen Ernstes vor, das Ergebnis einer sekündlichen
> Abfrage
> in das Journal zu schreiben, um die Daten dann später zum Zweck der
> Visualisierung wieder da herauszupopeln? Das ist ja noch ein Ende weiter
> vom Vernünftigen weg, als die Idee weiter oben, für eine sekündliche
> Abfrage cron heranzuziehen …

Er wollte ja etwas fertiges.

von Cartman (Gast)


Lesenswert?

Ich muss bei meinem Terminalprogi nur das Logging einschalten
und habe fertig.

Cron ist z.B. nie dafuer gedacht gewesen im "Sekundentakt"
Daten wegzuloggen. Und der ganze andere vorgeschlagene Rest
ist umso mehr eine Lachnummer.
Da sitzt das Hirn wohl inner Unnerhoos.

Beitrag #6974150 wurde von einem Moderator gelöscht.
von Tom (Gast)


Lesenswert?

Jetzt fangt mal keinen Streit an.

Spricht etwas dagegen das so zu machen? Das Abfragen der Daten fehlt 
natürlich noch. Das einpflegen in die DB würde so gehen mit python
1
import threading, time, os
2
3
def foo():
4
    os.system("curl  -XPOST 'http://192.168.1.44:8086/write?db=home' --data-binary 'dmm100 messwert=6.7'")
5
    print time.ctime()
6
7
WAIT_TIME_SECONDS = 0.5
8
9
ticker = threading.Event()
10
while not ticker.wait(WAIT_TIME_SECONDS):
11
    foo()

von Cartman (Gast)


Lesenswert?

> Oder du Vollidiot hast dein Problem nicht verständlich formuliert...

Im Gegensatz zum allgemeinen Trend, habe ich kein Problem.
Probleme haben nur die, die nur Bestellknoepfe druecken koennen.

von Jemand (Gast)


Lesenswert?

Tom schrieb:
> Spricht etwas dagegen das so zu machen?

Das hängt davon ab, ob dich der völlig nutzlose und vermeidbare Overhead 
durch das ständige
- Erzeugen eines neues Prozesses
- Aufbauen einer neuen TCP-Verbindung
interessiert. Bei so einer kleinen Anwendung muss es das nicht 
notwendigerweise.

Ich würde noch Acht auf das Fehlerverhalten geben, aber dort kann man ja 
unterschiedliche Anforderungen haben.

von Tom (Gast)


Lesenswert?

Hallo,
ich würde es nur ein paar Tage laufen lassen..von daher ist das 
vermutlich vernachlässigbar.

Wie könnte man es dennoch besser machen?

von Nano (Gast)


Lesenswert?

Tom schrieb:
> Hallo,
> ich würde es nur ein paar Tage laufen lassen..von daher ist das
> vermutlich vernachlässigbar.
>
> Wie könnte man es dennoch besser machen?

Mit einem C oder C++ Programm das alles macht.
Ein Prozess der solange läuft bis alles gelogged wurde.
Logs kannst du im Speicher vorhalten und dann schreibst du das ganze 
Blockweise auf die Platte. Das reduziert die Schreibzugriffe und schont 
die SD. Beim Stromausfall sind die Sachen im RAM allerdings weg.
Natürlich muss man nicht alles von grundauf neu erfinden, also guck nach 
Bibliotheken, die dich da unterstützen.
Bei vielen Werten kann sich ein Binärformat anbieten.
Der PI dürfte zwischen den Sekunden Pausen machen, du kannst ihn also 
schlafen legen bzw. dich darum kümmern, dass der Kernel das oft machen 
kann.

von Rene K. (xdraconix)


Lesenswert?

Tom schrieb:
> Jetzt fangt mal keinen Streit an.
>
> Spricht etwas dagegen das so zu machen? Das Abfragen der Daten fehlt
> natürlich noch. Das einpflegen in die DB würde so gehen mit pythonimport
> threading, time, os
> def foo():
>     os.system("curl  -XPOST 'http://192.168.1.44:8086/write?db=home';
> --data-binary 'dmm100 messwert=6.7'")
>     print time.ctime()
> WAIT_TIME_SECONDS = 0.5
> ticker = threading.Event()
> while not ticker.wait(WAIT_TIME_SECONDS):
>     foo()

Ich mache das eher so:
1
import threading, time, os
2
3
def foo():
4
  while True:
5
    os.system("curl  -XPOST 'http://192.168.1.44:8086/write?db=home' 
6
> --data-binary 'dmm100 messwert=6.7'")
7
    time.sleep(0.5)
8
9
# Multithreading:
10
thread1 = threading.Thread(target=foo)
11
thread1.start()

von Tom (Gast)


Lesenswert?

Nano schrieb:
> Mit einem C oder C++ Programm das alles macht.
> Ein Prozess der solange läuft bis

Mit C/C++ auf dem Pi habe ich gar keine Erfahrung.
Blockweisewklingt prinzipiell nicht schlecht. Wobei ich dann die 
Timestamps auch in die dB bekommen muss..was jetzt automatisch geschieht

von Jack V. (jackv)


Lesenswert?

Wenn’s dann doch in eine Datenbank soll, und Python oder C++ schon im 
Spiel ist: warum nicht einfach sqlite3, sondern so umständlich über eine 
weitere Software und noch ein externes Programm, das eine 
HTTP-Verbindung dahin aufbaut, nur um den Wert reinzuschreiben?

Ernstgemeinte Frage, denn ich sehe den Gegenwert für diese zusätzliche 
Komplexität gerade nicht. Wenn das so weitergesponnen wird, braucht der 
TE bald einen ausgewachsenen Rechner für den Job, den ein simpler 
Shell-Einzeiler selbst auf dem Pi der ersten Generation ohne 
nennenswerte Last zu verursachen erledigen würde.

: Bearbeitet durch User
von Wendels B. (wendelsberg)


Lesenswert?

Jack V. schrieb:
> Wenn’s dann doch in eine Datenbank soll, und Python oder C++ schon im
> Spiel ist: warum nicht einfach sqlite3

Das waere auch meine Empfehlung.
Schon dass man mit einer simplen Abfrage genau die gewuenschten Werte 
wieder herausbekommt, ist extrem hilfreich.

z.B. mit Perl:
1
$sth = $dbh->prepare("SELECT AVG(druck),MIN(druck),MAX(druck) FROM (SELECT druck FROM werte ORDER BY timestamp DESC LIMIT 0,1440);");
2
$sth->execute() or die $DBI::errstr;
3
my ($druck_avg, $druck_min, $druck_max) = $sth->fetchrow();
holt Mittelwert, Maximum und Minimum der letzten 1440 Eintraege (24h * 
60 Minuten) in der DB.

von Tom (Gast)


Lesenswert?

Jack V. schrieb:
> Ernstgemeinte Frage, denn ich sehe den Gegenwert für diese zusätzliche
> Komplexität gerade nicht.

Der Gegenwert ist, dass ich in kurzer Zeit ein funktionsfähiges Skript 
inklusive Anzeige fertig habe was vermutlich meinen Zwecken genügt.

Komplex war es dafür nicht, mich in C einarbeiten etc wäre durchaus 
komplexer und ich bräuchte dafür vermutlich mehrere Tage bis das läuft

von Nano (Gast)


Lesenswert?

Tom schrieb:
> Komplex war es dafür nicht, mich in C einarbeiten etc wäre durchaus
> komplexer und ich bräuchte dafür vermutlich mehrere Tage bis das läuft

Prinzipiell kannst du auch jede andere Programmiersprache verwenden, 
Hauptsache ist, dass sie dir einen Zugriff auf die Hardware erlaubt.

Du hast ja gefragt, wie man es "besser" machen könnte, deswegen habe ich 
dir gleich die Sprachen genannt, die man für die Systemprogrammierung 
verwenden würde. (Anmerkung: Rust gehört da übrigens auch noch dazu, die 
Sprache habe ich vergessen.)

Wenn du für den Hardwarezugriff ein passendes JNI hast, kannst du bspw, 
auch Java nehmen. Ist halt nur irgendwie mit dem Kopf durch die Wand.

Leider hast du ja auch nicht gesagt, welche Programmiersprachen du 
kannst.
Wenn du zu den älteren Hasen gehörst, könntest du es auch mit FreePascal 
probieren.

Und wenn du nur Skriptsprachen kannst, dann könntest du Python nehmen.
Für die Aufgabenstellung reicht das im Prinzip auch.

von Jack V. (jackv)


Lesenswert?

Meine Güte – er will von ttyS0 oder ähnlichem lesen, und die Daten 
wegschreiben. Wie kommst du von da aus auf Systemprogrammierung? Das 
lässt sich mit jeder Sprache lösen, wobei eine simpel zu nutzende 
Scriptsprache, wie Python, da in fünf Minuten zum Ergebnis führen 
sollte. Zehn, wenn noch viel nachgeschaut werden muss – solide 
Kenntnisse der Sprache vorausgesetzt.

Abgesehen davon ist das Speichern trivial – was ihm vermutlich mehr 
Sorgen machen wird, ist das Entgegennehmen/Auslesen der Daten. Dazu kann 
man mangels Kenntnis des Formats nun noch nichts sagen – bislang ist nur 
die Schnittstelle grob bekannt.

: Bearbeitet durch User
von Nano (Gast)


Lesenswert?

Jack V. schrieb:
> Meine Güte – er will von ttyS0 oder ähnlichem lesen, und die Daten
> wegschreiben. Wie kommst du von da aus auf Systemprogrammierung?

Er muss auf die GPIO des Raspberry Pi zugreifen, da das DMM die Daten 
per RS-232 Schnittstelle liefert.

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Jack V. schrieb:
> Wie gesagt: es ist ein simpler Shell-Einzeiler, die Daten zu lesen und
> sie $irgendwohin zu schreiben.

Aber, aber, aber ...

Da ist kein Python dabei. Und wir alle wissen doch, dass man ohne Python 
nicht programmieren kann. Da ist auch kein Grafana, keine Cloud, 
mindestens ein Docker-Container, besser noch Kubernetes, kein direktes 
I/O, keine NoSql-Datenbank, keine drei Web-Frameworks, keine Low-Code 
Umgebung, keine KI und keine Gameification dabei.

SO KANN MAN DOCH NICHT ARBEITEN.

von Jack V. (jackv)


Lesenswert?

Nano schrieb:
> Er muss auf die GPIO des Raspberry Pi zugreifen, da das DMM die Daten
> per RS-232 Schnittstelle liefert.

RS232 über GPIO wird nicht ohne Weiteres funktionieren (alleine schon 
aufgrund der Pegel), also wird vermutlich ein handelsüblicher Converter 
zu USB (von FTDI oder Prolific oder was auch immer) zum Einsatz kommen. 
Da gibt es dann /dev/ttySx oder /dev/ttyACMx, und man muss lediglich 
diese Datei zum Lesen öffnen können.

: Bearbeitet durch User
von Tom (Gast)


Lesenswert?

Nano schrieb:
> Du hast ja gefragt, wie man es "besser" machen könnte, deswegen habe ich
> dir gleich die Sprachen genannt,

Ja du hast Recht, das lohnt sich bestimmt sich auch nochmal anzuschauen. 
C/C++ kenne ich nur von Arduino und habe damit auf dem Raspberry noch 
nicht programmiert.
Mir ging es auch eher darum eine Lösung mit möglichst wenig Aufwand zu 
finden..die andere Baustelle ist schon komplex genug als dass ich eine 
neue Beschäftigung bräuchte.
Den http-request könnte man ja noch ersetzen, in die DB kann man ja auch 
direkt schreiben. Mir ist aber auch noch nicht bekannt, ob man die DB 
auch über eine GUI verwalten kann, löschen etc...ähnlich phpmysql. DAs 
wäre noch ganz gut. Auch will ich noch eine Möglichkeit das Programm zu 
beenden einbauen, damit ich noch davor ein Kommando an das DMM schicken 
kann.

Ansonsten ist das jetzt das letzte Programm. Aus dem spärlichen Handbuch 
des DMM konnte ich herauslesen wie man die Werte abfragt. D.h den 
empfangenen String muss ich dann nur noch auftrennen. Was da an 
Vorzeichen kommen ist mir nicht klar. Auf was da als Exponent geschickt 
wird nicht.
Als Schnittstelle dient ein USB-Rs232 Adapter, GPIO geht nicht, weil aus 
dem DMM eben andere Pegel kommen.

Mit meinem Skript kann ich auch zwischen Spannung und Strom umschalten.
Es ist alles aus Teilen zusammengestoppelt, aber scheint soweit den 
Zweck zu tun. mit einem zweiten PC und zwei USB-UART-Adaptern konnte ich 
die Dateneingabe simulieren
1
#!/usr/bin/python
2
#-*- coding:utf-8 -*-
3
4
import threading, time, os, serial, sys, getopt
5
6
7
8
#REN\xØA - Übergang zur Fernbedienung
9
#FUNC IDC\xØA - Gleichstrommessung
10
#VAL?\xØA - Anweisung zum Senden der Meßdaten
11
#GTL\xØA  - Übergang zur örtlichen Bedienung
12
13
#Empfangenes Format
14
#FFF VX.XXXXEVYY
15
#FFF - Meßfunktion/Meßwertdarstellung
16
#V - Vorzeichen (+/−)
17
#X.XXXX - Mantisse
18
#E - Symbol für Exponent
19
#V - Vorzeichen (+/−)
20
#YY - Exponent
21
22
23
serialPort = serial.Serial(
24
    port="/dev/ttyUSB0", baudrate=9600, bytesize=8, timeout=2, stopbits=serial.STOPBITS_ONE
25
)
26
serialString = ""  # Used to hold data coming over UART
27
28
29
30
def main(argv):
31
   inputfile = ''
32
   datenbankname = ''
33
   try:
34
      opts, args = getopt.getopt(argv,"hf:n:",["ffile=","ofile="])
35
   except getopt.GetoptError:
36
      print 'dmm100.py -f <inputfile> -n <datenbankname>'
37
      sys.exit(2)
38
   for opt, arg in opts:
39
      if opt == '-h':
40
         print 'dmm100.py -f <IDC/IAC/VDC/VAC/R--> -n <Datenbankname>'
41
         sys.exit()
42
      elif opt in ("-f", "--ffile"):
43
         inputfile = arg
44
      elif opt in ("-n", "--ofile"):
45
         datenbankname = arg
46
   if inputfile == 'idc':
47
       print ("Init logging DM100")
48
       serialPort.write(b"REN\n")
49
       time.sleep(1) 
50
       print 'Strommessung DC'
51
       serialPort.write(b"FUNC IDC\n")
52
       time.sleep(1)
53
       print ("Start logging DM100")
54
55
   if inputfile == 'vdc':
56
       print ("Init logging DM100")
57
       serialPort.write(b"REN\n")
58
       time.sleep(1) 
59
       print 'Spannungsmessung DC'
60
       serialPort.write(b"FUNC VDC\n")
61
       time.sleep(1)
62
       print ("Start logging DM100")
63
64
#   print 'Funktion "', inputfile
65
   if datenbankname=='':
66
       datenbankname='home'
67
   print 'Verwendete Datenbank "', datenbankname
68
69
if __name__ == "__main__":
70
   main(sys.argv[1:])
71
72
def foo():
73
    serialPort.write(b"VAL?\n")
74
    #Wait until there is data waiting in the serial buffer
75
    if serialPort.in_waiting > 0:
76
77
        # Read data out of the buffer until a carraige return / new line is found
78
        serialString = serialPort.readline()
79
80
        # Print the contents of the serial data
81
        try:
82
            serialString = serialString.replace('\r', '')
83
            os.system("curl  -XPOST 'http://192.168.1.44:8086/write?db=home' --data-binary 'dmm100 messwert=" + serialString + "'")
84
            print time.ctime()+" -> "+(serialString.decode("Ascii"))
85
        except:
86
            pass
87
88
89
90
WAIT_TIME_SECONDS = 0.5
91
ticker = threading.Event()
92
while not ticker.wait(WAIT_TIME_SECONDS):
93
    foo()
94
95
serialPort.write(b"GTL\n") #Beim Schließen des Programms ausführen, damit DMM wird auf Handbetrieb umschaltet

von Tom (Gast)


Lesenswert?

Als Adapter kommt dieser zum Einsatz, wenn er da ist und hoffentlich 
funktioniert
https://www.amazon.de/gp/product/B000QU2CSC

von Tom (Gast)


Lesenswert?

Jack V. schrieb:
> Das
> lässt sich mit jeder Sprache lösen, wobei eine simpel zu nutzende
> Scriptsprache, wie Python, da in fünf Minuten zum Ergebnis führen
> sollte. Zehn, wenn noch viel nachgeschaut werden muss – solide
> Kenntnisse der Sprache vorausgesetzt.

Ich würde behaupten, dass ich auch nur grobe Kenntnisse vn Python habe 
und aber weiß ungefähr nach was ich suchen muss. Bin kein Profi und der 
Raspberry nur Hilfsmittel

von Nano (Gast)


Lesenswert?

Tom schrieb:
> Mir ging es auch eher darum eine Lösung mit möglichst wenig Aufwand zu
> finden..die andere Baustelle ist schon komplex genug als dass ich eine
> neue Beschäftigung bräuchte.

Dann nimm Python.
Rasbian OS liefert entsprechende Bibliotheken mit um auf die GIOs via 
Python zuzugreifen und Zugriffsmöglichkeiten auf ein DBMS gibt es auch.


> Den http-request könnte man ja noch ersetzen, in die DB kann man ja auch
> direkt schreiben. Mir ist aber auch noch nicht bekannt, ob man die DB
> auch über eine GUI verwalten kann, löschen etc...ähnlich phpmysql. DAs
> wäre noch ganz gut.

Du kannst doch phpmysql verwenden.

Und wenn du es in schön willst, dann schreibst du dir halt noch ein 
Webinterface mit PHP und Zugriff via SQL.

Das hat allerdings nichts mehr mit dem Tool zu tun, dass die Daten von 
den GPIOs zur DB schaufeln soll. Es sind also zwei getrennte Programme.

> Auch will ich noch eine Möglichkeit das Programm zu
> beenden einbauen, damit ich noch davor ein Kommando an das DMM schicken
> kann.

Das kannst du in Python lösen.


> Als Schnittstelle dient ein USB-Rs232 Adapter, GPIO geht nicht, weil aus
> dem DMM eben andere Pegel kommen.

Ah okay. Dann vergiss das was ich zu den GPIOs oben geschrieben habe.

von Nano (Gast)


Lesenswert?

Nano schrieb:
> Du kannst doch phpmysql verwenden.

Korrektur, meine phpMyAdmin:

https://de.wikipedia.org/wiki/PhpMyAdmin

von Tom (Gast)


Lesenswert?

Nano schrieb:
> Korrektur, meine phpMyAdmin:

Ja vielleicht stricke ich das nochmal um. Hatte jetzt halt die 
vorgeschlagene influxDB genommen..mit der ich allerdings noch keine 
Erfahrung habe..auch was es da für tools dafür gibt

von Ein T. (ein_typ)


Lesenswert?

Zeno schrieb:
> Jack V. schrieb:
>> ließe sich mit einem Shell-Einzeiler
>> erledigen.
>
> Für so etwas gibt es cron.

Nein. Der TO wollte die Daten sekündlich und die feinstmögliche 
Auflösung üblicher  Cron-Daemons ist eine Minute.

von Ein T. (ein_typ)


Lesenswert?

Jack V. schrieb:
> Du schlägst allen Ernstes vor, das Ergebnis einer sekündlichen Abfrage
> in das Journal zu schreiben, um die Daten dann später zum Zweck der
> Visualisierung wieder da herauszupopeln? Das ist ja noch ein Ende weiter
> vom Vernünftigen weg, als die Idee weiter oben, für eine sekündliche
> Abfrage cron heranzuziehen …

Es geht...

> Wie gesagt: es ist ein simpler Shell-Einzeiler, die Daten zu lesen und
> sie $irgendwohin zu schreiben. Wobei $irgendwohin hier eine Textdatei
> sein kann (gerne auch in einem CSV-Format), eine sqlite3-Datenbank, eine
> ausgewachsene Datenbank, oder noch was Anderes.

... denn die zu sammelnden Daten sind ein klassischer Fall für ein 
Append-Only-Log. Und womit bietet so ein Linuxsystem bereits ein 
Append-Only-Log fertig an? Genau, mit den systemeigenen 
Logging-Möglichkeiten, bei klassischen Systemen also (r)syslogd und bei 
modernen Linuxsystemen mit systemd eben den journald. Und es ist 
durchaus sehr vernünftig, die ohnehin bereits vorhandenen Möglichkeiten 
des Systems zu benutzen anstatt eine zusätzliche Software installieren, 
konfigurieren, und dauerhaft pflegen zu müssen -- zumal ja nicht nur die 
Installation, Konfiguration und Pflege und zudem das Eintrageskript 
notwendig ist, sondern es zur Vermeidung von Überläufen auch noch eines 
Housekeeping bedarf, das im Falle von (r)syslogd oder journald bereits 
fertig vorhanden ist. Wenn man das alles zusammenrechnet, erscheint der 
Weg, das einfach in die bereits vorhandenen systemeigenen 
Logging-Facilities zu schreiben, auf einmal gar nicht mehr so 
unvernünftig...

von Ein T. (ein_typ)


Lesenswert?

Tom schrieb:
> Jetzt fangt mal keinen Streit an.
>
> Spricht etwas dagegen das so zu machen?

Ja.

> Das einpflegen in die DB würde so gehen mit python

Nein. curl(1) gibt die Daten auf stdout aus, aber da kommst Du mit einem 
Aufruf über os.system nicht daran. Zudem bringt Python leistungsfähige 
Standardbibliotheken zur clientseitigen Kommunikation über HTTP mit, der 
Aufruf von curl(1) ist also völliger Humbug, und os.system gilt als 
discouraged -- wenn man mit Python schon ein externes Programm aufrufen 
möchte, wird die Standardbibliothek subprocess empfohlen... ;-)

von Ein T. (ein_typ)


Lesenswert?

Rene K. schrieb:
> Ich mache das eher so:
>
>
1
> import threading, time, os
2
> 
3
> def foo():
4
>   while True:
5
>     os.system("curl  -XPOST 'http://192.168.1.44:8086/write?db=home'
6
>> --data-binary 'dmm100 messwert=6.7'")
7
>     time.sleep(0.5)
8
> 
9
> # Multithreading:
10
> thread1 = threading.Thread(target=foo)
11
> thread1.start()
12
>

Und das Multithreading hat genau welchen Vorteil? Genau: keinen. Wenn, 
dann also:
1
import time, os
2
3
if __name__ == '__main__':
4
  while True:
5
    os.system("curl  -XPOST 'http://192.168.1.44:8086/write?db=home'
6
 --data-binary 'dmm100 messwert=6.7'")
7
    time.sleep(0.5)

Das Zeitverhalten ist hier allerdings (bestenfalls) geschätzt und im 
Zweifel mehr als ungenau. Wesentlich besser wäre es deswegen, einfach 
die Klasse scheduler aus der Standardbibliothek sched zu benutzen.

Im Übrigen möchte ich allen Anfängern der Programmiersprache Python 
dringend den guten Ratschlag mitgeben, Euch einmal die 
Standardbibliotheken anzuschauen. Die Sprache Python ist nämlich nicht 
zuletzt deswegen so besonders beliebt geworden, weil sie die Philosophie 
des "batteries included" verfolgt und insofern bereits leistungsfähige, 
getestete und meistens sogar sehr performante Bibliotheken für etliche 
übliche Programmieraufgaben (scheduling, HTTP-Requests, ...) mitbringt. 
Dieses ganze aufwändige, fehleranfällige und unpräzise Herumgehacke 
könnt Ihr Euch also komplett ersparen und anstelle dessen einfach  all 
die feinen Dinge benutzen, die Python schon hat und Euch anbietet.

von Ein T. (ein_typ)


Lesenswert?

Tom schrieb:
> Wobei ich dann die
> Timestamps auch in die dB bekommen muss..was jetzt automatisch geschieht

Das hängt von der Datenbank ab. SQL-Datenbanken kennen die 
Standardfunktion NOW(), PostgreSQL obendrein die Variable 
CURRENT_TIMESTAMP.

von Ein T. (ein_typ)


Lesenswert?

Jack V. schrieb:
> Wenn’s dann doch in eine Datenbank soll, und Python oder C++ schon im
> Spiel ist: warum nicht einfach sqlite3, sondern so umständlich über eine
> weitere Software und noch ein externes Programm, das eine
> HTTP-Verbindung dahin aufbaut, nur um den Wert reinzuschreiben?

Naja, das wäre dann aber inkompatibel mit der Idee unserer Vorposter, 
die Daten per Cronjob (!) sekündlich (!!) abholen und eintragen zu 
wollen -- oder, allgemeiner gesagt, mit der Idee, das Skript irgendwie 
extern anzustoßen. Denn mit SQLite kann das zu lustigen Effekten führen, 
wenn ein Aufruf des Skripts aus irgendeinem Grund (Systemlast?) mal 
länger als eine Sekunde läuft und dann zwei Instanzen des Skripts auf 
dieselbe SQLite-Datei zugreifen... Man braucht dann also irgendeine Art 
der Synchronisierung, und die wiederum kann dann so aufwändig werden, 
daß das Aufsetzen einer "richtigen Datenbank" dagegen ein Kinderspiel 
wäre.

von Jack V. (jackv)


Lesenswert?

Ein T. schrieb:
> Und womit bietet so ein Linuxsystem bereits ein
> Append-Only-Log fertig an? Genau, mit den systemeigenen
> Logging-Möglichkeiten, bei klassischen Systemen also (r)syslogd und bei
> modernen Linuxsystemen mit systemd eben den journald

Du möchtest also sekündlich einen von außen gelesenen Messwert in das 
Systemlog schreiben, um die Daten dann später zum Aufbereiten 
(grafische Darstellung, Suche nach bestimmten Ereignissen, etc.) wieder 
rauszupopeln? Ja – natürlich geht das. Sinnvoll ist’s jedoch nicht. 
Das Journal ist für Informationen das System betreffend gedacht, und 
nicht dazu da, irgendwelche Userdaten reinzuschreiben. Und spätestens, 
wenn ich noch andere Filterkriterien als den Zeitraum anbringen möchte, 
oder auch nur die Daten auf einer anderen Maschine weiterverarbeiten 
möchte, fahre ich mit einer Datenbank oder auch nur einer Textdatei 
schlicht besser. Und womit bietet Python eine integrierte 
Datenbankfunktion an? Genau: mit dem sqlite3-Modul

von Zeno (Gast)


Lesenswert?

Tom schrieb:
> Jetzt fangt mal keinen Streit an.
Lass man hier gibt es einige Spezialisten die es regelmäßig darauf 
anlegen, die anderen zu provozieren. Der Schreiberling dieses 
gehaltvollen Satzes
Cartman schrieb:
> Da sitzt das Hirn wohl inner Unnerhoos.
gerhört wohl dazu und macht damit seinem Nicknamen alle Ehre, trägt aber 
selbst null komma nix zum Thema bei.

Nochmal zum Thema: Das mit dem sekündlich hatte ich überlesen, das kann 
cron nicht. Man könnte es dann so machen wie von Nano vorgeschlagen, 
alles in ein Programm (das alles, incl. Timerfunktion, macht) packen und 
das Ganze dann als Hintergrundprozeß laufen lassen. Wenn man der Meinung 
ist das man alles aufgezeichnet hat, beendet man einfach den Prozess.

von Zeno (Gast)


Lesenswert?

Ein T. schrieb:
> Nein. Der TO wollte die Daten sekündlich und die feinstmögliche
> Auflösung üblicher  Cron-Daemons ist eine Minute.

Ist ja gut - sekündlich hatte ich überlesen.

von Ein T. (ein_typ)


Lesenswert?

Jack V. schrieb:
> Ein T. schrieb:
>> Und womit bietet so ein Linuxsystem bereits ein
>> Append-Only-Log fertig an? Genau, mit den systemeigenen
>> Logging-Möglichkeiten, bei klassischen Systemen also (r)syslogd und bei
>> modernen Linuxsystemen mit systemd eben den journald
>
> Du möchtest also sekündlich einen von außen gelesenen Messwert in das
> Systemlog schreiben, um die Daten dann später zum Aufbereiten
> (grafische Darstellung, Suche nach bestimmten Ereignissen, etc.) wieder
> rauszupopeln? Ja – natürlich geht das. Sinnvoll ist’s jedoch nicht.

Das sehe ich anders.

> Das Journal ist für Informationen das System betreffend gedacht, und
> nicht dazu da, irgendwelche Userdaten reinzuschreiben.

Verzeihung, aber es gibt eine ganze Reihe von Anwendungsprogrammen, die 
die vom System bereitgestellten Logging benutzen, und das ist auch für 
genau solche Daten gemacht und gedacht. Damit Shellskripts etc. in diese 
Logs schreiben können, stellt so ein Linux-System sogar eigens das 
Programm logger(1) bereit.

> Und spätestens,
> wenn ich noch andere Filterkriterien als den Zeitraum anbringen möchte,
> oder auch nur die Daten auf einer anderen Maschine weiterverarbeiten
> möchte, fahre ich mit einer Datenbank oder auch nur einer Textdatei
> schlicht besser.

Wenn ich die Daten auf einer anderen Maschine weiterverarbeiten möchte, 
ist ein klassisches SQL-RDBMS sicherlich eine feine Sache, schließlich 
bieten die bereits eine Möglichkeit, über das Netzwerk auf die Daten 
zuzugreifen. Dateien hingegen haben den Nachteil, daß ich sie erst auf 
die andere Maschine bekommen muß, also so etwas wie NFS, Samba, SCP/SFTP 
oder ähnliches benutzen müßte, um die Daten von der einen auf die andere 
Maschine zu bekommen.

Für den vorliegenden Anwendungsfall des TO sehe ich aber keine sinnvolle 
Nutzung, mit der einzelne Datensätze gelesen oder gelöscht werden 
müßten, und daher bieten die Logging-Möglichkeiten des Systems haargenau 
das, was der TO braucht: Speichern, Abruf, und Housekeeping. Das 
benutzen etliche System- und Anwendungsprogramme, weil es exakt dafür 
gedacht, gemacht und vorgesehen ist.

Die meisten Entwickler denken leider nicht daran, daß sie bereits ein 
solches Loggingsystem haben, und benutzen deswegen den einzigen Hammer, 
den sie kennen: ein klassisches SQL-RDBMS, ganz egal, ob das zu den zu 
verarbeitenden Daten paßt oder nicht. Ich bin ja schon beeindruckt daß 
in diesem Thread mit InfluxDB ausnahmsweise einmal etwas Passenderes als 
eine klassische SQL-Datenbank empfohlen wurde, auch wenn ich persönlich 
aus Performance- und Stabilitätsgründen eher zu PostgreSQL mit der 
TimescaleDB-Erweiterung geraten hätte.

Wenn man es aber ganz einfach machen wollte, würde man ins Syslog oder 
den Journald schreiben und sich dazu dann noch ein kleines Shellskript 
oder Python-Progrämmchen schreiben -- Python bietet für so etwas eigens 
das Modul systemd.journal -- das die gefilterten Daten aus dem journald 
ausliest, und im einfachsten Fall mit gnuplot (oder einer der vielen 
Python-Libraries) plottet.

> Und womit bietet Python eine integrierte
> Datenbankfunktion an? Genau: mit dem sqlite3-Modul

SQLite ist keine Datenbank, sondern ein "SQL-ähnliches 
Festplatteninterface" -- das Zitat ist nicht von mir, sondern vom 
Datenbankpapst Joey Celko. Der hat damit zwar MySQL gemeint, aber für 
SQLite gilt das noch viel mehr. Ansonsten bietet Python für die meisten 
klassischen SQL-RDBMS ein Datenbankinterface, das PEP 249 erfüllt, da 
muß man nicht unbedingt zu einer Krücke wie SQLite greifen, nur weil das 
auf den ersten Blick so besonders einfach erscheint... Spätestens wenn 
aus irgendwelchen Gründen die klassischen SQLite-Probleme mit parallelen 
Schreibzugriffen auftreten, wird das Ganze sehr schnell kompliziert, und 
häufig hat man zu diesem Zeitpunkt bereits mehr oder weniger große 
Datenmengen unwiederbringlich verloren.

Edit: Klammersetzung korrigiert.

: Bearbeitet durch User
von Cartman (Gast)


Lesenswert?

> trägt aber selbst null komma nix zum Thema bei.

> Ich muss bei meinem Terminalprogi nur das Logging einschalten
> und habe fertig.

Was an Terminalprogi und Logging ist da nicht verstanden worden?

Du musst noch an deiner Lesekompetenz arbeiten.

von Jack V. (jackv)


Lesenswert?

Ein T. schrieb:
> Verzeihung, aber es gibt eine ganze Reihe von Anwendungsprogrammen, die
> die vom System bereitgestellten Logging benutzen, und das ist auch für
> genau solche Daten gemacht und gedacht.

Um ihren Status dort zu protokollieren, nicht um ihre Nutzdaten dort 
reinzuschreiben. Falls doch, bitte nenne eines dieser Programme, welche 
das machen. Ich mein – wie kommt man auf eine solche absurde Idee? 
Speicherst du deine PDFs und Filme und so auch im Systemlog, weil’s ja 
halt geht? Wie machst du das mit’m Platz? Denn einfach die nicht mehr 
benötigten Daten rauszulöschen, wie man’s normalerweise mit nicht mehr 
benötigten Nutzdaten macht, ist ja nicht vorgesehen. Lässt du also die 
Daten, die einen bestimmten Zeitraum zurückliegen, hinten rausfallen – 
wie’s ja üblicherweise mit Logs gemacht wird? Und wenn da Daten sind, 
die du länger behalten möchtest – schreibst du die dann ins aktuelle 
Log, und hast die dann solange doppelt drin, bis der alte Kram 
rausfällt?

Auf den Rest des Romans möchte ich an dieser Stelle nicht weiter 
eingehen – ist mir recht egal, wem du da nachplapperst, was ’ne 
Datenbank sein soll, und was nicht. Ebenso, was du glaubst, was der TE 
brauchen würde und was nicht.

Na gut, eins kommentiere ich noch:

Ein T. schrieb:
> Spätestens wenn
> aus irgendwelchen Gründen die klassischen SQLite-Probleme mit parallelen
> Schreibzugriffen auftreten, wird das Ganze sehr schnell kompliziert

Ja … sehr viele parallele Schreibzugriffe – bei einem Datum pro Sekunde, 
das weggeschrieben wird. Hast du eigentlich mal den Eingangsbeitrag 
gelesen, worum es geht? Nutzdaten ins Journal schreiben, Probleme mit 
parallelen Datenbank-Schreibzugriffen … fehlt eigentlich nur noch, dass 
du zu schwurbeln anfängst :|

von Ein T. (ein_typ)


Lesenswert?

Jack V. schrieb:
> Um ihren Status dort zu protokollieren, nicht um ihre Nutzdaten dort
> reinzuschreiben. Falls doch, bitte nenne eines dieser Programme, welche
> das machen. Ich mein – wie kommt man auf eine solche absurde Idee?

Das ist ziemlich einfach: indem man sich fragt, welche Art von Software 
für ein Append-Only-Log wohl am Besten geeignet ist. Ob auch andere 
schon auf diese sinnvolle Idee gekommen sind, interessiert höchstens 
Kleingeister.

Deine Behauptung, daß das eine "absurde Idee" sei, nehme ich mit 
Bedauern zur Kenntnis, sehe aber auch, daß Du bis auf solche 
Behauptungen keinerlei sachlichen Argumente gegen eine solche... sagen 
wir, "Zweitverwendung" vorbringen kannst.

> Speicherst du deine PDFs und Filme und so auch im Systemlog, weil’s ja
> halt geht?

Auch dumme Polemik kann nicht darüber hinwegtäuschen, daß Du im 
Gegensatz zu mir bislang kein einziges sachliches Argument vorbringen 
konntest. Daher habe ich vor allem den Eindruck, daß Du es Dir nur nicht 
vorstellen kannst.

> Denn einfach die nicht mehr
> benötigten Daten rauszulöschen, wie man’s normalerweise mit nicht mehr
> benötigten Nutzdaten macht, ist ja nicht vorgesehen.

Ach, weißt Du, ich betreibe eine ganze Reihe von Systemen, die zum 
Logging von allerlei Daten genutzt werden, in der Regel mit PostgreSQL 
und in den letzten Jahren auch Elasticsearch (Graylog) und neuerdings 
auch OpenSearch. Auf all diesen Systemen laufen entweder periodisch 
Skripte (Cron, systemd-timer), um veraltete Logdaten zu löschen, oder 
die Software selbst hat Mechanismen zum Aufräumen veralteter Daten. Denn 
so ist das nun einmal mit Logdaten: mit zunehmendem Alter verlieren sie 
an Wert und sind irgendwann wertlos.

> Auf den Rest des Romans möchte ich an dieser Stelle nicht weiter
> eingehen – ist mir recht egal, wem du da nachplapperst, was ’ne
> Datenbank sein soll, und was nicht. Ebenso, was du glaubst, was der TE
> brauchen würde und was nicht.

Oooch, hat der böse Onkel was gegen das arme SQLite gesagt?

> Ein T. schrieb:
>> Spätestens wenn
>> aus irgendwelchen Gründen die klassischen SQLite-Probleme mit parallelen
>> Schreibzugriffen auftreten, wird das Ganze sehr schnell kompliziert
>
> Ja … sehr viele parallele Schreibzugriffe – bei einem Datum pro Sekunde,
> das weggeschrieben wird.

Wir reden hier über einen Raspberry Pi, weißt Du, und da habe ich schon 
die abenteuerlichsten Dinge gesehen. In Situationen mit hoher Last kann 
es passieren, daß ein sekündlich aufgerufener Prozeß eben auch mal 
länger als eine Sekunde läuft. Das hatte ich zwar oben schon angedeutet, 
aber Du hast es anscheinend nicht gelesen oder nicht verstanden.

> Hast du eigentlich mal den Eingangsbeitrag
> gelesen, worum es geht? Nutzdaten ins Journal schreiben, Probleme mit
> parallelen Datenbank-Schreibzugriffen … fehlt eigentlich nur noch, dass
> du zu schwurbeln anfängst :|

Tja, ich habe den Eingangsbeitrag nicht nur gelesen, sonder vor allem 
auch mal darüber nachgedacht. Das solltest Du vielleicht auch mal 
versuchen, wenn Du Deine Reflexe und Fixierungen überwinden kannst. ;-)

von Jack V. (jackv)


Lesenswert?

Ein T. schrieb:
> daß Du im
> Gegensatz zu mir bislang kein einziges sachliches Argument vorbringen
> konntest.

Sachliches Argument? Gab’s einige, aber deine selektive Wahrnehmung ließ 
sie dich offensichtlich nicht erkennen. Ich schreib’s einfach nochmal, 
jedoch ohne viel Hoffnung, dass du das dieses Mal aufzunehmen in der 
Lage bist:

Das ist ein Log, kein Dateisystem für Nutzdaten. Es bietet keine 
sinnvolle Möglichkeit, die Daten darin zu verwalten, etwa nicht mehr 
benötigte Daten zu löschen, selektiv Daten zu sichern, die Daten ohne 
einen kompletten Suchdurchlauf auf einmal auszulesen, Daten zu 
bearbeiten, und selektiv Daten aufzubewahren, Daten selektiv auf ein 
anderes System zu bringen, etc. – weil’s halt nicht dafür gedacht ist, 
Nutzdaten zu halten.

Wie viel sachlicher hättest du’s denn gerne dargelegt, dass das 
Systemlog einer der dämlichsten Plätze zum Speichern von Nutzdaten 
ist?

Ein T. schrieb:
> Denn
> so ist das nun einmal mit Logdaten: mit zunehmendem Alter verlieren sie
> an Wert und sind irgendwann wertlos.

Genau dieses: und dann fallen sie hinten raus. Und obwohl du das selbst 
erkannt zu haben scheinst, möchtest du trotzdem Nutzdaten dort 
reinschreiben, die unter Umständen nach Jahren zum Vergleich 
herangezogen werden sollen? Der TE schrieb nicht, was für Daten und 
wofür – vielleicht will er’s ja so wie ich machen: Akkus vermessen, und 
nach Jahren dann schauen, wie sie sich geändert haben.

Und dein „Append-Only“ – du kannst jede beliebige Datei zum Anhängen 
öffen. Es gibt gar das Konstrukt >> in der Shell dafür, das die 
übergebenen Daten an die angegebene Datei anhängt (für dich: 
appended). Sollte dir eigentlich bekannt sein, wenn du die Qualifikation 
hättest, die zu haben du hier den Eindruck zu erwecken versuchst.

Ein T. schrieb:
> Wir reden hier über einen Raspberry Pi, weißt Du, und da habe ich schon
> die abenteuerlichsten Dinge gesehen.

Wir reden hier über ’n Datum mit wenigen Bytes jede Sekunde. Das schafft 
selbst ein Pi der ersten Generation sicher wegzuschreiben. Und wenn er 
das nicht mehr schaffen sollte, dann schafft journald es erst recht 
nicht – der braucht nämlich etwas mehr Ressourcen, als ein einfacher 
Schreibzugriff auf eine Datei.

Ein T. schrieb:
> Ach, weißt Du, ich betreibe eine ganze Reihe von Systemen, die zum
> Logging von allerlei Daten genutzt werden, in der Regel mit PostgreSQL
> und in den letzten Jahren auch Elasticsearch (Graylog) und neuerdings
> auch OpenSearch.

So, wie du schreibst, hast du von all den Sachen allenfalls mal in ’ner 
Zeitschrift gelesen. Kein Angriff – nur ein Feedback, wie dein 
Geschreibsel hier wahrgenommen werden kann.

Ein T. schrieb:
> Tja, ich habe den Eingangsbeitrag nicht nur gelesen, sonder vor allem
> auch mal darüber nachgedacht.

Mag ich gar nicht glauben – dann sollte man eigentlich auf die Idee 
gekommen sein, dass das Systemlog ein denkbar ungeeigneter Wert für 
Messwerte von außen sein würde, die man weiterverarbeiten, und unter 
Umständen archivieren möchte.

Im Übrigen hast du zwar viel geschrieben, aber dabei geschickt von 
meiner ausdrücklichen Frage an dich abgelenkt: könntest du bitte ein 
Programm nennen, das seine Nutzdaten ins Systemlog schreibt? Bitte ohne 
die nächste Nebelkerze, sondern einfach das Programm nennen. Ich gucke 
es mir dann an. TIA

: Bearbeitet durch User
von Le X. (lex_91)


Lesenswert?

Nutzdaten im Syslog zur späteren Verarbeitung ablegen ist irgendwie wie 
sich die Haare im Backofen zu trocknen.
Geht zwar irgendwie, aber sollte sich falsch anfühlen.

von Jemand (Gast)


Lesenswert?

Abgesehen von den besseren Lösungen...

Jack V. schrieb:
> selektiv Daten zu sichern,

Was hindert dich?

Jack V. schrieb:
> die Daten ohne einen kompletten Suchdurchlauf auf einmal auszulesen

Journals enthalten einen Index über alle Felder

Jack V. schrieb:
> Daten selektiv auf ein anderes System zu bringen

Was hindert dich?
Du kannst dir sogar den Kram per JSON-Export direkt ins Posgres o. ä. 
knallen und dort weiterarbeiten.

von Jack V. (jackv)


Lesenswert?

Jemand schrieb:
> Jack V. schrieb:
>> selektiv Daten zu sichern,
>
> Was hindert dich?

Die Absurdität, die Daten erst ins Systemlog zu streuen, um dann zum 
selektiven Sichern doch ’ne eigene Datei draus zu machen, oder sie in 
eine Datenbank zu schreiben.

Jemand schrieb:
> Jack V. schrieb:
>> die Daten ohne einen kompletten Suchdurchlauf auf einmal auszulesen
>
> Journals enthalten einen Index über alle Felder

Hast du mal einen Link zur Doku der Struktur des Journals?

Jemand schrieb:
> Jack V. schrieb:
>> Daten selektiv auf ein anderes System zu bringen
>
> Was hindert dich?

Siehe oben.

Le X. hat schon Recht: in diesem Fall geht es, und ich habe auch nie was 
Anderes behauptet. Ich halte es aber schlicht für Unfug, Nutzdaten 
zunächst in das Systemlog zu schreiben, und sie dann im Anschluss 
wieder rauszupopeln, um sie weiterzuverarbeiten. Welchen Vorteil soll 
das haben?

@Typ: die Nennung eines der vielen Programme (deine Aussage), die ihre 
Nutzdaten ins Syslog schreiben, steht weiterhin aus. Wenn du so lieb 
wärest, das mal nachzuliefern?

von Wolfgang (Gast)


Lesenswert?

Ein T. schrieb:
> Auf all diesen Systemen laufen entweder periodisch
> Skripte (Cron, systemd-timer), um veraltete Logdaten zu löschen, oder
> die Software selbst hat Mechanismen zum Aufräumen veralteter Daten. Denn
> so ist das nun einmal mit Logdaten: mit zunehmendem Alter verlieren sie
> an Wert und sind irgendwann wertlos.

Bei RRDBs wird dem durch Verringerung der Zeitauflösung Rechnung 
getragen.

Hoffentlich kann das Multimeter überhaupt sekündlich Werte liefern ;-)
Mir scheint, dass es da noch etwas an einem Messkonzept fehlt.

von Jemand (Gast)


Lesenswert?

Jack V. schrieb:
> Hast du mal einen Link zur Doku der Struktur des Journals?

Das Format ist hier beschrieben:
https://www.freedesktop.org/wiki/Software/systemd/journal-files/

Jack V. schrieb:
> in diesem Fall geht es, und ich habe auch nie was
> Anderes behauptet.

> Es bietet keine sinnvolle Möglichkeit,

Das klingt aber schon so

Jack V. schrieb:
> Ich halte es aber schlicht für Unfug, Nutzdaten
> zunächst in das Systemlog zu schreiben,

Dem widerspreche ich nicht, eine Konklusion als Argument zu nehmen, 
halte ich aber dennoch für ziemlich unelegant.

von Jack V. (jackv)


Lesenswert?

Jemand schrieb:
> eine Konklusion als Argument zu nehmen,
> halte ich aber dennoch für ziemlich unelegant.

Dann andersrum: was genau lässt denn das Speichern von Nutzdaten im 
Systemlog, wo sie dann zum Verarbeiten oder/und Archivieren ausgelesen 
und in eine eigene Datei geschrieben werden, sinnvoller erscheinen, als 
sie beispielsweise gleich in eine Datei zu schreiben?

Typ hatte das Argument „da kann man Daten anhängen“ angeführt – aber man 
kann noch viel einfacher eine Datei zum Anhängen öffnen. Typ hatte 
angeführt, dass ein schwacher Rechner ein paar Bytes in der Sekunde 
unter Umständen nicht sicher weggeschrieben bekäme – aber wenn er das 
nicht schafft, schafft er’s noch weniger, unter diesen Umständen das 
Journal zu schreiben.

Was also wäre ein sachliches Argument dafür, Nutzdaten zunächst in das 
Systemlog, statt gleich in eine eigene Datei zu schreiben?

Jemand schrieb:
> Jack V. schrieb:
>> Es bietet keine
>> sinnvolle Möglichkeit, die Daten darin zu verwalten, etwa nicht mehr
>> benötigte Daten zu löschen, selektiv Daten zu sichern, die Daten ohne
>> einen kompletten Suchdurchlauf auf einmal auszulesen, Daten zu
>> bearbeiten, und selektiv Daten aufzubewahren, Daten selektiv auf ein
>> anderes System zu bringen, etc.
>
> Das klingt aber schon so

(hab zur besseren Nachvollziehbarkeit das Problem mit dem fehlerhaften 
Zitat behoben)

Wie löscht man denn mit journalctl etwa eine bestimmte Messreihe, wie 
sichert man eine bestimmte Messreihe innerhalb dieses Journals, so dass 
die beim Rausrotieren des Zeitraums nicht verschwindet, wie ändert man 
einzelne Daten, und wie bringt man eine Messreihe auf ein anderes 
System, ohne entweder doch eine eigene Datei zu schreiben, oder den 
gesamten Journalauszug mitzuschicken?

@Typ: bitte sei doch so gut, und benenne noch eines dieser vielen 
Programme, die ihre Nutzdaten in das Systemlog schreiben.

: Bearbeitet durch User
von Jemand (Gast)


Lesenswert?

Jack V. schrieb:
> Wie löscht man denn mit journalctl etwa eine bestimmte Messreihe

Gar nicht, deswegen kritisiere ich diesen Punkt auch überhaupt nicht.

Jack V. schrieb:
> wie sichert man eine bestimmte Messreihe innerhalb dieses Journals

Sie muss mit entsprechendem Filter irgendwo hin exportiert werden.

Jack V. schrieb:
> wie ändert man einzelne Daten

Gar nicht, deswegen kritisiere ich diesen Punkt auch überhaupt nicht.

Jack V. schrieb:
> und wie bringt man eine Messreihe auf ein anderes System, ohne entweder
> doch eine eigene Datei zu schreiben, oder den gesamten Journalauszug
> mitzuschicken?

Der journalctl-Befehl gibt dir die Einträge beliebig gefiltert in einem 
Format deiner Wahl aus. Ob du das in eine Datei schreibst oder über 
TCP-Socket über die halbe Welt schickst ist journald egal, ebenso 
schreibt es dir nicht vor, ob du daraus mit systemd-journal-remote 
wieder ein neues Journal erstellst oder es direkt in eine SQL-Datenbank 
fütterst.
Wenn es dich erheitert, kannst du sogar z. B. über die Python-API das 
Journal direkt lesen.

Messdaten in das Systemjournal zu hämmern halte ich auch nicht für 
sinnvoll, aber es gibt wirklich genügend Möglichkeiten an dort geloggte 
Daten problemlos ranzukommen. Zumindest kann man gegenüber einer 
DIY-Lösung am definierten Format und die existierenden Werkzeuge für 
temporale Schlüssel-Wert-Paare (inklusive Binärblobs) profitieren.

von Ein T. (ein_typ)


Angehängte Dateien:

Lesenswert?

Jemand schrieb:
> Jack V. schrieb:
>> Wie löscht man denn mit journalctl etwa eine bestimmte Messreihe
>
> Gar nicht, deswegen kritisiere ich diesen Punkt auch überhaupt nicht.

Irgendwie scheint unser Jack eine etwas merkwürdige Vorstellung von 
Meßreihen zu haben. Mein Verständnis ist, daß entweder alle oder keine 
Datensätze gelöscht werden. Einzelne Datensätze aus einer Meßreihe zu 
löschen würde diese Meßreihe verfälschen und somit invalidieren -- und 
Ausreißer werden allenfalls während der Auswertung gefiltert, aber 
niemals gelöscht.

> Jack V. schrieb:
>> wie sichert man eine bestimmte Messreihe innerhalb dieses Journals
>
> Sie muss mit entsprechendem Filter irgendwo hin exportiert werden.

...was dank journalctl(1) und Pythons systemd.journal.Reader sehr 
einfach ist, siehe dazu auch das Progrämmchen "temperature-reader.py" im 
Anhang. Ein Unitfile für einen systemd-service und das Skriptlein zum 
Lesen des Journals liegen ebenfalls bei, um mal praktisch zu zeigen, wie 
einfach das ist.

> Jack V. schrieb:
>> wie ändert man einzelne Daten
>
> Gar nicht, deswegen kritisiere ich diesen Punkt auch überhaupt nicht.

Ich wüßte auch gar nicht, was es da zu kritisieren gäbe? Zumal zum 
Ändern von geloggten Meßdaten dasselbe zu sagen ist wie oben zum 
Löschen. Wer kommt auf die irrwitzige Idee, geloggte Daten nachträglich 
manipulieren zu wollen?

> Messdaten in das Systemjournal zu hämmern halte ich auch nicht für
> sinnvoll,

Hier wollte der TO ja nur sekündlich einzelne Meßwerte von einem DMM 
loggen und hat dafür etwas Fertiges gesucht. Klar, dafür kann man ein 
RDBMS installieren oder sich irgendwelche Behelfe mit SQLite oder CSV 
basteln, aber im Kern hat so ziemlich jedes Linux- und UNIX-System 
bereits etwas zum Loggen dabei. Für diesen Anwendungsfall kann man das 
schon nehmen.

> aber es gibt wirklich genügend Möglichkeiten an dort geloggte
> Daten problemlos ranzukommen. Zumindest kann man gegenüber einer
> DIY-Lösung am definierten Format und die existierenden Werkzeuge für
> temporale Schlüssel-Wert-Paare (inklusive Binärblobs) profitieren.

Ich hab's mal mit Daten aus lm-sensors und in JSON gemacht, siehe 
Anhang.

von Jack V. (jackv)


Lesenswert?

Oh, nun hast du doch glatt schon wieder vergessen, eines der so vielen 
Programme zu nennen, die ihre Nutzdaten ins Journal schreiben. Könntest 
du das bitte noch schnell nachholen?

Zu den Operationen auf den Messdaten: du hast genausowenig Ahnung, wie 
alle anderen hier, was der TE genau vor hat. Messreihe löschen: 
Testmessung, vorläufige und verworfene Testaufbauten. Einzelne Messdaten 
löschen: Ausreißer, etwa durch äußere Einflüsse. Messdaten ändern: etwa 
Daten mit anderen Daten verknüpfen. So als Beispiele. Es sei denn, dir 
wären Anforderungen des TE bekannt, die dem entgegenstehen, etwa dass 
die Daten explizit manipulationssicher gespeichert werden sollen 
(wobei’s auch dafür dann bessere Methoden gibt, als das Systemlog 
vollzuschmieren), oder dass es okay ist, dass die Daten nach einer 
gewissen Zeit mit dem Rest des Logs rausrotiert werden. Zumindest ich 
kann keine diesbezüglichen Aussagen seitens des TE erkennen.

Ein T. schrieb:
> Hier wollte der TO ja nur sekündlich einzelne Meßwerte von einem DMM
> loggen und hat dafür etwas Fertiges gesucht. Klar, dafür kann man ein
> RDBMS installieren oder sich irgendwelche Behelfe mit SQLite oder CSV
> basteln, aber im Kern hat so ziemlich jedes Linux- und UNIX-System
> bereits etwas zum Loggen dabei. Für diesen Anwendungsfall kann man das
> schon nehmen.

Ja, natürlich kann man auch das Syslog damit vollmüllen, und den Kram 
anschließend dann doch wieder umständlich rauspopeln, um ihn zur 
weiteren Verarbeitung in eine Datei zu schreiben. Aber im Kern hat so 
ziemlich jedes Linuxsystem die Werkzeuge zum einfachen Anhängen an eine 
Datei schon dabei: O_APPEND, bzw. Mode a bei fopen() (gem. POSIX-Kram) – 
für diesen Anwendungsfall kann man das schon nehmen. Jede gängige 
Sprache, incl. der Shells, bieten Zugriff auf diese Funktion.

Bevor du es wieder vergisst, hier nochmal die Wiederholung der Bitte 
nach der Benennung einer Software, die ihre Nutzdaten in das Systemlog 
schreibt. Wenn du dann so gut wärest, doch zumindest ein Beispiel zur 
Stützung deiner Behauptung aufzählen zu können?

: Bearbeitet durch User
von Ein T. (ein_typ)


Lesenswert?

Jack V. schrieb:
> Oh, nun hast du doch glatt schon wieder vergessen, eines der so vielen
> Programme zu nennen, die ihre Nutzdaten ins Journal schreiben. Könntest
> du das bitte noch schnell nachholen?

Es ist zwar lustig, aber nicht besonders seriös, meine Aussage erst 
gezielt falsch zu verstehen und dann zu versuchen, mich darauf 
festzunageln. Aber weil Du so lieb darum bittest, würden mir da etwa 
Auditd und PGAudit einfallen.

> Zu den Operationen auf den Messdaten: du hast genausowenig Ahnung, wie
> alle anderen hier, was der TE genau vor hat.

Deswegen orientiere ich mich einfach an dem, was er geschrieben hat: 
Loggen von Meßdaten unbekannter Herkunft, besonders gern mit etwas 
Fertigem.

> Ja, natürlich kann man auch das Syslog damit vollmüllen, und den Kram
> anschließend dann doch wieder umständlich rauspopeln, um ihn zur
> weiteren Verarbeitung in eine Datei zu schreiben.

Um die Systemlogs nicht vollzumüllen, bietet sich ein eigener Namespace 
an. Darüber läßt sich bei Bedarf auch ein separates Housekeeping 
festlegen.

Ich sehe auch kein "umständlich rauspopeln". Dafür nutze ich hier in 
diesem Falle ganz einfach das Syslog-Tag bzw. den SyslogIdentifier, aber 
man könnte natürlich auch einen Namespace nehmen -- das ist ja alles 
bereits vorhanden. Gerade das ist der Vorteil des strukturierten Logging 
im journald.

> Aber im Kern hat so
> ziemlich jedes Linuxsystem die Werkzeuge zum einfachen Anhängen an eine
> Datei schon dabei: O_APPEND, bzw. Mode a bei fopen() (gem. POSIX-Kram) –
> für diesen Anwendungsfall kann man das schon nehmen. Jede gängige
> Sprache, incl. der Shells, bieten Zugriff auf diese Funktion.

Richtig, aber die meisten Linuxsysteme haben eben auch ein Subsystem zum 
Event-Logging dabei, und so ein bisschen Pippifax wie die überschaubaren 
Datenmengen des TO paßt da zweifellos noch locker hinein.

Am Rande bemerkt ist der Aufruf von Systembefehlen aufgrund der dafür 
notwendigen Kontextwechsel leider auch nicht so ganz billig, gerade das 
Öffnen von Dateien.

Ehrlich gesagt ist es mir ein wenig unverständlich, warum Du auf meinen 
kleinen Hack so aggressiv und unsouverän reagierst. Hast Du da einen 
persönlichen Bezug?

von Le X. (lex_91)


Lesenswert?

@ von Ein T. (ein_typ):
was ist eigentlich dein Problem?
Dass man die Aufgabenstellung mit einem Syslog irgendwie hinkriegt haben 
doch mehrere der Anwesenden dir bestätigt.
Einen Preis für die beste Lösung wirst du aber nicht erwarten können, 
egal wielange du hier noch rumschwadronierst.

: Bearbeitet durch User
von Le X. (lex_91)


Lesenswert?

Ein T. schrieb:
> Hier wollte der TO ja nur sekündlich einzelne Meßwerte von einem DMM
> loggen und hat dafür etwas Fertiges gesucht. Klar, dafür kann man ein
> RDBMS installieren oder sich irgendwelche Behelfe mit SQLite oder CSV
> basteln, aber im Kern hat so ziemlich jedes Linux- und UNIX-System
> bereits etwas zum Loggen dabei. Für diesen Anwendungsfall kann man das
> schon nehmen.

Moment, Stop.
Du verschweigst hier die Hälfte der Aufgabenstellung.
Das Loggen der Messwerte ist nur die halbe Miete. Später soll das ganze 
in einer GUI visualisiert werden.
Und spätestens dann wird dein Syslog endgültig zur Krücke.
Grafana kann direkt auf RDBMS zugreifen, Excel (oder LibreOffice Calc) 
kann direkt csv-Dateien lesen und graphisch darstellen.
Deine Syslog-Einträge musst du erstmal herausfiltern und in ein zur 
Darstellung geeignetes Format konvertieren. Warum also einen Umweg 
gehen?

Wenn man also die Aufgabenstellung komplett betrachtet verschieben sich 
die Vorteile schon sehr in Richtung "kein Syslog".

@ TO: wie hast du das denn mittlerweile gelöst?

: Bearbeitet durch User
von Wendels B. (wendelsberg)


Lesenswert?

Ein T. schrieb:
> irgendwelche Behelfe mit SQLite

Wie ich schon oben bekundet habe, das ist alles andere als ein Behelf.
Das Speichern ist eine simple Zeile, die Moeglichkeiten, das gefiltert 
und vorbehandelt wieder abzufragen, sind Gold wert.
Ich jedenfalls benutze keine CSV mehr, seit ich sqlite begriffen habe.

Abspeichern, sqlite3, Wert steht in $temp_gs,Timestamp macht die DB 
selbst:
1
INSERT INTO temp_gs (t_gefriers) VALUES ($temp_gs);

Abrufen, z.B. Mittelwert, Maximum, Minimum, der letzten 1440 Werte (24h 
* 60):
1
SELECT AVG(t_gefriers), MIN(t_gefriers), MAX(t_gefriers) FROM (SELECT t_gefriers FROM temp_gs ORDER BY timestamp DESC LIMIT 0,1440);

Fuer sicher alle Programmiersprachen gibt es die Einbindung, ich selbst 
nutze Perlscripts und C.

: Bearbeitet durch User
von Ein T. (ein_typ)


Lesenswert?

Le X. schrieb:
> Du verschweigst hier die Hälfte der Aufgabenstellung.
> Das Loggen der Messwerte ist nur die halbe Miete. Später soll das ganze
> in einer GUI visualisiert werden.

Das stimmt:
1
#!/usr/bin/env python
2
'''plot temperature from systemd journal'''
3
import json
4
import argparse
5
6
import pandas as pd
7
from systemd import journal
8
import matplotlib.pyplot as plt
9
10
11
if __name__ == '__main__':
12
    parser = argparse.ArgumentParser(description='read temperature logs')
13
    parser.add_argument('identifier', default='temperature-logger', nargs='?',
14
                        help='syslog tag, default: "temperature-logger"')
15
    args = parser.parse_args()
16
    reader = journal.Reader()
17
    reader.add_match(SYSLOG_IDENTIFIER=args.identifier)
18
    datas = []
19
    for entry in reader:
20
        data = {'timestamp': entry.get('__REALTIME_TIMESTAMP', None)}
21
        data.update(json.loads(entry.get('MESSAGE', None)))
22
        datas.append(data)
23
    pd.DataFrame(datas).plot(
24
        x='timestamp', y=['core_0', 'core_1', 'core_2', 'core_3'])
25
    plt.show()

> Und spätestens dann wird dein Syslog endgültig zur Krücke.
> Grafana kann direkt auf RDBMS zugreifen,

Soweit ich weiß, kann Grafana auch auf das Syslog zugreifen.

> Wenn man also die Aufgabenstellung komplett betrachtet verschieben sich
> die Vorteile schon sehr in Richtung "kein Syslog".

Also stattdessen lieber ein DBMS und Grafana installieren und 
konfigurieren? Vor allem, wenn man bislang weder das Eine, noch das 
andere hat, und sich mit beidem (noch?) nicht auskennt? Hm, ich weiß 
nicht recht...

von Jack V. (jackv)


Lesenswert?

Ein T. schrieb:
> Aber weil Du so lieb darum bittest, würden mir da etwa
> Auditd und PGAudit einfallen.

Dies sind keine Anwendungsprogramme, und sie schreiben Infos das System 
(auditd) bzw. darauf laufender Software (pgaudit) betreffend ins Log – 
keine Nutzdaten.
Und natürlich ist es legitim, wenn auch tatsächliche 
Anwendungsprogramme, die auf dem System laufen, ihre Logdaten in das 
Systemlog schreiben.

Du propagierst hier jedoch die ganze Zeit etwas ganz Anderes, nämlich 
dass von außen kommende, das System also überhaupt nicht betreffende, 
Messwerte in das Systemlog geschrieben werden sollen, weil das ja so 
toll geeignet wäre, und weil es eine Reihe von Anwendungsprogrammen 
geben würde, die das ja auch machten.

Nun benenne bitte eines der Programme, die ihre Nutzdaten in das 
Systemlog schreiben.

von Ein T. (ein_typ)


Lesenswert?

Le X. schrieb:
> @ von Ein T. (ein_typ):
> was ist eigentlich dein Problem?

Wie kommst Du darauf, daß ich ein Problem hätte?

von STK500-Besitzer (Gast)


Lesenswert?

Nano schrieb:
> Er muss auf die GPIO des Raspberry Pi zugreifen, da das DMM die Daten
> per RS-232 Schnittstelle liefert.

Das ist doch falsch.
Die UARTs des Rapsberry's werden wie unter allen Linuxen per 
"/dev/tty..." angesprochen. Dazu braucht man keine GPIOs. Die Treiber 
gehören zum Kernel.
Auch die Treiber USB-Wandler von FTDI sind da schon integriert.

Testen kann man das z.B. mit minicom.
Es sind halt TTL-UART (5V oder eher sogar 3,3V) und keine RS232 o.dergl.

von Ein T. (ein_typ)


Lesenswert?

Wendels B. schrieb:
> Ein T. schrieb:
>> irgendwelche Behelfe mit SQLite
>
> Wie ich schon oben bekundet habe, das ist alles andere als ein Behelf.

Leider hab' ich mittlerweile schon zu oft gesehen, wie am Ende mehrere 
schreibende Prozesse auf dieselbe SQLite-Datei zugreifen sollten und 
dann ein Riesenaufwand zur Synchronisation betrieben werden mußte. 
SQLite ist toll, wenn garantiert ist, daß immer nur ein einziger Prozeß 
schreibend darauf zugreift. Versteh' mich bitte nicht falsch: ich kenne 
und mag SQLite, aber ich kenne auch seine seine Grenzen.

Für ein Append-Only-Log auf einem Raspberry Pi ist SQLite schon wegen 
seines Write-Ahead-Log genauso schwierig wie die klassischen SQL-RDBMS. 
Jeder Schreibzugriff der Applikation erzeugt drei schreibende Zugriffe 
auf das Persistierungemedium, das im Falle des RasPi obendrein meistens 
eine SD-Karte ist.

Zum Sammeln von Append-Only-Logs sind klassische RDBMS nun einmal keine 
sonderlich sinnvolle Lösung -- AOLs benötigen weder Relationen noch 
Transaktionen, werden ein einziges Mal geschrieben, sind danach 
immutable und werden nurmehr gelesen, und eine zeilenorientierte 
Speicherung ist für statistische Auswertungen wesentlich weniger gut 
geeignet als ein spaltenorientiertes Format. Für die Bedürfnisse des TO 
spielt das keine große Rolle, aber wenn es um größere Datenmengen ginge, 
würde ich eher zu einem Spezialisten wie Apache BookKeeper oder 
PostgreSQL mit TimescaleDB neigen.

> Das Speichern ist eine simple Zeile,

Eine Zeile SQL, ja... aber zum Ausführen des SQL-Statement braucht man 
ja ein Connection Handle, einen Cursor, connect(), cursor(), execute(), 
commit(), cursor.close(), connection.close()...

> die Moeglichkeiten, das gefiltert
> und vorbehandelt wieder abzufragen, sind Gold wert.

Das ist in vielen Fällen so, aber im vorliegenden Fall würde ich 
vermuten, daß das keine besonders hohe Priorität hat. Ich meine, wir 
reden vom Plotten eines einzigen Datenpunktes, nämlich des Meßwertes 
eines DMM über einen bestimmen Zeitraum. Müssen diese Daten großartig 
gefiltert und vorbehandelt werden?

> Ich jedenfalls benutze keine CSV mehr, seit ich sqlite begriffen habe.

Ja, das meinte ich ja weiter oben: wer nur einen Hammer hat, für den 
sieht jedes Problem wie ein Nagel aus. Aber sei unbesorgt, Du bist in 
bester Gesellschaft, etliche auch sehr erfahrene und fähige Entwickler 
aus meinem Freundes-, Bekannten- und Kollegenkreis greifen geradezu 
reflexartig zu relationalen SQL-Datenbanken, sobald es um die 
Speicherung strukturierter Daten geht. Das kann man machen, aber das 
ändert ja nichts daran, daß relationale SQL-Datenbanken für viele Arten 
von Daten nunmal nicht die ideale Wahl sind.

von Ein T. (ein_typ)


Lesenswert?

Jack V. schrieb:
> Ein T. schrieb:
>> Aber weil Du so lieb darum bittest, würden mir da etwa
>> Auditd und PGAudit einfallen.
>
> Dies sind keine Anwendungsprogramme, und sie schreiben Infos das System
> (auditd) bzw. darauf laufender Software (pgaudit) betreffend ins Log –
> keine Nutzdaten.

Das sind Nutzdaten, nichts anderes. Und wer Audit-Daten auf dem System 
speichert, auf dem sie anfallen, der hat das ganze Thema nicht 
verstanden.

> Nun benenne bitte eines der Programme, die ihre Nutzdaten in das
> Systemlog schreiben.

Hab' ich gerade, und jetzt darfst Du alleine mit Deinem Strohpüppchen 
weiterspielen.

Es scheint übrigens immer noch so zu sein, daß Du das ganze irgendwie 
persönlich nimmst. Was ist denn Dein Problem?

von Ein Ratschlag (Gast)


Lesenswert?

Und noch eine Kleinigkeit...

wenn du sekündlich auf die SD Karte schreibst, ist sie nach einigen 
Jahren defekt.

Das nervige - es geht so lange gut, bis du die Backups vernachlässigst 
und vergessen hast, wie die Kopie der SD Karte liegt.

von Wendels B. (wendelsberg)


Lesenswert?

Ein T. schrieb:
> Leider hab' ich mittlerweile schon zu oft gesehen, wie am Ende mehrere
> schreibende Prozesse auf dieselbe SQLite-Datei zugreifen sollten
Du widersprichst Dir selbst weiter unten:
Ein T. schrieb:
> Ich meine, wir
> reden vom Plotten eines einzigen Datenpunktes,

Ein T. schrieb:
> Eine Zeile SQL, ja... aber zum Ausführen des SQL-Statement braucht man
> ja ein Connection Handle, einen Cursor, connect(), cursor(), execute(),
> commit(), cursor.close(), connection.close()...

Eine csv musst Du auch am Anfang oeffnen und am Ende schliessen.

Ein Ratschlag schrieb:
> wenn du sekündlich auf die SD Karte schreibst, ist sie nach einigen
> Jahren defekt.

Das vermeide ich, indem die aktuelle DB in /dev/shm liegt und einmal pro 
Tag alle Werte, die noch nicht darin sind, in die DB auf der Karte 
geschrieben werden.
Das koennte man auch stuendlich, 2h, 4h, 6h machen, ganz wie es noetig 
und die Daten wichtig sind.

: Bearbeitet durch User
von Ein T. (ein_typ)


Lesenswert?

Wendels B. schrieb:
> Ein T. schrieb:
>> Leider hab' ich mittlerweile schon zu oft gesehen, wie am Ende mehrere
>> schreibende Prozesse auf dieselbe SQLite-Datei zugreifen sollten
> Du widersprichst Dir selbst weiter unten:

Nein, ich drücke mich mißverständlich aus...

> Ein T. schrieb:
>> Ich meine, wir
>> reden vom Plotten eines einzigen Datenpunktes,

Richtig wäre: einer Zeitreihe eines...

> Ein T. schrieb:
>> Eine Zeile SQL, ja... aber zum Ausführen des SQL-Statement braucht man
>> ja ein Connection Handle, einen Cursor, connect(), cursor(), execute(),
>> commit(), cursor.close(), connection.close()...
>
> Eine csv musst Du auch am Anfang oeffnen und am Ende schliessen.

Ja, klar, das bestreitet ja niemand.

> Ein Ratschlag schrieb:
>> wenn du sekündlich auf die SD Karte schreibst, ist sie nach einigen
>> Jahren defekt.
>
> Das vermeide ich, indem die aktuelle DB in /dev/shm liegt und einmal pro
> Tag alle Werte, die noch nicht darin sind, in die DB auf der Karte
> geschrieben werden.
> Das koennte man auch stuendlich, 2h, 4h, 6h machen, ganz wie es noetig
> und die Daten wichtig sind.

Wenn es eine Option ist, die Daten erst einmal flüchtig 
zwischenzuspeichern, würde ich eher zu Redis greifen. Damit hätte man 
mit einer entsprechenden Konfiguration dann auch eine vollautomatische 
Persistierung, gegebenenfalls ein Housekeeping, sowie das automatische 
Speichern und Wiederherstellen der Daten im Falle eines geordneten 
Restart oder Reboot... und einen Haufen netter Dinge mehr.

von Wendels B. (wendelsberg)


Lesenswert?

Ein T. schrieb:
> Nein, ich drücke mich mißverständlich aus..
Was mich da gestoert hat, war: wieso sollte ein einziges Messergebnis 
von mehreren Prozessen in eine DB geschrieben werden?

Ein T. schrieb:
> eher zu Redis greifen.

Muss ich mir mal ansehen.

: Bearbeitet durch User
von Wendels B. (wendelsberg)


Lesenswert?

Redis und ich werden zum jetzigen Zeitpunkt keine Freunde.
Schon dass
1
set time (time)
nicht den aktuellen Zeitstempel speichert, schreckt mich ab.
Das wieder zu Fuss zu machen, darauf hab ich keinen Bock mehr.

von Ein Kommentar (Gast)


Lesenswert?

> wieso sollte ein einziges Messergebnis
> von mehreren Prozessen in eine DB geschrieben werden?

Irgendwann willst du grafische Auswertungen über das ganze Jahr 
anzeigen. Stellst fest "select max(wert) group by day" dauert viel zu 
lange.

Falls du nun auf die Idee kommen solltest, du schreibst einen Cron-Job, 
der die konsolidierten Daten in zusätzliche Tabellen schreibt, hast du 
mehrere Prozesse, die auf die selbe DB schreiben.

von Ein T. (ein_typ)


Lesenswert?

Wendels B. schrieb:
> Ein T. schrieb:
>> Nein, ich drücke mich mißverständlich aus..
> Was mich da gestoert hat, war: wieso sollte ein einziges Messergebnis
> von mehreren Prozessen in eine DB geschrieben werden?

Hatte ich oben ausgeführt, als es noch darum ging, besagten Prozeß 
extern (etwa durch so etwas wie Cron oder einen systemd.timer) 
anzustoßen. So ein Raspberry Pi ist ja je nach Modell leider nicht allzu 
performant, und so kann es je nach Last und nach der Zuverlässigkeit des 
auszulesenden DMM durchaus dazu kommen, daß der Prozeß länger als eine 
Sekunde braucht, um das Meßergebnis zu lesen. In diesem Fall kann es 
dazu kommen daß ein zweiter Prozeß gestartet wird, während der erste 
noch läuft, so daß die Datei von beiden Prozessen zur gleichen Zeit... 
you get the idea.

von Ein T. (ein_typ)


Lesenswert?

Wendels B. schrieb:
> Redis und ich werden zum jetzigen Zeitpunkt keine Freunde.
> Schon dass
>
1
set time (time)
> nicht den aktuellen Zeitstempel speichert, schreckt mich ab.
> Das wieder zu Fuss zu machen, darauf hab ich keinen Bock mehr.

Redis ist nun einmal kein SQL-RDBMS. Was Du möchtest, läßt sich aber 
sehr leicht mit einem serverseitigen EVAL-Script oder, ab Redis Version 
7.0 vermutlich sogar noch komfortabler, einer benutzerdefinierten 
Redis-Funktion erledigen.

von Tom (Gast)


Lesenswert?

Le X. schrieb:
> @ TO: wie hast du das denn mittlerweile gelöst?

Wie schon weiter oben beschrieben mit meinem Skript, Influxdb und 
Grafana.
Es hat noch einen Moment gedauert, weil das DMM ein spezielles Kabel 
brauchte und einen 25pol Stecker bereitstellt, mein billig USB Adapter 
ebenfalls nur einen Stecker hatte. Nun habe ich einen Adapter gebaut und 
das funktioniert mit meinem rudimentären Skript wunderbar. Kann über 
Argumente angeben, ob die Datenbank gelöscht wird, ein neuer Name 
vergeben wird und ob Strom oder Spannungsmessung angefortert werden 
soll. Aktuell wird sogar alle 0.5s abgerufen. Bei 0.25 streikt das 
Messgerät, aber 0.5 ist für meinen Zweck total ausreichend.
 Es ist auch nicht geplant das ganze 345 Tage durchlaufen zu lassen mit 
der SD Karte und wenn dann hätte ich noch eine HDD für den Raspberry. 
Mir ging es wirklich darum schnell eine Lösung zu finden. Von Influx und 
Grafana hatte ich noch nie gehört und hatte da aber in kurzer Zeit alles 
fertig inklusiver Darstellung. Perfekt, danke für die Empfehlung

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.