Erste Schritte in FHEM: Unterschied zwischen den Versionen

Aus FHEMWiki
K (Abschnitt "Schaltbefehle definieren" hinzugefügt)
K (Das Attribut "disable" ist nicht von Anfang an in der Detailansicht zu sehen, zumindest nicht in der aktuellen Version von fhem. Daher habe ich den Text dahingehend geändert, dass man erst per Kommandozeile, das Attribut auf 1 setzen muss und erst dann in der Detailansicht zwischen den Werten 0 und 1 wählen kann.)
 
(85 dazwischenliegende Versionen von 10 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Baustelle}}
Für alle, die das erste mal mit FHEM arbeiten, hier ein kleiner Kurs zum Einstieg.
Eine kurze Erklärung zu den ersten Schritten in fhem.
Dieser ist so aufgebaut, dass man noch keine Hardware benötigt und nach dem Installieren der FHEM-Software sofort loslegen kann.


Diese Anleitung wurde ursprünglich von Ulrich Maass publiziert, der die Genehmigung erteilt hat, sie auch im Wiki zu veröffentlichen.
Diese Anleitung wurde ursprünglich von Ulrich Maass publiziert, der die Genehmigung erteilt hat, sie auch im Wiki zu veröffentlichen.
Anmerkung zur Bearbeitung: Korrekturen von Tippfehlern kann jeder machen. Redaktionelle Änderungen und Erweiterungen aber bitte mit dem Autor (z.B. auf der [[Diskussion:Erste Schritte in FHEM|zugehörigen Diskussionsseite]]) abstimmen.


==Der erste Einstieg==
==Der erste Einstieg==
Um fhem zum ersten Mal aufzurufen, geben Sie im Browser ein:
Um FHEM zum ersten Mal aufzurufen, geben Sie im Browser ein:
  <nowiki>http://<ip-Adresse>:8083</nowiki>
  <nowiki>http://<ip-Adresse>:8083</nowiki>
also z.B. <nowiki>http://192.168.1.1:8083</nowiki>.
also z.B. <nowiki>http://192.168.1.1:8083</nowiki>.
Zeile 13: Zeile 15:


*Am oberen Bildschirmrand sehen Sie das weiße ''Kommandofeld'', in das Sie Befehle tippen können.
*Am oberen Bildschirmrand sehen Sie das weiße ''Kommandofeld'', in das Sie Befehle tippen können.
*Links daneben befindet sich ein umrahmtes "+"-Symbol, über das Sie ein mehrzeiliges Eingabefeld erreichen können; mehr dazu später.
*Als ersten Menüpunkt sehen Sie die Schaltfläche ''Save config'', mit der Änderungen so gespeichert werden, dass sie auch nach einem Neustart noch vorhanden sind.
*Als ersten Menüpunkt sehen Sie die Schaltfläche ''Save config'', mit der Änderungen so gespeichert werden, dass sie auch nach einem Neustart noch vorhanden sind.
*Außerdem gibt es bereits die Räume ''Unsorted'' und ''Everything'', die wir bald kennenlernen.
*Außerdem gibt es bereits die Räume ''Unsorted'' und ''Everything'', die wir bald kennenlernen.
*Im unteren Block befinden sich weitere Links, auf die wir später ebenfalls eingehen.
*Im unteren Block befinden sich weitere Links, auf die wir später ebenfalls eingehen.


