neue Features: Generalisierung mit Templates

Begonnen von Damian, 16 Mai 2020, 18:16:51

Vorheriges Thema - Nächstes Thema

münster

Sehr nett. Danke.  :D

BTW, Weckzeit Mo - So: $1 ... $7, Rampenzeit: $8, Thermos: $9, Sender: $10, Licht-Szenen: $11, ...

moonsorrox

Frage zu den Rollladen Steuerungen, in welche Position fährt er denn wenn die zeitliche Beschattung aufgehoben wird.?
Könnte man das zusätzlich noch mit einem Block angeben.?
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

#17
Ich habe das Beispiel aus dem ersten Post um ein Web-Interface erweitert (siehe https://forum.fhem.de/index.php/topic,112566.msg1069005.html#msg1069005)

defmod di_beschattung3 DOIF subs  {\
## Definition der FHEM-Widgets        \
                                                                                        @{$VAR{widget}}=split (/\| */,q(time|time|  textFieldNL|          select,on,off));;\
## Überschrift der Widgets\
                                                                                        @{$VAR{params}}=split (/\| */,q(von| bis|   Befehl|               aktiv));;\
## Überschrift der Texte\
@{$VAR{text}}=     split (/\| */,q(Szene|Thermostat|Sensor));;\
\
## Definition einzelner Datensätze pro Szene\
push (@{$VAR{sc}},[split (/\| */,q(Bad|                TH_Bad_HM|    Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(12:00|21:00|R_Bad 30|              on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Dachgeschoss|       TH_DG_HM|     Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(12:00|21:00|R_DG 30|               on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kueche|             TH_Kueche_HM| Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(09:00|14:00|R_Kueche 50|           on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_1_ost| TH_Kz_o_HM|   Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(09:00|14:00|R_Kinderzimmer1_O 30|  on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_1_sued|TH_Kz_o_HM|   Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(12:00|21:00|R_Kinderzimmer1_S 25|  on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_2_sued|TH_Kz_w_HM|   Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(12:00|21:00|R_Kinderzimmer2_S 25|  on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_2_west|TH_Kz_w_HM|   Sonne_w))]);; push (@{$VAR{scene}},[split (/\| */,q(15:30|21:00|R_Kinderzimmer2_W.* 25|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Wohnzimmer_sued|    TH_WZ_HM|     Sonne_s))]);; push (@{$VAR{scene}},[split (/\| */,q(12:30|21:00|R_W_S 25|              on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Wohnzimmer_west|    TH_WZ_HM|     Sonne_w))]);; push (@{$VAR{scene}},[split (/\| */,q(15:30|21:00|R_W_W[23] 25|          on))]);;\
\
## Bei Änderung der Definition werden alle erfoderlichen Readings erstellt und vorbelegt\
\
if ($::init_done) {\
    my @params=@{$VAR{params}};;\
my @scene=@{$VAR{scene}};;\
my @sc=@{$VAR{sc}};;\
    for (my $i=0;;$i < @sc;;$i++) {\
  for (my $j=0;;$j < @params;;$j++) {\
    set_Reading ($sc[$i][0].".".$params[$j],$scene[$i][$j]);;\
      }\
    }\
  }\
}\
\
DEF TPL_shutter ( ## Definition des Templates namens TPL_shutter\
shutter_$1 {  ## DOIF Block \
if ($7 eq "on") { ## wenn Szene aktiv\
  if ([$2:measured-temp] > 24 and [$3] eq "on" and [$4-$5] and !$VAR{$1}) { ## Wenn die Zimmertemperatur über 24 und Sonne scheint innherhalb des Zeitfensters und das Fenster noch nicht heruntergefahren wurde\
    fhem_set($6);;  ## Fenster herunterfahren\
    $VAR{$1}=1;;         ## Merker setzen, dass Fenster bereits heruntergefahren wurde\
  }\
}\
}\
## Ende der Templatedefinition\
)\
reset {[00:01];;delete $VAR;;}    ## nachts alle Merker löschen\
\
## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates\
FOR (@{$VAR{sc}},TPL_shutter($1$1,$1$2,$1$3,FOR(@{$VAR{params}},([$SELF:$1$1.$2],))))
attr di_beschattung3 room DOIF,test
attr di_beschattung3 uiTable {\
  $TC{1..10}="style='padding-left: 10px;; padding-right: 10px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
\
## Überschrift der Parameter\
FOR (@{$VAR{text}},"$_"|)FOR (@{$VAR{params}},"$_"|)""\
\
## Pro Datensatz einer Beschattungs-Szene wird eine Zeile mit Werten und Widgets generiert\
FOR (@{$VAR{sc}},"$1$1"|"$1$2"|"$1$3"|FOR(@{$VAR{params}},WID([$SELF:$1$1.$2],${$VAR{widget}}[$COUNT2])|)"")


Edit: Überarbeitung der Definition
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#18
Hier eine weitere generalisierte Beschattung-Steuerung mit: Texten, uiTable-Funktionen und Widgets in der Tabelle

defmod di_beschattung4 DOIF subs  {\
## Parameter\
@{$VAR{params}}=   split (/\| */,q(Szene|             Temperatur|Einstrahlung|Befehl|            Status|von|  bis| aktiv));;\
\
## Definition einzelner Datensätze pro Szene\
push (@{$VAR{sc}},[split (/\| */,q(Bad|                TH_Bad_HM|    Sonne_s|R_Bad 30|              off|12:00|21:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Dachgeschoss|       TH_DG_HM|     Sonne_s|R_DG 30|               off|12:00|21:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kueche|             TH_Kueche_HM| Sonne_s|R_Kueche 50|           off|09:00|14:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_1_ost| TH_Kz_o_HM|   Sonne_s|R_Kinderzimmer1_O 30|  off|09:00|14:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_1_sued|TH_Kz_o_HM|   Sonne_s|R_Kinderzimmer1_S 25|  off|12:00|23:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_2_sued|TH_Kz_w_HM|   Sonne_s|R_Kinderzimmer2_S 25|  off|12:00|21:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Kinderzimmer_2_west|TH_Kz_w_HM|   Sonne_w|R_Kinderzimmer2_W.* 25|off|15:30|21:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Wohnzimmer_sued|    TH_WZ_HM|     Sonne_s|R_W_S 25|              off|12:30|21:00|on))]);;\
push (@{$VAR{sc}},[split (/\| */,q(Wohnzimmer_west|    TH_WZ_HM|     Sonne_w|R_W_W[23] 25|          off|15:30|21:00|on))]);;\
\
## Bei Änderung der Definition werden alle erfoderlichen Readings erstellt und vorbelegt\
\
if ($::init_done) {\
my @sc=@{$VAR{sc}};;\
my @params=@{$VAR{params}};;\
set_State("initialized");;\
    for (my $i=0;;$i < @sc;;$i++) {\
  for (my $j=4;;$j < @{$sc[$i]};;$j++) {\
    set_Reading ($sc[$i][0].".".$params[$j],$sc[$i][$j]);;\
      }\
    }\
  }\
\
sub reset_state {\
  my @sc=@{$VAR{sc}};;\
  for (my $i=0;;$i < @sc;;$i++) {\
    set_Reading($sc[$i][0].".Status","off",1);;\
  }\
\
}\
}\
\
DEF TPL_shutter ( ## Definition des Templates namens TPL_shutter\
shutter_$1 {  ## DOIF Block \
if ($7 eq "on") { ## wenn Szene aktiv\
  if ([$2:measured-temp] > 24 and [$3] eq "on" and [$5-$6] and get_Reading("$1.Status") eq "off") { ## Wenn die Zimmertemperatur über 24 und Sonne scheint innherhalb des Zeitfensters und das Fenster noch nicht heruntergefahren wurde\
fhem_set("$4");;  ## Fenster herunterfahren\
set_State("Szene: $1");;\
set_Reading("$1.Status","on",1);;\
   }\
}\
}\
## Ende der Templatedefinition\
)\
\
reset {[00:01];;     ## nachts alle Status zurücksetzen \
  reset_state();;\
}\
## Generierung der Steuerung pro Beschattung-Szene mit Hilfe des obigen Templates\
FOR (@{$VAR{sc}},TPL_shutter($_$1,$_$2,$_$3,$_$4,[$SELF:$_$1.von],[$SELF:$_$1.bis],[$SELF:$_$1.aktiv]))
attr di_beschattung4 room Beschattung,DOIF
attr di_beschattung4 uiTable {\
  package ui_Table;;\
  $TC{1..10}="style='padding-left: 10px;; padding-right: 10px;; padding-top: 3px;; padding-bottom: 3px;;' align='center'";;\
}\
\
## Überschrift der Parameter\
"Szene"|"Temperatur"|"Einstrahlung"|"von"|"bis"|"Status"|"aktiv"\
\
## Pro Datensatz einer Beschattungs-Szene wird eine Zeile mit Werten und Widgets generiert\
FOR (@{$VAR{sc}},"$_$1"|temp_ring([$_$2:measured-temp])|icon([$_$3:state],"fa_cloud","weather_sun\@yellow")|WID([$SELF:$_$1.von],"time")|WID([$SELF:$_$1.bis],"time")|icon([$SELF:$_$1.Status],"fts_shutter_10","fts_shutter_80")|WID([$SELF:$_$1.aktiv],"select,on,off"))

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#19
Neue DOIF-Version wurde eingecheckt.

Ich werde demnächst eine Wiki-Seite zur "Automatisierung mit DOIF" beginnen, wo es vor allem um praxisrelavante Automatisierungsaufgaben geht. Insbesondere sollen dort generalisierte Lösungen darstellt werden, wie hier bereits gepostet.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

#21
Ich musste deine Neuerungen erst einmal wirken lassen.
Es wird schon komplex - hat dafür aber enorme Vorteile.

Ich suche immer noch nach einer generalisierten Lösung für eine Treppenhausschaltung. Das Beispiel zum Modul 98_combine.pm ist interessant, aber ich würde es gerne mit einem DOIF umsetzen.

Würde das auch generalisiert in DOIF funktionieren?

Zitat von: justme1968 am 13 April 2020, 21:42:51
treppe:
  - ein timer der alle 10 sekunden zwischen aktiv und inaktiv wechselt. das wäre die zeisteuerung per at oder weekdaytimer
  - ein bewegungsmelder der sich durch klick aktivieren lässt, geht nach 5 sekunden wieder auf nomotion
  - ein schalter der sich durch klick ein- und ausschalten lässt

  - das ganze wird in einem combine device wie folgt kombiniert:
    - wenn der timer aktiv ist geht das licht auf 20%
    - wenn bei aktivem timer Bewegung erkannt wird geht das licht auf 50%
    - wenn der schalter eingeschaltet ist geht das licht immer auf 100%

Schalter und Dämmerung kann ich in deinem Wiki-Beispiel schon erkennen. Wobei jedoch für Dämmerung keine MinMax-Werte ausgewertet werden.
Und ich kann nicht erkennen, ob ein Reading genutzt wird oder ausschließlich den state?

Kannst du mir helfen?

moonsorrox

mir gefällt das mit der Beschattung im Beispiel di_beschattung4 sehr gut... wäre es möglich eine zweite Beschattungszeit einzubauen.
Ich habe das mit einem DOIF in Funktion, aber so sieht das noch besser aus.
Ich mache das wenn der Sonnenstand schon längst nicht mehr so ist wie im Ereignisszustand, damit die Rollläden dann etwas Licht ins Zimmer lassen und ich mache das noch zusätzlich über Temperatur.
Bin damit nur noch nicht ganz zufrieden, dass habe ich gestern gemerkt, als die Temperatur den Wert hatte aber keine Sonne da war und trotzdem beschattet wurde.

Bin da ständig dran um es zu verbessern, aber noch nicht die richtige Lösung gefunden.
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Zitat von: FunkOdyssey am 15 Juli 2020, 14:06:00
Ich musste deine Neuerungen erst einmal wirken lassen.
Es wird schon komplex - hat dafür aber enorme Vorteile.

Ich suche immer noch nach einer generalisierten Lösung für eine Treppenhausschaltung. Das Beispiel zum Modul 98_combine.pm ist interessant, aber ich würde es gerne mit einem DOIF umsetzen.

Würde das auch generalisiert in DOIF funktionieren?

Schalter und Dämmerung kann ich in deinem Wiki-Beispiel schon erkennen. Wobei jedoch für Dämmerung keine MinMax-Werte ausgewertet werden.
Und ich kann nicht erkennen, ob ein Reading genutzt wird oder ausschließlich den state?

Kannst du mir helfen?

Es stellt sich mir die Frage: Wie viele Treppenhäuser hast du? Unter Generalisierung verstehe ich eine bestimmte Steuerung mehrfach zu nutzen, indem man sie mit anderen Werten füttert. Bei einem Treppenhaus brauche ich eigentlich nichts zu generalisieren, da ich die Steuerung nur einmal nutze.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

Ich habe es nur so genannt. Und ich bin hier vermutlich komplett offtopic.
Aber nahezu jede meiner Einschaltungen ist von diversen Faktoren abhängig.
Nicht nur das Treppenhaus.  ;D

Es sah hier für mich aus, als wären wir hier schon nah dran.
Aber ich denke noch einmal in Ruhe nach. Hat ja nicht wirklich etwas mit Generalisierung zu tun.

Damian

Zitat von: moonsorrox am 15 Juli 2020, 14:45:56
mir gefällt das mit der Beschattung im Beispiel di_beschattung4 sehr gut... wäre es möglich eine zweite Beschattungszeit einzubauen.
Ich habe das mit einem DOIF in Funktion, aber so sieht das noch besser aus.
Ich mache das wenn der Sonnenstand schon längst nicht mehr so ist wie im Ereignisszustand, damit die Rollläden dann etwas Licht ins Zimmer lassen und ich mache das noch zusätzlich über Temperatur.
Bin damit nur noch nicht ganz zufrieden, dass habe ich gestern gemerkt, als die Temperatur den Wert hatte aber keine Sonne da war und trotzdem beschattet wurde.

Bin da ständig dran um es zu verbessern, aber noch nicht die richtige Lösung gefunden.

Die Steuerung entspricht einer einfachen if-Abfrage, die kannst du wie bei jedem DOIF beliebig erweitern. Du musst nur auf die Reihenfolge der übergebenen Parameter achten ($1, $2, $3 usw.). Wenn du einen weiteren Parameter einfügst verschieben sich die darauf folgenden.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: FunkOdyssey am 15 Juli 2020, 20:37:09
Ich habe es nur so genannt. Und ich bin hier vermutlich komplett offtopic.
Aber nahezu jede meiner Einschaltungen ist von diversen Faktoren abhängig.
Nicht nur das Treppenhaus.  ;D

Es sah hier für mich aus, als wären wir hier schon nah dran.
Aber ich denke noch einmal in Ruhe nach. Hat ja nicht wirklich etwas mit Generalisierung zu tun.

Du kannst natürlich auch nur für eine Steuerung die Parameter variabel halten, indem du indirekte Zeiten benutzt oder die Ausführungsbefehle in Readings ablegst, wie in diesem Beispiel https://forum.fhem.de/index.php/topic,111266.msg1069319.html#msg1069319

Im letzten Wiki-Automatisierungsbeispiel https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh.C3.A4ngige_Zeitsteuerung_f.C3.BCr_mehrere_Szenarien_mit_tabellarischer_.C3.9Cbersicht werden gleich mehrere Aspekte berücksichtigt:

1. Generalisierung: eine neue "Szene" kann einfach durch Hinzufügen einer einzigen Zeile erzeugt werden

aber eben auch die

2. Visualisierung. Sie wird automatisch aufgrund der hinzugefügten Zeile generiert. Dabei werden dargestellt:

1) feste vorgegebene Parameter einer Szene (Befehle, Zeiten usw.)
2) dynamische Werte (hier Dämmerung)
3) aktueller Status einer Szene

und

4) jede Szene lässt sich über ein Select-Widget aktivieren/deaktivieren


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

mumpitzstuff

Irgendwie ist die neue DOIF Version inkompatibel zur alten Version. Das Fernsehprogramm geht jetzt nicht mehr. Was muss man denn tun, damit es wieder geht?

Damian

Womöglich hängt es mit den Templates zusammen. Ich musste ein paar Auswertmechanismen ändern, die Version sollte aber kompatibel sein. Ich bräuchte genauere Infos, wo es klemmt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

mumpitzstuff

#29
Es tritt beim Fernsehprogramm DOIF auf.

Das folgende sehe ich im Logfile:

2020.07.15 22:07:10 1: PERL WARNING: Possible precedence issue with control flow operator at (eval 475) line 1.
2020.07.15 22:07:10 1: stacktrace:
2020.07.15 22:07:10 1:     main::__ANON__                      called by (eval 475) (1)
2020.07.15 22:07:10 1:     (eval)                              called by ./FHEM/98_DOIF.pm (284)
2020.07.15 22:07:10 1:     main::DOIF_RegisterCell             called by ./FHEM/98_DOIF.pm (639)
2020.07.15 22:07:10 1:     main::DOIF_uiTable_def              called by ./FHEM/98_DOIF.pm (2627)
2020.07.15 22:07:10 1:     main::DOIF_Notify                   called by fhem.pl (3795)
2020.07.15 22:07:10 1:     main::CallFn                        called by fhem.pl (3715)
2020.07.15 22:07:10 1:     main::DoTrigger                     called by fhem.pl (665)
2020.07.15 22:07:10 1: PERL WARNING: Possible precedence issue with control flow operator at (eval 479) line 1.
2020.07.15 22:07:10 1: stacktrace:
2020.07.15 22:07:10 1:     main::__ANON__                      called by (eval 479) (1)
2020.07.15 22:07:10 1:     (eval)                              called by ./FHEM/98_DOIF.pm (284)
2020.07.15 22:07:10 1:     main::DOIF_RegisterCell             called by ./FHEM/98_DOIF.pm (639)
2020.07.15 22:07:10 1:     main::DOIF_uiTable_def              called by ./FHEM/98_DOIF.pm (2627)
2020.07.15 22:07:10 1:     main::DOIF_Notify                   called by fhem.pl (3795)
2020.07.15 22:07:10 1:     main::CallFn                        called by fhem.pl (3715)
2020.07.15 22:07:10 1:     main::DoTrigger                     called by fhem.pl (665)


Die Probleme traten direkt nach dem Aufruf von Update all bzw. shutdown restart auf.