RRD-Datenbank: einen bestimmten Wert aus auslesen und nutzen

  • Hallo,
    meine individuelle Rollladensteuerung kommt meinen Vorstellungen inzwischen schon sehr nahe.
    Nun erweist sich aber ein Feature als sehr anfällig, der Hitzeschutz für Fenster.
    Im Hochsommer ballert sehr die Sonne ins Fenster. Die Lösung wäre andersartige Scheiben oder Rollos runter. Bisher haben wir uns aus Kostengründen für Lösung 2 entschieden und deshalb möchte ich das auch automatisieren.

    Deshalb habe ich in jedes betroffene Fenster auf Zimmerseite einen Messfühler platziert, der alle 5 Minuten die Temperatur misst und für Statistikzwecke in eine RRD-Datenbank eingetragen.
    Für die Hitzeschutzfunktion habe ich nun diese Temperatur genommen und bei Überschreiten eines Wertes (50Grad) wurde das Rollo fast ganz runter gefahren. Und bei Unterschreiten des Wertes (40Grad) wurde das Rollo wieder hoch gefahren.

    Nun stellt sich heraus, dass bei bewölktem Himmel die Rollos ständig hoch und runter fahren.
    Das Problem ist, dass ich punktartige Messwerte nehme, was recht zufällig sein kann. Besser wäre ein Mittelwert von mehreren Werten in einer bestimmten Zeitspanne.

    Im Prinzip habe ich diesen Mittelwert schon, nämlich in der RRD-Datenbank.
    Ich finde aber keine Lösung, wie ich diesen Wert einzeln aus der Datenbank auslesen und meinen Bash-Programm zur Verfügung stellen kann.

    Die Datenbankstruktur sieht so aus:


    Ich habe zwar etwas gefunden, wo man die RRD-Werte in eine XML kopiert, und dann vielleicht auslesen kann. Da das ständig geschehen müsste, finde ich das suboptimal. Die Abfrage direkt aus der Datenbank wäre mir lieber.

    Die Frage ist, wie kann ich von z.B.temp5 den zuletzt eingetragenen Wert auslesen.
    Habt ihr eine Idee oder eine Quelle, wo solche Fragen auf deutsch diskutiert werden? Ich finde zu RRD tiefergehende Quellen nur auf englisch, und da bin ich sehr aufgeschmissen...

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

  • RRD-Datenbank: einen bestimmten Wert aus auslesen und nutzen? Schau mal ob du hier fündig wirst!

  • Hallo docadams

    die zuletzt erfasste Messreihe lässt sich mit

    rrdtool lastupdate stube.rrd

    auslesen. Dabei wird zuerst die Bezeichnung der Messstellen angezeigt,
    dann der UNIX Timestamp und dann mit deinem Beispiel die Werte für temp1 ... temp7.

    Der gewünschte Messwert müsste entsprechend extrahiert werden.

    Es ist vieleicht einfacher die benötigten Werte z. B. mit

    echo "$datum;$temp4;$temp5" >> /home/pi/stube.xml

    in einer Datei zusätzlich zu speichern.
    Um die Dateigröße zu begrenzen z. B. nachts wenn die Steuerung
    nicht anspricht kann man die Datei auf null zu setzen.

  • Hallo,
    hier mal eine Zeile aus einer Bash Datei mit der ich einzelne Werte aus einer RRD Datenbank heraushoel. Diese Werte lasse ich mir in txt Dateien schreiben um sie von dort aus weiter zu verwenden.

    Code
    aussentempmax=$(/usr/bin/rrdtool graph /dev/null --start -86400  DEF:sensor2max=/usr/local/bin/messwerte.rrd:sensor2:MAX PRINT:sensor2max:MAX:"%3.4lf"|tail -1)
    
    
    echo $aussentempmax > /volume1/web/messdaten/sensor/temp/max/aussentempmax.txt

    Die Variable aussentempmax wird mit dem MAX Wert von sensor2 gefüllt
    Wobei der RRD Befehl PRINT die sonstige LINE in einer RRD Graph ersetzt, dadurch wird keine Grafik erzeugt sondern der Wert nur ausgelesen und "geschrieben".
    Die zweite Zeile, beginnend mit "echo" übergibt den Wert der Variablen "aussentempmax" in die txt Datei "aussentempmax.txt" von wo aus ich den Wert weiter verarbeiten kann.
    Ist natürlich nicht notwendig, man kann auch direkt in der Bash Datei weiter damit arbeiten.
    In diesem Beispiel wird der MAX Wert ausgelesen, wenn du den Durchschnittswert haben willst must du glaube ich AVERAGE nehmen, aber besser mit bei Herrn Oetker auf de RRD Homepage schauen.

  • Hallo und danke für eure Antworten.
    Es hat bei mir so lange gedauert, weil ich erst mal versuchen wollte, das für mich umzusetzen.

    Rosty, ich glaube, lastupdate liefert die jeweils letzten Messwerte. Das mache ich ja bisher auch und ist eben sehr schwankend.

    Jim-Knopf, das AVERAGE liefert den durchschnitt der letzten Periode, ich glaube der letzten 24 Stunden, das wäre nun wieder zu schwerfällig. Dein Vorschlag hat mich aber auf eine andere Idee gebracht.

    Wenn ich die zweite Grafik von dieser Beschreibung richtig verstanden habe, suche ich die PRIMARY DATA POINTS. Und wenn ich das weiter richtig verstanden habe, müsste das mit dem LAST-Befehl übereinstimmen. Oder habe ich einen Denkfehler?

    Code
    tempF1min=$(/usr/bin/rrdtool graph /dev/null --start -86400  DEF:temp1min=/home/pi/skripte/temperatur/stube.rrd:temp1:MIN PRINT:temp1min:MIN:"%3.4lf"|tail -1)
    tempF1avg=$(/usr/bin/rrdtool graph /dev/null --start -86400  DEF:temp1average=/home/pi/skripte/temperatur/stube.rrd:temp1:AVERAGE PRINT:temp1average:AVERAGE:"%3.4lf"|tail -1)
    tempF1max=$(/usr/bin/rrdtool graph /dev/null --start -86400  DEF:temp1max=/home/pi/skripte/temperatur/stube.rrd:temp1:MAX PRINT:temp1max:MAX:"%3.4lf"|tail -1)
    tempF1last=$(/usr/bin/rrdtool graph /dev/null --start -86400  DEF:temp1last=/home/pi/skripte/temperatur/stube.rrd:temp1:LAST PRINT:temp1last:LAST:"%3.4lf"|tail -1)
    
    
    echo Fenster 1 "   $tempF1min ; $tempF1avg ; $tempF1max ;$tempF1last"


    Während min, avg und max mir Ergebnisse liefert, kommt in der last-Zeile eine Fehlermeldung.

    Code
    ERROR: the RRD does not contain an RRA matching the chosen CF
    Fenster 1    16.2152 ; 21.8134 ; 45.0941 ;


    Aber den LAST-Parameter setzt man doch auch bei Grafiken ein.... ?

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

  • Wenn ich das richtig verstanden habe möchtest du einen Mittelwert aus einem bestimmten Zeifenster ?

    Wenn du in meinem Code den Wert 86400 auf das von die gewünschte Zeitfenster einstellst hast du genau den Mittelwert aus dem Zeitiuntervall den du möchtest.
    Die 86400 entsprechen ja genau 24 Stunden ( 60 sek * 60 min * 24 Std )
    Wenn du nur 10 min brauchst dann nimm als Wert 600 ( 60 sek * 10 min )

    Oder habe ich dein Problem falsch verstanden ?

  • So, ich habe nun endlich Zeit gefunden, deinen Hinweis umzusetzen. Nun warte ich auf einen heißen Tag mit wechselnder Bewölkung, aber ich bin guter Hoffnung, dass es klappt :bravo2:

    Mein Skript sieht für ein Fenster so aus, insgesamt habe ich das für 4 Fenster gemacht, jedes wird einzeln angesteuert.

    Der w1-Sensor 01-0000161ed568 ist ein Reedkontakt, der prüft, ob das Rollo tatsächlich oben ist. Wenn er nicht vorhanden ist, ist das Rollo vermutlich schon in Sonnenschutzposition und das Programm wird für dieses Fenster beendet. Bzw. bei Unterschreiten der zweiten Toleranztemperatur wird dann das Rollo hochgefahren.
    Bei Überschreiten der Grenztemperatur $max=47 Grad fährt das Rollo zu 80% runter und bei unterschreiten der Toleranztemperatur $tol=43 Grad fährt es wieder hoch.

    So ist der Plan ;)

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!