DOIF/Einsteigerleitfaden, Grundfunktionen und Erläuterungen
DOIF, für FHEM-Einsteiger konzipiert, wurde über Benutzeranforderungen zu einem immer vielfältigeren Werkzeug weiter entwickelt. Damit orientiert sich die Weiterentwicklung des DOIF an praktischen Aufgabenstellungen. Im Ergebnis können einfache Probleme, sowie auch spezielle und komplexe Aufgaben in kompakter Weise gelöst werden. Damit nimmt jedoch auch die Zahl der Einstellungsmöglichkeiten über Attribute, Syntaxvarianten und deren Kombinationen zu. Das macht es für Einsteiger und Fortgeschrittene nicht leicht den Überblick zu behalten.
Hier soll der Blick auf die Teile des DOIF beschränkt werden, die für die Einfachheit des DOIF aus seiner Anfangszeit stehen und die ausreichen 80% der Aufgabenstellungen lösen.
Voraussetzung
Die FHEM-Begriffe Gerät (Device), State (Status), Readings, Internals, Attribute, Event (Ereignis), Befehl (Command) und deren Funktion sollen bekannt sein.
DOIF-Light für Einsteiger
Die meisten Verknüpfungsaufgaben können mit einem Verständnis der folgenden Abschnitte der Hilfe zum DOIF (deutschsprachige Befehlsreferenz) gelöst werden.
- Einleitung
- Features
- Lesbarkeit der Definitionen
- Ereignissteuerung
- Zeitsteuerung
- Wochentagsteuerung
- Zeitsteuerung mit Zeitintervallen
- Indirekte Zeitangaben
- Angaben im Ausführungsteil
- do always
- wait
- do resetwait
- readingList, setList Frontendgestaltung
- zu beachten zusätzliche Hinweise und Tipps
- Kurzreferenz als Überblick
Struktur und Verhalten des DOIF
Der Aufbau des DOIF entspricht einer Baumstruktur mit Bedingungszweigen.
Verhaltensweise ohne steuernde Attribute
Angaben im Bedingungsteil
Der Bedingungsteil besteht aus einer Perl-Ebene und einer Präprozessorebene.
Die erste Ebene der ersten runden Klammer nach den Schlüsselwörtern DOIF oder DOELSEIF umschliesst eine Bedingung.
Für Angaben in dieser Klammer (Perl-Ebene) gilt die Perl-Syntax (Operatoren, Operanden, wie Funktionen, Variablen), ausgenommen sind die Angaben in der ersten Ebene der eckigen Klammern, sie umschliessen die Ebene des DOIF-Präprozessors, dort gilt die Syntax des DOIF-Präprozessors.
In dieser Ebene der eckigen Klammern werden DOIF-Operanden angegeben. Die DOIF-Operanden beinhalten Auslöser.
Auslöser sind Zeitpunkte, Gerätenamen und Reguläre Ausdrücke, die auf Gerätenamen oder das Ereignis passen.
Ereignisse sind für DOIF ablaufende Timer oder Ereignisse (Events) die durch [[Gerät|Geräte}} initiiert werden.
Der DOIF-Prozess wird gestartet wenn ein Ereignis eintrifft.
Passt ein Auslöser einer Bedingung zu dem Ereignis wird diese Bedingung geprüft.
Ist die Bedingung wahr, werden die nach der Bedingung stehenden Befehle ausgeführt.
Nach der Befehlsausführung wird der Status des DOIF auf die Befehlsnummer gesetzt (cmd_x) und DOIF wartet auf das nächste Ereignis.
Ist die Bedingung unwahr (falsch) wird der nächste Zweig bearbeitet.
Ist DOELSE angegeben, es gab einen passenden Auslöser und alle geprüften Bedingungen waren unwahr, dann werden die nach DOELSE angegebenen Befehle ausgeführt.
Die Befehle eines Zweiges werden ohne vorherigen Statuswechsel nur einmal ausgeführt.
Ein Statuswechsel findet statt, wenn ein anderer Bedingungszweig wahr wird.
Ein DOIF mit nur einem Zweig enthält ein internes DOELSE, d.h. bei unwahrer Bedingung und vorhandenem Auslöser, findet ein Statuswechsel auf cmd_2 statt.
Auslöser
Auslöser können durch direkte Angabe des Gerätenamen, Readings, Internals usw. angegeben werden.
Readings und Internals
[<Gerätename>] oder [<Gerätename>:&STATE] bezieht sich auf das Internal STATE des Gerätes.
[<Gerätename>:<Readingname>] bezieht sich auf das Reading des Gerätes.
[<Gerätename>:<Readingname>:d] bezieht sich auf den numerischen Teil des Reading-Wertes.
[<Gerätename>:<Readingname>:sec] bezieht sich auf das Alter des Zeitstempels in Sekunden.
[<Gerätename>:&<Internalname>] bezieht sich auf das Internal des Gerätes.
[<Auslöserangabe>,<Vorgabewert>] nicht existierende Auslöser können mit einem Vorgabewert angegeben werden.
Zeitangaben
[<Zeitpunkt>] gibt einen Zeitpunkt an
[<Zeitpunkt Beginn>-<Zeitpunkt Ende>|<Wochentagangaben>] gibt eine Zeitspanne an, optionale Wochentagangabe
[[<Auslöserangabe>]] gibt einen Zeitpunkt indirekt an.
Mit Zeitangaben kann gerechnet werden, Berechnungen erfolgen in runden Klammern.
Liefert eine Perl-Funktion HH:MM:SS muss sie in geschweifte Klammern eingeschlossen werden.
[{sunrise}] z.B. Angabe eines Zeitpunktes durch die Perl-Funktion sunrise.
Auslöser (erweitert)
Auslöser können auch allgemein formuliert werden, dazu ist die Fertigkeit erforderlich Reguläre Ausdrücke (Regex) formulieren zu können.
Readings und Internals
[<Auslöserangabe>:<Regex Filter>,<Ausgabeformatierung>] Auslöser können mit einem Filter eränzt werden, die gefilterten Werte können in der Ausgabeformatierung weiterverarbeitet werden.
Ereignisse
[<Gerätename>:"<Regex Ereignisrest>"]
["<Regex Gerätename>:<Regex Ereignisrest>"]
["<Regex Ereignis>",<Vorgabewert>]
["<Regex Ereignis>":<Regex Filter>,<Ausgabeformatierung>,<Vorgabewert>] optional: Filter und Formatierung, verpflichtend: Vorgabe
Alle Auslöser
[?<Auslöserangabe>] Auslöser, die mit Fragezeichen beginnen lösen nicht aus, sie werden nur abgefragt
Angaben im Befehlsteil
Befehle stehen nach einer Bedingung oder nach DOELSE in runden Klammern (erste Klammerebene), das ist die FHEM-Ebene. Befehle können direkt angegeben werden.
Befehle können zu Sequenzen gruppiert werden durch mehrere runde Klammerpaare der ersten Ebene)
Trennzeichen für Befehle ist das Komma, daher ist keine Verdoppelung der Trennzeichen erforderlich.
Enthält ein Befehl ein Komma, dass kein Befehlstrennzeichen ist, dann ist der Befehl in zusätzliche runde Klammern einzuschliessen.
Berechnungen erfolgen in geschweiften Klammern auf der Perl-Ebene und müssen unmittelbar mit einer runden Klammer beginnen.
Der Zugriff auf Readings, Internals usw. erfolgt wie im DOIF üblich, über Angaben in eckigen Klammern inklusive Ausgabeformatierung und Präprozessorersatznamen, wie $SELF, $DEVICE, $EVENT, $EVENTS (extended set magic).
Häufige Attribute
Attribute verändern das Standardverhalten des DOIF.
do always
Ohne do always gilt:Die Befehle eines Bedingungszweiges werden ohne vorherigen Statuswechsel nur einmal ausgeführt.
Das Attribut setzt diese Regel ausser Kraft. Befehle werden wiederholt im bestehenden Status ausgeführt.
Das interne DOELSE entfällt bei DOIF mit einem Zweig.
Wait-Timer werden bei wiederholtem Wahrwerden der Bedingung nicht abgebrochen.
wait
Das Attribut verzögert die Befehlsausführung, nach wahr werden einer Bedingung.
Laufende Wait-Timer werden bei einem Statuswechsel abgebrochen und die Befehle werden nicht ausgeführt.
do resetwait
Das Attribut beinhaltet do always, bricht aber die Wait-Timer bei wiederholtem Wahrwerden der Bedingung ab.
readingList, setList, webCmd, widgetOverride
Diese Attribute statten DOIF mit Dummy-Eigenschaften aus, so dass DOIF als erweitertes Eingabeelement im Frontend dienen kann.
Erste Schritte mit DOIF: Zeit- und Ereignissteuerung
Die nachfolgenden Beispiele sind aus der Einleitung der Hilfe zum DOIF entnommen. Sie werden hier weiter erläutert.
Beispiel A): Ereignissteuerung
[<Gerätename>:"<Ereignis>"]
zur Abfrage eines Ereignisses von einem Gerät- DOELSE das Schlüsselwort leitet einen Befehlszweig ohne explizite Bedingung ein. Dieser Zweig wird ausgeführt, wenn keine geprüfte Bedingung wahr ist.
- devStateIcon zum direkten Ausführen eines Befehls im DOIF und zur Anzeige von Icons
Aufgabenstellung:
Eine Fernbedienung soll einen Fernseher einschalten, der über eine Funkstekdose angeschlossen ist.
Das Gerät Fernbedienung wird durch den Dummy remotecontrol dargestellt. In der Realität könnte es die Definition eines Empfängers für eine Infrarot-Fernbedienung sein.
Das Gerät Funksteckdose TV wird durch den Dummy tv dargestellt. In der Realität könnte es die Definition einer Intertechno-Funkstekdose aus dem Baumarkt sein.
Die Signale von remotecontrol werden über das DOIF di_rc_tv alias Steuerlogik in einen Befehl für die Funksteckdose tv umgesetzt.
Das Signal ist als Ereignis im Event-Monitor sichtbar 2017-02-28 09:07:03 dummy tv on
Das DOIF reagiert durch die Angabe von [remotecontrol:"on"]
in der Schaltbedingung. Weil on als Wert in dem Ereignis enthalten ist, wird die Bedingung wahr. Das bewirkt das Ausführen des Befehls set tv on
. Danach nimmt das DOIF den Status cmd_1 an.
Falls off im Ereignis enthalten ist wird die Bedingung nicht wahr, daher wird der Befehl set tv off
des DOELSE-Zweiges des DOIF ausgeführt und DOIF nimmt den Status cmd_2 an.
Definition:
define di_rc_tv DOIF ([remotecontol:"on"]) (set tv on) DOELSE (set tv off)
Über das Attribut devStateIcon können die Befehle des DOIF direkt ausgeführt werden.
attr di_rc_tv devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
Das erste Tripel cmd_1:general_an:cmd_2
hat die Bedeutung aktueller Status:Icon-Name:Status nach Betätigung des Icons. Also, wenn der Status cmd_2 ist, dann zeige das Icon general_an und wenn das Icon betätigt wird, dann führe den Befehl aus, der zu cmd_1 gehört.
Das zweite Tripel hat die gleiche Funktion, jedoch wird in diesem Fall das Icon general_aus angezeigt, wenn der Status des DOIF cmd_1 ist oder initialized.
Die nachstehende, komplette Definition für die Gruppe A) kann über Raw definition in FHEM importiert werden.
defmod di_rc_tv DOIF ([remotecontrol:"on"]) (set tv on) DOELSE (set tv off) attr di_rc_tv alias Steuerlogik attr di_rc_tv devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1 attr di_rc_tv group A) Fernbedienung (Ereignissteuerung) attr di_rc_tv icon helper_doif attr di_rc_tv room Schulungsraum defmod remotecontrol dummy attr remotecontrol alias Fernbedienung attr remotecontrol devStateIcon .*:noIcon attr remotecontrol group A) Fernbedienung (Ereignissteuerung) attr remotecontrol icon it_remote attr remotecontrol room Schulungsraum attr remotecontrol webCmd on:off defmod tv dummy attr tv alias Funksteckdose TV attr tv devStateIcon on:it_television@red off:it_television@blue attr tv group A) Fernbedienung (Ereignissteuerung) attr tv icon it_television attr tv room Schulungsraum save
Beispiel B): Zeitsteuerung
[<Zeitpunkt>|<Wochentagangabe>]
zur Angabe eines Zeitpunktes mit Wochentagbeschränkung. Die Zeiten gelten für die angegebenen Wochentage.- DOELSEIF das Schlüsselwort leitet einen Bedingungszweig ein und muss eine Bedingung enthalten. Dieser Zweig wird ausgeführt, wenn eine Bedingung geprüft wird und sie wahr ist.
- devStateIcon zum direkten Ausführen eines Befehls im DOIF und zur Anzeige von Icons
Aufgabenstellung:
Ein Radio soll werktags und am Wochenende zu unterschiedlichen Zeiten ein- u. ausgeschaltet werden.
Das Gerät Funksteckdose Radio wird durch den Dummy radio dargestellt. In der Realität könnte es die Definition einer Intertechno-Funkstekdose aus dem Baumarkt sein.
Wenn die Uhrzeit mit einem Schaltzeitpunkt übereinstimmt, wird die Zeitpunktangabe wahr. Wird dann auch die gesamte Bedingung wahr, dann wird der zu diesem Bedingungszweig gehörende Befehl ausgeführt. Das DOIF di_clock_radio alias Zeitschaltuhr setzt dann einen Befehl zum Schalten der Funksteckdose radio ab.
Das Zeitereignis ist im Event-Monitor nicht sichtbar.
Die Zeitpunkte eines Bedingungszweiges sind or(oder) verknüpft. Im ersten Bedingungszweig steht die Einschaltbedingung, im Zweiten (DOELSEIF) die Auschaltbedingung.
Definition:
define di_clock_radio DOIF ([06:30|Mo Di Mi] or [08:30|Do Fr Sa So]) (set radio on) DOELSEIF ([08:00|Mo Di Mi] or [09:30|Do Fr Sa So]) (set radio off)
Über das Attribut devStateIcon können die Befehle des DOIF über das WEB-Frontend unabhängig von den Schaltzeitpunkten ausgeführt werden.
attr ddi_clock_radio devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
Die nachstehende, komplette Definition für die Gruppe B) kann über Raw definition in FHEM importiert werden.
defmod di_clock_radio DOIF ([06:30|8] or [08:30|7]) (set radio on) DOELSEIF ([08:00|8] or [09:30|7]) (set radio off) attr di_clock_radio alias Zeitschaltuhr attr di_clock_radio devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1 attr di_clock_radio group B) Zeitschaltuhr (Zeitsteuerung) attr di_clock_radio icon helper_doif attr di_clock_radio room Schulungsraum defmod radio dummy attr radio alias Funksteckdose Radio attr radio devStateIcon on:it_radio@red off:it_radio@blue attr radio group B) Zeitschaltuhr (Zeitsteuerung) attr radio icon it_radio attr radio room Schulungsraum save
Beispiel C): Kombinierte Ereignis- und Zeitsteuerung
[<Beginzeitpunkt>-<Endzeitpunkt>]
zur Angabe einer Zeitspanne.[<Gerätename>:<Reading-Name>]
zur Abfrage eines Reading-Inhaltes.<
, eines numerischen Vergleichsoperators und Vergleich mit einer Konstanten (40).- DOELSE das Schlüsselwort leitet einen Befehlszweig ohne explizite Bedingung ein. Dieser Zweig wird ausgeführt, wenn keine geprüfte Bedingung wahr ist.
- devStateIcon zum direkten Ausführen eines Befehls im DOIF und zur Anzeige von Icons
- readingList, setList und webCmd zur Erzeugung eines Eingabeelementes im Frontend
- stateFormat um einen benutzerdefinierten Status zu erzeugen.
Aufgabenstellung:
Eine Lampe soll in einer Zeispanne eingeschaltet werden, wenn die Helligkeit einen bestimmten Wert unterschreitet.
Das Gerät Lampe wird durch den Dummy lamp dargestellt. In der Realität könnte es die Definition einer funkgesteuerten Lampenfassung sein.
Das Gerät Helligkeitssensor wird durch den Dummy sensor dargestellt. In der Realität könnte es die Definition eines Homematic Funk-Lichtsensor sein oder ein selbstgebauter Helligkeitssensor mit TSL2561-Chip.
Wenn die aktuelle Uhrzeit in der angegebenen Zeitspanne liegt, ist die Zeitspanne wahr. Wenn dann auch die Helligkeit unter 40 sinkt, wird die gesamte Bedingung wahr, weil Zeitspanne und Hellikeitsvergleich and(und) verknupft sind. Der zu diesem Bedingungszweig gehörende Befehl wird dann ausgeführt. Das DOIF di_lamp alias Lampenlogik setzt dann einen Befehl zum Schalten der Lampe lamp ab. Der DOELSE-Zweig wird ausgeführt, wenn die Bedingung im ersten Zweig unwahr wird.
Definition:
define di_lamp DOIF ([06:00-19:00] and [sensor:brightness] < 40) (set lamp on) DOELSE (set lamp off)
Über das Attribut devStateIcon können die Befehle des DOIF über das WEB-Frontend unabhängig von den Schaltzeitpunkten ausgeführt werden.
attr di_lamp devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
Das Attribut setList zusammen mit readingList und webCmd realisiert im Gerät sensor für das Reading brightness einen Schieberegler, mit dem eine Helligkeit zwischen 0 und 100 in in Schritten von 1 simuliert werden kann und der im Frontend angezeigt wird.
attr sensor readingList brightness attr sensor setList brightness:slider,0,1,100 attr sensor webCmd brightness
Mit dem Attribut stateFormat wird im Gerät sensor das Reading brightness in den Status geschrieben. Damit wird der Helligkeitswert auch im Frontend sichtbar.
attr sensor stateFormat brightness
Die nachstehende, komplette Definition für die Gruppe C) kann über Raw definition in FHEM importiert werden.
defmod di_lamp DOIF ([06:00-19:00] and [sensor:brightness] < 40) (set lamp on) DOELSE (set lamp off) attr di_lamp alias Lampenlogik attr di_lamp devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1 attr di_lamp group C) Kombinierte Ereignis- und Zeitsteuerung attr di_lamp icon helper_doif attr di_lamp room Schulungsraum defmod lamp dummy attr lamp alias Lampe attr lamp group C) Kombinierte Ereignis- und Zeitsteuerung attr lamp icon light_light attr lamp room Schulungsraum defmod sensor dummy attr sensor alias Helligkeitssensor attr sensor group C) Kombinierte Ereignis- und Zeitsteuerung attr sensor icon message_light_intensity attr sensor readingList brightness attr sensor room Schulungsraum attr sensor setList brightness:slider,0,1,100 attr sensor stateFormat brightness attr sensor webCmd brightness save
Ansicht der Gruppen A) bis C) im Frontend
Links
- DOIF
- DOIF/Tipps zur leichteren Bedienung Erstellung, Bearbeitung, Syntaxhervorhebung, Klammerprüfung, Suchen&Ersetzen, Zeilennummerierung, uvm. (nicht nur) von DOIF
- Regulärer_Ausdruck
- Event Ereignisse
- Readings
- Internals
- Attribute
- http://perldoc.perl.org/perlop.html Perloperatoren
- http://perldoc.perl.org/perlre.html Reguläre Ausdrücke