DOIF/Labor - ausführbare, praxisnahe Beispiele als Problemlösung zum Experimentieren

Aus FHEMWiki
Wechseln zu: Navigation, Suche
Info green.png Eine aktuelle DOIF-Version ist erforderlich


Zusammenfassung

Das DOIF-Labor fasst praxisnahe Beispiele in dem FHEM-Raum DOIF_Labor zusammen. Alle Beispiele sind so aufbereitet, dass sie über Raw definition ausführbar importiert werden können. Jedes Beispiel einschliesslich der dazugehörenden Geräte wird einer FHEM-Gruppe zugeordnet, der Laborgruppe. Das DOIF-Labor kann komplett und die Laborgruppen können einzeln importiert werden. Die Beispiele können die Grundlage für eigene Problemlösungen sein. Experimente mit den Beispielen und Übungen sollen helfen DOIF mit seinen Möglichkeiten besser kennenzulernen.

Nutzungshinweise

Das Labor kann komplett oder gruppenweise importiert werden, siehe DOIF/Import von Code Snippets. Die Namen definierter Geräte enden auf _Labor, ggf. mit einer nachfolgenden Nummer und die Laborgruppen beginnen mit Labor: , damit sollen Namenskonflikte mit bestehenden Geräten reduziert werden. Durch Umbenennen betroffener Gerät im Import-Code, können Namenskonflikte vermieden werden. Das Labor befindet sich im Raum "DOIF_Labor" und kann komplett oder gruppenweise gelöscht werden.

  • Gruppe löschen mit
	delete group=<Gruppenname>
  • Komplette Löschung mit
	delete room=DOIF_Labor

In der im Browser geöffneten Raumansicht des DOIF_Labor können die Beispiele bedient werden.
In einem zweiten Browserfenster könnte die Geräteansicht des DOIF geöffnet werden, dann ist das Verhalten des DOIF als Reaktion auf die Bedienung gleichzeitig zu beobachten, falls die Browserfenster nebeneinander liegen.

Links zu den Laborgruppen

uiTable, das Frontend des DOIF

DOIF/uiTable

Operatorenrangfolge

DOIF/Operatorenrangfolge

Mehrfachnutzung eines Tasters

DOIF/Mehrfachnutzung eines Tasters

Zeitgeber

DOIF/Zeitgeber Wecker, Kurzzeitwecker, Tageszeitgeber

Zeitsteuerung mit manuell Ein/Aus

DOIF/Ein- und Ausgabe in FHEMWEB und Tablet-UI am Beispiel einer Schaltuhr

Datumsbereich von HH:MM dd.mm.yyyy bis HH:MM dd.mm.yyyy schalten

DOIF/Zeitspanne zwischen zwei Terminen schalten

Zeitspanne im DOIF und disabledForIntervals im Vergleich

DOIF/Zeitspanne im DOIF und disabledForIntervals im Vergleich

partielle Deaktivierung der Befehlsausführung

DOIF/partielle Deaktivierung der Befehlsausführung, Zurücksetzen eines Wait-Timers mit $SELF oder IsDisabled verhindern, im Vergleich

Das komplette Labor zum Importieren

Die Definitionen sind zum den direkten Import über Raw definition vorbereitet.
Zum Update muss ein vorhandenes Labor gelöscht werden.
Nach dem Import, die Änderungen an FHEM mit save übernehmen.

Alle Definitionen

define Heizperiode_Labor DOIF ([00:01] and [?$SELF:P_begin:"^(\d\d)\.(\d\d)":($2*1)."-".($1*1)] eq "$month-$mday" or [$SELF:P_einaus,"auto"] eq "on")\
   {Log 1, "Heizperiode an"}\
DOELSEIF ([00:01] and [?$SELF:P_ende:"^(\d\d)\.(\d\d)":($2*1)."-".($1*1)] eq "$month-$mday" or [$SELF:P_einaus,"auto"] eq "off" or ["^global$:^MODIFIED $SELF$"])\
   {Log 1, "Heizperiode aus"}
attr Heizperiode_Labor alias Heizperiode
attr Heizperiode_Labor cmdState 1|0
attr Heizperiode_Labor group Labor: Heizperiode
attr Heizperiode_Labor icon time_calendar
attr Heizperiode_Labor readingList P_einaus P_begin P_ende
attr Heizperiode_Labor room DOIF_Labor
attr Heizperiode_Labor setList P_einaus:uzsuSelectRadio,auto,on,off\
P_begin:datetime,theme:"default",timepicker:false,inline:true\
P_ende:datetime,theme:"default",timepicker:false,inline:true
attr Heizperiode_Labor webCmd P_einaus:P_begin:P_ende
attr Heizperiode_Labor widgetOverride setList:textField-long

