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

  • daviid
    antwortet
    Makki du bist der beste

    Läuft wunderbar.

    Gruß
    David

    Einen Kommentar schreiben:


  • makki
    antwortet
    Ä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

    Einen Kommentar schreiben:


  • daviid
    antwortet
    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?

    Einen Kommentar schreiben:


  • makki
    antwortet
    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

    Einen Kommentar schreiben:


  • greentux
    antwortet
    Yes, it works.

    Einen Kommentar schreiben:


  • makki
    antwortet
    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;
         }

    Einen Kommentar schreiben:


  • greentux
    antwortet
    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?

    Einen Kommentar schreiben:


  • greentux
    antwortet
    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.

    Einen Kommentar schreiben:


  • kleinklausi
    antwortet
    Danke Makki!
    Hab ich mir doch gedacht, dass es nicht so wild sein sollte :-)

    Schönes WE

    Einen Kommentar schreiben:


  • makki
    antwortet
    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

    Einen Kommentar schreiben:


  • greentux
    antwortet
    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?".

    Einen Kommentar schreiben:


  • makki
    antwortet
    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

    Einen Kommentar schreiben:


  • greentux
    antwortet
    Ok, rrd wäre eine Variante.
    wenn das jemand in linknx gemacht hat, wäre ich auch daran interessiert...

    Einen Kommentar schreiben:


  • kleinklausi
    antwortet
    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ß

    Einen Kommentar schreiben:


  • greentux
    antwortet
    Geht das schon irgendwie (und ich blicks nicht) oder hat da niemand weiter Interesse?

    Einen Kommentar schreiben:

Lädt...
X