Ankündigung

Einklappen
Keine Ankündigung bisher.

Windgeschwindigkeitsdiagramm für Visualisierung (rrdtool-Fragen)

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] Windgeschwindigkeitsdiagramm für Visualisierung (rrdtool-Fragen)

    Hallo,

    da gerade meine Wetterstation gekommen ist, habe ich dies zum Anlass genommen, mal wieder was am Wiregate auszuprobieren (ausser Temperaturfühler anschliessen/einlesen und ein paar Versuchen mit dem Zeitschaltuhr-Plugin gehen meine Erfahrungen leider noch gegen 0).
    Jetzt wollte ich schonmal CometVisu antesten, indem ich die Windgeschwindigkeit in einem Diagramm anzeigen lasse. Das hat genial einfach und schnell funktioniert.
    Dafür erstmal ein grosses Lob an die Wiregate- und CometVisu-Entwickler (hat ja schon fast Plug&Play-Feeling).



    Ausgangssituation:
    • Nach dem Vorbild von Makki's Plugin: https://knx-user-forum.de/code-schni...tenarchiv.html wird, passend zur Werteaktualisierung, nun alle 5Minuten

      Code:
      update_rrd("Quadra_Windstaerke","",knx_read("0/1/3",300,9));
      aufgerufen.
      Der RRA-Step ist per Default auf 300
    • Einstellung Wetterstation Windwert senden: zyklisch(5min) + Änderung (2m/s)


    Nun bin ich mit dem Ergebnis aber in sofern nicht ganz zufrieden, dass kurze Windböen durch den Abfrage-Intervall nicht aufgezeichnet/angezeigt werden könnten.



    Da ich jetzt die nötigen Änderungen nicht irgendwo abschreiben und zusammenklauen, sondern verstehen will, hoffe ich, ihr könnt mir ein paar Fragen beantworten, deren Antwort ich auf die Schnelle nicht selbst finden konnte.

    1. Nach meinem Verständnis über knx_read (https://knx-user-forum.de/forum/supp.../wiregate/6566) kann ich ja logischerweise nur den letzten(neuesten) Wert zurückbekommen, der im Cache/auf dem Bus ist, auch wenn innerhalb der Cache-Zeit mehrere Werte kamen. Ist das richtig?
    2. Angenommen rrdtool hätte in einem Step-Intervall 3 Werte bekommen. Dann wird im Zuge der Normalisierung daraus ein PDP gebildet (kann ich hier nicht einstellen, dass er einfach den max-Wert nehmen soll?).
    3. (Lediglich eine Gedankenstütze für mich selbst) Nun werden durch Konsolidierung aus den PDPs die CDPs gebildet, welche dann auch letzendlich in der Datenbank abgespeichert werden (wenn ich mich hier also für die Konsolidierung nach den Maximalwerten entscheide, kann dies nachträglich für bereits im RRA gespeicherte Daten nicht mehr geändert werden, da meine PDPs ja danach futsch sind) - deshalb werden sinnvollerweise auch für jeden Wert 12 Archive angelegt. Siehe dort: https://knx-user-forum.de/forum/supp...wiregate/12727




    Zurück zum ursprünglichen "Problem":

    Um nun auch kurzzeitige Böen erfassen zu können fallen mir folgende Möglichkeiten ein:
    1. Anstatt alle 300 Sekunden die Werte vom Bus/Cache zu lesen, per "$plugin_subscribe" an der Gruppenadresse für die Windgeschwindigkeit anmelden und bei jedem Telegramm den Wert mit "update_rrd" schreiben. Lässt man den RRA-Step auf 300, wäre es dann sicher noch zweckdienlich die Daten aus der Maximalwert-Konsolidierung anzeigen zu lassen.
    2. RRA manuell anlegen und Step von 300 auf 1s setzen (gehen da auch Werte kleiner 1s ?), im Diagramm für den Wochenrückblick würde ich dann auch wieder die Maximalwerte aufrufen
    3. Im Aufrufintervall des bisherigen Plugins(300) den kompletten Busverkehr durchforsten (das RRA für den knx-Verkehr müsste das doch hergeben?) und alle relevanten Daten ins Archiv schreiben.
    4. Falls knx_read nicht, wie oben vermutet, nur den letzten Wert zurückgeben kann, würden ja eh alle (normalisierten) Werte der letzten 300 Sekunden im RRA stehen und ich könnte nur die Max-Werte verwenden.


    Bei Variante 2 hätte ich eventuell sehr oft Leerwerte, falls sich die Windgeschwindigkeit nicht ständig über 2m/s ändert. Um dem zu entgegnen, könnte ich wiederum den Sendezyklus der Wetterstation hochsetzen, was aber meiner Meinung nach eine schlechte Lösung ist.

    Variante 3 scheint mir auch keine gute Lösung zu sein

    Variante 4 gibt knx_read wohl nicht her


    Bleibt Variante 1:
    Bei Variante1 und einem RRA-Step von 300 würde ich aber extreme Maximalwerte durch die PDP-Normalisierung verlieren. Um diesen Effekt zu verringern müsste ich den RRA-Step wohl so gering wie möglich einstellen (1s?).
    Alternativ könnte ich mir aber auch im Plugin 300 Sekunden lang alle reinkommenden Wind-Werte abspeichern und eine eigene Filterlogik drüberlaufen lassen, bevor ich den gewünschten Wert dann ins RRA schreibe...

    Könnte man das so machen oder hab ich das RRA-Prinzip jetzt völlig falsch verstanden?

    Gruß Frank

    #2
    Ist schon korrekt so. Ich habe für andere Messwerte sowohl einen Step von 120s als auch einen Step von 24h konfiguriert. Das bei 120s oft mal nix Neues kommt, ist dann einfach so. Soooviel Platz nimmt das im rrd ja nicht weg.
    Derzeit zwischen Kistenauspacken und Garten anlegen.
    Baublog im Profil.

    Kommentar


      #3
      Hab jetzt mal folgendes programmiert:
      Code:
      my $quadra_windspd = "0/1/1";   #GA des Windgeschwindigkeitswerts
      
      # Eigenen Aufruf-Zyklus setzen
      # Da das Plugin nur auf GAs hört, würde auch ein einmaliger Aufruf genügen 
      $plugin_info{$plugname.'_cycle'} = 86400;  
      
      
      #Nur bei einem Schreibtelegramm auf die GA von $quadra_windspd reagieren
      if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq  $quadra_windspd) 
      {
        if (!defined $msg{'value'}) 
        {
          # Wert muss dekodiert werden
          $msg{'value'} = decode_dpt9($msg{'data'});
        }
        update_rrd("Quadra_WindSpeedHighRes","",$msg{'value'});      
      } 
      else 
      { 
          # Plugin an Gruppenadresse anmelden
          $plugin_subscribe{$quadra_windspd}{$plugname} = 1;
      }
      
      
      
      #Die Windgeschwindigkeit wird zyklisch(2min) und bei Änderung (1m/s)gesendet
      #Der Heartbeat wird auf 5min gesetzt (ein verlorenes Telegramm wird toleriert)
      #Es werden Werte von 0-100 zugelassen
      #Jede Sekunde soll ein PDP erzeugt werden (Step=1)  >Geht 1 Sekunde überhaupt, oder ist der Wert zu klein?<
      #Alle 2Minuten sollen die gesammelten PDPs nach Min-/Max- und Durschschnittswerten konsolidiert werden
      #Zu diesem Zweck wird je ein RRA angelegt, das die Werte 2er Tage hält 120*1440s 
      #Die Werte von 4Wochen sollen 15minütig gespeichert werden 900*2688s
      if (!-e '/var/www/rrd/Quadra_WindSpeedHighRes.rrd') 
      {
            RRDs::create('/var/www/rrd/Quadra_WindSpeedHighRes.rrd',
              '--step' => 1,
              'DS:value:GAUGE:300:0:100',
              'RRA:AVERAGE:0.5:120:1440','RRA:AVERAGE:0.5:2688:2688',
              'RRA:MIN:0.5:120:1440','RRA:MIN:0.5:900:2688',
              'RRA:MAX:0.5:120:1440','RRA:MAX:0.5:900:2688');
      } 
      
      return;
      Ich hab auch mal ne dreisekündige Windböe simuliert und das sieht eigentlich vom Ergebnis her nicht schlecht aus (Siehe Anhang).

      Was ich immernoch nicht weiß: Kann man den RRD-Step auf 1 Sekunde setzen oder ist das zu kurz? Habe in keiner Doku nen Min-Wert gefunden.

      Ein anderer Punkt, der mir unklar ist:
      zw. 20.36 und 20.42 kam laut ETS-Protokoll alle 2min genau 1 Wert für die Windgeschwindigkeit. Müssten die Werte für Min, Max und Average im Diagramm in diesem Zeitraum nicht identisch sein? Wo liegt hier mein (Denk)fehler?
      Angehängte Dateien

      Kommentar


        #4
        Hab jetzt nochmal ein Diagramm hochgeladen, bei dem das "Problem" deutlicher zu sehen ist.

        Einstellungen der Wetterstation:
        Windgeschwindigkeit zyklisch(2min) + Änderung(1m/s)

        Da zwischen 4.38-4.58 Uhr, sowie zw. 5.00-5.16 Uhr die Windgeschwindigkeit unter 1m/s lag, dürfte in diesem Zeitraum ja nur alle 2 Minuten 1 Telegramm gekommen sein. (Habe das in diesem Fall leider nicht in der ETS mitgeloggt, aber vorherige Logs bestätigen das grundsätzlich).

        Wie können dann unterschiedliche Min-/Max-Werte zustande kommen?

        Gruß
        Frank
        Angehängte Dateien

        Kommentar


          #5
          Hallo.

          Ich weiss ja nicht ob es damit zusammen hängt aber...

          Du beschreibst in deinem Plugin die Variabel $msg{'value'}. Da dass aber eine globale Variabel ist, die mit dem Cache zusammen hängt, könnte hier das Problem liegen. Ich bin mir nicht sicher ob das decode_dpt9($msg{'data'}) den gleichen Wert zurück liefert wie wenn er direkt vom eibd kommt (z.B. Rundungsfehler). Das kanst du aber mal mit einem Pluginlog testen. Dann siehst du was genau geschieht.
          Gruss Patrik alias swiss

          Kommentar


            #6
            Hallo swiss,
            danke für Deine Antwort.
            Über das dekodieren hab ich mir tatsächlich keine Gedanken gemacht (hab mir das aus nem anderen Plugin kopiert )
            Aber zu dem Zeitpunkt, an dem ich die RRAs update, könnte der Wert dadurch zwar allgemein verfälscht, sollte doch aber wohl trotzdem für min und max identisch sein?!


            Ich befürchte eher, dass ich das RRDtool nicht richtig verstanden habe.

            Unter RRDtool - rrdcreate steht zum heartbeat:
            The "heartbeat" can be short (unusual) or long (typical) relative to the "step" interval between PDPs. A short "heartbeat" means you require multiple samples per PDP, and if you don't get them mark the PDP unknown. A long heartbeat can span multiple "steps", which means it is acceptable to have multiple PDPs calculated from a single sample. An extreme example of this might be a "step" of 5 minutes and a "heartbeat" of one day, in which case a single sample every day will result in all the PDPs for that entire day period being set to the same average rate.
            Was bedeutet "the same average rate" ?


            Dort: RRDtool - rrd-beginners habe ich nämlich folgendes gelesen:
            After every step interval, a new value of DS is supplied to update the database. This value is also called Primary Data Point (PDP). In our example mentioned above, a new PDP is generated every 300 seconds. Note, that if you do NOT supply new data points exactly every 300 seconds, this is not a problem, RRDtool will interpolate the data accordingly.
            Da ich ja einen Step von 1s habe, im ungünstigen Fall aber im Minutentakt Werte übergebe (mit update_rrd), hieße das ja, daß RRDtool hier interpoliert!?
            Wenn ich aber das Diagramm untersuche fällt mir keine Interpolation ein, die solche Werte auswirft....


            Konkret würde mich mal interessiern:
            Was passiert denn nun in den 119 Steps, in denen ein PDP erzeugt wird, ohne daß ein neuer Wert vorliegt?
            Ich ging nämlich davon aus, dass einfach mit dem letzten bekannten Wert solange PDPs erzeugt werden, bis die heartbeat-Zeit abgelaufen ist oder ein neuer Wert vorliegt....

            Kommentar


              #7
              Zitat von Jitter123 Beitrag anzeigen
              Was bedeutet "the same average rate" ?
              Das will einfach nur sagen, das für diesen Tag dann wohl Min,Avg und Max gleich sein werden.

              Grundsätzlich haste es schon, besser kann ichs auch nicht erklären, höchstens mit anderen Worten
              Wichtig bzw. hilfreich fürs Verständniss ist auch mal ein
              Code:
              rrdtool info /var/www/rrd/meinwind.rrd
              um zu sehen was da an Zahlen drinsteht weil der Graph macht ja wieder - je nach Zeitraum! - evtl. etwas anderes daraus.

              Ich versuchs mal mit einem ergänzenden, vielleicht aufschlussreichen Link:
              RRDTool Basis- u. Hintergrundwissen (Simon Meggle, Nagios-Workshop 2010 Nürnberg)

              Aber 1s Step bitte vergessen, das bringt garnichts.. Max in 5 Minuten bleibt auch so Max;
              Generell, Intervalle <60sek enden regelmässig in Frust, das ist kein Octacore mit SAS-Platten..
              Ich werde da mit nächstem Update auch eine Bremse einbauen, weil wir gefühlt in den letzten 4 Wochen alleine 10 Profis hatten die mal ein Datenintervall von 2-3sek ausprobiert haben

              Was passiert denn nun in den 119 Steps, in denen ein PDP erzeugt wird, ohne daß ein neuer Wert vorliegt?
              Es wird interpoliert, AFAIR solange 50% der Werte von Steps vorliegen..

              Ich hab zwar vielleicht denn Sinn noch nicht ganz verstanden, Windböhen sekundengenau aufzuzeichnen aber evtl. wäre auch ein Plugin mit gleitendem Max-Wert hier das sinnvollere wenn man das denn - warum auch immer - ganz präzise anstrebt(?)

              Makki
              EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
              -> Bitte KEINE PNs!

              Kommentar


                #8
                Zitat von makki Beitrag anzeigen
                höchstens mit anderen Worten
                Ich weiß, es ist aber auch verdammt schwer was zu beschreiben, mit dem man sich so gar nicht auskennt...



                Ich will nochmal versuchen anhand eines konkreten Beispiels meine Gedankengänge zu verdeutlichen:

                Ich erzeuge mal 2 RRAs, die mit den selben Werten gefüttert werden:
                Fall1 ist das Default-RRA, wie Du es vorschlägst - Fall2 ist meine Abwandlung
                • RRA-Fall1 (Default): Step: 300 - RRA:MAX mit 0.5:1:2160
                • RRA-Fall2: Step: 1 - RRA:MAX mit 0.5:300:2160

                In beiden Fälle haben wir jetzt doch ein gleichgroßes RRA, welches alle 5 Minuten einen CDP enthält und somit 180h aufzeichnet?!




                Voraussetzungen:
                • Windmesser sendet zykl. alle 5min und bei Änderung von 6m/s
                • Auf die GA der Windgeschw. hörend, wird bei jedem erkannten Telegramm "update_rrd" mit dem aktuellen Wert aufgerufen
                • Windgeschwindigkeit liegt bei 2m/s und dieser Wert wurde gleich in der ersten Sekunde des RRA-Steps geschrieben
                • Jetzt kommt eine 2-sekündige Böe mit 10m/s
                • Danach bleibt die Windgeschwindigkeit bei 1m/s


                Grafisch würde das für Fall1 so aussehen
                Zyklus: - - - - |Step(x) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |Step(x+1)- - -
                Werte: -- - - - -|2m/s - - - - - - - 10m/s- - 1m/s - - - - - - - - - - - - - - -|1m/s - - - - - -
                CDP Fall1: -- -|x m/s - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - -|1,56m/s- - - - - -
                CDP Fall2: - --|x m/s - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- |10m/s- - - - - -





                Was macht jetzt unser RRDtool im Fall1?
                Ich würde vermuten, es erzeugt alle 5min einen PDP durch Normalisierung, was bedeuten würde:
                [(2m/s * 150s) + (10m/s * 2s) + (1m/s * 148s)] / 300s = 1,56m/s
                ->PDP(x) = 1,56m/s
                Dieser PDP wird als CDP ins RRA geschrieben


                Was macht jetzt unser RRDtool im Fall2?

                Es holt sich aus den 300 Einzelsteps den Max-Wert (PDP(max) = 10m/s) und schreibt ihn als CDP ins RRA!





                Zitat von makki Beitrag anzeigen
                Aber 1s Step bitte vergessen, das bringt garnichts.. Max in 5 Minuten bleibt auch so Max
                Das ist springende Punkt! Wenn das wirklich so ist, hab ich's also doch falsch verstanden.


                Im Fall1 (5min-Step) sind mir die max-Werte doch durch die Normalisierung flöten gegangen?!

                Fall1: CDP(x)=1,56m/s
                Fall2: CDP(x)=10m/s
                Meine Windböe wäre bei Fall1 unter den Tisch gefallen und ich frag mich hinterher, warum mein Baukran bei 1,56m/s umgefallen ist


                Zitat von makki Beitrag anzeigen
                Ich hab zwar vielleicht denn Sinn noch nicht ganz verstanden, Windböhen sekundengenau aufzuzeichnen
                Mein Beweggrund ist nicht, die Windböen sekundengenau aufzeichnen (das "schnellste" RRA in meinem Plugin macht nur alle 2 min ein CDP), sondern lediglich mit höchst möglicher Wahrscheinlichkeit den Max-Wert erfassen zu können.

                Zitat von makki Beitrag anzeigen
                evtl. wäre auch ein Plugin mit gleitendem Max-Wert hier das sinnvollere
                Ich glaube das ist der Weg das relativ sauber mit dem gewünschten Ergebnis hinzubekommen - werde das mal probieren (und wahrscheinlich wieder um Hilfe betteln, wenns nicht so klappt...).


                Aber das Rätsel um die Min/Max-Werte in meinem Diagramm ist damit wohl trotzdem nicht gelöst.
                Ich weiß, das ist jetzt wieder viel Text (sorry) und ich weiß, dass man da gar keine Lust hat sich das durchzulesen. Aber ich hab mir jetzt echt Mühe gegeben, mein Problem zu erläutern und ich bitte Euch das trotz des Zeitaufwands mal nachzuvollziehen. Ich muss da wohl echt ein elementares Verständnisproblem haben (obwohl ich "RTFM" gemacht hab ;-) ).

                Kommentar


                  #9
                  Das kannst du ja auchmal auf der rrdtool Liste posten. Da kommen alle naslang derlei komplexe Probleme auf den Tisch
                  Derzeit zwischen Kistenauspacken und Garten anlegen.
                  Baublog im Profil.

                  Kommentar


                    #10
                    Guter Hinweis, das ist eigentlich sehr naheliegend, da es ja wirklich weniger um das Wiregate, als um das rrdtool selbst geht.

                    Wobei das Problem ja eigentlich gar nicht komplex ist, eher die Beschreibung.

                    Meinst Du mit "rrdtool Liste" die hier: RRD Mailinglists - RRDtool Users Mailinglist | Mailing List Archive

                    Ich krieg das zwar hin, aber auf Englisch brauch ich ja noch länger um das zu beschreiben

                    Kommentar


                      #11
                      https://lists.oetiker.ch/cgi-bin/listinfo

                      das ist das "original"
                      Derzeit zwischen Kistenauspacken und Garten anlegen.
                      Baublog im Profil.

                      Kommentar


                        #12
                        Max. Werte aufzeichnen

                        Hallo zusammen!

                        Nachdem ich den Thread so ein wenig mitverfolgt habe, möchte ich auch meinen Lösungsweg kurz beschreiben, doe ohne rrd-Änderungen und hoher Buslast auskommt:
                        Meine Wetterstation (Elsner Subtracer) hat Wind, Windmax und ResetWindMax. Für die maximale Windgeschwindigkeit logge ich Windmax und schicke gleichzeitig ein ResetWindMax auf den Bus. Damit habe ich immer die max. Windgeschwindigkeit der letzten 5min ohne Buslast.
                        Damit lassen sich zB Windalarme sehr gut nachvollziehen, wenn man nich ein rrd für Windalarm Status anlegen will.

                        Weiters ist mit den oben beschriebenen Lösungen die "Gefahr", dass max. Werte übersehen werden, da jede Wetterstation eine Telegrammratenbegrenzung hat und damit bei einer Böhe ein Wert geschickt wird, wenn die Änderung/Zeit überschritten wird, aber das Maximum vielleicht erst kurz darauf auftritt.

                        Hier der Ausschnitt aus dem Plugin:
                        Code:
                        ## ------- Suntracer Daten ------- ##
                        my $WindMax =knx_read($WindMax_ga,300,9);
                        update_rrd("Wind","",$WindMax);
                        knx_write($WindResetMax_ga,1,1);             #Reset WindMax auf Suntracer
                        Hab mal ein Diagramm angehängt. Darauf sieht man die max. Windstärke und die mittlere Geschwindigkeit, gemittelt über 20min der aktuellen Messwerte (mit Zykluszeit 30s), da man sonst nur ein zufälliges Rauschen bekommt.
                        Leider bekommt man aufgrund des gleitenden Mittelwerts den klassischen Offset, aber damit kann ich leben. Das Plugin für den Mittelwert kann ich gerne noch posten oder ins SVN stellen. War mit pack/unpack dank Makkis Tipp gut umzusetzen.

                        Ganz schön windig heute
                        lg
                        Robert
                        Angehängte Dateien

                        Kommentar


                          #13
                          "Windmax" - das fehlt der Quadra noch zum Glück. Das könnte man doch bestimmt leicht über die Firmware noch nachliefern???

                          Kommentar


                            #14
                            Lustig das wir just gestern in grosser Runde über das "einfache" Nachrüsten von Funktionen (im Kontext der ETS-Applikation/KNX-Zertifizierung) gesprochen haben

                            Ich denke Frank ist einverstanden wenn wir das erstmal einfach so wie hier, extern lösen
                            Wobei das mit WindMax/Reset natürlich IMHO evtl. noch etwas smarter ist.
                            Aber meine Quadra ist noch nicht montiert (erinnert mich mitte des Jahres nochmal), so richtig mitreden kann ich da noch nicht..

                            Jedenfalls, das hat immer alles Vor- und Nachteile, viele Wege führen nach Rom;
                            @Robert: (gleitendes) Mittelwert-Plugin (ohne RRD-auslesen) fehlt uns aber glaube ich noch, wär also durchaus ne Sache fürs Plugin-SVN!

                            Makki
                            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                            -> Bitte KEINE PNs!

                            Kommentar

                            Lädt...
                            X