Hauptmenü

problem mit average

Begonnen von didi-fritz, 31 Januar 2013, 20:37:57

Vorheriges Thema - Nächstes Thema

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 .

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

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)

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

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?

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

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:

...
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  ....

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.

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

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

...
  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
...



didi

didi-fritz

ich habe nun in 98_average.pm die Zeile

    my ($evName, $val) = split(" ", $s, 2); # resets $1

zum Testen durch diese ersetzt:

    my $ss=$devName.":".$s;
    $ss =~ s/$re/\1 \2/;
    my ($evName, $val)  = split(" ", $ss, 2);
    ($evName, $val) = split(" ", $s, 2) if ($val eq "");

nun habe ich bei den readings die von mir gewünschten Werte

T_avg_day 21.0 2013-01-31 23:41:20
T_avg_month 21.0 2013-01-31 23:41:20
T_cum_day 1790880 2013-01-31 23:41:20
T_cum_month 58037280 2013-01-31 23:41:20
T_max_day 21.6 2013-01-31 23:28:11
T_max_month 21.6 2013-01-31 23:28:11
T_min_day 21 2013-01-31 23:32:30
T_min_month 21 2013-01-31 23:32:30
W_avg_day 7.5 2013-01-31 23:41:20
W_avg_month 13.8 2013-01-31 23:41:20
W_cum_day 640681 2013-01-31 23:41:20
W_cum_month 38138281 2013-01-31 23:41:20
W_max_day 507.0 2013-01-31 15:53:21
W_max_month 507.0 2013-01-31 15:53:21
W_min_day 0.0 2013-01-31 16:56:21
W_min_month 0.0 2013-01-31 16:56:21
state W: 0 G: 6213 T: 21.58 A: 0.08 1.88 0.00 0.00 S: 63 58 5 184 2013-01-31 23:41:20

allerdings habe ich noch nicht die Standard Variante mit nur einem ()-Ausdruck getestet (mach ich Morgen)

Didi

rudolfkoenig

Ich habe jetzt den support fuer kombinierte Events eingebaut, allerdings etwas anders als von Didi-fritz skizziert. Wuerde mich interessieren, ob es funktioniert. Aus der Doku:

# Compute the same from a combined event. Note: we need two average
# definitions here, each of them defining the name with the first
# paranthesis, and the value with the second.
#
# Event: ws1 T: 52.3  H: 67.4
define avg_temp_ws1_t average ws1:(T):.([-\d\.]+).*
define avg_temp_ws1_h average ws1:.*(H):.([-\d\.]+).*

didi-fritz

funktioniert perfekt!

Danke
Didi