Der Hinweis ''Security Check'' besagt, dass Sie noch kein Passwort für fhem eingerichtet haben. Wie man einen Passwortschutz einrichten kann, steht in der fhem-Befehlsreferenz [http://fhem.de/commandref_DE.html commandref], in der es übrigens eine Beschreibung zu allen Funktionen und Modulen von fhem gibt. Um diese Meldung erst einmal zu unterdrücken, geben Sie in das Kommandofeld ein:
Der Hinweis ''Security Check'' besagt, dass Sie noch kein Passwort für FHEM eingerichtet haben. Wie man einen Passwortschutz einrichten kann, steht im Detail in der FHEM-Befehlsreferenz {{Link2CmdRef|Lang=de|Anker=allowed}}, in der es übrigens eine Beschreibung zu allen Funktionen und Modulen von FHEM gibt. Um diese Meldung erst einmal zu unterdrücken, geben Sie in das Kommandofeld ein:
  attr global motd none
  attr global motd none
und bestätigen Ihre Eingabe mit der {{Taste|Enter}}-Taste.
und bestätigen Ihre Eingabe mit der {{Taste|Enter}}-Taste oder klicken alternativ einfach auf den gleichnamigen Link.


[[Datei:ErsteSchritteInFhem02.png]]
[[Datei:ErsteSchritteInFhem02.png]]


==Devices anlegen - define==
==Device anlegen - define==
 
Das Grundgerüst von FHEM sind "devices". Typische Devices sind beispielsweise Funksteckdosen, Rolladenmotoren, Temperaturmessgeräte, Magnetventile usw. Aber andere Dinge, die man auf den ersten Blick nicht als physisches Gerät bezeichnen würde, sind Device: So etwa ist die Benutzeroberfläche von FHEM selbst ein device ("FHEMWEB"), ebenso gibt es Devices ohne physische Geräte, die dazu benutzt werden können, um eine Variable zu speichern. Ein sehr einfaches Device, dummy genannt, legen wir jetzt an.


Um fhem zunächst kennenzulernen, legen wir erst einmal einige "dummy"-devices an. So können Sie diese Tests auch ohne ein Hardware-System durchführen bzw. kann hier eine allgemeine Einführung erfolgen, ohne auf die Unterschiede der einzelnen Hardwaresysteme einzugehen. Ein dummy-device sieht auf der fhem-Oberfläche im Allgemeinen genau so aus, wie ein fhem-device zu einem "echten" Gerät Ihres Hardwaresystems.
Das dummy devices ist insofern ein besonderes Objekt, weil es nicht unbedingt ein korrespondierendes physisches Gerät (eine physische Lampe, ein Rolladen, ein Magnetventil) benötigt. So können Sie diese Schritte auch ohne ein Hardware-System durchführen bzw. kann hier eine allgemeine Einführung erfolgen, ohne auf die Unterschiede der einzelnen Hardwaresysteme einzugehen. Ein Dummy-Device sieht auf der FHEM-Oberfläche im Allgemeinen genau so aus, wie ein FHEM-Device zu einem physisch vorhandenen Gerät Ihres Hardwaresystems.


Zunächst legen wir einen Schalter an. Dieser soll einen Lichtschalter an der Wand simulieren. Geben Sie dazu folgenden Befehl in das Kommandofeld ein:
Zunächst legen wir einen Schalter an. Dieser soll einen Lichtschalter an der Wand simulieren. Geben Sie dazu folgenden Befehl in das Kommandofeld ein:
  define mySchalter1 dummy
  define mySwitch1 dummy
Nach drücken der {{Taste|Enter}}-Taste wird die Detail-Ansicht des neuen fhem-device "mySchalter1" angezeigt.
"define" ist der FHEM-Befehl, "mySwitch1" der zukünftige Name des devices und "dummy" bezeichnet den Typ. Die Worte define und dummy gehören zur Befehlssyntax von FHEM und können nicht verändert werden, mySwitch1 ist (mehr oder weniger) frei wählbar. Nach drücken der {{Taste|Enter}}-Taste wird die Detail-Ansicht des neuen FHEM-Device ''mySwitch1'' angezeigt.


[[Datei:ErsteSchritteInFhem03.png]]
[[Datei:ErsteSchritteInFhem03.png]]


Der Block ''Internals'' zeigt immer die grundlegende Ausprägung eines fhem-device an:
{{Hinweis|Jedes Device hat genau einen "Typ".  Dieser Typ legt gleichzeitig die Perl-Befehlsdatei (man spricht präziser vom "Modul") fest, in der bestimmte Routinen und Eigenschaften festgehalten sind. Ist etwa ein Device vom Typ dummy, so weiß FHEM, dass die Routinen und Eigenschaften im Modul 98_dummy.pm liegen. (Die Zahl 98 hatte früher eine Bedeutung, heute ist das nicht mehr der Fall, aus historischen Gründen wird sie aber immer noch verwendet.)}}
*''NAME''  ist der von Ihnen vergebene Name.
{{Hinweis|Diese Einleitung soll Ihnen ein Gefühl für die Funktionsweise von FHEM vermitteln, ohne dass Ihnen konkrete physische Geräte (spezielle Funk- oder WLAN-Steckdosen, 433MHz-Sender,  Homematic-Lampen, ZWave-Aktoren usw.) zur Verfügung stehen müssen. Um für diesen Kurs ein rein "virtuelles Gerät" nutzen zu können, greifen wir auf ein dummy-device zurück. Ein ''dummy'' wird Ihnen auch später noch häufig begegnen, wenn es darum geht, einen Testaufbau zu erläutern oder zur Steuerung eines Programmablaufs Informationen userseitig verfügbar zu machen. Beachten Sie dabei aber bitte immer, dass Ihnen später auch '''sehr viele andere Möglichkeiten''' offenstehen, um Informationen abzuspeichern, auszuwerten oder anzuzeigen, sobald Sie FHEM-Geräte für physische Hardware angelegt haben. Statt hierfür Geräte des Typs ''dummy'' zu verwenden, wird es für Sie zukünftig häufig übersichtlicher sein, Informationen zu einem Gerät direkt bei diesem zu verwalten. Neben den Attributen und Readings, die die hierfür jeweils genutzen Module bereits automatisch bereitstellen, können Sie z.B. bei allen Devices weitere Attribute (userattr) oder Readings (setreading) selbst in fast beliebigem Umfang generieren und darin Ihre eigenen Informationen bereitstellen.}}
*''TYPE''  ist der Typ des fhem-device, hier dummy.
 
*''STATE'' ist der in allen Übersichten angezeigte Status des Geräts. Da noch keine Zuordnung stattgefunden hat, ist dieser zunächst ''???''.
Devices haben einen "Zustand", der sich im Zeitablauf ändert und den FHEM registriert. So ist beispielsweise ein Fenster offen, ein Rolladenpanzer geschlossen und eine Funksteckdose hat Spannung. Ein Zustand muss dabei nicht exakt eine Variable beinhalten (Fenster entweder "offen" oder "geschlossen"), ein Zustand kann auch durch mehrere Variablen beschrieben werden (der Zustand eines Raspberry-Systems, device-type sysmon, umfasst beispielsweise die CPU-Frequenz, die CPU-Temperatur, den load und vieles mehr).
 
Dieser Zustand wird in FHEM durch insgesamt drei Größen erfasst. Diese Größen heißen Internals, Attribute und Readings. Es wäre jetzt zu früh, auf die Bedeutung der drei Begriffe im Detail einzugehen, aber folgende Anmerkungen sind für die nachfolgenden Schritte wichtig:
*''Internals'' enthalten ganz grundlegende Informationen zu dem device. Sie werden vom Nutzer in den seltensten Fällen direkt bearbeitet (meist nur bei der Einrichtung des devices).
*''Attribute'' sollen das Verhalten des devices steuern. Sie können vom Anwender typischerweise verändert (oder erst angelegt) werden.
*''Readings'' besitzen im Gegensatz zu den beiden anderen Größen einen Zeitstempel. Hier werden üblicherweise Messwerte des Gerätes erfasst.
 
Verwirrend für einen Anfänger kann sein, dass manchmal Internals wie auch Readings mit gleichem Namen (STATE und state) existieren können. Allerdings unterscheidet Perl zwischen Groß- und Kleinschreibung!
 
{{Hinweis|Der Block '''''Internals''''' zeigt immer die grundlegende Ausprägung eines FHEM-device an:
*'''''NAME'''''  ist der von Ihnen vergebene Name.
*'''''TYPE'''''  ist der Typ des FHEM-device, hier dummy.
*'''''STATE''''' ist der in allen Übersichten angezeigte Status des Geräts. Da noch keine Zuordnung stattgefunden hat, ist dieser zunächst '''''???'''''.}}


==Räume definieren==
==Räume definieren==
In Räumen können Sie Geräte gruppieren, die sich auch physisch in einem Raum (Wohnzimmer, Schlafzimmer, etc.) befinden.
Im nächsten Schritt wollen wir Geräte ordnen und geeignet zusammenfassen. Beispielsweise könnten Sie es für sinnvoll erachten, die Geräte, die sich physisch (tatsächlich) in einem Raum befinden, auch in FHEM entsprechend anzuordnen. In einem "Schlafzimmer" sollen dann also entsprechende devices "Rolladen", "Zeitschalter" und "Radios" zu finden sein. Sie können aber auch andere Zuordnungen vornehmen; man könnte etwa alle Messinstrumente wie Thermometer, Stromzähler und Feuchtigkeitsfühler in einem (eventuell nur logisch und nicht physisch existierenden) Raum "Messinstrumente" erfassen. Der Name eines Raumes ist dabei beliebig.  


Um ein Device einem Raum zuzuordnen (der Raum muss zu diesem Zeitpunkt noch nicht existieren), verwenden Sie folgenden Befehl:
Um dies zu tun, müssen Sie allen devices, die zum Raum gehören sollen, ein "Attribut" (siehe oben) hinzufügen. Dieses Attribut heißt room und muss als Wert den Namen des Raumes bekommen. Versuchen wir dies für unseren dummy. Hierzu verwenden Sie folgenden Befehl (abschließen der Eingabe mit {{Taste|Enter}}):
  attr mySchalter1 room Schulungsraum
  attr mySwitch1 room Training


Nach Eingabe dieses Befehls in das Kommandofeld und Abschließen der Eingabe mit {{Taste|Enter}} ist das Device dem Raum ''Schulungsraum'' zugeordnet. Durch diese Zuordnung ist dieser Raum links zur Liste der Räume hinzugefügt worden.
Durch diesen Befehl wird dem Device ''mySwitch1'' das Attribut ''room'' mit dem Wert ''Training'' hinzugefügt. Wieder gehören attr, mySwitch1 und room zur Befehlssyntax von FHEM und können nicht verändert werden, Training ist frei wählbar.  


Klicken Sie einmal auf den Raum ''Schulungsraum''.
''mySwitch1'' gehört jetzt zum room ''Training''. Durch diese Zuordnung ist dieser Raum in der Navigationsleiste links zur Liste der Räume hinzugefügt worden. Klicken Sie einmal auf den Raum ''Training''.


[[Datei:ErsteSchritteInFhem04.png]]
[[Datei:ErsteSchritteInFhem04.png]]


Es werden nun alle Geräte angezeigt, die diesem Raum zugeordnet wurden. Bisher haben wir hier nur ein Gerät: ''mySchalter1''. Es wird in einem Block mit der Typbezeichnung ''dummy'' dargestellt.
Es werden nun alle Geräte angezeigt, die diesem Raum zugeordnet wurden. Bisher haben wir hier nur ein Gerät: ''mySwitch1'', unseren dummy.  
Neben dem Device-Namen wird immer der Status des Device angezeigt, hier noch ''???''.
Neben dem Device-Namen wird immer der Status des Device angezeigt, hier noch ''???''.
Wenn Sie auf den Namen ''mySchalter1'' klicken, gelangen Sie wieder in dessen Detailansicht.
Wenn Sie auf den Namen ''mySwitch1'' klicken, gelangen Sie wieder in dessen Detailansicht.
 
Unser dummy wird in einem Block mit der Typbezeichnung ''dummy'' dargestellt. Diese Typbezeichnung können Sie ebenfalls ändern, wenn Sie ein weiteres Attribut "group" hinzufügen und einen (ebenfalls frei wählbaren) Namen vergeben: Gruppen sortieren devices innerhalb eines Raumes.
 
Anmerkung: Wenn Sie einen Raum löschen wollen, so tun Sie dies, indem Sie sämtliche devices aus dem Raum entfernen. Für unser Beispiel des Raums ''Training'' bedeutet es, dass in allen devices das Attribut room entfernt wird. Der Raum ''Training'' verschwindet dann von alleine.  


==Schaltbefehle definieren==
==Schaltbefehle definieren==
Nun soll unser ''mySchalter1'' Schalterflächen für ''on'' und ''off'' bekommen.
Nun soll unser ''mySwitch1'' Schalterflächen für ''on'' und ''off'' bekommen.
  attr mySchalter1 webCmd on:off
  attr mySwitch1 webCmd on:off


Statt den o.g. Befehl in das Kommandofeld einzugeben, können Sie auch im unteren Bereich der Detailansicht das gewünschte Attribut (hier: ''webCmd'') auswählen und in dem Textfeld rechts daneben die gewünschten Werte eintragen, hier ''on:off''. Schließen Sie Ihre Eingabe durch Klick auf den Button ''attr'' ab.
Auch hier handelt es sich um ein Attribut mit dem Namen webCmd und den Werten on:off, das dem device ''mySwitch1'' hinzugefügt wird. Statt den o.g. Befehl in das Kommandofeld einzugeben, können Sie auch im unteren Bereich der Detailansicht das gewünschte Attribut (hier: '''''webCmd''''') auswählen und in dem Textfeld rechts daneben die gewünschten Werte eintragen, hier '''''on:off'''''. Schließen Sie Ihre Eingabe durch Klick auf den Button {{Taste|attr}} ab.


[[Datei:ErsteSchritteInFhem05.png]]
[[Datei:ErsteSchritteInFhem05.png]]


Klicken Sie nun wieder links auf den ''Schulungsraum''.
Klicken Sie nun wieder links auf den Raum ''Training''.


Sie sehen, dass durch die Attribut-Angabe im vorhergehenden Schritt, nun in der Raumansicht die Schaltflächen für ''on'' und ''off'' hinzugekommen sind.
Sie sehen, dass durch die Attribut-Angabe im vorhergehenden Schritt nun in der Raumansicht die Schaltflächen für ''on'' und ''off'' hinzugekommen sind.


[[Datei:ErsteSchritteInFhem06.png]]
[[Datei:ErsteSchritteInFhem06.png]]
Zeile 70: Zeile 91:
Klicken Sie versuchsweise auf ''on'' und ''off'': Statt der bisher angezeigten ''???'' erscheint nun ein Glühbirnensymbol, das den aktuellen Status darstellt.
Klicken Sie versuchsweise auf ''on'' und ''off'': Statt der bisher angezeigten ''???'' erscheint nun ein Glühbirnensymbol, das den aktuellen Status darstellt.


Wenn Sie durch Klicken auf den Device-Namen ''mySchalter1'' wieder in die Detailansicht wechseln, sehen Sie, dass im Block ''Internals'' nun auch der aktuelle Zustand ''STATE'' angezeigt wird. Dieser wird in der Raumansicht als Icon (Glühbirne) dargestellt.
Wenn Sie durch Klicken auf den Device-Namen ''mySwitch1'' wieder in die Detailansicht wechseln, sehen Sie, dass im Block ''Internals'' nun auch der aktuelle Zustand ''STATE'' angezeigt wird. Dieser wird in der Raumansicht als Icon (Glühbirne) dargestellt.


[[Datei:ErsteSchritteInFhem07.png]]
[[Datei:ErsteSchritteInFhem07.png]]


Auch sehen Sie im Detail-Bildschirm einen neuen Block ''Readings''. Dieser zeigt Informationen an, die - anders als Attribute - nicht direkt vom Anwender geändert werden können. Unter anderem werden hier Datum und Uhrzeit der letzten Zustandsänderung angezeigt.
Auch sehen Sie im Detail-Bildschirm einen neuen Block ''Readings''.
 
Schalten Sie ''mySwitch1'' noch einmal aus. Achten Sie beim Schalten auf die Readings: Neben dem Internal ''STATE'' gibt es ein Reading gleichen Namens, das aber (siehe oben: Grundbegriffe; Perl unterscheidet zwischen Groß- und Kleinschreibung) mit einem Zeitstempel versehen ist.  Prüfen Sie, ob das Reading ''state'' incl. seines Zeitstempels aktualisiert wurde.
 
==Event monitor==
 
Devices kommunizieren über so genannte ''Events'' (Ereignisse) miteinander. Ein device sendet ein Event an FHEM und FHEM verteilt dieses Event an alle devices. Diese devices wiederum entscheiden dann, ob und wie sie auf das Event reagieren. Das Verständnis von Events und wie sie aufgebaut sind ist elementar und wir werden sie noch oft benötigen. Wir wollen daher Events ein wenig näher kennenlernen und uns dazu den Eventmonitor anschauen. Dieser Eventmonitor zeigt alle aktuellen Events in FHEM an.
 
Öffnen Sie dazu in Ihrem Browser ein zusätzliches Fenster, in dem Sie neben FHEM den '''[[Event monitor]]''' anzeigen. Am schnellsten geht das, indem Sie mit der rechten Maustaste auf ''Event monitor'' klicken und aus dem Kontextmenü des Browsers ''Öffnen in neuem Fenster'' auswählen. Legen Sie die Fenster so übereinander, dass Sie gleichzeitig den Event monitor sehen und Ihren ''mySwitch1'' bedienen können. Unter Windows ab Version 7 geht das am Einfachsten, wenn Sie zuerst das eine Fenster aktivieren und {{Taste|Windows}}+{{Taste|Pfeil rechts}} drücken, anschließend das selbe mit dem anderen Fenster und {{Taste|Windows}}+{{Taste|Pfeil links}} wiederholen.
 
[[Datei:ErsteSchritteInFhem08.png]]
 
Schalten wir ''mySwitch1'', so löst unser device ein Event aus und FHEM verteilt es an alle anderen devices. Bei jeder Betätigung des Schalters erscheint ein neues Event im ''Event monitor''. Probieren Sie auch, was passiert, wenn Sie zweimal hintereinander auf ''on'' klicken.
 
Im Eventmonitor wird ein Event immer durch einen Zeitstempel beschrieben. Es folgen der Typ des auslösenden Gerätes (hier ''dummy''), der Name des Device, welches das Ereignis auslöst (hier ''mySwitch1'') und zuletzt der ausgelöste Befehl (hier ''on'' oder ''off'').
 
Andere FHEM-Geräte (beispielsweise eine Fernbedienung oder ein Funkschalter an der Wand) erzeugen bei jedem Tastendruck oder bei Klick einen Event. Diese Events erscheinen ebenfalls im Event monitor.
 
==Schalten von Geräten - set==
''mySwitch1'' kann also über Klicken auf ''on'' oder ''off'' geschaltet werden. Alternativ geht das auch über die Eingabe eines Befehls in das Kommandofeld.
 
Geben Sie dazu in das Kommandofeld <code>set mySwitch1 on</code> oder <code>set mySwitch1 off</code> ein und bestätigen jeweils mit der {{Taste|Enter}}-Taste. Auch hierbei ändert sich der Schaltzustand und ein Event wird ausgelöst. Den ''set''-Befehl werden wir ebenfalls noch häufig verwenden.
 
Für weitere Tests legen wir nun ein neues Device '''''myLamp1''''' an. Diese wollen wir später mit '''''mySwitch1''''' bedienen.
define myLamp1 dummy
Da dies eine Lampe, also einen Aktor darstellen soll, werden wir der Lampe selbst keine Buttons für ''on'' oder ''off'' geben.
 
Die Lampe soll im Training stehen. Diese Zuordnung könnten Sie wie zuvor über die Kommandozeile erreichen. Diesmal sind wir aber tippfaul und möchten die Zuordnung durch Klicken vornehmen.
 
Da ''myLamp1'' noch keinem Raum zugeordnet ist, erscheint sie im Raum ''Unsorted''. Wechseln Sie in diesen Raum und klicken Sie auf den Namen von ''myLamp1'', um in die Detailansicht zu gelangen.
 
[[Datei:ErsteSchritteInFhem09.png]]
 
Im unteren Bereich können wir wieder die Attributzuordnung vornehmen.
 
Praktischerweise ist das Attribut ''room'' bereits ausgewählt. Bei einem Klick in das Eingabefeld neben ''room'' öffnet sich eine Dialogbox mit allen in FHEM bereits angelegten Räumen. Durch Anklicken der Raumnamen können Sie ein oder mehrere Räume auswählen. Wählen Sie den Raum ''Training'' aus und bestätigen Sie die Dialogbox mit OK. Der ausgewählte Raum wird in das Eingabefeld übernommen und Sie müssen nur noch auf den Button {{Taste|attr}} klicken.
 
Wechseln Sie nun wieder in den Raum ''Training''. Es werden beide Geräte angezeigt.
 
[[Datei:ErsteSchritteInFhem10.png]]
 
==Bei Event ausführen - notify==
 
Im nächsten Schritt werden wir FHEM beibringen, auf einen Event von ''mySwitch1'' zu reagieren. Im Beispiel soll immer dann, wenn ''mySwitch1'' einen Event mit dem Befehl ''on'' auslöst, das Gerät ''myLamp1'' eingeschaltet werden.
 
Dazu wird in FHEM ein "notify" verwendet. Die Befehlsstruktur ist
define <NAME> notify <REGEXP> <command>
Diese Befehlsstruktur besteht erkennbar aus drei Teilen.
 
*Der Name '''<NAME>''' dient später dazu, dieses FHEM-Device anzeigen und wiederfinden zu können. Als Name verwende ich hier ''n_mySwitch1_on'', also ''n_'' um es als Notify kenntlich zu machen, dann das auslösende Gerät ''mySwitch1'' und den auslösenden Event ''on''. Sie können das notify ganz nach Gusto ''n1'' nennen oder ''Karlheinz''.  Mein Name scheint auf den ersten Blick kompliziert, ist aber hilfreich, wenn Sie später mehrere Notify angelegt haben. Device-Namen dürfen aus den Zeichen '''a-z''', '''A-Z''', '''0-9''', '''Unterstrich _''' und '''Punkt .''' bestehen, wobei ein Punkt nicht an erster Stelle stehen darf. Sie werden später sehen, dass der Punkt in perl und damit FHEM eine besondere Bedeutung hat, wenn möglich sollten Sie daher auf seine Verwendung in Device-Namen verzichten.
*'''<REGEXP>''' steht für "Regular Expression" (auch reguläre Ausdrücke) und definiert die Bedingung, wann das Notify ausgeführt werden soll. Hierauf gehen wir gleich genauer ein, da reguläre Ausdrücke in perl und FHEM sehr häufig verwendet werden.
*'''<command>''' definiert, was denn eigentlich ausgeführt werden soll. In unserem Beispiel soll das <code>set myLamp1 on</code> sein.
 
Reguläre Ausdrücke dienen dazu, bestimmte (syntaktische) Eigenschaften von Zeichenketten zu beschreiben. So kann man mit Hilfe eines Regex beispielsweise prüfen, ob ein bestimmtes Wort in einer Zeichenkette enthalten ist oder ob es nicht in der Zeichenkette vorkommt, man kann Zahlen in einer Zeichenkette identifizieren und vieles mehr. Sie werden sich mit Regex später detaillierter auseinandersetzen dürfen :)
 
