mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-01 20:20:10 +00:00
98_DOIF.pm: uiTable: FOR-Command, instance variables with Prefix $_, documentation moved to the FHEM-wiki
git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@20929 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
e782e6bd01
commit
a363cd65ef
242
FHEM/98_DOIF.pm
242
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
|
||||
<a href="#DOIF_Zeitspanne_eines_Readings_seit_der_letzten_Aenderung">Zeitspanne eines Readings seit der letzten Änderung</a><br>
|
||||
<a href="#DOIF_setList__readingList">Darstellungselement mit Eingabemöglichkeit im Frontend und Schaltfunktion</a><br>
|
||||
<a href="#DOIF_cmdState">Status des Moduls</a><br>
|
||||
<a href="#DOIF_uiTable">uiTable, das User Interface</a><br>
|
||||
<a href="#DOIF_uiTable">uiTable, DOIF Web-Interface</a><br>
|
||||
<a href="#DOIF_Reine_Statusanzeige_ohne_Ausfuehrung_von_Befehlen">Reine Statusanzeige ohne Ausführung von Befehlen</a><br>
|
||||
<a href="#DOIF_state">Anpassung des Status mit Hilfe des Attributes <code>state</code></a><br>
|
||||
<a href="#DOIF_DOIF_Readings">Erzeugen berechneter Readings<br>
|
||||
@ -5232,7 +5278,7 @@ Zu beachten ist, dass bei einer wahren Bedingung die dazugehörigen Befehle ausg
|
||||
<b>Darstellungselement mit Eingabemöglichkeit im Frontend und Schaltfunktion</b> <a href="#DOIF_Inhaltsuebersicht">back</a><br>
|
||||
<br>
|
||||
<a name="setList"></a>
|
||||
Die unter <i>Dummy</i> beschriebenen Attribute <i>readingList</i> und <i>setList</i> 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 <i>setList</i>, die in <i>FHEMWEB</i> angegebenen Modifier des Attributs <i>widgetOverride</i> verwendet werden.<br>
|
||||
Die unter <i>Dummy</i> beschriebenen Attribute <i>readingList</i> und <i>setList</i> 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 <i>setList</i>, die in <i>FHEMWEB</i> angegebenen Modifier des Attributs <i>widgetOverride</i> verwendet werden.<br>
|
||||
<br>
|
||||
<u>Anwendungsbeispiel</u>: Eine Schaltuhr mit time-Widget für die Ein- u. Ausschaltzeiten und der Möglichkeit über eine Auswahlliste manuell ein und aus zu schalten.<br>
|
||||
<br>
|
||||
@ -5265,185 +5311,15 @@ attr di_web setList myInput:first,second</code><br>
|
||||
<a href="#DOIF_setcmd">Bedingungsloses Ausführen von Befehlen</a><br>
|
||||
<br>
|
||||
</li><li><a name="DOIF_uiTable"></a>
|
||||
<b>uiTable, das User Interface</a></b> <a href="#DOIF_Inhaltsuebersicht">back</a><br>
|
||||
<b>uiTable, DOIF Web-Interface</a></b> <a href="#DOIF_Inhaltsuebersicht">back</a><br>
|
||||
<br>
|
||||
<a name="uiTable"></a>
|
||||
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.<br>
|
||||
<br>
|
||||
Features:<br>
|
||||
<br>
|
||||
- pro DOIF eine beliebige UI-Tabelle definierbar<br>
|
||||
- alle FHEM-Widgets nutzbar<br>
|
||||
- alle FHEM-Icons nutzbar<br>
|
||||
- DOIF-Syntax verwendbar<br>
|
||||
- alle Devices und Readings in FHEM direkt darstellbar und ansprechbar<br>
|
||||
- dynamische Styles (z. B. Temperaturfarbe abhängig vom Temperaturwert)<br>
|
||||
- es brauchen keine eigenen CSS- oder js-Dateien definiert werden<br>
|
||||
- Nutzung vordefinierter Templates aus Template-Dateien<br>
|
||||
- vordefinierte Perl-Funktionen für Standardwidgets oder Styles<br>
|
||||
<br>
|
||||
Ein guter Einblick in die uiTable-Benutzerschnittstelle lässt sich am besten mit Hilfe von Bildern über entsprechende Wiki-Seiten verschaffen:<br>
|
||||
<br>
|
||||
Schnelleinstieg in uiTable mit bebilderten Beispielen: <a href="https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg">uiTable für Beginner im FHEM-Wiki</a><br>
|
||||
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.<br>
|
||||
<br>
|
||||
Die Dokumentation zu diesem Attribut wurde mit bebilderten Beispielen im FHEM-Wiki erstellt: <a href="https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg">uiTable Dokumentation</a><br>
|
||||
<br>
|
||||
Anwendungsbeispiele für Fortgeschrittene: <a href="https://wiki.fhem.de/wiki/DOIF/uiTable">uiTable für Fortgeschrittene im FHEM-Wiki</a><br>
|
||||
<br>
|
||||
<b>Aufbau des uiTable-Attributs<br></b>
|
||||
<br>
|
||||
<code>{<br>
|
||||
<Perlblock für Definition von Template-Attributen, Zellenformatierungen, eigenen Perlfunktionen><br>
|
||||
}<br>
|
||||
<br>
|
||||
<Templates><br>
|
||||
<br>
|
||||
<Tabellendefinition><br>
|
||||
<br></code>
|
||||
<br>
|
||||
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.<br>
|
||||
<br>
|
||||
<b>Die Tabellendefinition</b><br>
|
||||
<br><code>
|
||||
<Zellendefinition erste Zeile erste Spalte> | <Zellendefinition erste Zeile zweite Spalte | ... # Definition der ersten Tabellenzeile<br>
|
||||
<Zellendefinition zweite Zeile erste Spalte> | <Zellendefinition zweite Zeile zweite Spalte | ... # Definition der zweiten Tabellenzeile<br>
|
||||
usw.<br></code>
|
||||
<br>
|
||||
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.<br>
|
||||
<br>
|
||||
Beispiele: <a href="https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Einfache_Tabellendefinition_ohne_Funktionen">Tabellendefinition</a><br>
|
||||
<br>
|
||||
Über die Funktion STY werden Angaben mit Formatierungen über das CSS-Style-Attribut vorgenommen.<br>
|
||||
<br>
|
||||
Syntax:<br>
|
||||
<br>
|
||||
<code>STY(<Wert>,<CSS-Style-Attribut>)</code><br>
|
||||
<br>
|
||||
Die Funktionalität von STY kann durch eine Perl-Funktionen abgedeckt werden, diese muss zwei Rückgabewerte zurückgeben:<br>
|
||||
<br>
|
||||
<code>return(<Wert>,<CSS-Style-Attribut>)</code><br>
|
||||
<br>
|
||||
Beispiele: <a href="https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Eigene_uiTable-Funktionen_programmieren">uiTable-Funktionen</a><br>
|
||||
<br>
|
||||
Über die Funktion WID werden FHEM-Widgets definiert. Es können alle in FHEM vorhanden FHEM-Widgets verwendet werden.<br>
|
||||
<br>
|
||||
Syntax<br>
|
||||
<br>
|
||||
<code>WID(<Wert>,<FHEM-Widget-Definition>)</code><br>
|
||||
<br>
|
||||
Die Funktionalität von WID kann durch eine Perl-Funktionen abgedeckt werden, diese muss drei Rückgabewerte zurückgeben:<br>
|
||||
<br>
|
||||
<code>return(<Wert>,"",<FHEM-Widget-Definition>)</code><br>
|
||||
<br>
|
||||
Beispiele: <a href="https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Eigene_uiTable-Funktionen_programmieren">uiTable-Funktionen</a><br>
|
||||
<br>
|
||||
<b>Der Perlblock: Definition von Template-Attributen, Zellenformatierungen und eigene Perl-Funktionen<br></b>
|
||||
<br>
|
||||
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.<br>
|
||||
<br>
|
||||
Die Syntax lautet:<br>
|
||||
<br>
|
||||
<code>$TPL{<name>}=<Perlsyntax für Zeichenketten><br></code>
|
||||
<br>
|
||||
<code><name></code> ist beliebig wählbar. <br>
|
||||
<br>
|
||||
Bsp.<br>
|
||||
<code>$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";<br></code>
|
||||
<br>
|
||||
Damit würde die obige Beispiel-Definition des Thermostat-Widgets wie folgt aussehen:<br>
|
||||
<br>
|
||||
<code>WID([TH_Bad_HM:desired-temp],$TPL{HKnob},"set")<br></code>
|
||||
<br>
|
||||
Weiterhin können die Tabelle, einzelne Zellen-, Zeilen- oder Spaltenformatierungen definiert werden, dazu werden folgende Bezeichner benutzt:<br>
|
||||
<br>
|
||||
<code>$TABLE="<CSS-Attribute der Tabelle>"<br>
|
||||
$TD{<Zellenbereich für Zeilen>}{<Zellenbereich für Spalten>}="<CSS-Attribute der Zellen>"<br>
|
||||
$TC{<Zellenbereich für Spalten>}="<CSS-Attribute der Spalten>"<br>
|
||||
$TR{Zeilenbereich}="<CSS-Attribute der Zeilen>"<br></code>
|
||||
<br>
|
||||
mit <br>
|
||||
<br>
|
||||
<code><Zellen/Spalten/Zeilen-Bereich>: Zahl|kommagetrennte Aufzählung|Bereich von..bis<br></code>
|
||||
<br>
|
||||
Beispiele:<br>
|
||||
<code>
|
||||
$TABLE = "width:300px; height:300px; background-image:url(/fhem/www/pgm2/images/Grundriss.png); background-size: 300px 300px;";<br>
|
||||
$TD{0}{0} = "style='border-right-style:solid; border-right-width:10px'";<br>
|
||||
$TR{0} = "class='odd' style='font-weight:bold'";<br>
|
||||
$TC{1..5} = "align='center'";<br>
|
||||
$TC{1,3,5} = "align='center'";<br>
|
||||
$TC{last} = "style='font-weight:bold'";<br></code>
|
||||
<br>
|
||||
<b>Steuerungsattribute<br></b>
|
||||
<br>
|
||||
Ausblenden des Status in der Devicezeile:<br>
|
||||
<br>
|
||||
<code>$SHOWNOSTATE=1;</code><br>
|
||||
<br>
|
||||
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:<br>
|
||||
<br>
|
||||
<code>$SHOWNODEVICELINK=1;</code><br>
|
||||
<br>
|
||||
Die Gerätezeile wird ausgeblendet, wenn der "Reguläre Ausdruck" <regex room> zum Raumnamen passt, gilt nicht für den Raum <i>Everything</i>.<br>
|
||||
<br>
|
||||
<code>$SHOWNODEVICELINE = "<regex room>";</code><br>
|
||||
<br>
|
||||
Die Detailansicht wird umorganisiert, hilfreich beim Editieren längerer uiTable-Definitionen.<br>
|
||||
<br>
|
||||
<code>$ATTRIBUTESFIRST = 1;</code><br>
|
||||
<br>
|
||||
<b>Templates<br></b>
|
||||
<br>
|
||||
Bei Widgetdefinition, die mehrfach verwendet werden sollen, können Templates definiert werden. Die Definition beginnt mit dem Schlüsselwort <code>DEF</code>. Ein Template muss mit <code>TPL_</code> beginnen.<br>
|
||||
<br>
|
||||
Syntax<br>
|
||||
<br>
|
||||
<code>DEF TPL_<name>(<Definition mit Platzhaltern $1,$2 usw.>)<br></code>
|
||||
<br>
|
||||
<code><name></code> ist beliebig wählbar.<br>
|
||||
<br>
|
||||
In der Tabellendefinition können die zuvor definierten Templates genutzt werden. Die Übergabeparameter werden an Stelle der Platzhalter $1, $2 usw. eingesetzt.<br>
|
||||
<br>
|
||||
Beispiele: <a href="https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#uiTable-Templates">Templates</a><br>
|
||||
<br>
|
||||
<b>Import von Templates und Funktionen<br></b>
|
||||
<br>
|
||||
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.<br>
|
||||
<br>
|
||||
Syntax<br>
|
||||
<br>
|
||||
<code>IMPORT <Pfad mit Dateinamen><br></code>
|
||||
<br>
|
||||
Bespiel:<br>
|
||||
<br>
|
||||
in uiTable<br>
|
||||
<br>
|
||||
<code>IMPORT /fhem/contrib/DOIF/mytemplates.tpl<br>
|
||||
<br>
|
||||
## table definition<br>
|
||||
<br>
|
||||
"outdoor" | TPL_temp([outdoor:temperature])<br>
|
||||
<br></code>
|
||||
in mytemplates.tpl<br>
|
||||
<br>
|
||||
<code>## templates and functions<br>
|
||||
{<br>
|
||||
$TPL{unit}="°C";<br>
|
||||
sub FUNC_temp<br>
|
||||
{
|
||||
my ($temp)=@_;<br>
|
||||
return ("height:6px;font-weight:bold;font-size:16pt;color:".DOIF_hsv ($temp,-10,30,210,360,60,90));<br>
|
||||
}<br>
|
||||
}<br>
|
||||
<br>
|
||||
## template methode<br>
|
||||
DEF TPL_temp(STY($1.$TPL{unit},FUNC_temp($1)))<br></code>
|
||||
<br>
|
||||
<u>Links</u><br>
|
||||
<a href="https://wiki.fhem.de/wiki/FHEMWEB/Widgets">FHEMWEB-Widgets</a><br>
|
||||
<br>
|
||||
</li><li><a name="DOIF_cmdState"></a>
|
||||
<b>Status des Moduls</b> <a href="#DOIF_Inhaltsuebersicht">back</a><br>
|
||||
<br>
|
||||
@ -5497,6 +5373,7 @@ Da man beliebige Perl-Ausdrücke verwenden kann, lässt sich z. B. der Mittelwer
|
||||
<code>attr di_average state Average of the two rooms is {(sprintf("%.1f",([room1:temperature]+[room2:temperature])/2))}</code><br>
|
||||
<br>
|
||||
</li><li><a name="DOIF_DOIF_Readings"></a>
|
||||
<a name="DOIF_Readings"></a>
|
||||
<b>Erzeugen berechneter Readings ohne Events</b> <a href="#DOIF_Inhaltsuebersicht">back</a><br>
|
||||
<br>
|
||||
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
|
||||
<br>
|
||||
</li><li>
|
||||
<a name="DOIF_event_Readings"></a>
|
||||
<a name="event_Readings"></a>
|
||||
<b>Erzeugen berechneter Readings mit Events</b> <a href="#DOIF_Inhaltsuebersicht">back</a><br>
|
||||
<br>
|
||||
Mit Hilfe des Attributes event_Readings können eigene Readings innerhalb des DOIF definiert werden. Dieses Atrribut hat die gleiche Syntax wie <a href="#DOIF_DOIF_Readings">DOIF_Readings</a>. Der Unterschied besteht darin, dass event_Readings im Gegensatz zu DOIF_Readings beim Setzen der definierten Readings jedes mal Events produziert.
|
||||
|
Loading…
x
Reference in New Issue
Block a user