define battState_Labor DOIF ([":^battery: low"] and [?$SELF:BATT$DEVICE,"init"] ne "low")\
   (setreading $SELF msg {((AttrVal("$DEVICE","alias","") ? AttrVal("$DEVICE","alias","") : "$DEVICE")." Battery is low")}, {Log 1,((AttrVal("$DEVICE","alias","") ? AttrVal("$DEVICE","alias","") : "$DEVICE")." Battery is low")},setreading $SELF BATT$DEVICE low)\
DOELSEIF ([":^battery: ok"] and [?$SELF:BATT$DEVICE,"init"] ne "ok")\
   (setreading $SELF BATT$DEVICE ok, setreading $SELF msg -)
attr battState_Labor alias einmal Statusmeldung je Gerät für ["<;Regex>;:^battery: low"] mit autom. Rücksetzung
attr battState_Labor do always
attr battState_Labor group Labor: Statusabfragen
attr battState_Labor room DOIF_Labor
attr battState_Labor stateFormat msg
setstate battState_Labor 2016-11-26 16:27:25 P_Link_zur_Commandref <html><a target="_blank" href="http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events">s. Bsp. Batteriewarnung</a></html>

define button_Labor000 dummy
attr button_Labor000 alias Taster
attr button_Labor000 group Labor: Mehrfachnutzung eines Tasters
attr button_Labor000 room DOIF_Labor
attr button_Labor000 setList short long
attr button_Labor000 webCmd short:long

define datumsbereich_Labor0 DOIF ([[$SELF:P_bhm,"00:00"]] and [?$SELF:P_byear] == $year and [?$SELF:P_bmon] == $month and [?$SELF:P_bday] == $mday)\
   ({Log 1, "Alarmstart"})\
DOELSEIF ([[$SELF:P_ehm,"00:00"]] and [?$SELF:P_eyear] == $year and [?$SELF:P_emon] == $month and [?$SELF:P_eday] == $mday)\
   ({Log 1, "Alarmstop"})
attr datumsbereich_Labor0 alias Terminspanne
attr datumsbereich_Labor0 cmdState 1|0
attr datumsbereich_Labor0 group Labor: Datumsbereich von HH:MM dd.mm.yyyy bis HH:MM dd.mm.yyyy ohne datetimepicker Widget
attr datumsbereich_Labor0 icon time_calendar
attr datumsbereich_Labor0 readingList P_bhm P_bday P_bmon P_byear P_ehm P_eday P_emon P_eyear
attr datumsbereich_Labor0 room DOIF_Labor
attr datumsbereich_Labor0 setList P_bhm:time\
P_bday:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 \
P_bmon:1,2,3,4,5,6,7,8,9,10,11,12\
P_byear:2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026 P_ehm:time \
P_eday:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 \
P_emon:1,2,3,4,5,6,7,8,9,10,11,12 P_eyear:2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026
attr datumsbereich_Labor0 webCmd P_bhm:P_bday:P_bmon:P_byear:P_ehm:P_eday:P_emon:P_eyear
attr datumsbereich_Labor0 widgetOverride setList:textField-long