Wann immer in FHEM ein Event auftritt, wird dieses an alle notifies weitergeleitet. Jedes Notify prüft nun, ob es auf das Ereignis reagieren soll. Das geschieht, indem mit Hilfe reguläre Ausdrücke geprüft wird, ob das gerade weitergeleitete Event den oben genannten Befehl auslösen soll. Man spricht auch davon dass geprüft wird, ob Ereignis und notify "matchen". In unserem Fall löst ''mySwitch1'' ein Event mit dem Befehl ''on'' aus. Um dieses Event "abzufangen" und darauf zu reagieren, wird für die Regular Expression die Schreibweise <code>mySwitch1:on</code> verwendet. In einem notify werden Events also dadurch abgefangen, indem wir das device (auf das reagiert werden soll) und der Befehl (auf den reagiert wird) durch einen Doppelpunkt trennen. Diese Syntax gilt für alle notifies. (Bei anderen Modulen kann es sein, dass Events durch eine andere Schreibweise "angefangen" werden müssen.)
 
Unser Notify wird also erstellt mit
define n_mySwitch1_on notify mySwitch1:on set myLamp1 on
 
Nach Eingabe dieses Befehls in das Kommandofeld, abgeschlossen durch {{Taste|Enter}}, sehen Sie wieder die Detailansicht des neuen FHEM-Device, also des Notify (siehe TYPE).
 
[[Datei:ErsteSchritteInFhem11.png]]
 
Im Block ''Internals'' sehen Sie hier die Definition '''DEF'''. Angezeigt wird hier alles, was bei der Definition nach dem Wort "notify", also nach dem Gerätetyp angegeben wurde. Es erscheinen also ''<regexp>'' und ''<command>''.
{{Hinweis|Im Block '''''Probably associated with''''' werden alle FHEM-Devices angezeigt, die mit dem Notify verbunden sind. Die Geräte werden als klickbare Device-Namen angezeigt. Das ist praktisch, da man so mit einem Klick zur Detailansicht des jeweiligen Geräts springen kann.}}
 
Ordnen Sie auch das Notify unserem Training zu (im unteren Bereich das Attribut ''room'' und den passenden Raum auswählen und dann auf ''attr'' klicken).
 
Wenn Sie nun im FHEM-Menü auf ''Training'' klicken, werden unsere drei FHEM-Devices angezeigt.
 
[[Datei:ErsteSchritteInFhem12.png]]
 
{{Hinweis|Üblicherweise würde man das Notify keinem Raum zuordnen, da es später für den Benutzer gar nicht sichtbar sein soll. Für unsere Testdurchläufe ist es aber praktischer.}}
 
Wenn Sie nun ''mySwitch1'' auf ''on'' schalten, wird auch ''myLamp1'' auf ''on'' geschaltet. Das funktioniert scheinbar nur beim ersten Mal – wenn Sie aber den Event Monitor prüfen oder in der Detailansicht von ''myLamp1'' auf den Zeitstempel der letzten Statusänderung schauen, werden Sie sehen, dass es jedes Mal ausgeführt wird.
 
Damit das Ganze auch beim Ausschalten funktioniert, legen Sie ein zweites notify an:
define n_mySwitch1_off notify mySwitch1:off set myLamp1 off
Funktioniert es wie erwartet?
 
 
Natürlich möchte man nicht für jeden Befehl, den ein Device auslöst, ein eigenes Notify anlegen. Es geht auch einfacher.
Statt
define n_mySwitch1_on  notify mySwitch1:on  set myLamp1 on
define n_mySwitch1_off notify mySwitch1:off set myLamp1 off
definieren wir nun
define n_mySwitch1 notify mySwitch1 set myLamp1 '''$EVENT'''
Wir sehen, dass die Regex nun nicht mehr unterscheidet, ob ''mySwitch1'' den Event ''on'' oder ''off'' sendet. Lassen wir diese Angabe weg, löst dieses Notify bei jedem Event von ''mySwitch1'' aus, egal mit welchem Kommando. Im auszuführenden ''set''-Befehl verwenden wir nun die FHEM-Variable '''$EVENT''' (Groß/Kleinschreibung beachten!). Dies ist ein Platzhalter für den Befehl, der vom auslösenden Event übernommen wird. Wenn also ''mySwitch1'' ein ''on'' auslöst, nimmt '''$EVENT''' den Wert ''on'' an. Entsprechend für ''off'' oder jeden anderen Befehl.
 
==Devices löschen oder deaktivieren – delete, disable==
Wenn Sie den Event Monitor beachten, werden Sie sehen, dass nach jeder Betätigung von ''mySwitch1'' der Befehl für ''myLamp1'' nun zweimal ausgeführt wird. Das liegt daran, dass auf jeden Event von ''mySwitch1'' zwei Notify reagieren – sowohl die "alten" Notify wie auch das Neue. Um dies zu umgehen, müssen wir die alten Notify loswerden. Dazu gibt es zwei Möglichkeiten.
 
#Löschen Sie ein Notify mit dem Befehl <code>delete <name></code>, z.B. mit <code>delete n_mySwitch1_on</code>. Der <code>delete</code> Befehl funktioniert übrigens für jedes Objekt in FHEM. Sie können damit also auch "echte" Devices löschen.
#Deaktivieren Sie ein Notify, indem Sie das Attribut ''disable'' verwenden. Geben Sie dazu in der Kommandozeile <code>attr n_mySwitch1_off disable 1</code> ein. Dadurch taucht in der Detailansicht des Notify im unteren Bereich das Attribut ''disable'' auf. Dieses kann man nun auf zwei Arten ändern, entweder über die Kommandozeile oder über die Detailansicht (dort den Wert ''1'' oder ''0'' auswählen, dann {{Taste|attr}} klicken).
 
==Save Config==
 
