Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit Array - gleitender Mittelwert

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

    [wiregate] Problem mit Array - gleitender Mittelwert

    Ich würde mir gerne ein Array von Plugin Aufruf zu Aufruf merken ==> gleitenden Mittelwert über einen gewisse Zeitdauer.

    Folgender Befehl in Zeile 13 funktioniert offensichtlich noch nicht so ganz:
    my @Wind_History = $plugin_info{$plugname.'_Wind_History'};

    Wer hat einen kurzen Hinweis? Hab das ganze Plugin noch eingefügt, falls jemand ähnliches vor hat oder am WG testen will.

    Danke Robert

    Code:
    [FONT=Arial][SIZE=2]# Wind Mittelwert[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]# V1.00 2011-02-02[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]### Definitionen [/SIZE][/FONT]
    [FONT=Arial][SIZE=2]my $Wind_aktuell_ga = "5/1/90";            [/SIZE][/FONT]
    [FONT=Arial][SIZE=2]my $w_Intervall=60;                        # Minuten[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]### Ende Definitionen[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]$plugin_info{$plugname.'_cycle'} = 30;[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]my $w_max= $w_Intervall*60/$plugin_info{$plugname.'_cycle'}; [/SIZE][/FONT]
    [FONT=Arial][SIZE=2]my $Wind_aktuell=knx_read($Wind_aktuell_ga,10,9);[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]my $w = $plugin_info{$plugname.'_wind_zaehler'};                     # Letzte Position lesen[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]my @Wind_History = $plugin_info{$plugname.'_Wind_History'};  # Array lesen [/SIZE][/FONT]
    [FONT=Arial][SIZE=2]$Wind_History[$w]=$Wind_aktuell;[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]$w++;[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]if ($w > ($w_max-1)) {$w=0}[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]$plugin_info{$plugname.'_wind_zaehler'} = $w;                     # Naechste Position merken[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]$plugin_info{$plugname.'_Wind_History'} = @Wind_History;  #  Array merken[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]
    [FONT=Arial][SIZE=2]# Mittelwert[/SIZE][/FONT] [FONT=Arial]berechnen[/FONT]
    [/SIZE][/FONT][FONT=Arial][SIZE=2]my $Summe = 0;[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]for my $i (0 .. ($w_max-1))  [/SIZE][/FONT]
    [FONT=Arial][SIZE=2]{[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]$Summe = $Summe + $Wind_History[$i];[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]}[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]my $Wind_Mittelwert = (1.0* $Summe / $w_max);[/SIZE][/FONT] 
    [FONT=Arial][SIZE=2]return;[/SIZE][/FONT]
    [FONT=Arial][SIZE=2]# zum debuggen [/SIZE][/FONT]
    [FONT=Arial][SIZE=2]# return "Wind_Mittelw $Wind_Mittelwert w $w Summe $Summe W0 $Wind_History[0] W1 $Wind_History[1] W2 $Wind_History[2]";[/SIZE][/FONT]

    #2
    Zitat von Robert_Mini Beitrag anzeigen
    Ich würde mir gerne ein Array von Plugin Aufruf zu Aufruf merken ==> gleitenden Mittelwert über einen gewisse Zeitdauer.

    Folgender Befehl in Zeile 13 funktioniert offensichtlich noch nicht so ganz:
    my @Wind_History = $plugin_info{$plugname.'_Wind_History'};
    Wenn mich nicht alles täuscht können in $plugin_info nur eindimensionale Werte, d.h. keine Arrays, abgelegt werden.
    Eine Lösung für Dein Problem könnte sein, das Array zum Speichern in einen String zu serialisieren und beim nächsten Ausführen zu deserialisieren.

    Kommentar


      #3
      Zitat von chriss1980 Beitrag anzeigen
      Wenn mich nicht alles täuscht können in $plugin_info nur eindimensionale Werte, d.h. keine Arrays, abgelegt werden.
      Eine Lösung für Dein Problem könnte sein, das Array zum Speichern in einen String zu serialisieren und beim nächsten Ausführen zu deserialisieren.
      Ohne unverschäumt sein zu wollen - hast du (oder jemand anderer) dazu vielleicht schon was fertiges?

      Ansonsten muss ich heut abend mal wieder nach den perl Befehlen googeln...

      In jedem Fall könnte das plugin für andere auch interessant sein.

      Hintergrund: Hab grad eine Korrekturfunktion für die Temperatur des Suntracers gebastelt (bei direkter Sonneneinstrahlung, abhängig von Helligkeit, Wind, Sonnenstand). Mir fehlt noch ein sauberer Mittelwert, da Wind etc. springen, aber den Messwert nur längerfristig beeinflussen.

      Außerdem hat der gleitende MW sowas wie einen Integralanteil, der gleichzeitig die Trägheit der Fühler/Gehäuse ein wenig kompensieren kann.

      In Summe bin ich im Moment bei einer Abweichung <2°C für alle getesteten Situtationen, was in Anbetracht der starken Sonneneinstrahlung der letzten Woche IMHO sehr gut ist.

      lg
      Robetr

      Kommentar


        #4
        Zitat von Robert_Mini Beitrag anzeigen
        Ohne unverschäumt sein zu wollen - hast du (oder jemand anderer) dazu vielleicht schon was fertiges?

        Ansonsten muss ich heut abend mal wieder nach den perl Befehlen googeln...
        Schaum hin oder her... Fertig habe ich da nichts, aber auf die Schnelle denke ich, dass das hier auf Deine Anforderungen passen könnte.

        Was sagt denn der Plugin-Erfinder Makki zu dem Problem? Evtl. hilft ein Hinweis, wie der globale Hash $plugin_info gespeichert wird ja auch weiter.

        Kommentar


          #5
          So ist es, $plugin_info ist ein Tied Hash und darf aufgrund von limitation des zugrundeliegenden Storage-Moduls nur eindimensonal sein.

          Einfachste Lösung, richtig, serialisieren:
          Code:
          my @array = ("dog", "cat", "bird", "camel", "giraffe");
          # speichern
          $plugin_info{$plugname.'_array'} = pack("(w/a*)*", @array);
          # abrufen
          my @array_in = unpack("(w/a*)*", $plugin_info{$plugname.'_array'});
          Makki
          EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
          -> Bitte KEINE PNs!

          Kommentar


            #6
            Zitat von makki Beitrag anzeigen
            Einfachste Lösung, richtig, serialisieren:
            Code:
            my @array = ("dog", "cat", "bird", "camel", "giraffe");
            # speichern
            $plugin_info{$plugname.'_array'} = pack("(w/a*)*", @array);
            # abrufen
            my @array_in = unpack("(w/a*)*", $plugin_info{$plugname.'_array'});
            Makki
            Danke für die Schnelle Antwort!!

            Nur damit ich auch in perl was dazulerne (solche Dinge sind schon arg zu googlen):
            was macht/heißt (w/a*)* ??

            Btw: wie kann ich eine real Zahl mit vielen Nachkommas in perl auf zB 2 Nachkommastellen formatieren (zB für's log-File)?

            Ist diese Bsp richtig?
            $preis = sprintf("%0.2f", $myvar);


            oder gibt es auch was smarteres?

            lg
            Robert

            PS: Wenn man C, Fortran, VB ganz gut kennt, ist Perl schon eine verrückte Sprache.

            Kommentar


              #7
              Zitat von Robert_Mini Beitrag anzeigen
              Nur damit ich auch in perl was dazulerne (solche Dinge sind schon arg zu googlen):
              was macht/heißt (w/a*)* ??
              Äh, keine Ahnung, das was es hier soll, Strings sicher einpacken
              Hab das auch nur fluchs gegoogelt, es gibt sicher noch 10 andere Varianten von sprintf über split uvm.
              Im Detail: pack - perldoc.perl.org

              Btw: wie kann ich eine real Zahl mit vielen Nachkommas in perl auf zB 2 Nachkommastellen formatieren (zB für's log-File)?

              Ist diese Bsp richtig?
              $preis = sprintf("%0.2f", $myvar);
              Oder
              $preis = nearest(.2,$myvar);

              Was davon nun schöner oder besser ist, da gibts bestimmt 4 Meinungen von 3 Leuten..
              int($myvar) schneidet ab
              round($myvar) rundet auf volle Zahlen
              ceil($myvar) rundet auf
              floor($myvar) rundet ab

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

              Kommentar


                #8
                Zitat von makki Beitrag anzeigen
                Äh, keine Ahnung, das was es hier soll, Strings sicher einpacken

                Oder
                $preis = nearest(.2,$myvar);

                Makki
                Wusst ich's doch: viel schöner und leichter zu merken .

                Danke Robert

                Kommentar

                Lädt...
                X