FHEM Forum

FHEM => Sonstiges => Thema gestartet von: didi-fritz am 31 Januar 2013, 20:37:57

Titel: problem mit average
Beitrag von: didi-fritz am 31 Januar 2013, 20:37:57
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
Titel: Aw: problem mit average
Beitrag von: rudolfkoenig am 31 Januar 2013, 21:28:06
>  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.
Titel: Aw: problem mit average
Beitrag von: didi-fritz am 31 Januar 2013, 21:48:34
Hallo Rudi,

Danke für die schnelle Antwort!

in http://fhem.de/commandref.html#average (//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
Titel: Aw: problem mit average
Beitrag von: rudolfkoenig am 31 Januar 2013, 22:01:41
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.
Titel: Aw: problem mit average
Beitrag von: didi-fritz am 31 Januar 2013, 22:41:55
... 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
Titel: Aw: problem mit average
Beitrag von: didi-fritz am 31 Januar 2013, 23:48:14
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
Titel: Aw: problem mit average
Beitrag von: rudolfkoenig am 02 Februar 2013, 13:39:34
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\.]+).*
Titel: Aw: problem mit average
Beitrag von: didi-fritz am 03 Februar 2013, 08:14:00
funktioniert perfekt!

Danke
Didi