RRDTOOL: nur einen Wert eintragen: wie?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Octeon
User
Beiträge: 14
Registriert: Sonntag 23. September 2018, 08:08

Hallo Forum,

in meinem Round-Robin-Archiv habe ich mehrere Datensätze mit Temperaturen: temp1, temp2, temp3.

Eingetragen werden die Werte z.B. mit:

Code: Alles auswählen

rrdtool.update("Temperaturen.rrd","N:21:22:32")
Was ist aber, wenn ich nur einen bestimmten Temperaturwert (z.B. temp2) eintragen will?
Geht das ausschließlich mit:

Code: Alles auswählen

rrdtool.update("Temperaturen.rrd","N::25:")
Oder kann ich auch irgendwie direkt auf den Datensatz-Namen verweisen, wo ich einen Wert eintragen will, also z.B.

Code: Alles auswählen

rrdtool.update("Temperaturen.rrd","N:temp2:25")
Gruß
Octeon
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Octeon: Das geht mit der ``--template``/``-t``-Option. Siehe die Dokumentation. Und da auch den Hinweis das nicht eingetragene Werte zu dem Zeitpunkt als unbekannt eingetragen werden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Octeon
User
Beiträge: 14
Registriert: Sonntag 23. September 2018, 08:08

Danke für die Antwort, aber es funktioniert irgendwie nicht.

Mein Code sieht jetzt so aus:

Code: Alles auswählen

rrdtool.update("Temperaturen.rrd","-t temp1 N:21")
Normalerweise bekomme ich ein NONE zurück, wenn alles ordnungsgemäß ausgeführt wurde. Ich bekomme aber nichts zurück, auch keinen Fehler o.ä.

Was mache ich falsch?
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Octeon: Meinst Du `None` oder `NONE`? Und ”nichts” geht gar nicht, *jeder* Aufruf hat in Python einen Rückgabewert. Wenn es keinen expliziten gibt, dann wird implizit `None` zurückgegeben.

Zum Aufruf selbst: das müssten *zwei* Argumente sein. Also "-t temp1" und "N:21".
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Octeon
User
Beiträge: 14
Registriert: Sonntag 23. September 2018, 08:08

Das ist ja das komisch: da kommt nichts zurück.
Normalerweise wird None zurückgemeldet, wenn alles einwandfrei ausgeführt wurde.

Ich prüfe das mit:

Code: Alles auswählen

print (rrdtool.update("Temperaturen.rrd","-t temp1","N:21"))
(so sieht mein Code jetzt aus, es wird aber nichts in das RRD-Archiv eingetragen und auch kein None zurückgemeldet)

Ich kann auch das hier eingeben, ohne das ein Fehler auftritt:

Code: Alles auswählen

print (rrdtool.update("Temperaturen.rrd","MickeyMaus","N:21"))
Komisch....
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Der Aufruf von Funktionen gibt immer etwas zurück.
Nach einem Funktionsaufruf gehört kein Leerzeichen.
Was gibt das denn aus?

Code: Alles auswählen

print("Vorher")
return_value = rrdtool.update("Temperaturen.rrd","-t temp1","N:21")
print(f"Return value: {return_value}")
print("Hinterher)
Es kling nämlich, als würde dein Code an der Stelle nicht ankommen.
Octeon
User
Beiträge: 14
Registriert: Sonntag 23. September 2018, 08:08

Ok...ich glaube, langsam komme ich dem Problem auf die Schliche.

Abgesehen davon, dass das

Code: Alles auswählen

print(f"Return value: {return_value}")
einen Syntaxfehler gibt (habe ich geändert), kommt immer nur "Vorher".
Ich rufe den Befehl in eine Callback-Funktion auf, die jedes Mal aufgerufen wird, wenn ein MQTT-Wert eintrifft.
Kann es sein, dass die rrdtool.update-Funktion gar nicht richtig zu Ende ausgeführt, da schon der nächste MQTT-Wert eintrudelt und somit der nächste Callback getriggert wird?
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Octeon: Wie alt ist denn Dein Python? f-Zeichenkettenliterale gibt es seit Python 3.6. Und das ist das älteste Python für das es noch Support gibt.

Wie geht der Callback-Mechanismus denn mit Ausnahmen aus? Siehst Du die irgendwo? Falls nicht ist das, ähm, sehr ugnünstig für die Fehlersuche.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Octeon
User
Beiträge: 14
Registriert: Sonntag 23. September 2018, 08:08

So, Problem mehr oder weniger "gelöst".

Zu Deiner Frage: ist Python 3.5.3 auf einem älteren RasPi.

Zum Problem:
Mein Programm trägt jedes Mal, wenn ein Temperatur-Wert per MQTT eintrudelt, den Wert in ein RRD ein.
Das passiert in der Callback-Funktion von MQTT (on_message, gestartet über loop_start()).
Und offensichtlich ist es so, dass wenn beim Aufruf von rrdtool.update(*args) irgendwas nicht passt (z.B. falsche Parameter, s.u.), KEIN Fehler geworfen wird. Es wird die Callback-Funktion m.E. einfach abgebrochen. Vielleicht weil das Hauptprogramm sowieso in irgendeiner anderen Schleife o.ä. hängt und die Callback-Funktion on_message in einem neuen Thread bearbeitet wird.

Der Fehler war, dass ich den Parameter -t / --template falsch übergegen habe: da darf kein Leerzeichen zwischen dem -t und dem Name des DS.
Antworten