FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Damian am 30 Juni 2020, 20:10:58

Titel: neue Features: parametrisierbare Steuerung mit Visualisierung
Beitrag von: Damian am 30 Juni 2020, 20:10:58
Ich habe das Modul um weitere Features erweitert. Es ist jetzt möglich jeweils mit einem Parameter-Datensatz die Steuerung und mit dazugehöriger Visualisierung für beliebige Aufgaben zu generieren. Das Geheimnis besteht darin, Instanz-Arrays zu definieren, auf die man sowohl im DEF-Bereich als auch im uiTable-Attribut zugreifen kann.

Beispiel: Helligkeits- und zeitgesteuerte Licht-Szenerien

defmod di_Licht DOIF subs  {\
## Definition der FHEM-Widgets pro Spalte \
@{$VAR{widget}}   =                                    split (/\| */,q(selectnumbers,-20,5,20,1,lin| time| time| select,Mo,Di,Mi,Do,Fr,WE,AT,AT WE|textFieldNL|textFieldNL|textFieldNL|textFieldNL|select,on,off));;\
\
## Definitiion per Parameter\
@{$VAR{params}}   =                                    split (/\| */,q(Daemmerung| von_Zeit| bis_Zeit| Wochentag| von_Tag| bis_Tag| an_Befehl|     aus_Befehl|     aktiv));;\
\
## Definition einzelner Datensätze pro Szene, weitere Szenen können hier erweitert werden\
push (@{$VAR{sc}},"Wohnzimmer");; push (@{$VAR{scene}},[split (/\| */,q(10|         15:00|    23:00|    WE|        01-01|   12-31|   Tisch,Wand on| Tisch,Wand off| on))]);;\
push (@{$VAR{sc}},"Außen");;      push (@{$VAR{scene}},[split (/\| */,q(-5|         15:00|    22:00|    AT WE|     09-01|   04-30|   Außenlampe on| Außenlampe off| on))]);;\
push (@{$VAR{sc}},"Weihnachten");;push (@{$VAR{scene}},[split (/\| */,q( 0|         16:00|    21:00|    AT WE|     12-01|   01-31|   Tannenbaum on| Tannenbaum off| on))]);;\
\
## Programmcode zum Generieren erforderlicher Readings bei Änderung der Definition\
if ($::init_done) {\
    my @params=@{$VAR{params}};;\
my @scene=@{$VAR{scene}};;\
my @sc=@{$VAR{sc}};;\
        for (my $i=0;;$i < @scene;;$i++) {\
  for (my $j=0;;$j < @params;;$j++) {\
    set_Reading ($sc[$i].".".$params[$j],$scene[$i][$j]);;\
          }\
       }\
   }\
}\
\
## Template für die Steuerung einer Licht-Szene\
DEF TPL_Licht ( \
$1 {\
if ([$SELF:$1.aktiv] eq "on") {\
  if ([Helligkeit] < $2 and  [$3-$4|$5] and ($md gt $6 or $md lt $7)) {\
    if (!$VAR{$1}) {fhem_set ($8);;set_State("$1 on");;$VAR{$1}=1}\
  } else {\
    if ($VAR{$1}) {fhem_set ($9);;set_State("$1 off");;$VAR{$1}=0}\
  }\
}\
}\
)\
\
## Pro Datensatz einer Licht-Szene wird die Steuerung mit Hilfe des obigen Templates generiert\
FOR (@{$VAR{sc}},TPL_Licht($1,FOR(@{$VAR{params}},([$SELF:$1.$2],))))
\
attr di_Licht uiTable {\
$TC{1..10} ="style='padding-left: 10px;; padding-right: 10px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
## Überschrift der Parameter\
"Scene"|FOR (@{$VAR{params}},"$1"|)""\
\
## Pro Datensatz einer Licht-Szene wird eine Zeile mit Widgets generiert\
FOR (@{$VAR{sc}},"$1"|FOR(@{$VAR{params}},WID([$SELF:$1.$2],${$VAR{widget}}[$COUNT2])|)"")


Für eine neue Licht-Szene braucht man z. B. nur einen solchen Datensatz in der obigen Definition zu ergänzen und schon hat man eine weitere Steuerung inkl. Visualisierung  generiert:

push (@{$VAR{sc}},"Ostern");; push (@{$VAR{scene}},[split (/\| */,q(10|         16:00|    23:00|    WE|        04-01|   04-10|   Ostereier on| Ostereier off| on))]);;\


Für eine andere Aufgabe muss nur das Steuerungstemplate sowie die Parameterlisten: $VAR{widget} und $VAR{params} und natürlich dazugehörigen Szenarien $VAR{scene} geändert werden , der Rest kann bleiben.

Auf diese Weise können beliebige Steuerungen für diverse Aufgaben wie Zeitschaltuhren, Beschattung, Heizung usw. erstellt werden, die sich einfach über Datensätze für verschiedene Szenarien erweitern und über die Web-Oberfläche bedienen lassen.

Die Änderungen des DOIFs betreffen:

Instanzvariablen $VAR können jetzt in Templates und FOR-Schleifen sowohl im DEF-Bereich als auch in uiTable genutzt werden.

FOR-Schleifen können geschachtelt werden.

Die neue Version des Moduls wird demnächst eingecheckt.

Edit: neue DOIF-Version wurde eingecheckt


Titel: Antw:neue Features: parametrisierbare Steuerung mit Visualisierung
Beitrag von: mumpitzstuff am 01 Juli 2020, 10:56:58
Kann man dann auch das "$TC{1..10}" irgendwie generieren? Wenn ich das richtig verstanden habe, dann wäre ja die Zahl der Tabellenzeilen unter Umständen variabel. Je nachdem was man hier machen möchte, müsste man dann auch die Formatierung entsprechend anpassen können.
Titel: Antw:neue Features: parametrisierbare Steuerung mit Visualisierung
Beitrag von: Damian am 01 Juli 2020, 11:15:41
Zitat von: mumpitzstuff am 01 Juli 2020, 10:56:58
Kann man dann auch das "$TC{1..10}" irgendwie generieren? Wenn ich das richtig verstanden habe, dann wäre ja die Zahl der Tabellenzeilen unter Umständen variabel. Je nachdem was man hier machen möchte, müsste man dann auch die Formatierung entsprechend anpassen können.

ja, z. B. konventionell über eine for-Schleife:

for (my $i=1;$i<=@{$VAR{params}};$i++) {
  $TC{$i}="style=...."
}

oder ganz billig etwas großzügiger den Bereich definieren $TC{1..20} - zu viel stört nicht