Ankündigung

Einklappen
Keine Ankündigung bisher.

Min/Max-Werte Plugin?

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

    [wiregate] Min/Max-Werte Plugin?

    Hat jemand schon ein Plugin geschrieben um sich Min/Max-Werte ausgeben lassen zu können?
    So langsam würde man ja gern mal wissen, wie kalt es nachts draußen wirklich minimal war. Klar kann man in den Graphen nachschauen, aber eine Anzeige in der Visu etc wäre schon "schöner".

    Grüße
    Derzeit zwischen Kistenauspacken und Garten anlegen.
    Baublog im Profil.

    #2
    Geht das schon irgendwie (und ich blicks nicht) oder hat da niemand weiter Interesse?
    Derzeit zwischen Kistenauspacken und Garten anlegen.
    Baublog im Profil.

    Kommentar


      #3
      Hi,
      Meine visu baue ich mir erst im Winter. Aber wenn du die werte in einem rrd hast, würde ich versuchen aus diesem den wert auszulesen. Entweder gibt es direkt einen befehl im rrd tool oder sonst die werte aus dem rrd als liste auslesen und dann mit perl den max bestimmen.

      Gruß

      Kommentar


        #4
        Ok, rrd wäre eine Variante.
        wenn das jemand in linknx gemacht hat, wäre ich auch daran interessiert...
        Derzeit zwischen Kistenauspacken und Garten anlegen.
        Baublog im Profil.

        Kommentar


          #5
          Ich denke so direkt gibts das noch nicht ist aber übersichtlich;
          Der Ansatz ausm rrdtool ist sicher auch kein Fehler, kommt halt drauf an. Soll Min/Max irgendwann zurückgesetzt werden?
          Wenn ja, hart (Tag/Woche/..) oder floating, also der älteste Wert raus? Je nachdem lässt sich da schon ein 5zeiler machen

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

          Kommentar


            #6
            Ich hätte gern regelmässig "floating 20h Min/Max" auf je eine GA gesendet. Wenn man den Fensterwert (20h) im Plugin einstellen kann, ist das sicher kein Fehler.
            Usecase ist wie gesagt "Gabs die Nacht Frost?" oder "Wie hoch war die maximale VL am heutigen Tag?".
            Derzeit zwischen Kistenauspacken und Garten anlegen.
            Baublog im Profil.

            Kommentar


              #7
              Also so:

              Code:
              ### Plugin Min/Max values from RRD auf den Bus
              # v0.3
              my $RRDName = "28.7FD4EB010000_temp";
              my $ds   = "MIN"; # Datasource: MIN AVERAGE MAX - egal bei Werten <180h
              my $start = "now-20h"; # AT-STYLE TIME SPECIFICATION 
              my $end   = "now";
              $plugin_info{$plugname.'_cycle'} = 3600; # alle x sekunden
              my $debug = 0;
              my $gamin = '11/2/20'; # leer um Versand zu unterbinden-> ''
              my $gamax = '11/2/21'; # leer um Versand zu unterbinden-> ''
              my $dpt = $eibgaconf{$gamin}{'DPTSubId'} || $eibgaconf{$gamax}{'DPTSubId'} || "9.001";
              # hier einen Wert setzen (statt "9.001" z.B. "5.001"), falls es nicht im import/config ist
              
              ### ENDE Definitionen
              
              # return early on write/response (telegram from myself!)
              if ($msg{'apci'} && $msg{'apci'} ne "A_GroupValue_Read") {
              	return;
              }
              
              my ($min,$max);
              my ($dbstart, $step, $names, $data) =
              	RRDs::fetch('/var/www/rrd/'.$RRDName.'.rrd', "--start=$start","--end=$end", $ds);
              
              foreach my $line (@$data) {
                 foreach my $val (@$line) {
              	next unless defined $val;
              	$min = $val unless defined $min;
              	$max = $val unless defined $max;
              	$min = $val if $val < $min;
                 	$max = $val if $val > $max;
                  }
              }
              
              if ($msg{'apci'} eq "A_GroupValue_Read" and $msg{'dst'} eq $gamin) {
              	knx_write($gamin,$min,$dpt,1);
              	return;
              } elsif ($msg{'apci'} eq "A_GroupValue_Read" and $msg{'dst'} eq $gamax) {
              	knx_write($gamax,$max,$dpt,1);
              	return;
              }
              
              if ($gamin) {
              	knx_write($gamin,$min,$dpt);
              	$plugin_subscribe{$gamin}{$plugname} = 1;
              }
              if ($gamax) {
              	knx_write($gamax,$max,$dpt);
              	$plugin_subscribe{$gamax}{$plugname} = 1;
              }
              return("Min $min Max $max in $start") if $debug;
              return;
              Makki

              BTW: bin da grad mal wieder über einen netten Artikel zum Thema rrdtool gestolpert: Messdaten mit RRDtool und Perl verwalten « 06 « 2004 « Ausgaben « Heft & Abo « Linux-Magazin Online
              EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
              -> Bitte KEINE PNs!

              Kommentar


                #8
                Danke Makki!
                Hab ich mir doch gedacht, dass es nicht so wild sein sollte :-)

                Schönes WE

                Kommentar


                  #9
                  Ok, das läuft. Kann man verwenden.
                  Jetzt braucht Comet nur noch ein schönes Multiinfofeld Aber das ist ein anderes Thema.

                  Ggf. wäre noch eine multi-Variante interessant. Also x rrd auf x Gruppenadressen zu mappen, statt derzeit nur eine. Für die 4 Werte lasse ich derzeit das Plugin aber einfach 4 Mal laufen. Geht auch.
                  Derzeit zwischen Kistenauspacken und Garten anlegen.
                  Baublog im Profil.

                  Kommentar


                    #10
                    Ah geht doch noch nicht.
                    MIN geht nur für Werte unter 0 Grad Wenns wie derzeit also über 0 Grad liegt, wird das nicht MIN. Gleiches vermutlich für MAX im kalten Winter. Vermutlich muss das noch initialisiert werden?
                    Derzeit zwischen Kistenauspacken und Garten anlegen.
                    Baublog im Profil.

                    Kommentar


                      #11
                      Vor allem nicht falsch mit 0 initialisieren Habs oben korrigiert. (100,-100 ginge auch aber dann gehts unter/über 100 nicht, besser so..)

                      Makki

                      Code:
                      markstaller@v1520-mm:~/devel/openautomation/wiregate$ svn diff
                      Index: plugin/generic/MinMaxValueFromRRDtoGA.pl
                      ===================================================================
                      --- plugin/generic/MinMaxValueFromRRDtoGA.pl	(Revision 472)
                      +++ plugin/generic/MinMaxValueFromRRDtoGA.pl	(Arbeitskopie)
                      @@ -14,13 +14,15 @@
                       	return;
                       }
                       
                      -my ($min,$max) = (0,0);
                      +my ($min,$max);
                       my ($dbstart, $step, $names, $data) =
                       	RRDs::fetch('/var/www/rrd/'.$RRDName.'.rrd', "--start=$start","--end=$end", $ds);
                       
                       foreach my $line (@$data) {
                          foreach my $val (@$line) {
                       	next unless defined $val;
                      +	$min = $val unless defined $min;
                      +	$max = $val unless defined $max;
                       	$min = $val if $val < $min;
                          	$max = $val if $val > $max;
                           }
                      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                      -> Bitte KEINE PNs!

                      Kommentar


                        #12
                        Yes, it works.
                        Derzeit zwischen Kistenauspacken und Garten anlegen.
                        Baublog im Profil.

                        Kommentar


                          #13
                          Hmm, so ist das wenn mans noch schnell im stehen auf dem Sprung macht, der RRD-Teil war zu einfach als das das Gehirn zu 100% hochgefahren wäre:
                          Also ich wär soweit, wir wollten doch um sieben da sein?
                          AW: Jaja, habs doch gleich
                          An dem Tag hatte es minusgrade in der Nacht, da gingen alle Test-cases

                          Ggf. wäre noch eine multi-Variante interessant. Also x rrd auf x Gruppenadressen zu mappen, statt derzeit nur eine.
                          Naja, da wird nichts schneller oder besser, ein Plugin pro Wert tuts auch. Höchstens wird es übersichtlicher aber dafür stünden im Plugin dann eher hässliche Arrays oder noch hässlichere Hashes die man für $plugin_info de/serialisieren muss..
                          Aber das ist ja das schöne, wenns einem so nicht 100% gefällt macht man es halt ein bisschen anders, ist ja wahrlich kein Monstermässig komplexer Code (und postet/submitted es dann optimalerweise kurz)

                          Bin da ehrlichgesagt eher ein Freund von "einfach", kann man x-mal kopieren, durchnummerieren und versteht man in 3 Monaten auch noch auf Anhieb statt zu grübeln wie das nun noch gleich war und warum da soviele {#$%} sind :d
                          Das mit der CV steht auch auf meinem Radar, zwar nicht in diesem Kontext aber so ähnlich und dafür auch brauchbar


                          Übrigens am Rande: ich kenne das rrdtool gut genug zu wissen, das man mit einer "Eigenlösung" dafür statt fetch (könnte man sich ja auch die Werte so speichern und auswerten) als sehr guter programmierer bestenfalls gleichstand erreicht was die Performance&resourcen angeht - und dann auch nur für den eigenen use-case, wenn die Zeiträume und Auflösungen flexibel bzw. automatisch sein sollen ist das für genau sowas IMHO echt unschlagbar.

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

                          Kommentar


                            #14
                            Irgendwie bin ich zu blöd dafür, habe folgenden Code und bekomme als Minimal immer nun 0.0:

                            Code:
                            ### Plugin Min/Max values from RRD auf den Bus
                            my $RRDName = "28.203CF0020000_temp";
                            my $ds   = "MIN"; # Datasource: MIN AVERAGE MAX - egal bei Werten <180h
                            my $start = "now-20h"; # AT-STYLE TIME SPECIFICATION 
                            my $end   = "now";
                            $plugin_info{$plugname.'_cycle'} = 3600; # alle x sekunden
                            my $debug = 0;
                            my $gamin = '7/3/0'; # DPT9.001 leer um Versand zu unterbinden-> ''
                            my $gamax = '7/3/1'; # leer um Versand zu unterbinden-> ''
                            ### ENDE Definitionen
                            
                            # return early on write/response (telegram from myself!)
                            if ($msg{'apci'} && $msg{'apci'} ne "A_GroupValue_Read") {
                                return;
                            }
                            
                            -my ($min,$max) = (0,0);
                            +my ($min,$max);
                             my ($dbstart, $step, $names, $data) =
                                 RRDs::fetch('/var/www/rrd/'.$RRDName.'.rrd', "--start=$start","--end=$end", $ds);
                             foreach my $line (@$data) {
                                foreach my $val (@$line) {
                                 next unless defined $val;
                            +    $min = $val unless defined $min;
                            +    $max = $val unless defined $max;
                                 $min = $val if $val < $min;
                                    $max = $val if $val > $max;
                                 }
                            }
                            
                            if ($msg{'apci'} eq "A_GroupValue_Read" and $msg{'dst'} eq $gamin) {
                                knx_write($gamin,$min,9,1);
                                return;
                            } elsif ($msg{'apci'} eq "A_GroupValue_Read" and $msg{'dst'} eq $gamax) {
                                knx_write($gamax,$max,9,1);
                                return;
                            }
                            
                            if ($gamin) {
                                knx_write($gamin,$min,9);
                                $plugin_subscribe{$gamin}{$plugname} = 1;
                            }
                            if ($gamax) {
                                knx_write($gamax,$max,9);
                                $plugin_subscribe{$gamax}{$plugname} = 1;
                            }
                            return("Min $min Max $max in $start") if $debug;
                            return;
                            Ich hab doch die Änderung von makki eingearbeitet, oder nicht?

                            Kommentar


                              #15
                              Ähm, die +/- stehen nicht im Plugin-code? (das sind "Steuerzeichen" die den Unterschied zur Vorgängerversion anzeigen)

                              -> Nimm einfach den Code auf Posting#7 ab Definitionen..

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

                              Kommentar

                              Lädt...
                              X