define datumsbereich_Labor1 DOIF ([[$SELF:P_begin:"(\d\d:\d\d)$","00:00"]] and [?$SELF:P_begin:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday")\
   {Log 1, "Alarmstart"}\
DOELSEIF ([[$SELF:P_ende:"(\d\d:\d\d)$","00:00"]] and [?$SELF:P_ende:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday" or ["^global$:^MODIFIED $SELF$"])\
   {Log 1, "Alarmstop"}
attr datumsbereich_Labor1 alias Terminspanne über Jahre,Monate und Tage
attr datumsbereich_Labor1 cmdState 1|0
attr datumsbereich_Labor1 group Labor: Datumsbereich von HH:MM dd.mm.yyyy bis HH:MM dd.mm.yyyy
attr datumsbereich_Labor1 icon time_calendar
attr datumsbereich_Labor1 readingList P_begin P_ende
attr datumsbereich_Labor1 room DOIF_Labor
attr datumsbereich_Labor1 setList P_begin:datetime,theme:"default",step:5,inline:true P_ende:datetime,theme:"default",step:5,inline:true
attr datumsbereich_Labor1 webCmd P_begin:P_ende
attr datumsbereich_Labor1 widgetOverride setList:textField-long

define kurzzeitwecker_Labor DOIF ([$SELF:P_weckzeit,0])\
DOELSEIF ([+([$SELF:P_weckzeit,1] * 60)]) ## (set <Gerätename> <gerätespezifische Angaben>)
attr kurzzeitwecker_Labor alias Kurzzeitwecker
attr kurzzeitwecker_Labor cmdState warten|alarm
attr kurzzeitwecker_Labor group Labor: Zeitgeber
attr kurzzeitwecker_Labor readingList P_weckzeit
attr kurzzeitwecker_Labor room DOIF_Labor
attr kurzzeitwecker_Labor setList P_weckzeit:0,1,2,3,4,5,6,7,8,9,10,15,20,25,30,35,40,45,50,55,60
attr kurzzeitwecker_Labor webCmd P_weckzeit

define lamp1_Labor000 dummy
attr lamp1_Labor000 alias Lampe1
attr lamp1_Labor000 group Labor: Mehrfachnutzung eines Tasters
attr lamp1_Labor000 room DOIF_Labor

define lamp2_Labor000 dummy
attr lamp2_Labor000 alias Lampe2
attr lamp2_Labor000 group Labor: Mehrfachnutzung eines Tasters
attr lamp2_Labor000 room DOIF_Labor

define lamp_Labor000 dummy
attr lamp_Labor000 alias Lampe
attr lamp_Labor000 group Labor: Zeitsteuerung mit manuell Ein/Aus
attr lamp_Labor000 room DOIF_Labor

define operatorenRang_Labor1 DOIF (([$SELF1:A] or [$SELF1:B]) and [$SELF1:C]) ## operatorenRang_Labor2 operatorenRang_Labor11
attr operatorenRang_Labor1 alias c) (A or B) and C
attr operatorenRang_Labor1 cmdState Bedingung wahr|Bedingung falsch
attr operatorenRang_Labor1 group Labor: Operatorenrangfolge
attr operatorenRang_Labor1 room DOIF_Labor

define operatorenRang_Labor11 DOIF ([$SELF:A,0] or [$SELF:B,0] and [$SELF:C,0]) ## operatorenRang_Labor1 operatorenRang_Labor2
attr operatorenRang_Labor11 alias a) A or B and C
attr operatorenRang_Labor11 cmdState Bedingung wahr|Bedingung falsch
attr operatorenRang_Labor11 group Labor: Operatorenrangfolge
attr operatorenRang_Labor11 readingList A B C
attr operatorenRang_Labor11 room DOIF_Labor
attr operatorenRang_Labor11 setList A:0,#,null,1,-1,eins B:0,#,null,1,-1,eins C:0,#,null,1,-1,eins
attr operatorenRang_Labor11 webCmd A:B:C

define operatorenRang_Labor2 DOIF ([operatorenRang_Labor11:A] || [operatorenRang_Labor11:B] and [operatorenRang_Labor11:C]) ## operatorenRang_Labor1 operatorenRang_Labor3 operatorenRang_Labor11
attr operatorenRang_Labor2 alias b) A || B and C
attr operatorenRang_Labor2 cmdState Bedingung wahr|Bedingung falsch
attr operatorenRang_Labor2 group Labor: Operatorenrangfolge
attr operatorenRang_Labor2 room DOIF_Labor

define operatorenRang_Labor3 DOIF ([operatorenRang_Labor11:A] =~ "ein|1") ## operatorenRang_Labor1 operatorenRang_Labor2 operatorenRang_Labor11
attr operatorenRang_Labor3 alias d) A =~ "ein|1"
attr operatorenRang_Labor3 cmdState Bedingung wahr|Bedingung falsch
attr operatorenRang_Labor3 group Labor: Operatorenrangfolge
attr operatorenRang_Labor3 room DOIF_Labor

define schrittSchalter_Labor001 DOIF ## 1 \
(["button_Labor000:short"] and $cmd=~"0|4") \
   (set lamp1_Labor000 on)\
## 2\
DOELSEIF (["button_Labor000:short"] and $cmd==1) \
   (set lamp2_Labor000 on, set lamp1_Labor000 off)\
## 3\
DOELSEIF (["button_Labor000:short"] and $cmd==2) \
   (set lamp(1|2)_Labor000 on)\
## 4\
DOELSEIF (["button_Labor000:short"] and $cmd==3) \
   (set lamp(1|2)_Labor000 off)
