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
> 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.
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
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.
... 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
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
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\.]+).*
funktioniert perfekt!
Danke
Didi