FHEM > Sonstiges
problem mit average
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