attr schrittSchalter_Labor001 alias Schrittschalter
attr schrittSchalter_Labor001 cmdState Schritt 1|Schritt 2|Schritt 3|Schritt 4
attr schrittSchalter_Labor001 group Labor: Mehrfachnutzung eines Tasters
attr schrittSchalter_Labor001 room DOIF_Labor

define statusBattWndw_Labor0 dummy
attr statusBattWndw_Labor0 alias Fenstersensor
attr statusBattWndw_Labor0 group Labor: Statusabfragen
attr statusBattWndw_Labor0 readingList battery
attr statusBattWndw_Labor0 room DOIF_Labor
attr statusBattWndw_Labor0 setList battery:ok,low
attr statusBattWndw_Labor0 stateFormat Batterie: battery
attr statusBattWndw_Labor0 webCmd battery ok:battery low

define statusBattWndw_Labor1 dummy
attr statusBattWndw_Labor1 group Labor: Statusabfragen
attr statusBattWndw_Labor1 readingList battery
attr statusBattWndw_Labor1 room DOIF_Labor
attr statusBattWndw_Labor1 setList battery:ok,low
attr statusBattWndw_Labor1 stateFormat Batterie: battery
attr statusBattWndw_Labor1 webCmd battery ok:battery low

define tageszeit_Labor DOIF ([[$SELF:P_morgens,"06:00"]])\
DOELSEIF ([[$SELF:P_vormittags,"09:00"]])\
DOELSEIF ([[$SELF:P_mittags,"12:00"]])\
DOELSEIF ([[$SELF:P_nachmittags,"14:00"]])\
DOELSEIF ([[$SELF:P_abends,"18:00"]])\
DOELSEIF ([[$SELF:P_nachts,"22:00"]])
attr tageszeit_Labor alias einstellbarer Zeitgeber Tageszeit
attr tageszeit_Labor cmdState morgens|vormittags|mittags|nachmittags|abends|nachts
attr tageszeit_Labor group Labor: Zeitgeber
attr tageszeit_Labor readingList P_morgens P_vormittags P_mittags P_nachmittags P_abends P_nachts
attr tageszeit_Labor room DOIF_Labor
attr tageszeit_Labor setList P_morgens:time P_vormittags:time P_mittags:time P_nachmittags:time P_abends:time P_nachts:time
attr tageszeit_Labor webCmd P_morgens:P_vormittags:P_mittags:P_nachmittags:P_abends:P_nachts

define time_switch_Labor DOIF (["$SELF:P_mybutton: on"] or [[$SELF:P_mybegin,"00:00"]])\
   (set lamp_Labor000 on)\
DOELSEIF (["$SELF:P_mybutton: off"] or [[$SELF:P_myend,"00:01"]])\
   (set lamp_Labor000 off)
attr time_switch_Labor alias Schaltuhr
attr time_switch_Labor cmdState on|off
attr time_switch_Labor group Labor: Zeitsteuerung mit manuell Ein/Aus
attr time_switch_Labor readingList P_mybutton P_mybegin P_myend
attr time_switch_Labor room DOIF_Labor
attr time_switch_Labor setList P_mybutton:uzsuSelectRadio,on,off P_mybegin:time P_myend:time
attr time_switch_Labor webCmd P_mybutton:P_mybegin:P_myend


defmod rg_time_switch_Labor readingsGroup time_switch_Labor:+STATE,<P_mybutton>,P_mybutton,<P_mybegin>,P_mybegin,<P_myend>,P_myend
attr rg_time_switch_Labor commands {"P_mybutton"=>"P_mybutton:","P_mybegin"=>"P_mybegin:","P_myend"=>"P_myend:",}
attr rg_time_switch_Labor group Labor: Zeitsteuerung mit manuell Ein/Aus
attr rg_time_switch_Labor noheading 1
attr rg_time_switch_Labor room DOIF_Labor


define wecker_Labor DOIF ([$SELF:P_einaus,"off"] eq "on" and [[$SELF:P_weckzeit,"12:00"]]) ## (<Befehle>)
attr wecker_Labor alias Wecker
attr wecker_Labor do always
attr wecker_Labor group Labor: Zeitgeber
attr wecker_Labor readingList P_einaus P_weckzeit
attr wecker_Labor room DOIF_Labor
attr wecker_Labor setList P_einaus:uzsuSelectRadio,on,off P_weckzeit:time
attr wecker_Labor webCmd P_einaus:P_weckzeit


define using_disabledForIntervals_Labor DOIF ## 1\
([$SELF:mybutton] == 1 and !IsDisabled("$SELF")) \
   ({Log 1, "Befehl 1"})\
