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

  • -uiTable, das User Interface   back
    +uiTable, DOIF Web-Interface   back

    -Mit dem Attribut uiTable kann innerhalb eines DOIF-Moduls ein User Interface in Form einer Tabelle erstellt werden. Die Definition der Tabelle wird mit Hilfe von Perl sowie FHEM-Widgets kombiniert mit DOIF-Syntax vorgenommen.
    -
    -Features:
    -
    -- pro DOIF eine beliebige UI-Tabelle definierbar
    -- alle FHEM-Widgets nutzbar
    -- alle FHEM-Icons nutzbar
    -- DOIF-Syntax verwendbar
    -- alle Devices und Readings in FHEM direkt darstellbar und ansprechbar
    -- dynamische Styles (z. B. Temperaturfarbe abhängig vom Temperaturwert)
    -- es brauchen keine eigenen CSS- oder js-Dateien definiert werden
    -- Nutzung vordefinierter Templates aus Template-Dateien
    -- vordefinierte Perl-Funktionen für Standardwidgets oder Styles
    -
    -Ein guter Einblick in die uiTable-Benutzerschnittstelle lässt sich am besten mit Hilfe von Bildern über entsprechende Wiki-Seiten verschaffen:
    -
    -Schnelleinstieg in uiTable mit bebilderten Beispielen: uiTable für Beginner im FHEM-Wiki
    +Mit dem Attribut uiTable kann innerhalb eines DOIF-Moduls ein Web-Interface zur Visualisierung und Steuerung von Geräten in Form einer Tabelle erstellt werden.
    +
    +Die Dokumentation zu diesem Attribut wurde mit bebilderten Beispielen im FHEM-Wiki erstellt: uiTable Dokumentation

    Anwendungsbeispiele für Fortgeschrittene: uiTable für Fortgeschrittene im FHEM-Wiki

    -Aufbau des uiTable-Attributs
    -
    -{
    - <Perlblock für Definition von Template-Attributen, Zellenformatierungen, eigenen Perlfunktionen>
    -}
    -
    -<Templates>
    -
    -<Tabellendefinition>
    -
    -
    -Der Perlblock ist optional. Er wird in geschweiften Klammern mit wenigen Ausnahmen in Perl definiert. Hier können Template-Attribute für Zeichenketten, das Layout der Tabelle über HMTL-Zellenformatierungen sowie eigene Perlfunktionen definiert werden. -Im Anschluß an den Perlblock können optional Template-Methoden definiert werden, um komplexere wiederverwendbare Widget-Definitionen zu formulieren. Diese werden in der Tabellendefinition benutzt. -Die eigentliche Tabellendefinition wird über die Definition von Zellen vorgenommen. Zellen werden mit | voneinander abgegrenzt. Kommentare können an beliebiger Stelle beginnend mit ## bis zum Zeilenende eingefügt werden.
    -
    -Die 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.
    -
    -Endet eine Zeile mit |, so wird deren Definition in der nächsten Zeile fortgesetzt. Dadurch können längere Zeilendefinition einer Tabelle auf mehrerer Zeilen aufgeteilt werden.
    -
    -Beispiele: Tabellendefinition
    -
    -Über die Funktion STY werden Angaben mit Formatierungen über das CSS-Style-Attribut vorgenommen.
    -
    -Syntax:
    -
    -STY(<Wert>,<CSS-Style-Attribut>)
    -
    -Die Funktionalität von STY kann durch eine Perl-Funktionen abgedeckt werden, diese muss zwei Rückgabewerte zurückgeben:
    -
    -return(<Wert>,<CSS-Style-Attribut>)
    -
    -Beispiele: uiTable-Funktionen
    -
    -Über die Funktion WID werden FHEM-Widgets definiert. Es können alle in FHEM vorhanden FHEM-Widgets verwendet werden.
    -
    -Syntax
    -
    -WID(<Wert>,<FHEM-Widget-Definition>)
    -
    -Die Funktionalität von WID kann durch eine Perl-Funktionen abgedeckt werden, diese muss drei Rückgabewerte zurückgeben:
    -
    -return(<Wert>,"",<FHEM-Widget-Definition>)
    -
    -Beispiele: uiTable-Funktionen
    -
    -Der Perlblock: Definition von Template-Attributen, Zellenformatierungen und eigene Perl-Funktionen
    -
    -Im ersten Bereich werden sog. Template-Attribute als Variablen definiert, um wiederholende Zeichenketten in Kurzform anzugeben. Template-Attribute werden intern als hash-Variablen abgelegt. Die Syntax entspricht weitgehend der Perl-Syntax.
    -
    -Die Syntax lautet:
    -
    -$TPL{<name>}=<Perlsyntax für Zeichenketten>
    -
    -<name> ist beliebig wählbar.
    -
    -Bsp.
    -$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";
    -
    -Damit würde die obige Beispiel-Definition des Thermostat-Widgets wie folgt aussehen:
    -
    -WID([TH_Bad_HM:desired-temp],$TPL{HKnob},"set")
    -
    -Weiterhin können die Tabelle, einzelne Zellen-, Zeilen- oder Spaltenformatierungen definiert werden, dazu werden folgende Bezeichner benutzt:
    -
    -$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>"
    -
    -mit
    -
    -<Zellen/Spalten/Zeilen-Bereich>: Zahl|kommagetrennte Aufzählung|Bereich von..bis
    -
    -Beispiele:
    - -$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'";
    -
    -Steuerungsattribute
    -
    -Ausblenden des Status in der Devicezeile:
    -
    -$SHOWNOSTATE=1;
    -
    -Standardmäßig werden Texte innerhalb der Tabelle, die einem vorhandenen FHEM-Device entsprechen als Link zur Details-Ansicht dargestellt. Soll diese Funktionalität unterbunden werden, so kann man dies über folgendes Attribut unterbinden:
    -
    -$SHOWNODEVICELINK=1;
    -
    -Die Gerätezeile wird ausgeblendet, wenn der "Reguläre Ausdruck" <regex room> zum Raumnamen passt, gilt nicht für den Raum Everything.
    -
    -$SHOWNODEVICELINE = "<regex room>";
    -
    -Die Detailansicht wird umorganisiert, hilfreich beim Editieren längerer uiTable-Definitionen.
    -
    -$ATTRIBUTESFIRST = 1;
    -
    -Templates
    -
    -Bei Widgetdefinition, die mehrfach verwendet werden sollen, können Templates definiert werden. Die Definition beginnt mit dem Schlüsselwort DEF. Ein Template muss mit TPL_ beginnen.
    -
    -Syntax
    -
    -DEF TPL_<name>(<Definition mit Platzhaltern $1,$2 usw.>)
    -
    -<name> ist beliebig wählbar.
    -
    -In der Tabellendefinition können die zuvor definierten Templates genutzt werden. Die Übergabeparameter werden an Stelle der Platzhalter $1, $2 usw. eingesetzt.
    -
    -Beispiele: Templates
    -
    -Import von Templates und Funktionen
    -
    -Mit Hilfe des Befehls IMPORT können Definitionen aus Dateien importiert werden. Damit kann der Perlblock sowie Template-Methoden in eine Datei ausgelagert werden. Der Aufbau der Datei entspricht dem des uiTable-Attributes. Tabellendefinitionen selbst können nicht importiert werden. -Der IMPORT-Befehl kann vor dem Perlblock oder vor dem Tabellendefintionsbereich angegeben werden. Ebenso können mehrere IMPORT-Befehle angegeben werden. Gleiche Definitionen von Funktionen, Templates usw. aus einer IMPORT-Datei überlagern die zuvor definierten. -Der IMPORT-Befehl kann ebenfalls innerhalb einer Import-Datei angegeben werden.
    -
    -Syntax
    -
    -IMPORT <Pfad mit Dateinamen>
    -
    -Bespiel:
    -
    -in uiTable
    -
    -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)))
    -
    -Links
    -FHEMWEB-Widgets
    -
  • Status des Moduls   back

    @@ -5497,6 +5373,7 @@ Da man beliebige Perl-Ausdrücke verwenden kann, lässt sich z. B. der Mittelwer attr di_average state Average of the two rooms is {(sprintf("%.1f",([room1:temperature]+[room2:temperature])/2))}

  • + Erzeugen berechneter Readings ohne Events   back

    Mit Hilfe des Attributes DOIF_Readings können eigene Readings innerhalb des DOIF definiert werden, auf die man im selben DOIF-Device zugreifen kann. @@ -5527,6 +5404,7 @@ Hierbei wird der aufwändig berechnete Durchschnittswert nur einmal berechnet, s
  • + Erzeugen berechneter Readings mit Events   back

    Mit Hilfe des Attributes event_Readings können eigene Readings innerhalb des DOIF definiert werden. Dieses Atrribut hat die gleiche Syntax wie DOIF_Readings. Der Unterschied besteht darin, dass event_Readings im Gegensatz zu DOIF_Readings beim Setzen der definierten Readings jedes mal Events produziert.