FHEM > Sonstiges

problem mit average

(1/2) > >>

didi-fritz:
Hallo,

ich hab das Problem, dass die average-readings nur teilweise generiert werden.

Ich habe eine Photovoltaikanlage und möchte da die Betriebsdaten erfassen und auswerten. Dazu habe ich eine Perl-Funktion (get_piko() ) in 99_myUtils.pm erstellt, die alle Minuten (über at) den Webserver vom Wechselrichter abfragt und die Daten in ein dummy-device namens piko schreibt .

--- Code: ---
fhem> list piko
Internals:
   NAME       piko
   NR         83
   STATE      W: 0 G: 6213 T: 21.58 A: 0.14 1.91 0.00 0.00 S: 98 92 6 117
   TYPE       dummy
   Readings:
     2013-01-31 19:56:37   W_avg_day       8.9
     2013-01-31 19:56:37   W_avg_month     13.9
     2013-01-31 19:56:37   W_cum_day       640681
     2013-01-31 19:56:37   W_cum_month     38138281
     2013-01-31 15:53:21   W_max_day       507.0
     2013-01-31 15:53:21   W_max_month     507.0
     2013-01-31 16:56:21   W_min_day       0.0
     2013-01-31 16:56:21   W_min_month     0.0
     2013-01-31 19:56:37   state           W: 0 G: 6213 T: 21.58 A: 0.14 1.91 0.00 0.00 S: 98 92 6 117
Attributes:
   alias      Wechselrichter
   room       Strom

--- Ende Code ---

nun wollte ich die average-werte für W: und T: bilden....

Für den W-wert ist es mir ja gelungen :-) (siehe readings bei piko)

--- Code: ---
fhem> list avg_piko_W
Internals:
   DEF        piko:(W):.(\d+).*
   NAME       avg_piko_W
   NR         90
   NTFY_ORDER 10-avg_piko_W
   REGEXP     piko:(W):.(\d+).*
   STATE      active
   TYPE       average
Attributes:
   room       Strom

--- Ende Code ---

Für mein Verständnis muss ja der regexpr 2 Argumente liefern; das erste ist der Name, das zweite der Wert

Wieso klappt es nun bei avg_piko_T nicht, die readings für das piko-device zu erzeugen?

--- Code: ---
fhem> list avg_piko_T
Internals:
   CFGFN      
   DEF        piko:.*(T):.([\d\.]+).*
   NAME       avg_piko_T
   NR         113
   NTFY_ORDER 10-avg_piko_T
   REGEXP     piko:.*(T):.([\d\.]+).*
   STATE      active
   TYPE       average
Attributes:
   room       Strom

--- Ende Code ---

Der Regexpr "piko:.*(T):.([\d\.]+).*" sollte ja bei "piko:W: 0 G: 6213 T: 21.58 A: 0.14 1.91 0.00 0.00 S: 98 92 6 117"  die werte "T 21.58" liefern
Was mach ich da falsch?

Danke
Didi

rudolfkoenig:
>  Für mein Verständnis muss ja der regexpr 2 Argumente liefern; das erste ist der Name, das zweite der Wert

Huch: steht das irgendwo? Ich meine im Code oder in der Doku nur ein Wert zu sehen.
Nein, ich kann das Verhalten auch nicht erklaeren.
Es muesste mAn mit 2 avarage definitionen funktionieren.

didi-fritz:
Hallo Rudi,

Danke für die schnelle Antwort!

in http://fhem.de/commandref.html#average finde ich:

--- Code: ---
...
if it matches, and the event is of the form "eventname number", then this module computes the daily and monthly average, maximum and minimum values and generates events of the form
 <device> <eventname>_avg_day: <computed_average>
 <device> <eventname>_min_day: <minimum day value>
 <device> <eventname>_max_day: <maximum day value>
 and  ....

--- Ende Code ---

Ich dachte mir nun folgendes:
bei der Zeile "piko:W: 0 G: 6213 T: 21.58 A: 0.14 1.91 0.00 0.00 S: 98 92 6 117"

liefert der regexpr "piko:(W):.(\d+).*" --> W 0
... und readings mit dem Eventnamen "W" (z.B. W_avg_day) werden unter dem dummy-device piko generiert.

der regexpr "piko:.*(T):.([\d\.]+).*" liefert --> T 21.58
... und ich hoffte, das Readings mit dem Eventnamen "T" unterm Device piko zusätzlich entstehen..

lieg ich da total falsch?

danke
Didi

rudolfkoenig:
Jaja, ich habs gelesen (eigentlich auch geschrieben), aber ich weiss immer noch nicht wieso Du auf die Idee mit dem 2. () kommst. Das Modul prueft mWn nie $2, nur $1.

didi-fritz:
... meine Idee war, dass $1 der Name und $2 der Wert ist

ich hab nun das log im average-modul aktiviert.

--- Code: ---
2013.01.31 22:12:11 1: mytestavg pre-filter: globalDELETED s=DELETED a_piko
2013.01.31 22:12:11 1: mytestavg pre-filter: globalDELETED s=DELETED a_piko
2013.01.31 22:12:11 1: mytestavg pre-filter: globalDELETED s=DELETED a_piko
2013.01.31 22:12:11 1: mytestavg pre-filter: globalDELETED s=DELETED a_piko
2013.01.31 22:12:11 1: mytestavg pst-filter: pikoW: val=0
2013.01.31 22:12:11 1: mytestavg pre-filter: pikoW: s=W: 0 G: 6213 T: 21.58 A: 0.09 1.89 0.00 0.00 S: 179 171 8 89
2013.01.31 22:12:11 1: mytestavg pst-filter: pikoW: val=0
2013.01.31 22:12:11 1: mytestavg pre-filter: pikoW: s=W: 0 G: 6213 T: 21.58 A: 0.09 1.89 0.00 0.00 S: 179 171 8 89
2013.01.31 22:12:11 2: dummy set piko W: 0 G: 6213 T: 21.58 A: 0.09 1.89 0.00 0.00 S: 179 171 8 89

--- Ende Code ---

hier sehe ich, dass aus beiden average der selbe Eventname generiert wird
wie es aussieht, ist in $s die gesamte Zeile und egal welcher regexpr matchet, wird immer der eventname "W" mit dem value "0" zur average bildung herangezogen

--- Code: ---
...
  for (my $i = 0; $i < $max; $i++) {
    my $s = $dev->{CHANGED}[$i];

    ################
    # Filtering
    next if(!defined($s));
    my ($evName, $val) = split(" ", $s, 2); # resets $1
 Log 1,"mytestavg pre-filter: ".$devName.$evName." s=".$s;
    next if($devName !~ m/^$re$/ && "$devName:$s" !~ m/^$re$/ || $s =~ m/_avg_/);
    if(defined($1)) {
      my $reArg = $1;
      $val = $reArg if(defined($reArg) && $reArg =~ m/^(-?\d+\.?\d*)/);
    }
    next if(!defined($val) || $val !~ m/^(-?\d+\.?\d*)/);
    $val = $1;

 Log 1,"mytestavg pst-filter: ".$devName.$evName." val=".$val;

    ################
    # Avg computing
...

--- Ende Code ---



didi

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln