Seite 1 von 1
RRDTOOL: nur einen Wert eintragen: wie?
Verfasst: Montag 18. Januar 2021, 21:23
von Octeon
Hallo Forum,
in meinem Round-Robin-Archiv habe ich mehrere Datensätze mit Temperaturen: temp1, temp2, temp3.
Eingetragen werden die Werte z.B. mit:
Was ist aber, wenn ich nur einen bestimmten Temperaturwert (z.B. temp2) eintragen will?
Geht das ausschließlich mit:
Oder kann ich auch irgendwie direkt auf den Datensatz-Namen verweisen, wo ich einen Wert eintragen will, also z.B.
Gruß
Octeon
Re: RRDTOOL: nur einen Wert eintragen: wie?
Verfasst: Dienstag 19. Januar 2021, 01:06
von __blackjack__
@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.
Re: RRDTOOL: nur einen Wert eintragen: wie?
Verfasst: Dienstag 19. Januar 2021, 17:05
von Octeon
Danke für die Antwort, aber es funktioniert irgendwie nicht.
Mein Code sieht jetzt so aus:
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?
Re: RRDTOOL: nur einen Wert eintragen: wie?
Verfasst: Dienstag 19. Januar 2021, 19:25
von __blackjack__
@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".
Re: RRDTOOL: nur einen Wert eintragen: wie?
Verfasst: Dienstag 19. Januar 2021, 20:17
von Octeon
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....
Re: RRDTOOL: nur einen Wert eintragen: wie?
Verfasst: Dienstag 19. Januar 2021, 20:46
von sparrow
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.
Re: RRDTOOL: nur einen Wert eintragen: wie?
Verfasst: Dienstag 19. Januar 2021, 21:35
von Octeon
Ok...ich glaube, langsam komme ich dem Problem auf die Schliche.
Abgesehen davon, dass das
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?
Re: RRDTOOL: nur einen Wert eintragen: wie?
Verfasst: Dienstag 19. Januar 2021, 22:17
von __blackjack__
@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.
Re: RRDTOOL: nur einen Wert eintragen: wie?
Verfasst: Donnerstag 21. Januar 2021, 21:28
von Octeon
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.