Wann immer Sie mit dem aktuellen Zustand Ihrer FHEM-Konfiguration zufrieden sind, klicken Sie im FHEM-Menü oben links einmal auf '''''Save config''''' oder geben Sie in das Kommandofeld den Befehl <code>save</code> ein. Ihre Konfiguration wird nun gespeichert. Tun Sie das nicht, sind alle Änderungen nach dem nächsten FHEM-Neustart '''verloren'''. FHEM erinnert Sie deshalb an ungespeicherte Änderungen durch ein rotes Fragezeichen neben '''''Save config'''''.
 
==Bestehende Devices verändern – modify==
 
Wir legen nun eine zweite Lampe an, die ebenfalls durch unseren ''mySwitch1'' und unser Notify geschaltet werden soll.
Die neue Lampe wird durch folgende Eingabe in das Kommandofeld erzeugt:
define myLamp2 dummy
 
Durch "Zusammenklicken" im Detail-Bildschirm von ''myLamp2'' ordnen Sie diese ebenfalls dem Raum ''Training'' zu und weisen ihr über das Attribut ''webCmd'' Schaltflächen für ''on'' und ''off'' zu.
 
 
[[Datei:ErsteSchritteInFhem13.png]]
 
 
Nun passen wir das Notify ''n_mySwitch1'' an. Dazu navigieren Sie auf den Detail-Bildschirm des Notify: Wechseln Sie in den Raum ''Training'' und klicken Sie auf den Namen von ''n_mySwitch1''.
 
Im Detail-Bildschirm befindet sich die Zeile ''DEF'', die wir uns vorhin schon einmal angeschaut haben. Wenn Sie auf das Wort ''DEF'' klicken, können Sie die Definition eines FHEM-Objekts bearbeiten.
 
{{Hinweis|Im Feld ''DEF'' wird nur der Teil der Definition angezeigt, der beim Anlegen dieses Notify nach dem Objekttyp, also ''notify'' folgt. Sie finden hier also zunächst die Regex auf die das Notify reagiert, dann nach einer Leerstelle den auszuführenden Befehl.
Der Lesbarkeit halber ist im Folgenden immer das gesamte define-Statement dargestellt, auch wenn man es im Feld ''DEF'' nicht vollständig sieht.}}
 
Wir ändern hier also von
define n_mySwitch1 notify mySwitch1 set myLamp1 $EVENT
zu
define n_mySwitch1 notify mySwitch1 set myLamp1,myLamp2 $EVENT
 
 
[[Datei:ErsteSchritteInFhem14.png]]
 
 
Zum Beenden der Bearbeitung klicken Sie auf die Schaltfläche '''''modify <name>''''', hier also {{Taste|modify n_mySwitch1}}. Wenn Sie die Angaben im Detail-Bildschirm prüfen, sehen Sie, dass die ''DEF''inition des Notify angepasst wurde.
 
[[Datei:ErsteSchritteInFhem14B.png]]
 
Beachten Sie auch hier wieder, dass im Detailscreen im unteren Bereich unter ''Probably associated with'' die geschalteten Lampen erscheinen – das wird noch oft nützlich sein.
 
{{Hinweis|Über den Link '''''Device specific help''''' können Sie sich übrigens den gesamten Hilfe-Text zu Ihrem device-Typ aus der commandref anschauen, hier also den Hilfetext zu ''notify''. Dieser Link ist gerade zu Beginn häufig hilfreich.}}
 
Nun können Sie testen, ob ein Klick auf ''mySwitch1'' auch wirklich beide Lampen schaltet. Schauen Sie sich dabei auch wieder in einem separaten Fenster mit dem Event Monitor die entstehenden Events an.
 
 
[[Datei:ErsteSchritteInFhem15.png]]
 
==Mehrere Devices schalten==
 
Zum Schalten mehrerer Devices kann also verwendet werden
set <device1>,<device2> on
 
Eine alternative Schreibweise dafür ist
set <device1> on; set <device2> on
 
Auch eine Kombination ist möglich:
set <device1>,<device2> on; set <device3> off
 
 
Auch innerhalb eines notify (oder anderen FHEM-Befehlen) kann man mehrere Befehle auflisten, jedoch ist hier eines zu beachten:
define n1 notify mySwitch1:on set myLamp1 on;set myLamp2 off
Die Befehle sind durch ein Semikolon getrennt. Effekt ist: Das notify schaltet myLamp1 wann immer mySwitch1 den Event on sendet. Der nächste Befehl in dieser Zeile ist ''set myLamp2 off''. Dieser wird '''sofort''' bei der Eingabe der o.g. Befehlszeile abgearbeitet. Es schaltet also myLamp2 sofort, myLamp1 erst nach dem Event von mySwitch1.
 
Soll auch der zweite Befehl ''set myLamp2 off'' erst nach dem Event ausgeführt werden, muss ein doppeltes Semikolon genutzt werden:
define n1 notify mySwitch1:on set myLamp1 on;;set myLamp2 off
 
Die kombinierte Variante könnte so aussehen:
define n1 notify mySwitch1:on set myLamp1 on;;set myLamp2 off;set myLampe3 on
Diese Befehlszeile würde also myLampe3 sofort schalten, aber erst nach dem Event von mySwitch1 schalten myLamp1 und myLamp2.
 
==Devices umbenennen==
 
Schließlich wollen wir (zur Übung) noch ein Device umbenennen: Aus '''''myLamp2''''' soll '''''myStandardLamp''''' werden. Dafür verwenden wir
rename <alterName> <neuerName>
 
Hierbei ist zu beachten, dass zugehörige notify-Anweisungen '''nicht''' automatisch aktualisiert werden. Beachten Sie also vor dem Umbenennen im unteren Bereich des Detail-Bildschirms die Liste ''Probably associated with'', damit Sie bei der folgenden Anpassung keines Ihrer Notify vergessen.
 
Geben Sie also in das Kommandofeld ein
rename myLamp2 myStandardLamp
und passen Sie anschließend ''n_mySwitch1'' an, indem Sie auf dessen Detail-Bildschirm im Bereich ''DEF'' die Definition anpassen.
 
Nach der Änderung muss das Notify lauten
define n_mySwitch1 notify mySwitch1 set myLamp1,myStandardLamp $EVENT
 
 
[[Datei:ErsteSchritteInFhem16.png]]
 
 
==Zeitgesteuert schalten - at==
 
Im nächsten Schritt soll eine Zeitsteuerung eingerichtet werden.
Zunächst möchten wir erreichen, dass ''myLamp1'' nach einer Minute ausgeschaltet wird wie z.B. ein Treppenhauslicht.
 
{{Hinweis|Damit Sie den Effekt sehen können, schalten Sie ''myLamp1'' vorher auf ''on''.}}
 
Für Zeitsteuerungen gibt es den FHEM-Device-Typ ''at''. Die Befehlsstruktur ist
define <name> at <timespec> <command>
'''<name>''' und '''<command>''' haben hier dieselbe Funktion wie bei notify. Neu ist hier lediglich '''<timespec>''' (time specification), also die Zeitangabe. Diese erfolgt in der Schreibweise ''HH:MM:SS'' oder ''HH:MM''.
 
Um '''''myLamp1''''' also '''in einer Minute auszuschalten''', erzeugen Sie folgendes ''at'':
define a_myLamp1 at +00:01:00 set myLamp1 off
 
 
[[Datei:ErsteSchritteInFhem17.png]]
 
 
Probieren Sie es aus.
Wird ''myLamp1'' nach einer Minute ausgeschaltet?
Wird dabei ein Event erzeugt?
 
Wenn Sie sich die Detailansicht des ''at'' anschauen möchten, müssen Sie sich übrigens beeilen: Nach der einmaligen Ausführung wird das ''at'' automatisch gelöscht. Falls FHEM schneller war, können Sie es ja noch einmal anlegen und ggf. eine längere Zeitspanne angeben :-)
 
Bei  <timespec> kann man die Sekunden auch weglassen und einfach nur HH:MM schreiben. Außerdem gibt es mehrere Varianten:
{|class="wikitable"
|+Varianten von Zeitangaben für ''at''
|-
!Notation
!Erklärung
|-
|style="text-align: right;"|+00:02:00
|In zwei Minuten; einmalige Ausführung
|-
|style="text-align: right;"|00:02:00
|Um zwei Minuten nach Mitternacht, also um 00:02 Uhr und 0 Sekunden; einmalige Ausführung
|-
|style="text-align: right;"|*00:02:00
|Täglich um 00:02 Uhr
|-
|style="text-align: right;"|+*00:02:00
|Alle 2 Minuten
|-
|style="text-align: right;"|+*{3}00:02
|Dreimal, alle zwei Minuten
|-
|style="text-align: right;"|*{3}00:02
|Dreimal um 00:02 Uhr
|-
|style="text-align: right;"|*{sunset_rel()}
|Täglich zu Sonnenuntergang
|-
|style="text-align: right;"|*{sunrise(+120)}
|Täglich 2 Minuten (120 Sekunden) nach Sonnenaufgang
|}
*Durch die Angabe von '''*''' wird also eine dauerhafte Wiederholung definiert. Die Wiederholungen laufen so lange, bis das ''at'' gelöscht oder disabled wird.
*Durch die Angabe von '''+''' wird die angegebene Zeit nicht mehr als absolute Uhrzeit interpretiert, sondern als Timer, nach wie vielen Stunden:Minuten:Sekunden der Befehl ausgeführt wird.
*Durch die Angabe von '''''{n}''''' wird das ''at'' nur n-mal durchlaufen.
*Die Funktionen '''''{sunset_rel()}''''' und '''''{sunrise()}''''' liefern die passende Uhrzeit zurück. Durch Angabe von '''''*''''' wird dies täglich wiederholt. Die geschweiften Klammer zeigen an, dass FHEM den Inhalt dieser Klammern direkt als Perl-Funktionen ausführt.
 
Um bspw. täglich zu Sonnenaufgang die Gartenbeleuchtung auszuschalten, definieren Sie so etwas wie
define a_gardenLight_morning_off at *{sunrise()} set gardenLight off
 
 
[[Datei:ErsteSchritteInFhem18.png]]
 
Im Detailscreen eines ''at'' wird übrigens im ''STATE'' der Zeitpunkt der nächsten Ausführung angezeigt.  
 
Diese Info erscheint auch in der Raum-Ansicht, falls Sie das ''at'' dort anzeigen lassen:
 
[[Datei:ErsteSchritteInFhem18B.png]]
 
==Timer bei einem Event starten - notify und at==
{{Randnotiz|RNText='''Zeit- und Ereignissteuerung mit DOIF'''
Seit Erscheinen des ursprünglichen Artikels Anfang 2014 ist eine weitere Möglichkeit der Zeit- und Ereignissteuerung eingeführt worden.
 
Siehe: [[DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erläuterungen#Erste_Schritte_mit_DOIF:_Zeit-_und_Ereignissteuerung|'''Erste Schritte mit DOIF: Zeit- und Ereignissteuerung''']]
 
Der Autor des ursprünglichen Artikels hat freundlicherweise zugestimmt diesen Artikel mit einem Link zu ergänzen.}}
Als letzte Übung wollen wir ein ''notify'' und ein ''at'' verbinden. Der Timer soll nun nicht starten, wenn Sie den Befehl in das Kommandofeld eingeben, sondern wenn ein Event eintritt.
 
[[Datei:GotoRAW-Import firststeps.PNG|thumb|left|300px]]Dazu basteln wir uns ein Stairwell: Legen Sie dafür die Dummy-Devices ''sw_Switch'' und ''sw_Light'' im Raum ''Stairwell'' an. Um die folgenden Befehle an einem Stück eingeben zu können, klicken Sie auf das umrahmte "+"-Symbol neben der Kommandozeile (Nur im Standard Style f18 vorhanden - beachten Sie dazu diesen Artikel [[Import_von_Code_Snippets]]), fügen die folgenden Zeilen mit copy&paste in das daraufhin erscheinende Dialogfeld ein und drücken auf {{Taste|Execute}}:
 
define sw_Switch dummy
attr  sw_Switch room Stairwell
attr  sw_Switch webCmd on
define sw_Light dummy
attr  sw_Light room Stairwell
[[Datei:RAW-Import firststeps.PNG]]
 
Anschließend können Sie das Dialogfeld wieder schließen oder auch die nachfolgenden Befehle darüber eingeben. Beachten Sie, dass mit ''Execute'' alle Anweisungen aus dem Dialogfeld ausgeführt werden, was ggf. zu Fehlermeldungen führen kann, wenn z.B. ein Gerät bereits definiert ist. Zeilen mit Anweisungen, die bereits in die Konfiguration übernommen wurden, können Sie daher getrost löschen, um solche Effekte zu vermeiden.
 
Nun fehlt noch das Notify, welches auf ''sw_Switch:on'' reagiert und daraufhin zwei Befehle ausführt:
*Einschalten des Treppenhauslichts mit <code>set sw_Light on</code>
*Einen Timer starten, der es nach einer Minute wieder ausschaltet. Also <code>define a1 at +00:01 set sw_Light off</code>.
 
Das sieht dann so aus (und muss ins Kommandofeld als '''eine''' Zeile eingegeben werden):
define n_sw_Switch_on notify sw_Switch:on
        set sw_Light on;;define a1 at +00:01 set sw_Light off
Beim Auslösen des Notify wird also als Kommando das Einschalten des Treppenhauslichts ausgelöst, wie auch das Definieren eines Timers, der es eine Minute später wieder ausschaltet.
Funktioniert es?
 
 
[[Datei:ErsteSchritteInFhem19.png]]
 
 
Da das ja doch recht sperrig ist, gibt es noch eine etwas einfachere Alternative:
define n_sw_Switch_on notify sw_Switch:on set sw_Light on;;sleep 60;;set sw_Light off
 
Manche Hardwaresysteme bieten auch den Befehl ''on-for-timer'', mit dem man alternativ schreiben kann
define n_sw_Switch_on notify sw_Switch:on set sw_Light on-for-timer 60
 
==Wie geht es weiter?==
 
Sie haben nun kennengelernt:
* Das Anlegen von FHEM-Devices mit '''define'''
* '''Events''' und den Event-Monitor
* Schalten von Devices mit '''set'''
* Verändern von Devices mit '''modify''', '''rename''' und '''delete'''
* Das Setzen und Bearbeiten von '''Attributen'''
* Event-getriebene Aktionen durch '''notify'''
* Zeitgesteuertes Schalten mit '''at'''
 
Damit kennen Sie die grundlegendsten Mechanismen von FHEM. Details zu diesen Befehlen finden Sie in der FHEM Befehlsreferenz {{Link2CmdRef}}.
 
'''Tipp:''' Zu vielen FHEM-Befehlen und Gerätetypen gibt es auch eine deutschsprachige Beschreibung. Klicken Sie dazu in der commandref oben links auf den Link "DE".
 
In der commandref finden Sie neben der Beschreibung aller FHEM-Befehle auch die Liste aller Gerätetypen, die in FHEM eingebunden werden können.
 
Sie werden feststellen, dass "echte" FHEM-Devices grundsätzlich genau so aussehen, wie die dummy-Devices, die Sie hier bereits kennengelernt haben. Der wesentliche Unterschied ist, dass Sie die verfügbaren Befehle nicht mehr selbst mittels ''attr webCmd'' festlegen müssen, da diese bereits durch das FHEM-Device vorgegeben sind. Und Events werden nicht nur ausgelöst, wenn Sie im FHEM-Webfrontend klicken, sondern auch, wenn das physische Gerät (also der Bewegungssensor oder der Lichtschalter an der Wand) auslöst.
 
Sobald Sie ihre ersten Geräte an FHEM gekoppelt haben, schauen Sie sich den Event-Monitor an, um zu sehen, wann welche Events ausgelöst werden.
 
Einen umfangreicheren Einstieg in FHEM finden Sie im Dokument [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung-mit-FHEM]
 
Die für FHEM wichtigen Grundlagen der Programmiersprache Perl kann man in den ersten Kapiteln eines Perl-Buches oder diversen frei im Internet verfügbaren Perl-Tutorials nachlesen.
 
Viel Spaß und Erfolg mit FHEM !


Schalten Sie ''mySchalter1'' noch einmal aus und prüfen Sie, ob das Reading ''STATE'' incl. seines Zeitstempels aktualisiert wurde.
[[Kategorie:HOWTOS]]

Aktuelle Version vom 22. November 2024, 14:40 Uhr

Für alle, die das erste mal mit FHEM arbeiten, hier ein kleiner Kurs zum Einstieg. Dieser ist so aufgebaut, dass man noch keine Hardware benötigt und nach dem Installieren der FHEM-Software sofort loslegen kann.

Diese Anleitung wurde ursprünglich von Ulrich Maass publiziert, der die Genehmigung erteilt hat, sie auch im Wiki zu veröffentlichen.

Anmerkung zur Bearbeitung: Korrekturen von Tippfehlern kann jeder machen. Redaktionelle Änderungen und Erweiterungen aber bitte mit dem Autor (z.B. auf der zugehörigen Diskussionsseite) abstimmen.

Der erste Einstieg

Um FHEM zum ersten Mal aufzurufen, geben Sie im Browser ein:

http://<ip-Adresse>:8083

also z.B. http://192.168.1.1:8083. Sie gelangen auf den Startbildschirm:

ErsteSchritteInFhem01.png

  • Am oberen Bildschirmrand sehen Sie das weiße Kommandofeld, in das Sie Befehle tippen können.
  • Links daneben befindet sich ein umrahmtes "+"-Symbol, über das Sie ein mehrzeiliges Eingabefeld erreichen können; mehr dazu später.
  • Als ersten Menüpunkt sehen Sie die Schaltfläche Save config, mit der Änderungen so gespeichert werden, dass sie auch nach einem Neustart noch vorhanden sind.
  • Außerdem gibt es bereits die Räume Unsorted und Everything, die wir bald kennenlernen.
  • Im unteren Block befinden sich weitere Links, auf die wir später ebenfalls eingehen.

Der Hinweis Security Check besagt, dass Sie noch kein Passwort für FHEM eingerichtet haben. Wie man einen Passwortschutz einrichten kann, steht im Detail in der FHEM-Befehlsreferenz commandref/allowed, in der es übrigens eine Beschreibung zu allen Funktionen und Modulen von FHEM gibt. Um diese Meldung erst einmal zu unterdrücken, geben Sie in das Kommandofeld ein:

attr global motd none

und bestätigen Ihre Eingabe mit der Enter-Taste oder klicken alternativ einfach auf den gleichnamigen Link.

ErsteSchritteInFhem02.png

Device anlegen - define

Das Grundgerüst von FHEM sind "devices". Typische Devices sind beispielsweise Funksteckdosen, Rolladenmotoren, Temperaturmessgeräte, Magnetventile usw. Aber andere Dinge, die man auf den ersten Blick nicht als physisches Gerät bezeichnen würde, sind Device: So etwa ist die Benutzeroberfläche von FHEM selbst ein device ("FHEMWEB"), ebenso gibt es Devices ohne physische Geräte, die dazu benutzt werden können, um eine Variable zu speichern. Ein sehr einfaches Device, dummy genannt, legen wir jetzt an.

Das dummy devices ist insofern ein besonderes Objekt, weil es nicht unbedingt ein korrespondierendes physisches Gerät (eine physische Lampe, ein Rolladen, ein Magnetventil) benötigt. So können Sie diese Schritte auch ohne ein Hardware-System durchführen bzw. kann hier eine allgemeine Einführung erfolgen, ohne auf die Unterschiede der einzelnen Hardwaresysteme einzugehen. Ein Dummy-Device sieht auf der FHEM-Oberfläche im Allgemeinen genau so aus, wie ein FHEM-Device zu einem physisch vorhandenen Gerät Ihres Hardwaresystems.

Zunächst legen wir einen Schalter an. Dieser soll einen Lichtschalter an der Wand simulieren. Geben Sie dazu folgenden Befehl in das Kommandofeld ein:

define mySwitch1 dummy

"define" ist der FHEM-Befehl, "mySwitch1" der zukünftige Name des devices und "dummy" bezeichnet den Typ. Die Worte define und dummy gehören zur Befehlssyntax von FHEM und können nicht verändert werden, mySwitch1 ist (mehr oder weniger) frei wählbar. Nach drücken der Enter-Taste wird die Detail-Ansicht des neuen FHEM-Device mySwitch1 angezeigt.

ErsteSchritteInFhem03.png


Info blue.png
Jedes Device hat genau einen "Typ". Dieser Typ legt gleichzeitig die Perl-Befehlsdatei (man spricht präziser vom "Modul") fest, in der bestimmte Routinen und Eigenschaften festgehalten sind. Ist etwa ein Device vom Typ dummy, so weiß FHEM, dass die Routinen und Eigenschaften im Modul 98_dummy.pm liegen. (Die Zahl 98 hatte früher eine Bedeutung, heute ist das nicht mehr der Fall, aus historischen Gründen wird sie aber immer noch verwendet.)


Info blue.png
Diese Einleitung soll Ihnen ein Gefühl für die Funktionsweise von FHEM vermitteln, ohne dass Ihnen konkrete physische Geräte (spezielle Funk- oder WLAN-Steckdosen, 433MHz-Sender, Homematic-Lampen, ZWave-Aktoren usw.) zur Verfügung stehen müssen. Um für diesen Kurs ein rein "virtuelles Gerät" nutzen zu können, greifen wir auf ein dummy-device zurück. Ein dummy wird Ihnen auch später noch häufig begegnen, wenn es darum geht, einen Testaufbau zu erläutern oder zur Steuerung eines Programmablaufs Informationen userseitig verfügbar zu machen. Beachten Sie dabei aber bitte immer, dass Ihnen später auch sehr viele andere Möglichkeiten offenstehen, um Informationen abzuspeichern, auszuwerten oder anzuzeigen, sobald Sie FHEM-Geräte für physische Hardware angelegt haben. Statt hierfür Geräte des Typs dummy zu verwenden, wird es für Sie zukünftig häufig übersichtlicher sein, Informationen zu einem Gerät direkt bei diesem zu verwalten. Neben den Attributen und Readings, die die hierfür jeweils genutzen Module bereits automatisch bereitstellen, können Sie z.B. bei allen Devices weitere Attribute (userattr) oder Readings (setreading) selbst in fast beliebigem Umfang generieren und darin Ihre eigenen Informationen bereitstellen.


Devices haben einen "Zustand", der sich im Zeitablauf ändert und den FHEM registriert. So ist beispielsweise ein Fenster offen, ein Rolladenpanzer geschlossen und eine Funksteckdose hat Spannung. Ein Zustand muss dabei nicht exakt eine Variable beinhalten (Fenster entweder "offen" oder "geschlossen"), ein Zustand kann auch durch mehrere Variablen beschrieben werden (der Zustand eines Raspberry-Systems, device-type sysmon, umfasst beispielsweise die CPU-Frequenz, die CPU-Temperatur, den load und vieles mehr).

Dieser Zustand wird in FHEM durch insgesamt drei Größen erfasst. Diese Größen heißen Internals, Attribute und Readings. Es wäre jetzt zu früh, auf die Bedeutung der drei Begriffe im Detail einzugehen, aber folgende Anmerkungen sind für die nachfolgenden Schritte wichtig:

  • Internals enthalten ganz grundlegende Informationen zu dem device. Sie werden vom Nutzer in den seltensten Fällen direkt bearbeitet (meist nur bei der Einrichtung des devices).
  • Attribute sollen das Verhalten des devices steuern. Sie können vom Anwender typischerweise verändert (oder erst angelegt) werden.
  • Readings besitzen im Gegensatz zu den beiden anderen Größen einen Zeitstempel. Hier werden üblicherweise Messwerte des Gerätes erfasst.

Verwirrend für einen Anfänger kann sein, dass manchmal Internals wie auch Readings mit gleichem Namen (STATE und state) existieren können. Allerdings unterscheidet Perl zwischen Groß- und Kleinschreibung!


Info blue.png
Der Block Internals zeigt immer die grundlegende Ausprägung eines FHEM-device an:
  • NAME ist der von Ihnen vergebene Name.
  • TYPE ist der Typ des FHEM-device, hier dummy.
  • STATE ist der in allen Übersichten angezeigte Status des Geräts. Da noch keine Zuordnung stattgefunden hat, ist dieser zunächst ???.


Räume definieren

Im nächsten Schritt wollen wir Geräte ordnen und geeignet zusammenfassen. Beispielsweise könnten Sie es für sinnvoll erachten, die Geräte, die sich physisch (tatsächlich) in einem Raum befinden, auch in FHEM entsprechend anzuordnen. In einem "Schlafzimmer" sollen dann also entsprechende devices "Rolladen", "Zeitschalter" und "Radios" zu finden sein. Sie können aber auch andere Zuordnungen vornehmen; man könnte etwa alle Messinstrumente wie Thermometer, Stromzähler und Feuchtigkeitsfühler in einem (eventuell nur logisch und nicht physisch existierenden) Raum "Messinstrumente" erfassen. Der Name eines Raumes ist dabei beliebig.

Um dies zu tun, müssen Sie allen devices, die zum Raum gehören sollen, ein "Attribut" (siehe oben) hinzufügen. Dieses Attribut heißt room und muss als Wert den Namen des Raumes bekommen. Versuchen wir dies für unseren dummy. Hierzu verwenden Sie folgenden Befehl (abschließen der Eingabe mit Enter):

attr mySwitch1 room Training

Durch diesen Befehl wird dem Device mySwitch1 das Attribut room mit dem Wert Training hinzugefügt. Wieder gehören attr, mySwitch1 und room zur Befehlssyntax von FHEM und können nicht verändert werden, Training ist frei wählbar.

mySwitch1 gehört jetzt zum room Training. Durch diese Zuordnung ist dieser Raum in der Navigationsleiste links zur Liste der Räume hinzugefügt worden. Klicken Sie einmal auf den Raum Training.

ErsteSchritteInFhem04.png

Es werden nun alle Geräte angezeigt, die diesem Raum zugeordnet wurden. Bisher haben wir hier nur ein Gerät: mySwitch1, unseren dummy. Neben dem Device-Namen wird immer der Status des Device angezeigt, hier noch ???. Wenn Sie auf den Namen mySwitch1 klicken, gelangen Sie wieder in dessen Detailansicht.

Unser dummy wird in einem Block mit der Typbezeichnung dummy dargestellt. Diese Typbezeichnung können Sie ebenfalls ändern, wenn Sie ein weiteres Attribut "group" hinzufügen und einen (ebenfalls frei wählbaren) Namen vergeben: Gruppen sortieren devices innerhalb eines Raumes.

Anmerkung: Wenn Sie einen Raum löschen wollen, so tun Sie dies, indem Sie sämtliche devices aus dem Raum entfernen. Für unser Beispiel des Raums Training bedeutet es, dass in allen devices das Attribut room entfernt wird. Der Raum Training verschwindet dann von alleine.

Schaltbefehle definieren

Nun soll unser mySwitch1 Schalterflächen für on und off bekommen.

attr mySwitch1 webCmd on:off

Auch hier handelt es sich um ein Attribut mit dem Namen webCmd und den Werten on:off, das dem device mySwitch1 hinzugefügt wird. Statt den o.g. Befehl in das Kommandofeld einzugeben, können Sie auch im unteren Bereich der Detailansicht das gewünschte Attribut (hier: webCmd) auswählen und in dem Textfeld rechts daneben die gewünschten Werte eintragen, hier on:off. Schließen Sie Ihre Eingabe durch Klick auf den Button attr ab.

ErsteSchritteInFhem05.png

Klicken Sie nun wieder links auf den Raum Training.

Sie sehen, dass durch die Attribut-Angabe im vorhergehenden Schritt nun in der Raumansicht die Schaltflächen für on und off hinzugekommen sind.

ErsteSchritteInFhem06.png

Klicken Sie versuchsweise auf on und off: Statt der bisher angezeigten ??? erscheint nun ein Glühbirnensymbol, das den aktuellen Status darstellt.

Wenn Sie durch Klicken auf den Device-Namen mySwitch1 wieder in die Detailansicht wechseln, sehen Sie, dass im Block Internals nun auch der aktuelle Zustand STATE angezeigt wird. Dieser wird in der Raumansicht als Icon (Glühbirne) dargestellt.

ErsteSchritteInFhem07.png

Auch sehen Sie im Detail-Bildschirm einen neuen Block Readings.

Schalten Sie mySwitch1 noch einmal aus. Achten Sie beim Schalten auf die Readings: Neben dem Internal STATE gibt es ein Reading gleichen Namens, das aber (siehe oben: Grundbegriffe; Perl unterscheidet zwischen Groß- und Kleinschreibung) mit einem Zeitstempel versehen ist. Prüfen Sie, ob das Reading state incl. seines Zeitstempels aktualisiert wurde.

Event monitor

Devices kommunizieren über so genannte Events (Ereignisse) miteinander. Ein device sendet ein Event an FHEM und FHEM verteilt dieses Event an alle devices. Diese devices wiederum entscheiden dann, ob und wie sie auf das Event reagieren. Das Verständnis von Events und wie sie aufgebaut sind ist elementar und wir werden sie noch oft benötigen. Wir wollen daher Events ein wenig näher kennenlernen und uns dazu den Eventmonitor anschauen. Dieser Eventmonitor zeigt alle aktuellen Events in FHEM an.

Öffnen Sie dazu in Ihrem Browser ein zusätzliches Fenster, in dem Sie neben FHEM den Event monitor anzeigen. Am schnellsten geht das, indem Sie mit der rechten Maustaste auf Event monitor klicken und aus dem Kontextmenü des Browsers Öffnen in neuem Fenster auswählen. Legen Sie die Fenster so übereinander, dass Sie gleichzeitig den Event monitor sehen und Ihren mySwitch1 bedienen können. Unter Windows ab Version 7 geht das am Einfachsten, wenn Sie zuerst das eine Fenster aktivieren und Windows+Pfeil rechts drücken, anschließend das selbe mit dem anderen Fenster und Windows+Pfeil links wiederholen.

ErsteSchritteInFhem08.png

Schalten wir mySwitch1, so löst unser device ein Event aus und FHEM verteilt es an alle anderen devices. Bei jeder Betätigung des Schalters erscheint ein neues Event im Event monitor. Probieren Sie auch, was passiert, wenn Sie zweimal hintereinander auf on klicken.

Im Eventmonitor wird ein Event immer durch einen Zeitstempel beschrieben. Es folgen der Typ des auslösenden Gerätes (hier dummy), der Name des Device, welches das Ereignis auslöst (hier mySwitch1) und zuletzt der ausgelöste Befehl (hier on oder off).

Andere FHEM-Geräte (beispielsweise eine Fernbedienung oder ein Funkschalter an der Wand) erzeugen bei jedem Tastendruck oder bei Klick einen Event. Diese Events erscheinen ebenfalls im Event monitor.

Schalten von Geräten - set

mySwitch1 kann also über Klicken auf on oder off geschaltet werden. Alternativ geht das auch über die Eingabe eines Befehls in das Kommandofeld.

Geben Sie dazu in das Kommandofeld set mySwitch1 on oder set mySwitch1 off ein und bestätigen jeweils mit der Enter-Taste. Auch hierbei ändert sich der Schaltzustand und ein Event wird ausgelöst. Den set-Befehl werden wir ebenfalls noch häufig verwenden.

Für weitere Tests legen wir nun ein neues Device myLamp1 an. Diese wollen wir später mit mySwitch1 bedienen.

define myLamp1 dummy

Da dies eine Lampe, also einen Aktor darstellen soll, werden wir der Lampe selbst keine Buttons für on oder off geben.

Die Lampe soll im Training stehen. Diese Zuordnung könnten Sie wie zuvor über die Kommandozeile erreichen. Diesmal sind wir aber tippfaul und möchten die Zuordnung durch Klicken vornehmen.

Da myLamp1 noch keinem Raum zugeordnet ist, erscheint sie im Raum Unsorted. Wechseln Sie in diesen Raum und klicken Sie auf den Namen von myLamp1, um in die Detailansicht zu gelangen.

ErsteSchritteInFhem09.png

Im unteren Bereich können wir wieder die Attributzuordnung vornehmen.

Praktischerweise ist das Attribut room bereits ausgewählt. Bei einem Klick in das Eingabefeld neben room öffnet sich eine Dialogbox mit allen in FHEM bereits angelegten Räumen. Durch Anklicken der Raumnamen können Sie ein oder mehrere Räume auswählen. Wählen Sie den Raum Training aus und bestätigen Sie die Dialogbox mit OK. Der ausgewählte Raum wird in das Eingabefeld übernommen und Sie müssen nur noch auf den Button attr klicken.

Wechseln Sie nun wieder in den Raum Training. Es werden beide Geräte angezeigt.

ErsteSchritteInFhem10.png

Bei Event ausführen - notify

Im nächsten Schritt werden wir FHEM beibringen, auf einen Event von mySwitch1 zu reagieren. Im Beispiel soll immer dann, wenn mySwitch1 einen Event mit dem Befehl on auslöst, das Gerät myLamp1 eingeschaltet werden.

Dazu wird in FHEM ein "notify" verwendet. Die Befehlsstruktur ist

define <NAME> notify <REGEXP> <command>

Diese Befehlsstruktur besteht erkennbar aus drei Teilen.

  • Der Name <NAME> dient später dazu, dieses FHEM-Device anzeigen und wiederfinden zu können. Als Name verwende ich hier n_mySwitch1_on, also n_ um es als Notify kenntlich zu machen, dann das auslösende Gerät mySwitch1 und den auslösenden Event on. Sie können das notify ganz nach Gusto n1 nennen oder Karlheinz. Mein Name scheint auf den ersten Blick kompliziert, ist aber hilfreich, wenn Sie später mehrere Notify angelegt haben. Device-Namen dürfen aus den Zeichen a-z, A-Z, 0-9, Unterstrich _ und Punkt . bestehen, wobei ein Punkt nicht an erster Stelle stehen darf. Sie werden später sehen, dass der Punkt in perl und damit FHEM eine besondere Bedeutung hat, wenn möglich sollten Sie daher auf seine Verwendung in Device-Namen verzichten.
  • <REGEXP> steht für "Regular Expression" (auch reguläre Ausdrücke) und definiert die Bedingung, wann das Notify ausgeführt werden soll. Hierauf gehen wir gleich genauer ein, da reguläre Ausdrücke in perl und FHEM sehr häufig verwendet werden.
  • <command> definiert, was denn eigentlich ausgeführt werden soll. In unserem Beispiel soll das set myLamp1 on sein.

Reguläre Ausdrücke dienen dazu, bestimmte (syntaktische) Eigenschaften von Zeichenketten zu beschreiben. So kann man mit Hilfe eines Regex beispielsweise prüfen, ob ein bestimmtes Wort in einer Zeichenkette enthalten ist oder ob es nicht in der Zeichenkette vorkommt, man kann Zahlen in einer Zeichenkette identifizieren und vieles mehr. Sie werden sich mit Regex später detaillierter auseinandersetzen dürfen :)

Wann immer in FHEM ein Event auftritt, wird dieses an alle notifies weitergeleitet. Jedes Notify prüft nun, ob es auf das Ereignis reagieren soll. Das geschieht, indem mit Hilfe reguläre Ausdrücke geprüft wird, ob das gerade weitergeleitete Event den oben genannten Befehl auslösen soll. Man spricht auch davon dass geprüft wird, ob Ereignis und notify "matchen". In unserem Fall löst mySwitch1 ein Event mit dem Befehl on aus. Um dieses Event "abzufangen" und darauf zu reagieren, wird für die Regular Expression die Schreibweise mySwitch1:on verwendet. In einem notify werden Events also dadurch abgefangen, indem wir das device (auf das reagiert werden soll) und der Befehl (auf den reagiert wird) durch einen Doppelpunkt trennen. Diese Syntax gilt für alle notifies. (Bei anderen Modulen kann es sein, dass Events durch eine andere Schreibweise "angefangen" werden müssen.)

Unser Notify wird also erstellt mit

define n_mySwitch1_on notify mySwitch1:on set myLamp1 on

Nach Eingabe dieses Befehls in das Kommandofeld, abgeschlossen durch Enter, sehen Sie wieder die Detailansicht des neuen FHEM-Device, also des Notify (siehe TYPE).

ErsteSchritteInFhem11.png

Im Block Internals sehen Sie hier die Definition DEF. Angezeigt wird hier alles, was bei der Definition nach dem Wort "notify", also nach dem Gerätetyp angegeben wurde. Es erscheinen also <regexp> und <command>.

Info blue.png
Im Block Probably associated with werden alle FHEM-Devices angezeigt, die mit dem Notify verbunden sind. Die Geräte werden als klickbare Device-Namen angezeigt. Das ist praktisch, da man so mit einem Klick zur Detailansicht des jeweiligen Geräts springen kann.


Ordnen Sie auch das Notify unserem Training zu (im unteren Bereich das Attribut room und den passenden Raum auswählen und dann auf attr klicken).

Wenn Sie nun im FHEM-Menü auf Training klicken, werden unsere drei FHEM-Devices angezeigt.

ErsteSchritteInFhem12.png


Info blue.png
Üblicherweise würde man das Notify keinem Raum zuordnen, da es später für den Benutzer gar nicht sichtbar sein soll. Für unsere Testdurchläufe ist es aber praktischer.


Wenn Sie nun mySwitch1 auf on schalten, wird auch myLamp1 auf on geschaltet. Das funktioniert scheinbar nur beim ersten Mal – wenn Sie aber den Event Monitor prüfen oder in der Detailansicht von myLamp1 auf den Zeitstempel der letzten Statusänderung schauen, werden Sie sehen, dass es jedes Mal ausgeführt wird.

Damit das Ganze auch beim Ausschalten funktioniert, legen Sie ein zweites notify an:

define n_mySwitch1_off notify mySwitch1:off set myLamp1 off

Funktioniert es wie erwartet?


Natürlich möchte man nicht für jeden Befehl, den ein Device auslöst, ein eigenes Notify anlegen. Es geht auch einfacher. Statt

define n_mySwitch1_on  notify mySwitch1:on  set myLamp1 on
define n_mySwitch1_off notify mySwitch1:off set myLamp1 off

definieren wir nun

define n_mySwitch1 notify mySwitch1 set myLamp1 $EVENT

Wir sehen, dass die Regex nun nicht mehr unterscheidet, ob mySwitch1 den Event on oder off sendet. Lassen wir diese Angabe weg, löst dieses Notify bei jedem Event von mySwitch1 aus, egal mit welchem Kommando. Im auszuführenden set-Befehl verwenden wir nun die FHEM-Variable $EVENT (Groß/Kleinschreibung beachten!). Dies ist ein Platzhalter für den Befehl, der vom auslösenden Event übernommen wird. Wenn also mySwitch1 ein on auslöst, nimmt $EVENT den Wert on an. Entsprechend für off oder jeden anderen Befehl.

Devices löschen oder deaktivieren – delete, disable

Wenn Sie den Event Monitor beachten, werden Sie sehen, dass nach jeder Betätigung von mySwitch1 der Befehl für myLamp1 nun zweimal ausgeführt wird. Das liegt daran, dass auf jeden Event von mySwitch1 zwei Notify reagieren – sowohl die "alten" Notify wie auch das Neue. Um dies zu umgehen, müssen wir die alten Notify loswerden. Dazu gibt es zwei Möglichkeiten.

  1. Löschen Sie ein Notify mit dem Befehl delete <name>, z.B. mit delete n_mySwitch1_on. Der delete Befehl funktioniert übrigens für jedes Objekt in FHEM. Sie können damit also auch "echte" Devices löschen.
  2. Deaktivieren Sie ein Notify, indem Sie das Attribut disable verwenden. Geben Sie dazu in der Kommandozeile attr n_mySwitch1_off disable 1 ein. Dadurch taucht in der Detailansicht des Notify im unteren Bereich das Attribut disable auf. Dieses kann man nun auf zwei Arten ändern, entweder über die Kommandozeile oder über die Detailansicht (dort den Wert 1 oder 0 auswählen, dann attr klicken).

Save Config

Wann immer Sie mit dem aktuellen Zustand Ihrer FHEM-Konfiguration zufrieden sind, klicken Sie im FHEM-Menü oben links einmal auf Save config oder geben Sie in das Kommandofeld den Befehl save ein. Ihre Konfiguration wird nun gespeichert. Tun Sie das nicht, sind alle Änderungen nach dem nächsten FHEM-Neustart verloren. FHEM erinnert Sie deshalb an ungespeicherte Änderungen durch ein rotes Fragezeichen neben Save config.

Bestehende Devices verändern – modify

Wir legen nun eine zweite Lampe an, die ebenfalls durch unseren mySwitch1 und unser Notify geschaltet werden soll. Die neue Lampe wird durch folgende Eingabe in das Kommandofeld erzeugt:

define myLamp2 dummy

Durch "Zusammenklicken" im Detail-Bildschirm von myLamp2 ordnen Sie diese ebenfalls dem Raum Training zu und weisen ihr über das Attribut webCmd Schaltflächen für on und off zu.


ErsteSchritteInFhem13.png


Nun passen wir das Notify n_mySwitch1 an. Dazu navigieren Sie auf den Detail-Bildschirm des Notify: Wechseln Sie in den Raum Training und klicken Sie auf den Namen von n_mySwitch1.

Im Detail-Bildschirm befindet sich die Zeile DEF, die wir uns vorhin schon einmal angeschaut haben. Wenn Sie auf das Wort DEF klicken, können Sie die Definition eines FHEM-Objekts bearbeiten.


Info blue.png
Im Feld DEF wird nur der Teil der Definition angezeigt, der beim Anlegen dieses Notify nach dem Objekttyp, also notify folgt. Sie finden hier also zunächst die Regex auf die das Notify reagiert, dann nach einer Leerstelle den auszuführenden Befehl. Der Lesbarkeit halber ist im Folgenden immer das gesamte define-Statement dargestellt, auch wenn man es im Feld DEF nicht vollständig sieht.


Wir ändern hier also von

define n_mySwitch1 notify mySwitch1 set myLamp1 $EVENT

zu

define n_mySwitch1 notify mySwitch1 set myLamp1,myLamp2 $EVENT


ErsteSchritteInFhem14.png


Zum Beenden der Bearbeitung klicken Sie auf die Schaltfläche modify <name>, hier also modify n_mySwitch1. Wenn Sie die Angaben im Detail-Bildschirm prüfen, sehen Sie, dass die DEFinition des Notify angepasst wurde.

ErsteSchritteInFhem14B.png

Beachten Sie auch hier wieder, dass im Detailscreen im unteren Bereich unter Probably associated with die geschalteten Lampen erscheinen – das wird noch oft nützlich sein.


Info blue.png
Über den Link Device specific help können Sie sich übrigens den gesamten Hilfe-Text zu Ihrem device-Typ aus der commandref anschauen, hier also den Hilfetext zu notify. Dieser Link ist gerade zu Beginn häufig hilfreich.


Nun können Sie testen, ob ein Klick auf mySwitch1 auch wirklich beide Lampen schaltet. Schauen Sie sich dabei auch wieder in einem separaten Fenster mit dem Event Monitor die entstehenden Events an.


ErsteSchritteInFhem15.png

Mehrere Devices schalten

Zum Schalten mehrerer Devices kann also verwendet werden

set <device1>,<device2> on

Eine alternative Schreibweise dafür ist

set <device1> on; set <device2> on

Auch eine Kombination ist möglich:

set <device1>,<device2> on; set <device3> off


Auch innerhalb eines notify (oder anderen FHEM-Befehlen) kann man mehrere Befehle auflisten, jedoch ist hier eines zu beachten:

define n1 notify mySwitch1:on set myLamp1 on;set myLamp2 off

Die Befehle sind durch ein Semikolon getrennt. Effekt ist: Das notify schaltet myLamp1 wann immer mySwitch1 den Event on sendet. Der nächste Befehl in dieser Zeile ist set myLamp2 off. Dieser wird sofort bei der Eingabe der o.g. Befehlszeile abgearbeitet. Es schaltet also myLamp2 sofort, myLamp1 erst nach dem Event von mySwitch1.

Soll auch der zweite Befehl set myLamp2 off erst nach dem Event ausgeführt werden, muss ein doppeltes Semikolon genutzt werden:

define n1 notify mySwitch1:on set myLamp1 on;;set myLamp2 off

Die kombinierte Variante könnte so aussehen:

define n1 notify mySwitch1:on set myLamp1 on;;set myLamp2 off;set myLampe3 on

Diese Befehlszeile würde also myLampe3 sofort schalten, aber erst nach dem Event von mySwitch1 schalten myLamp1 und myLamp2.

Devices umbenennen

Schließlich wollen wir (zur Übung) noch ein Device umbenennen: Aus myLamp2 soll myStandardLamp werden. Dafür verwenden wir

rename <alterName> <neuerName>

Hierbei ist zu beachten, dass zugehörige notify-Anweisungen nicht automatisch aktualisiert werden. Beachten Sie also vor dem Umbenennen im unteren Bereich des Detail-Bildschirms die Liste Probably associated with, damit Sie bei der folgenden Anpassung keines Ihrer Notify vergessen.

Geben Sie also in das Kommandofeld ein

rename myLamp2 myStandardLamp

und passen Sie anschließend n_mySwitch1 an, indem Sie auf dessen Detail-Bildschirm im Bereich DEF die Definition anpassen.

Nach der Änderung muss das Notify lauten

define n_mySwitch1 notify mySwitch1 set myLamp1,myStandardLamp $EVENT


ErsteSchritteInFhem16.png


Zeitgesteuert schalten - at

Im nächsten Schritt soll eine Zeitsteuerung eingerichtet werden. Zunächst möchten wir erreichen, dass myLamp1 nach einer Minute ausgeschaltet wird wie z.B. ein Treppenhauslicht.


Info blue.png
Damit Sie den Effekt sehen können, schalten Sie myLamp1 vorher auf on.


Für Zeitsteuerungen gibt es den FHEM-Device-Typ at. Die Befehlsstruktur ist

define <name> at <timespec> <command>

<name> und <command> haben hier dieselbe Funktion wie bei notify. Neu ist hier lediglich <timespec> (time specification), also die Zeitangabe. Diese erfolgt in der Schreibweise HH:MM:SS oder HH:MM.

Um myLamp1 also in einer Minute auszuschalten, erzeugen Sie folgendes at:

define a_myLamp1 at +00:01:00 set myLamp1 off


ErsteSchritteInFhem17.png


Probieren Sie es aus. Wird myLamp1 nach einer Minute ausgeschaltet? Wird dabei ein Event erzeugt?

Wenn Sie sich die Detailansicht des at anschauen möchten, müssen Sie sich übrigens beeilen: Nach der einmaligen Ausführung wird das at automatisch gelöscht. Falls FHEM schneller war, können Sie es ja noch einmal anlegen und ggf. eine längere Zeitspanne angeben :-)

Bei <timespec> kann man die Sekunden auch weglassen und einfach nur HH:MM schreiben. Außerdem gibt es mehrere Varianten:

Varianten von Zeitangaben für at
Notation Erklärung
+00:02:00 In zwei Minuten; einmalige Ausführung
00:02:00 Um zwei Minuten nach Mitternacht, also um 00:02 Uhr und 0 Sekunden; einmalige Ausführung
*00:02:00 Täglich um 00:02 Uhr
+*00:02:00 Alle 2 Minuten
+*{3}00:02 Dreimal, alle zwei Minuten
*{3}00:02 Dreimal um 00:02 Uhr
*{sunset_rel()} Täglich zu Sonnenuntergang
*{sunrise(+120)} Täglich 2 Minuten (120 Sekunden) nach Sonnenaufgang
  • Durch die Angabe von * wird also eine dauerhafte Wiederholung definiert. Die Wiederholungen laufen so lange, bis das at gelöscht oder disabled wird.
  • Durch die Angabe von + wird die angegebene Zeit nicht mehr als absolute Uhrzeit interpretiert, sondern als Timer, nach wie vielen Stunden:Minuten:Sekunden der Befehl ausgeführt wird.
  • Durch die Angabe von {n} wird das at nur n-mal durchlaufen.
  • Die Funktionen {sunset_rel()} und {sunrise()} liefern die passende Uhrzeit zurück. Durch Angabe von * wird dies täglich wiederholt. Die geschweiften Klammer zeigen an, dass FHEM den Inhalt dieser Klammern direkt als Perl-Funktionen ausführt.

Um bspw. täglich zu Sonnenaufgang die Gartenbeleuchtung auszuschalten, definieren Sie so etwas wie

define a_gardenLight_morning_off at *{sunrise()} set gardenLight off


ErsteSchritteInFhem18.png

Im Detailscreen eines at wird übrigens im STATE der Zeitpunkt der nächsten Ausführung angezeigt.

Diese Info erscheint auch in der Raum-Ansicht, falls Sie das at dort anzeigen lassen:

ErsteSchritteInFhem18B.png

Timer bei einem Event starten - notify und at

Info green.pngZeit- und Ereignissteuerung mit DOIF

Seit Erscheinen des ursprünglichen Artikels Anfang 2014 ist eine weitere Möglichkeit der Zeit- und Ereignissteuerung eingeführt worden.

Siehe: Erste Schritte mit DOIF: Zeit- und Ereignissteuerung

Der Autor des ursprünglichen Artikels hat freundlicherweise zugestimmt diesen Artikel mit einem Link zu ergänzen.

Als letzte Übung wollen wir ein notify und ein at verbinden. Der Timer soll nun nicht starten, wenn Sie den Befehl in das Kommandofeld eingeben, sondern wenn ein Event eintritt.

GotoRAW-Import firststeps.PNG

Dazu basteln wir uns ein Stairwell: Legen Sie dafür die Dummy-Devices sw_Switch und sw_Light im Raum Stairwell an. Um die folgenden Befehle an einem Stück eingeben zu können, klicken Sie auf das umrahmte "+"-Symbol neben der Kommandozeile (Nur im Standard Style f18 vorhanden - beachten Sie dazu diesen Artikel Import_von_Code_Snippets), fügen die folgenden Zeilen mit copy&paste in das daraufhin erscheinende Dialogfeld ein und drücken auf Execute:

