diff --git a/fhem/FHEM/98_DOIF.pm b/fhem/FHEM/98_DOIF.pm index 6d1e8fa81..f5cb66911 100644 --- a/fhem/FHEM/98_DOIF.pm +++ b/fhem/FHEM/98_DOIF.pm @@ -253,6 +253,7 @@ AggrIntDoIf my $average; my $extrem; my $name; + my $devname; my $err; my $ret; my $result; @@ -264,13 +265,13 @@ AggrIntDoIf my $warning=0; my $mode=substr($modeType,0,1); my $type; - my $dec; + my $format; my $place; my $number; - if ($modeType =~ /.(sum|average|max|min)?[:]?(d(\d)?)?/) { +if ($modeType =~ /.(sum|average|max|min)?[:]?(?:(a|d)?(\d)?)?/) { $type = (defined $1)? $1 : ""; - $dec= $2; + $format= (defined $2)? $2 : ""; $place= $3; } @@ -324,31 +325,36 @@ AggrIntDoIf } else { $ret=1; } + if ($format eq "a") { + $devname=AttrVal($name,"alias",$name); + } else { + $devname=$name; + } if ($ret) { if ($type eq ""){ $num++; - push (@devices,$name); + push (@devices,$devname); } elsif (defined $value) { if ($type eq "sum" or $type eq "average") { - $num++; - push (@devices,$name); + $num++; + push (@devices,$devname); $sum+=$number; } elsif ($type eq "max") { if (!defined $extrem or $number>$extrem) { $extrem=$number; - @devices=($name); + @devices=($devname); } } elsif ($type eq "min") { if (!defined $extrem or $number<$extrem) { $extrem=$number; - @devices=($name); + @devices=($devname); } } } } } - delete ($defs{$hash->{NAME}}{READINGS}{warning_aggr}) if ($warning==0); + delete ($defs{$hash->{NAME}}{READINGS}{warning_aggr}) if (defined $hash and $warning==0); if ($type eq "max" or $type eq "min") { $extrem=0 if (!defined $extrem); @@ -363,7 +369,7 @@ AggrIntDoIf $result=$num; } if ($mode eq "#") { - if (defined $dec) { + if ($format eq "d") { $result = ($result =~ /(-?\d+(\.\d+)?)/ ? $1 : 0); $result = round ($result,$place) if (defined $place); } @@ -394,10 +400,14 @@ AggregateDoIf my ($hash,$modeType,$device,$reading,$cond,$default)=@_; my $mode=substr($modeType,0,1); my $type=substr($modeType,1); + my $splittoken=","; + if ($modeType =~ /.(?:sum|average|max|min)?[:]?[^s]*(?:s\((.*)\))?/) { + $splittoken=$1 if (defined $1); + } if ($mode eq "#") { return (AggrIntDoIf($hash,$modeType,$device,$reading,$cond,$default)); } elsif ($mode eq "@") { - return (join (",",AggrIntDoIf($hash,$modeType,$device,$reading,$cond,$default))); + return (join ($splittoken,AggrIntDoIf($hash,$modeType,$device,$reading,$cond,$default))); } return (""); } @@ -2815,7 +2825,7 @@ Die Angabe des Readings kann weggelassen werden, dann wird lediglich nach entspr
Syntax:

-[<function>:"<regex device>:<regex event>":<reading>:<condition>,<default>]
+[<function>:<format>:"<regex device>:<regex event>":<reading>:<condition>,<default>]

<function>:

@@ -2828,7 +2838,7 @@ Syntax:
@max Device des höchsten Wertes
@min Device de niedrigsten Wertes

-<function>:d<number> optional kann das Ergebnis auf Nachkommastellen gerundet werden, dazu wird an die Funktion getrennt durch einen Doppelpunkt der Buchstabe "d" gefolgt von einer Ziffer (<number>) angegeben. Die Ziffer gibt die Anzahl der Nachkommastellen an.
+<format> d<number> zum Runden des Wertes mit Nachkommastellen, a für Aliasnamen bei Devicelisten, s(<splittoken>) <splittoken> sind Trennzeichen in der Device-Liste

"<regex Device>:<regex Event>" spezifiziert sowohl die betroffenen Devices, als auch den Ereignistrigger, die Syntax entspricht der DOIF-Syntax für Ereignistrigger.
Die Angabe <regex Event> ist im Ausführungsteil nicht sinnvoll und sollte weggelassen werden.
@@ -2839,7 +2849,7 @@ Die Angabe <regex Event> ist im Ausführungsteil nicht sinnvoll und sollte
<default> Default-Wert, falls kein Device gefunden wird, entspricht der Syntax des Default-Wertes bei Readingangaben

-<reading>, <condition>, <default> sind optional
+<format>, <reading>, <condition>, <default> sind optional

Syntax-Beispiele im Ausführungteil

@@ -2851,6 +2861,10 @@ Liste der Devices, die mit "window" beginnen:

[@"^window"]

+Liste der Devices, die mit "window" beginnen, es werden Aliasnamen ausgegeben, falls definiert:
+
+[@:a"^window"]
+
Liste der Devices, die mit "windows" beginnen und ein Reading "myreading" beinhalten:

[@"^window":myreading]