Negativer Temperaturwert in RRDtool

  • Hi Leute,


    ich bin relativ neu in Python und komme grade nicht weiter. Ich möchte zwei Temperaturwerte in eine rrd Datenbank schreiben. Allerdings erhalte ich bei einem negativen Temperaturwert eine Fehlermeldung, die ich nicht lösen kann. Ich habe einiges versucht, um alternative replacments zu verwenden, das Problem ist jedoch leider geblieben. Ich hoffe, Ihr könnt mir weiterhelfen.


    Zunächst einmal die Datenbank selbst:


    Code
    rrdtool create outtemp.rrd --step 3600 DS:temp0:GAUGE:1200:-40:60 DS:temp1:GAUGE:1200:-40:80 RRA:AVERAGE:0.5:1:240 RRA:MIN:0.5:96:3600 RRA:MAX:0.5:96:3600 RRA:AVERAGE:0.5:96:3600


    Und hier mein Script (Informationen in den Kommentaren im Script):



    Vielleicht habt Ihr eine Idee, wie ich das Problem lösen kann. Im Log wird es übrigens korrekt angezeigt.



    Gruß & Danke für Euer Feedback

    Sc0rc3d

    • Best Answer

    w1 und w2 sind str und kein int oder float.


  • Hi Dead_Eye, und danke für deine Rückmeldung und das schön geschriebene Script.


    Funktioniert perfekt.

    Edited once, last by Sc0rc3d ().

  • `req` ist eine komische Abkürzung für `response`. Wofür steht da das `q`? 😎


    Die beiden ``continue`` sind unschön und leicht vermeidbar.


    Wenn die Webseite einen anderen Status liefert der nicht OK ist, dann wird das unterdrückt. Genau so wenn die Webseite nicht innerhalb von einer Sekunde antwortet, oder wenn sie antwortet, aber aus irgendeinem Grund keine Temperatur in der Antwort ist, auf die das Muster passt. Das führt dann im weiteren zu einem `KeyError`, man weiss aber gar nicht welcher der möglichen Gründe dazu geführt hat.


    Das Wörterbuch an sich scheint mir auch nicht so sinnvoll wenn im Ausgangsbeitrag doch steht das am Ende einfach nur *ein* Temperaturwert abgefragt werden soll und der russische da nur als Test für negative Werte drin ist.


    Der '|' im regulären Ausdruck macht keinen Sinn.


    Der selbe `FileHandler` wird zweimal zum selben `Logger` hinzugefügt.


    Bei den Logging-Aufrufen kann man f-Strings verwenden, allerdings wird das dann auch formatiert wenn am Ende gar nicht geloggt wird, falls das Loglevel nicht hoch genug ist. Also dann doch wieder %-Platzhalter.


    Ungetestet:

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • Danke für Deine Rückmeldung __blackjack__ und das Verschönern des Scripts. :)


    Ich möchte noch eine kleine Rückfrage loswerden. Laut der Log-Datei (das Script läuft jede Stunde über crontab) läuft das Script nun seit gestern Abend jede Stunde sauber durch:

    Wenn ich jedoch einen Graphen erstellen möchte (aktuell noch mit rrdtool graph später hoffentlich über eine andere Lösung mit JavaScript über den Clineten) werden keine Temperaturwerte angezeigt.


    Ich nutze dafür folgenden Befehl:


    Code
    rrdtool graph GERRU.png -s 'now - 1 day' -e 'now' DEF:temp0=outtemp.rrd:temp0:AVERAGE LINE2:temp0#00FF00:Berlin VDEF:temp0last=temp0,LAST "GPRINT:temp0last:%.1lf °C" DEF:temp1=outtemp.rrd:temp1:AVERAGE LINE2:temp1#0000FF:VladiWostock VDEF:temp1last=temp1,LAST "GPRINT:temp1last:%.1lf °C"




    Laut rrdinfo sind auch Daten in der Datenbank:



    Liegt das vielleicht daran, wie ich die Datenbank aufgebaut habe?

    Code
    rrdtool create outtemp.rrd --step 3600 DS:temp0:GAUGE:1200:-40:60 DS:temp1:GAUGE:1200:-40:80 RRA:AVERAGE:0.5:1:240 RRA:MIN:0.5:96:3600 RRA:MAX:0.5:96:3600 RRA:AVERAGE:0.5:96:3600


    Gruß

    Sc0rc3d

  • Hiho; Sc0rc3d!


    rrdtool ist oft nicht gerade einfach zu durchschauen...


    Also Du hast

    rrdtool create outtemp.rrd --step 3600

    bedeutet: Die Datenbank outtemp.rrd erwartet alle 3600s (also jede Stunde) einen Input

    (-bzw bildet den Mittelwert aus mehreren Inputs alle 3600 Sekunden). Das ist also später die maximale Datenauflösung.


    DS:temp0:GAUGE:1200:-40:60

    bedeutet: Eine Datenreihe temp0 wird erzeugt. Die 1200 sind die Sekunden, in denen mindestens ein Input erfolgen muss, sonst erzeugt das System eine Lücke im Graphen. Wenn Du dein Script nun 1x/Stunde laufen lässt, würde es die Punkte nicht verbinden. Bei 7200 (Sekunden) würde es dagegen in der Grafik die Linie verbinden, auch wenn mal in einer Stunde ein Wert fehlen würde.

    Irgendwie finde Ich es sinnvoller, diesen Wert höher als den step zu setzen, bestenfalls gleich, aber auf keinen Fall niedriger (Oder Du musst auch das script mindestens alle 20 Minuten laufen lassen (=1200 s), dann bildet rrd jede Stunde (=3600s daraus einen Mittelwert, der in der Datenbank gespeichert wird.)


    Zu deinen Werten:

    last_ds zeigt, dass wohl Werte eingegangen sind

    Direkt darunter sollte aber bei value eine Zahl stehen im Format zB:

    .value = 2.5741788000e+02


    Das NaN bei deinen Werten steht eigentlich für "Not a Number", also gibt es keinen Wert


    Jetzt weiß Ich nicht, ob das an obigem "Auslassen" liegt oder ob es ein sonstiges Problem gibt.


    Vielleicht also:


    Code
    rrdtool create outtemp2.rrd --step 3600
    DS:temp0:GAUGE:7200:-40:60
    DS:temp1:GAUGE:7200:-40:80
    RRA:AVERAGE:0.5:1:240
    RRA:MIN:0.5:96:3600
    RRA:MAX:0.5:96:3600
    RRA:AVERAGE:0.5:96:3600


    Deine erste rra bedeutet, dass jeder 1-Stunden-Mittelwert geschrieben wird (1 step=3600s)und 240 davon aufbewahrt werden, erst dann überschreibt rrd den Ältesten dieser Werte.

    Die 96 bei den nächsten rra's bedeuten, dass von diesen 1-Stunden-Werten 96 gesammelt werden, dann erst wird aus diesen 96 Werten ein Mittelwert gebildet. Und davon hebst Du 3600 auf, bevor der älteste überschrieben wird.

    Also wirst Du erst nach 96 Stunden den ersten dieser MIN/MAX/AVERAGE haben! (Also nach vier Tagen!)

    Alle Vier Tage käme dann erst der nächste Wert und von diesen 4-Tage-Werten würdest Du 3600 aufbewahren.

    (Grob gerechnet könntest Du also 40 Jahre darauf zurückgreifen, erst dann wird der älteste Wert überschrieben)



    Das Sekunden-in-Stunden-Tage-Wochen-Jahre umrechnen ist ja sehr unübersichtlich. Es ist mittlerweile einfacher geworden, diese Intervalle anzugeben, hier ist der step mal 10 Sekunden:



    Code
    rrdtool create blabla.rrd --step 10
    DS:ds0:GAUGE:5m:0:U
    RRA:AVERAGE:0.5:5m:300h
    RRA:AVERAGE:0.5:15m:900h
    RRA:AVERAGE:0.5:1h:50d


    Alle 10 Sekunden wird ein neuer Mittelwert gebildet und zwischengespeichert.

    Die DS hat eine maximale Toleranz von 5 Minuten, erst dann würde man in der Grafik eine Lücke erhalten.


    Die erste RRA erlaubt es nachher 300 Stunden lang, auf die 5-Minuten-Mittelwerte zuzugreifen

    Die zweite RRA erlaubt es nachher 900 Stunden lang, auf die 15-Minuten-Mittelwerte zuzugreifen

    Die dritte RRA erlaubt es nachher 50 Tage lang, auf die 1-Stunden-Mittelwerte zuzugreifen


    Also ist es sinnvoll, zuerst zu überlegen, wie klein die Minimal-Intervalle sein sollen, die man später auflösen will. Wenn Dir eine Stunde reicht, also step bei 3600 lassen.

    Hast Du verlässliche 1-Stunden-Updates, kannst Du den DS-Wert auf 1h setzen, dann bekommst Du später im Diagramm eine Lücke, sobald mal ein Update nicht gelaufen wäre.

    Sinnvoll finde Ich dann aber schon, sich auch die grundsätzlichen RRA's anzeigen zu lassen, also immer für Average/MIN/MAX bei Dir "1h" zu setzen.

    Wie lange rückwirkend Du dann Grafiken in dieser Auflösung erzeugen kannst, hängt dann an der letzten Zahl.

    Sobald Du ein Diagramm erzeugen willst, das über diesen Zeitraum hinaus geht, wird rrd dir dann nur die nächsten (gröberen) "Averages"... zeichnen, also zB den Tages-/Wochen-/Monats-Durchschnitt -falls Du dafür eine rra definiert hast.


    Äääääääh, irgendwie ein bisschen viel geworden ;)

  • Hey Rasray, wow DANKE!


    Das hat mir erst mal weiter die Augen geöffnet und mich im Verständnis von RRD in jedem Fall weiter gebracht. Ich möchte mich herzlich für Dein Feedback bedanken. Und auch noch mal danke für die anderen Antworten hier. :thumbup:<3