define sw_Switch dummy
attr   sw_Switch room Stairwell
attr   sw_Switch webCmd on
define sw_Light dummy
attr   sw_Light room Stairwell

RAW-Import firststeps.PNG

Anschließend können Sie das Dialogfeld wieder schließen oder auch die nachfolgenden Befehle darüber eingeben. Beachten Sie, dass mit Execute alle Anweisungen aus dem Dialogfeld ausgeführt werden, was ggf. zu Fehlermeldungen führen kann, wenn z.B. ein Gerät bereits definiert ist. Zeilen mit Anweisungen, die bereits in die Konfiguration übernommen wurden, können Sie daher getrost löschen, um solche Effekte zu vermeiden.

Nun fehlt noch das Notify, welches auf sw_Switch:on reagiert und daraufhin zwei Befehle ausführt:

  • Einschalten des Treppenhauslichts mit set sw_Light on
  • Einen Timer starten, der es nach einer Minute wieder ausschaltet. Also define a1 at +00:01 set sw_Light off.

Das sieht dann so aus (und muss ins Kommandofeld als eine Zeile eingegeben werden):

define n_sw_Switch_on notify sw_Switch:on 
       set sw_Light on;;define a1 at +00:01 set sw_Light off

Beim Auslösen des Notify wird also als Kommando das Einschalten des Treppenhauslichts ausgelöst, wie auch das Definieren eines Timers, der es eine Minute später wieder ausschaltet. Funktioniert es?


ErsteSchritteInFhem19.png


Da das ja doch recht sperrig ist, gibt es noch eine etwas einfachere Alternative:

define n_sw_Switch_on notify sw_Switch:on set sw_Light on;;sleep 60;;set sw_Light off

Manche Hardwaresysteme bieten auch den Befehl on-for-timer, mit dem man alternativ schreiben kann

define n_sw_Switch_on notify sw_Switch:on set sw_Light on-for-timer 60

Wie geht es weiter?

Sie haben nun kennengelernt:

  • Das Anlegen von FHEM-Devices mit define
  • Events und den Event-Monitor
  • Schalten von Devices mit set
  • Verändern von Devices mit modify, rename und delete
  • Das Setzen und Bearbeiten von Attributen
  • Event-getriebene Aktionen durch notify
  • Zeitgesteuertes Schalten mit at

Damit kennen Sie die grundlegendsten Mechanismen von FHEM. Details zu diesen Befehlen finden Sie in der FHEM Befehlsreferenz commandref.

Tipp: Zu vielen FHEM-Befehlen und Gerätetypen gibt es auch eine deutschsprachige Beschreibung. Klicken Sie dazu in der commandref oben links auf den Link "DE".

In der commandref finden Sie neben der Beschreibung aller FHEM-Befehle auch die Liste aller Gerätetypen, die in FHEM eingebunden werden können.

Sie werden feststellen, dass "echte" FHEM-Devices grundsätzlich genau so aussehen, wie die dummy-Devices, die Sie hier bereits kennengelernt haben. Der wesentliche Unterschied ist, dass Sie die verfügbaren Befehle nicht mehr selbst mittels attr webCmd festlegen müssen, da diese bereits durch das FHEM-Device vorgegeben sind. Und Events werden nicht nur ausgelöst, wenn Sie im FHEM-Webfrontend klicken, sondern auch, wenn das physische Gerät (also der Bewegungssensor oder der Lichtschalter an der Wand) auslöst.

Sobald Sie ihre ersten Geräte an FHEM gekoppelt haben, schauen Sie sich den Event-Monitor an, um zu sehen, wann welche Events ausgelöst werden.

Einen umfangreicheren Einstieg in FHEM finden Sie im Dokument Heimautomatisierung-mit-FHEM

Die für FHEM wichtigen Grundlagen der Programmiersprache Perl kann man in den ersten Kapiteln eines Perl-Buches oder diversen frei im Internet verfügbaren Perl-Tutorials nachlesen.

Viel Spaß und Erfolg mit FHEM !