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]