diff --git a/FHEM/98_DOIF.pm b/FHEM/98_DOIF.pm
index c75450d53..47b44a920 100644
--- a/FHEM/98_DOIF.pm
+++ b/FHEM/98_DOIF.pm
@@ -377,6 +377,7 @@ sub parse_tpl
$wcmd =~ s/\$TABLE/\$hash->{$table}{tablestyle}/;
$wcmd =~ s/\$VAR/\$hash->{var}/g;
+ $wcmd =~ s/\$_(\w+)/\$hash->\{var\}\{$1\}/g;
$wcmd =~ s/\$SELF/$d/g;
$wcmd =~ s/FUNC_/::DOIF_FUNC_$d\_/g;
$wcmd =~ s/PUP[ \t]*\(/::DOIF_tablePopUp(\"$d\",/g;
@@ -402,17 +403,22 @@ sub parse_tpl
}
}
+ ($err,$wcmd)=DOIF_uiTable_FOR($hash,$wcmd,$table);
+ if ($err) {
+ return($err,"");
+ }
+
$wcmd =~ s/^\s*//;
$wcmd =~ s/[ \t]*\n/\n/g;
$wcmd =~ s/,[ \t]*[\n]+/,/g;
$wcmd =~ s/\.[ \t]*[\n]+/\./g;
$wcmd =~ s/\|[ \t]*[\n]+/\|/g;
$wcmd =~ s/>[ \t]*[\n]+/>/g;
-
+
my $tail=$wcmd;
my $beginning;
my $currentBlock;
-
+
while($tail =~ /(?:^|\n)\s*DEF\s*(TPL_[^ ^\t^\(]*)[^\(]*\(/g) {
($beginning,$currentBlock,$err,$tail)=GetBlockDoIf($tail,'[\(\)]');
if ($err) {
@@ -440,6 +446,46 @@ sub import_tpl
return "";
}
+sub DOIF_uiTable_FOR
+{
+ my ($hash,$wcmd,$table)=@_;
+ my $err="";
+ my $tail=$wcmd;
+ my $beginning;
+ my $currentBlock;
+ my $output="";
+
+ while ($tail ne "") {
+ if ($tail =~ /FOR/g) {
+ my $prefix=substr($tail,0,pos($tail));
+ my $begin=substr($tail,0,pos($tail)-3);
+ $tail=substr($tail,pos($tail)-3);
+ if ($tail =~ /^FOR\s*\(/) {
+ ($beginning,$currentBlock,$err,$tail)=GetBlockDoIf($tail,'[\(\)]');
+ if ($err) {
+ return ("error in $table: $err $currentBlock","");
+ } elsif ($currentBlock ne "") {
+ my ($array,$command) = SplitDoIf(',',$currentBlock);
+ my $commandoutput="";
+ for (eval($array)) {
+ my $temp=$command;
+ $temp =~ s/\$_/$_/g;
+ $commandoutput.=$temp."\n";
+ }
+ $output.=($begin.$commandoutput);
+ }
+ } else {
+ $tail=substr($tail,3);
+ $output.=$prefix;
+ }
+ } else {
+ $output.=$tail;
+ $tail="";
+ }
+ }
+ return ("",$output);
+}
+
sub DOIF_uiTable_def
{
my ($hash,$wcmd,$table) = @_;
@@ -449,13 +495,14 @@ sub DOIF_uiTable_def
delete ($hash->{$table});
($err,$wcmd)=parse_tpl($hash,$wcmd,$table);
return $err if ($err);
-
- my $tail=$wcmd;
my $beginning;
my $currentBlock;
my $output="";
+
+ #$wcmd=DOIF_uiTable_FOR($wcmd,$table);
+
+ my $tail=$wcmd;
- #while ($wcmd =~ /^\s*(TPL_[^ ^\t^\(]*)[^\(]*\(/g) {
while ($tail ne "") {
if ($tail =~ /TPL_/g) {
my $prefix=substr($tail,0,pos($tail));
@@ -488,7 +535,6 @@ sub DOIF_uiTable_def
$tail="";
}
}
-
$wcmd=$output;
my @rcmd = split(/\n/,$wcmd);
@@ -4015,7 +4061,7 @@ Eine ausführliche Erläuterung der obigen Anwendungsbeispiele kann hier nachgel
Zeitspanne eines Readings seit der letzten Änderung
Darstellungselement mit Eingabemöglichkeit im Frontend und Schaltfunktion
Status des Moduls
- uiTable, das User Interface
+ uiTable, DOIF Web-Interface
Reine Statusanzeige ohne Ausführung von Befehlen
Anpassung des Status mit Hilfe des Attributes state
Erzeugen berechneter Readings
@@ -5232,7 +5278,7 @@ Zu beachten ist, dass bei einer wahren Bedingung die dazugehörigen Befehle ausg
Darstellungselement mit Eingabemöglichkeit im Frontend und Schaltfunktion back
-Die unter Dummy beschriebenen Attribute readingList und setList stehen auch im DOIF zur Verfügung. Damit wird erreicht, dass DOIF im WEB-Frontend als Eingabeelement mit Schaltfunktion dienen kann. Zusätzliche Dummys sind nicht mehr erforderlich. Es können im Attribut setList, die in FHEMWEB angegebenen Modifier des Attributs widgetOverride verwendet werden.
+Die unter Dummy beschriebenen Attribute readingList und setList stehen auch im DOIF zur Verfügung. Damit wird erreicht, dass DOIF im Web-Frontend als Eingabeelement mit Schaltfunktion dienen kann. Zusätzliche Dummys sind nicht mehr erforderlich. Es können im Attribut setList, die in FHEMWEB angegebenen Modifier des Attributs widgetOverride verwendet werden.
Anwendungsbeispiel: Eine Schaltuhr mit time-Widget für die Ein- u. Ausschaltzeiten und der Möglichkeit über eine Auswahlliste manuell ein und aus zu schalten.
@@ -5265,185 +5311,15 @@ attr di_web setList myInput:first,second
Bedingungsloses Ausführen von Befehlen
{
- <Perlblock für Definition von Template-Attributen, Zellenformatierungen, eigenen Perlfunktionen>
-}
-
-<Templates>
-
-<Tabellendefinition>
-
-
-<Zellendefinition erste Zeile erste Spalte> | <Zellendefinition erste Zeile zweite Spalte | ... # Definition der ersten Tabellenzeile
-<Zellendefinition zweite Zeile erste Spalte> | <Zellendefinition zweite Zeile zweite Spalte | ... # Definition der zweiten Tabellenzeile
-usw.
-STY(<Wert>,<CSS-Style-Attribut>)
return(<Wert>,<CSS-Style-Attribut>)
WID(<Wert>,<FHEM-Widget-Definition>)
return(<Wert>,"",<FHEM-Widget-Definition>)
$TPL{<name>}=<Perlsyntax für Zeichenketten>
-<name>
ist beliebig wählbar. $TPL{HKnob}="knob,min:17,max:25,width:45,height:40,step:0.5,fgColor:DarkOrange,bgcolor:grey,anglearc:270,angleOffset:225,cursor:10,thickness:.3";
-WID([TH_Bad_HM:desired-temp],$TPL{HKnob},"set")
-$TABLE="<CSS-Attribute der Tabelle>"
-$TD{<Zellenbereich für Zeilen>}{<Zellenbereich für Spalten>}="<CSS-Attribute der Zellen>"
-$TC{<Zellenbereich für Spalten>}="<CSS-Attribute der Spalten>"
-$TR{Zeilenbereich}="<CSS-Attribute der Zeilen>"
-<Zellen/Spalten/Zeilen-Bereich>: Zahl|kommagetrennte Aufzählung|Bereich von..bis
-
-$TABLE = "width:300px; height:300px; background-image:url(/fhem/www/pgm2/images/Grundriss.png); background-size: 300px 300px;";
-$TD{0}{0} = "style='border-right-style:solid; border-right-width:10px'";
-$TR{0} = "class='odd' style='font-weight:bold'";
-$TC{1..5} = "align='center'";
-$TC{1,3,5} = "align='center'";
-$TC{last} = "style='font-weight:bold'";
-$SHOWNOSTATE=1;
$SHOWNODEVICELINK=1;
$SHOWNODEVICELINE = "<regex room>";
$ATTRIBUTESFIRST = 1;
DEF
. Ein Template muss mit TPL_
beginnen.DEF TPL_<name>(<Definition mit Platzhaltern $1,$2 usw.>)
-<name>
ist beliebig wählbar.IMPORT <Pfad mit Dateinamen>
-IMPORT /fhem/contrib/DOIF/mytemplates.tpl
-
-## table definition
-
-"outdoor" | TPL_temp([outdoor:temperature])
-
-in mytemplates.tpl## templates and functions
-{
- $TPL{unit}="°C";
- sub FUNC_temp
- {
- my ($temp)=@_;
- return ("height:6px;font-weight:bold;font-size:16pt;color:".DOIF_hsv ($temp,-10,30,210,360,60,90));
- }
-}
-
-## template methode
-DEF TPL_temp(STY($1.$TPL{unit},FUNC_temp($1)))
-attr di_average state Average of the two rooms is {(sprintf("%.1f",([room1:temperature]+[room2:temperature])/2))}