## 2\
DOELSEIF ([$SELF:mybutton] == 2 and !IsDisabled("$SELF"))\
   ({Log 1, "Befehl 2"})
attr using_disabledForIntervals_Labor userattr disabledForIntervals
attr using_disabledForIntervals_Labor alias Nutzung von Attribut disabledForIntervals und IsDisabled-Funktion
attr using_disabledForIntervals_Labor cmdState Befehl 1|Befehl 2
attr using_disabledForIntervals_Labor disabledForIntervals 13:00-14:00
attr using_disabledForIntervals_Labor group Labor: state inactive Funktion IsDisabled und disabledForIntervals
attr using_disabledForIntervals_Labor readingList mybutton
attr using_disabledForIntervals_Labor room DOIF_Labor
attr using_disabledForIntervals_Labor setList mybutton:0,1,2
attr using_disabledForIntervals_Labor webCmd mybutton

setstate using_disabledForIntervals_Labor 2016-12-08 20:26:55 mybutton 0


define using_time_spanpan_Labor DOIF ## 1\
([$SELF:mybutton] == 1 and ![?13:00-14:00]) \
   ({Log 1, "Befehl 1"})\
## 2\
DOELSEIF ([$SELF:mybutton] == 2 and ![?13:00-14:00])\
   ({Log 1, "Befehl 2"})
attr using_time_spanpan_Labor alias Nutzung einer Zeitspanne zur zeitlichen Befehlseinschränkung,<br> die ursprüngliche DOIF Funktionalität
attr using_time_spanpan_Labor cmdState Befehl 1|Befehl 2
attr using_time_spanpan_Labor group Labor: state inactive Funktion IsDisabled und disabledForIntervals
attr using_time_spanpan_Labor readingList mybutton
attr using_time_spanpan_Labor room DOIF_Labor
attr using_time_spanpan_Labor setList mybutton:0,1,2
attr using_time_spanpan_Labor webCmd mybutton

setstate using_time_spanpan_Labor 2016-12-08 23:33:47 mybutton 0


define using_inactive_Labor DOIF ## 1\
([$SELF:mybutton] == 1) \
   ({Log 1, "Befehl 1_1 gegen Zurücksetzen des wait geschützt"})\
   ({Log 1, "Befehl 1_2 gegen Zurücksetzen des wait geschützt"})\
   ({Log 1, "Befehl 1"})\
## 2\
DOELSEIF ([$SELF:mybutton] == 2 and !IsDisabled("$SELF")) \
   ({Log 1, "Befehl 2"})
attr using_inactive_Labor alias Nutzung von state inactive und IsDisabled-Funktion<br>Zurücksetzen des Wait-Timers verhindern
attr using_inactive_Labor cmdState inactive,inactive,Befehl 1|Befehl 2
attr using_inactive_Labor group Labor: state inactive und Funktion IsDisabled
attr using_inactive_Labor readingList mybutton
attr using_inactive_Labor room DOIF_Labor
attr using_inactive_Labor setList mybutton:0,1,2
attr using_inactive_Labor wait 0,5,5:0
attr using_inactive_Labor webCmd mybutton

setstate using_inactive_Labor 2016-12-09 07:44:21 mybutton 0


define using_cmd_x_Labor DOIF ## 1\
([$SELF:mybutton] == 1) \
   ({Log 1, "Befehl 1_1 gegen Zurücksetzen des wait geschützt"})\
   ({Log 1, "Befehl 1_2 gegen Zurücksetzen des wait geschützt"})\
   ({Log 1, "Befehl 1"})\
## 2\
DOELSEIF ([$SELF:mybutton] == 2 and [$SELF] !~ "cmd_1_1|cmd_1_2") \
   ({Log 1, "Befehl 2"})
attr using_cmd_x_Labor alias Nutzung der originären DOIF Funktionalität [$SELF] !~  und "cmd_1_1|cmd_1_2"<br> Zurücksetzen des Wait-Timers verhindern
attr using_cmd_x_Labor group Labor: state inactive und Funktion IsDisabled
attr using_cmd_x_Labor readingList mybutton
attr using_cmd_x_Labor room DOIF_Labor
attr using_cmd_x_Labor setList mybutton:0,1,2
attr using_cmd_x_Labor wait 0,5,5:0
attr using_cmd_x_Labor webCmd mybutton

setstate using_cmd_x_Labor 2016-12-09 08:59:00 mybutton 0

weitere Links