FHEM > DOIF

neue Features: Generalisierung mit Templates

<< < (2/9) > >>

moonsorrox:
Ok, ich habe es mir angeschaut, ist trotzdem kompliziert.
Ich stelle es gerne auch mit einem Dummy um... entweder steuert es Fhem oder ich stelle es auf Beschattung, oder komplett aus, bei einigen habe ich noch eine Weihnachten Option.
Morgens fahre ich zu flexibel einstellbaren Zeiten die Rollläden hoch, soll heißen entweder 7.45, 8 Uhr oder 8.15 usw. und abends immer zu Astro Civil, ist das mit dem DOIF so möglich...?

Damian:

--- Zitat von: moonsorrox am 25 Mai 2020, 22:21:22 ---Ok, ich habe es mir angeschaut, ist trotzdem kompliziert.
Ich stelle es gerne auch mit einem Dummy um... entweder steuert es Fhem oder ich stelle es auf Beschattung, oder komplett aus, bei einigen habe ich noch eine Weihnachten Option.
Morgens fahre ich zu flexibel einstellbaren Zeiten die Rollläden hoch, soll heißen entweder 7.45, 8 Uhr oder 8.15 usw. und abends immer zu Astro Civil, ist das mit dem DOIF so möglich...?

--- Ende Zitat ---
Natürlich geht das :)
In einem Perl-DOIF könntest du im Prinzip dein ganzes FHEM unterbringen, weil dort im Gegensatz zum FHEM-Modus keine Abhängigkeiten der Blöcke existieren. Ob das allerdings sinnvoll wäre, ist eine andere Frage. Es kann ebenso übersichtlicher sein, Steuerungen, die wenig Gemeinsamkeiten haben, in einzelnen DOIFs zu belassen.

Ich würde damit anfangen ähnlich aufgebaute DOIFs zu generalisieren, wie in meinem Beschattungsbeispiel, dort ist die Steuerung durch eine if-Zeile abgedeckt, der Rest sind im Wesentlichen fenster- und zimmerabhängige Parameter. Wenn das läuft, kann man versuchen es zu erweitern, wenn es sinnvoll erscheint, aber das muss man im Einzelfall sehen.

Damian:
Man kann in der kommenden DOIF-Version im Perl-Modus, wie im FHEM-Modus, einzelne Blöcke manuell per set-Befehl ausführen. Das erleichtert das Überprüfen einer neuen Definition.

eddy242:
Hallo Damian,

kannst Du Dir bitte mal diesen kurzen Code anschauen. Ich habe 2 Fragen. 1) der else-Block wird pro Template Line aufgelöst, richtig? Ich könnte den Code eigentlich mit dem ?: Operator noch kürzer machen, das würde die Dopplung von Reading-Update ersparen. und 2), wie würde ich die wait- und die homebridgemappings aus dem Original-Code umsetzen (wenn letzteres überhaupt geht, das müssten ja eigentlich für Homebridge separate Geräte sein)? Vielleicht könntest Du bitte auch noch einen Hinweis geben wie die Integration mit uiTable genau geht. Würde ich im Ausführungsteil Modulvariablen setzen und im uiTable-Teil auslesen oder die eigenen Readings lesen? Danke!

vorher

--- Code: ---defmod DOIF_Sonne_W DOIF (\
  ([Sensor_Eltako_West:brightness:d] < 27000) and\
  ([DOIF_IstEsEineHitzeWelle:state] eq "off")\
)(\
setreading $SELF Sonnenschutz GanzAuf\
) DOELSE (\
setreading $SELF Sonnenschutz [DOIF_IstEsEineHitzeWelle:Besch_Position]\
)
attr DOIF_Sonne_W DbLogExclude .*
attr DOIF_Sonne_W DbLogInclude cmd
attr DOIF_Sonne_W alias Sonnenschutz: West?
attr DOIF_Sonne_W cmdState off|on
attr DOIF_Sonne_W devStateIcon on:weather_sun@yellow off|initialized:weather_sun@grey
attr DOIF_Sonne_W genericDeviceType ContactSensor
attr DOIF_Sonne_W group Sonne,KeyStatusInfo
attr DOIF_Sonne_W homebridgeMapping clear \
ContactSensorState=state,values=off:CONTACT_DETECTED;;on:CONTACT_NOT_DETECTED \
history:size=1024
attr DOIF_Sonne_W icon weather_sun
attr DOIF_Sonne_W room ControlCenter,Tagesablauf,Homekit
attr DOIF_Sonne_W wait 900:900

--- Ende Code ---
nachher

--- Code: ---defmod DOIF_TEST_Sonne DOIF DEF TPL_Sonne (\
{\
  if (([$2:brightness:d] < $3) and ([DOIF_IstEsEineHitzeWelle:state] eq "off")) {\
  set_Reading_Begin;;\
  set_Reading_Update("$4_Sonne", "off");;\
  set_Reading_Update("$4_Beschattungsposition", "GanzAuf");;\
  set_Reading_End(1);;\
  set_State("Last Change: $4 Sonne weg");;\
  } else {\
  set_Reading_Begin;;\
  set_Reading_Update("$4_Sonne", "on");;\
  set_Reading_Update("$4_Beschattungsposition", [DOIF_IstEsEineHitzeWelle:Besch_Position]);;\
  set_Reading_End(1);;\
  set_State("Last Change: $4 Sonne da");;\
  }\
}\
) ## Ende der Templatedefinition\
\
\
## Definition einzelner DOIF-Blöcke mit Hilfe des Templates\
##               $1 $2               $3     $4\
TPL_Sonne (1,Sensor_Eltako_Ost,27000,Ost)\
TPL_Sonne (2,Sensor_Eltako_West,27000,West)\
TPL_Sonne (3,Sensor_Eltako_Sued,27000,Süd)\

attr DOIF_TEST_Sonne DbLogExclude .*

setstate DOIF_TEST_Sonne 2020-06-01 07:56:57 mode enabled


--- Ende Code ---

Damian:
1. ? geht nicht, da es keine Variablenzuweisung ist, sondern das Setzen von Readings mit einer Funktion (set_Reading)
2. wait gibt es im Perl-Modus nicht, stattdessen set_Exec ("Timer1",Sekunden,"Auszuführender Befehl") verwenden, siehe: https://fhem.de/commandref_DE.html#DOIF_set_Exec
3. uiTable arbeitet nicht mit Modulvariablen, sondern mit Readings (hier kann man $SELF für eigene Readings verwenden), zu uiTable gibt es sehr viele Beispiele: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln