Smart Home – was ist das?
Smart Home ist die Bezeichnung für ein intelligentes Gebäude bzw. intelligentes wohnen. Mit entsprechenden Komponenten/Geräten und einer Software/Plattform um die jeweiligen Komponenten zu verwalten ist es also möglich gewisse Vorgänge in seinem Zuhause/Leben zu automatisieren. Besonders bietet sich dieses Vorgehen für die Regelung der Heizung oder der Beleuchtung an. Aber es ist noch viel – VIEL mehr möglich. Grenzen werden dem eigentlich nur den eigenen Wahnsinn oder sein eigenes Können gesetzt.
Eine dieser Plattformen um sein Smart Home zu verwalten ist Fhem. Wie man Fhem installiert und weitere wichtige Funktionen möchte ich euch auf dieser Seite vorstellen.
- Installation von Fhem unter (Debian-) Linux
- Erste Schritte
- Zweite Schritte
- Doif
- Logfile und Graphen anlegen
Installation von Fhem unter (Debian-) Linux
Die Installation von Fhem auf einem Debian-Linux basierendem System läuft in der Regel immer gleich ab. Am besten benutzt man für sein System eine frische Grundinstallation des Betriebssystems.
Bei der Wahl des Betriebssystems sollte man bei einem reinen Server auf eine Desktop-Version verzichten (sofern möglich) – oder den Desktop im Nachgang deaktivieren/deinstallieren bzw. das Booten in die reine Kommandozeile nutzen. Dabei ist auch unerheblich, ob sich der Nutzer automatisch anmeldet oder nicht (aus Sicherheitsgründen sollte sich der Nutzer generell nie automatisch anmelden).
Der (Fhem-) Server wird in Zukunft komplett extern verwaltet, daher sind elementare Einstellungen wie die Netzwerkverbindung (hier wird das Kabel ganz klar bevorzugt) und das Aktivieren von SSH Grundvoraussetzung um mit der Installation von Fhem beginnen zu können. Natürlich sollte auch die IP-Adresse des Servers bekannt sein.
Ist das Betriebssystem fertig eingerichtet, die Netzwerkverbindung hergestellt, SSH aktiviert und die IP-Adresse bekannt, so kann mit der Installation begonnen werden. Dafür meldet man sich mit einem SSH-Client am Server an.
Der erste Schritt ist ein aktueller Datenstand, daher wird das System mit
sudo apt-get update && apt-get upgrade
auf den aktuellen Stand gebracht.
Da Fhem auf der Programmiersprache Perl basiert, werden einige zusätzliche Pakete installiert, die die reibungslose Installation gewährleisten
sudo apt-get -y install perl libdevice-serialport-perl libio-socket-ssl-perl libwww-perl libxml-simple-perl libdbd-sqlite3-perl libtext-diff-perl libxml-simple-perl libcgi-pm-perl libjson-perl sqlite3
nach der Installation der Pakete geht es im Kern weiter mit dem Download des Fhem-Pakets
wget http://fhem.de/fhem-5.8.deb
und der Installation des Selbigen
sudo dpkg -i fhem-5.8.deb
Fhem ist nun installiert. Das Webinterface kann über den Browser mit
Ip.Adresse.des.Servers:8083/fhem
aufgerufen werden.
Bei der Installation von Fhem wurde u.A. ein eigener Linux-Nutzer namens „Fhem“ angelegt. Unter Linux kann der Root-Nutzer den jeweiligen anderen Nutzern gewisse Rechte einräumen und Ihn in Gruppen zuweisen, um Veränderungen am System vornehmen zu können ggf. auch ohne den Root-Nutzer vorher um Erlaubnis zu bitten.
Um dem Nutzer „Fhem“ die grundlegenden Rechte (insbesondere für das Fhem Installationsverzeichnis) zu geben, sollte man noch folgenden Befehl ausführen
cd /opt && sudo chmod -R a+w fhem && sudo usermod -a -G tty USER && sudo usermod -a -G tty fhem
Unter USER muss der entsprechende (Root)-Username eingefügt werden. Unter Raspbian ist das der User „Pi“, unter Ubuntu z.B. wird der entsprechende User nach der Grundinstallation jeweils erst angelegt und kann dementsprechend individuell benannt werden.
Im Nachgang kann es immer wieder erforderlich sein, dem User Fhem, einer Datei oder einem Verzeichnis erforderliche Rechte zu geben, damit z.B. ein Skript ausgeführt werden kann oder in ein bestimmten Ordner geschrieben werden darf. Das sollte immer im Hinterkopf behalten werden. Näheres zu den Nutzer-Rechten unter Linux findet sich in den Grundlagen.
Zusätzliche Pakete
- Wer Homematic-Komponenten unter Fhem einsetzen möchte, insbesondere Jene, die eine AES-Verschlüsselung nutzen, sollte folgendes Paket installieren
sudo apt-get install libcrypt-rijndael-perl
- Für die Funktionsfähigkeit des Moduls „WOL“ (Wake-on-Lan) benötigt man
sudo apt-get install etherwake
sudo apt-get install wakeonlan
- Produkte von Xiaomi (mit Gateway) benötigen ebenfalls zusätzliche Pakete
sudo apt-get install libio-socket-multicast-perl
sudo apt-get install libjson-perl
sudo apt-get install libcrypt-cbc-perl
sudo cpan Crypt::Cipher::AES
Für’s erste sollte man so für alle Fälle gut gerüstet sein. Natürlich entbindet das einen nicht von seiner Pflicht selbst für ein aktuelles System zu sorgen und fehlende Pakete nachzuinstallieren.
Erste Schritte
Wenn ihr hier angekommen seid, dann habt ihr Fhem erfolgreich installiert und seht im Browser nun die Fhem Web-Oberfläche vor euch.
Ganz oben auf der Fhem Web-Oberfläche sieht man eine Kommandozeile, diese wird in Zukunft euer Freund. Wann immer man hier einen Befehl liest, der in Fhem eingebunden werden soll, wird dieser über die Fhem-Kommandozeile eingegeben.
Toll und was jetzt? – Als erstes wird abgesichert.
Hinweis: Ihr müsst teilweise zwischen dem Linux Terminal/SSH und dem Fhem-Webinterface wechseln – lest die Anleitung genau durch, dann kann nichts schief gehen!!
Da Fhem vermutlich künftig ein Teil eures Hauses sein wird und die Haustür normalerweise auch nur mit einem Schlüssel geöffnet werden kann, sollten die Zugänge zu den Oberflächen von Fhem entsprechend gesichert werden.
Fhem installiert direkt drei verschiedene Oberflächen mit, die alle über einen anderen Port erreichbar sind. In der Regel nutzt man die Oberfläche Web, über den Port 8083.
Webphone, für Smartphones erreicht man über den Port 8084 und Webtablet über Port 8085.
Nach dem ersten Aufrufen der Weboberfläche wird euch der Fhem Security Check sagen, dass für Web, Webphone und Webtablet kein Attribut für BasicAuth gesetzt ist. Alle drei Oberflächen gehören dementsprechend abgesichert.
Konkret heißt das, dass ihr am Ende dieser Passage eure Oberflächen nur noch per Nutzername und Passwort erreichen könnt! Es ist daher wichtig, dass man sich das Passwort merkt und auch auf Groß- und Kleinschreibung achtet.
Als erstes generieren wir uns nun einen Nutzernamen und ein Passwort, dazu wird im Linux-Terminal folgender Befehl ausgeführt
echo -n Benutzername:Passwort |base64
Die Ausgabe, die man von Linux-Terminal erhält, wird kopiert und dann in Fhem über die Fhem-Kommandozeile wie folgt eingebunden:
Erstmal klickt man links im Menü auf Unsorted
Unter „FHEMWEB“ sieht man im Mainscreen nun die drei Oberflächen. JEDE davon muss abgesichert sein. Ich zeige das am Beispiel von WEB.
Man klickt nun auf WEB und erhält die Deviceoverview. Hier kann man im unteren Abschnitt sogenannte Attribute setzen.
Hier wird das Attribut basicAuth ausgewählt
und der Code aus dem Linux-Terminal eingefügt
Natürlich nutzt ihr dazu eure EIGENE Ausgabe und NICHT diese hier! Wehe ich erwische jemanden, bei dem ich mich mit Nutzername & Passwort Tinkerblog:tinkerblog anmelden kann! 😉
Ist der Code eingefügt, klickt man auf den Button attr um das Attribut zu setzen, der Browser wird einen nun auffordern sich anzumelden.
Hier meldet man sich mit seinen Daten an. In meinem Fall also „Tinkerblog / tinkerblog“ – man gelangt dann wieder, wie sollte es auch anders sein, auf die Fhem-Weboberfläche.
Als nächstes muss die Config gesichert werden – auch das ist ein Vorgang, den ihr nun häufiger machen werdet. Jedes Mal wenn ihr etwas an der Konfiguration von Fhem ändert, muss diese auch gespeichert werden. Fhem signalisiert euch eine Änderung dadurch, das hinter dem Button Save Config ein Fragezeichen auftaucht.
Um die neue Konfiguration zu speichern klickt man einmal auf den Button – das Fragezeichen sollte dann auch verschwinden. Alternativ kann man auch
save
in die Fhem-Kommandozeile tippen und mit Enter abschicken.
(man achte auf das rote Fragezeichen hinter „Save config“)
(hier sieht man auch wie das rote Fragezeichen hinter „Save config“ verschwunden ist)
Das ganze wiederholt man auch für die beiden anderen Oberflächen, dazu sollte man jeweils auf die entsprechende Oberfläche wechseln
- WEBphone
Hier einfach auf WEBphone klicken und das Attribut basicAuth setzen – es erscheint das selbe Anmeldefenster, wie auch im WEB.
- WEBtablet
Hier das selbe wie bei WEB. Klick auf Unsorted, WEBtablet auswählen und das Attribut basicAuth setzen.
Man kann immer den selben Code verwenden, oder man generiert sich für jede Oberfläche einen neuen Code. Nicht vergessen die Config zu speichern!!
Im Anschluss wird Fhem neu gestartet – dazu muss nicht der ganze Rechner neu gestartet werden – sondern lediglich der Befehl
shutdown restart
in die Fhem-Kommandozeile eingetippt werden.
Nach dem Fhem-Neustart werdet Ihr nun vom Browser aufgefordert einen Benutzernamen und ein Passwort einzugeben um die Web-Oberflächen aufzurufen. Dabei muss auch auf Groß- und Kleinschreibung geachtet werden. Habt ihr den Benutzernamen am Anfang groß geschrieben, dann macht ihr das im Anmeldefenster natürlich auch. Dass das selbe für das Passwort gilt gehört, denke ich mal, zum Grundverständnis.
Wenn alles geklappt hat, dann sollte der Security Check nun lediglich noch den
zu meckern haben, dieser kann mit einem Passwort abgesichert werden. Folgend findet alles wieder unter der Oberfläche WEB statt, sprich Port 8083!
Dazu kann man sich wieder mal ein Passwort ausdenken und über die Fhem-Kommandozeile mit
attr telnetPort globalpassword Passwort
setzen.
Danach wieder Config speichern & neu starten. Der Security Check sollte nun keine Meldung mehr anzeigen.
Ist optional, gehört aber beim Thema Sicherheit einfach dazu und ist schnell eingerichtet – das Fhem Wiki hat dazu eine schöne Anleitung bereitgestellt.
Schaut es euch an – und macht es. Je besser man den Server absichert, umso schwerer ist es für jemanden sich Zugang zu verschaffen.
Nachdem ihr hoffentlich die HTTPS-Absicherung eingerichtet habt, sollte Fhem erstmal ein Update erhalten. Dazu wird in die Fhem-Kommandozeile einfach
update all
eingetragen. Der Vorgang wird etwas Zeit in Anspruch nehmen. Nach Abschluss des Updates muss Fhem manuell neu gestartet werden (shutdown restart).
Der Standart-Fhem Skin kommt etwas Altbacken daher – ich persönlich nutze daher den Skin von Matthias Kleine. Dieser kann auch ziemlich einfach über die Fhem-Kommandozeile installiert werden mit
update add https://raw.githubusercontent.com/klein0r/fhem-style-haus-automatisierung/version-2/controls_ha_theme.txt
danach ein
update all ha_theme
Nun kann links im Menü unter Select Style der Style hausautomatisierung_com ausgewählt werden.
Danach sieht die Web-Oberfläche so aus
Damit auch alle Icons künftig korrekt dargestellt werden, muss noch
attr WEB JavaScripts codemirror/fhem_codemirror.js hausautomatisierung-com/custom.js
&
attr WEB roomIcons Save.config:message_attention
über die Fhem-Kommandozeile gesetzt werden. Das ist alles völlig gefahrlos und wertet die Optik von Fhem enorm auf. Der Skin wird übrigens im Rahmen von Fhem-Updates ebenfalls immer auf den aktuellsten Stand gebracht. Stand 5.2018 gibt’s den Skin in der Version 2.6 (zu sehen oben links in der Ecke, über dem Logo).
Zum Abschluss natürlich noch eben Safe config klicken!
An dieser Stelle auch nochmal ein herzlichen Dank an Matthias Kleine für die tolle Arbeit! Übrigens betreibt er auch einen tollen Blog mit vielen Videos u.A. mit vielen Tutorials über Fhem – schaut mal rein.
Nachdem Fhem installiert und grundlegend eingerichtet ist – kann man nun ein bisschen Spaß haben.
Sicherlich hätte ich das folgende Bild auch in die ersten Schritte setzen können, wollte allerdings, insbesondere wegen des Skins, nicht für Irritationen sorgen. Grade am Anfang ist Fhem noch ziemlich übersichtlich, daher sollten die Beschreibungen dort auch genügen, um sich zu orientieren.
- Ist die Fhem-Kommandozeile, hier werden alle Befehle eingetragen. Es gibt auch die Option die Konfigurationsdatei von Fhem direkt zu bearbeiten – allerdings werdet ihr auf meinem Blog keinesfalls dazu animiert, da dieses Vorgehen auch gewisse Risiken birgt.
- Ist der Save Conig Button – jedes mal, wenn die Konfiguration von Fhem geändert wurde, kann man mit einem Klick auf den Button die Änderungen speichern. Im Standart-Skin ist dann ein Fragezeichen zu sehen, beim Skin von Matthias Kleine erscheinen zwei farbige Balken.
- Sind alle angelegten Räume (Rooms) – in diesen Rooms befinden sich die dem Room zugewiesenen Geräte (Devices). Neue Devices werden häufig in den Room Unsorted eingeordnet und können von da dann verschoben werden.
- Sind die Fhem-Internals
- Logfile: Dort wird fast alles was in Fhem so passiert geloggt. Inbesondere bei der Fehlersuche ist ein Blick in das Logfile immer sehr hilfreich. Das Logfile wird monatlich „geleert“, d.h. für jeden Monat wird ein neues Logfile angelegt.
- Commandref: Dort erhaltet ihr eine Menge Informationen über die Module in Fhem. Jedes offizielle Modul hat dort einen Eintrag mit Beispielen und beschreibt die Anwendung. Das Commandref hat eine englische und eine deutsche Fassung, leider sind nicht alle Beschreibungen übersetzt.
- Remote doc: Leitet euch auf die Fhem Documentation Page weiter. Ich hab noch keinen Blick riskiert.
- Edit files: Hier können die Fhem-Dateien direkt bearbeitet werden oder eigene Dateien (z.B. für eigene Skripts, die Fhem dann zu irgendeinem Zeitpunkt ausführt) angelegt/bearbeitet werden. Die fhem.cfg kann ebenfalls eingesehen – aber nicht bearbeitet werden. Wie oben beschrieben birgt das Risiken – und die sind einfach nicht nötig.
- Select Style: Wurde in den ersten Schritten bereits erwähnt. Dort kann der Skin von Fhem verändert werden. Wenn Ihr meiner Empfehlung gefolgt seid, sieht es bei euch so ähnlich aus wie bei mir.
- Event monitor: Der Event monitor ist eine interessante Sache – er erfasst alles was in Fhem so passiert. Sendet also grad z.B. ein Temperatursensor eine gemessene Temperatur – tauchen all diese Informationen im Event monitor auf. Praktischer Weise kann man im Event monitor sogar ein grade stattgefundenes Event markieren und ein Device erstellen (z.B. ein Notify) oder bearbeiten.
Eure nackte Fhem Installation freut sich jetzt natürlich auf ein paar Devices. Wer jetzt noch keine weiteren Smart-Home Komponenten bzw. Gateways hat, der kann trotzdem das ein oder andere Device anlegen.
Devices werden händisch immer mit folgender Syntax, über die Fhem-Kommandozeile angelegt
define DEVICENAME MODULNAME OPTIONEN
Viele Devices, meist die, die über ein Gateway (auch Brücke genannt) mit Fhem kommunizieren – werden über das sog. autocreate angelegt, d.h. von ganz alleine. Das ist natürlich sehr komfortabel und spart viel Arbeit.
Jedes Gerät, dass sich z.B. im heimischen Netzwerk befindet, kann aufgenommen werden – vielleicht gibt es für einige Geräte, die sich gegenwärtig im Haushalt befinden, auch bereits eigene Module.
Bei mir war das z.B. mit meiner Fritzbox, Kodi oder meinem Enigma2 Receiver der Fall. Um zu prüfen welches Gerät ggf. ein Modul hat, kann man im Commandref nachschauen, oder Google bemühen.
Wer keine Fritzbox, Kodi und auch keinen Enigma2 Receiver hat, der kann z.B. ein
anlegen. SYSMON ist ein Modul zur Überwachung der Serverhardware. Der Server muss dazu keine weiteren Voraussetzungen erfüllen als ein Linux-Betriebssystem zu haben.
In diesem Forums-Eintrag wird das Modul vorgestellt. Auch im Commandref sollte man weitere Informationen erhalten.
In die Fhem-Kommandozeile wird dazu folgendes eingegeben
define sysmon SYSMON 1 0 0 0
Nun habt ihr ein SYSMON-Device, dass die Hardware eures Servers überwacht, erstellt.
Aller Voraussicht nach wird sich sysmon nun ebenfalls im Room Unsorted befinden. Klickt man auf den entsprechenden Raum und wiederum auf sysmon, erhält man die sog. Deviceoverview.
Dort befinden sich u.A. die sog.
Das sind Werte, die das Gerät (in dem Fall sysmon) ausgelesen hat. Hier ein Ausschnitt meiner sysmon-Readings (Hinweis: sysmon braucht unmittelbar nach dem Anlegen des Device ca. eine Minute um alle Werte auszulesen!)
(Wie man an dem farblich hinterlegten Zeitstempel (Timestamp) sehen kann, bewegt sich die CPU-Temperatur meines Tinkerboard im erhöhten Bereich, vielleicht sollte ich eine aktive Kühlung in Erwägung ziehen..)
Man sieht z.B. cpu0_freq – was die Taktfrequenz der CPU ausdrück, in dem Fall 1800 MHz. Die Netzwerkschnittstelle ist unter „eth0“ ebenfalls mit interessanten Daten aufgeführt.
Scrollt man weiter runter, findet man die
Hier kann man dem Device spezielle Optionen zuordnen. Einige Devices arbeiten erst korrekt, wenn man ihnen das ein oder andere Attribut zugeordnet hat – die Informationen findet man meist in der Beschreibung des Moduls.
Der Raum, in dem sich sysmon bei mir befindet nennt sich Geraete. Falls sich das Gerät im Unsorted befindet ist das Feld leer!
Man kann nun einen Raum seiner Wahl auswählen (falls man schon welche hat), oder einen Raum erstellen. Dazu trägt man einfach den Namen in das Feld ein und klickt abschließend auf den Button attr. Natürlich geht dies auch über die Kommandozeile mit
attr sysmon room RAUMNAME
Hat man sich im obigen Fall einen neuen Raum ausgedacht, ist dieser nun auch links im Menü zu sehen – klickt man darauf, befindet sich der sysmon darin 🙂
Ein Room existiert immer nur so lange, wie sich auch mindestens ein Device darin befindet – löscht man also das einzige Device in einem Room – wird der Room ebenfalls entfernt. Bei Unsorted verhält sich das übrigens genau so.
Ich versuche immer jedes Device sofort irgendwo unter zu bringen. Die Devices, die standardmäßig nach der Grundinstallation im Unsorted sind, habe ich z.B. alle in den Room Hidden verschoben. Das ist, wie der Name schon verrät, ein versteckter Raum (quasi die Fhem – eigene Abstellkammer). Devices im Hidden kann man aber weiterhin über den Link Everything erreichen und sind daher auch nicht von der Welt.
So, ich denke für den Anfang seid ihr sehr gut gerüstet und habt hoffentlich Bock auf (viel) mehr bekommen. Bitte denkt immer dran, safety first und im Zweifel never touch a running system!
Doif
Doif ist eine DER Funktionen in Fhem, die Automatisierung so richtig interessant macht.
In einem Doif werden Bedingungen an Befehle gekoppelt – das Modul prüft die festgelegten Bedingungen und führt bei Zutreffen eine Aktion aus – oder macht etwas anderes.
Ich fange mit zwei kleinen Beispielen an, um zu veranschaulichen was man so machen kann.
Eine leichte Aufgabe für ein Doif wäre z.B. das schalten der Außenbeleuchtung bei Sonnenunter- und Sonnenaufgang.
Um Sonnenauf/Untergangsszenarien nutzen zu können, muss im Device „global“ der Längen- und Breitengrad des Wohnorts eingetragen werden. Dazu nutzt man z.B. Google Maps, tippt seinen Wohnort ein und kann so aus der URL die entsprechenden Daten ermitteln
attr global latitude 51.7698748
&
attr global longitude 8.7410614
Fhem weiß ab jetzt, wann an deinem Wohnort die Sonne auf- oder unter geht – diese Daten kann man jetzt z.B. zur Steuerung der Außenbeleuchtung nutzen.
define DOIF ([{sunset("REAL")}]) (set <Außenbeleuchtung on) DOELSEIF ([{sunrise("REAL")}]) (set <Außenbeleuchtung> off)
Mehr zum Sunrise Modul findet man im Fhem Wiki, dort wird auch erklärt wozu das „REAL“ da steht und welche Alternativen man nutzen kann.
Natürlich ist das bei weitem nicht alles was ein Doif kann. Im folgenden Beispiel zeige ich euch, wie ich mit Hilfe einer Sonoff S20 den
an meinem Schreibtisch reguliere.
Das Doif soll hier folgende Bedingungen erfüllen
- Montags, Dienstags und Mittwochs soll die Steckdose um 17 Uhr eingeschaltet werden
- Donnerstags, Freitags, Samstags, Sonntags soll die Steckdose um 10 Uhr eingeschaltet werden
- Zwischen 22:00 Uhr und 23:59 Uhr soll alle 15 Minuten geprüft werden, ob mein Rechner noch läuft ist – falls nicht, soll die Steckdose abgeschaltet werden
Um dieses Doif verwenden zu können, muss der Computer per WOL in Fhem definiert sein. Es ist dabei uninteressant ob der jeweilige Computer tatsächlich WOL unterstützt – es geht lediglich darum zu sehen ob ein Rechner derzeit „läuft“. Das Funktioniert mit allen netzwerkfähigen Geräten (Xbox, Ps4, Fernseher, AV-Receiver, Sat-Receiver usw.) sehr zuverlässig. Man kann auch das Modul Presence nutzen.
Das Doif für dieses Szenario sieht wie folgt aus
define Power_Schreibtisch DOIF ([17:00|Mo Di Mi] or [10:00|Do Fr Sa So]) (set S20_2 on) DOELSEIF (([22:00-23:59] and [+00:15]) and [Marcels_PC:isRunning] eq "false") (set S20_2 off)
Aber nun nochmal zurück zum Anfang. Damit ein Doif das tut man was sich vorstellt ist es wichtig die Syntax zu verstehen. Dazu nehme ich mal ein ganz einfaches Doif, aus dem täglichen gebrauch
define DOIF ([Fensterkontakt:state] eq "open") (set Device postEvent open) DOELSE (set Device postEvent closed)
Was dieses Doif genau macht, findet man unter Homematic im Abschnitt Tür- Fensterkontakte anderer Hersteller.
- „define“, „“ und „DOIF“ <- setzte ich mal als selbsterklärend voraus.
- ([Fensterkontakt:state] eq „open“) <- in der ersten Klammer finden wir die Bedingung. Das Reading „state“ des Device „Fensterkontakt“ soll „open“ zeigen.
- (set Device postEvent open) <- in der zweiten Klammer befindet sich der Befehl. Hier soll das Device „Device“ geschaltet werden. In dem Fall „postEvent open“
- DOELSE <- was soll getan werden, wenn die Bedingung nicht zutrifft
- (set Device postEvent closed) <- das ist der Befehl, der ausgeführt wird, sofern die Bedingung im ersten Teil nicht zutrifft
Die jeweiligen Abschnitte werden in (Schalt-)Zustände gegliedert. Das Doif hat in dem Fall also zwei Zustände (in Fhem bezeichnet als „cmd1“ und „cmd2„.
[cmd1] DOIF -> (Bedingung) -> (Befehl) -> [cmd2] DOELSE -> (Befehl)
[cmd1] DOIF -> (Bedingung) -> (Befehl) -> [cmd2] DOELSEIF -> (Bedingung) -> (Befehl)
[cmd1] DOIF -> (Bedingung) -> (Befehl) -> [cmd2] DOELSEIF -> (Bedingung) -> (Befehl) ->[cmd3] DOELSE -> (Befehl)
Das ganze lässt sich mit mehreren Bedingungen/Befehlen natürlich weiter verfeinern, dazu kann man or oder and hinzufügen und so ganz detailliert angeben wann was geschehen soll.
Hier ein zerlegtes Beispiel dazu:
DOIF -> Zweig [cmd1]
([7:30]) -> Bedingung, hier eine Uhrzeit
(set Sonoff_S20 on) -> Befehl, Steckdose an
DOELSEIF -> neuer Zweig [cmd2]
(([22:00-23:59] and [+00:15]) -> Bedingung 1 und 1a, zwischen 22:00 und 23:59 soll alle 15 Minuten geprüft werden
and [Fernseher:isRunning] eq „false“ -> Bedingung 2, und prüfen ob Fernseher abgeschaltet ist
or [XboxOne:isRunning] eq „false“) -> Bedingung 3, oder prüfen ob Xbox abgeschaltet ist
(set Sonoff_S20 off) -> Befehl, Steckdose abschalten
Tipp: Wenn man größere Doifs anlegen will, dann sollte man aus Gründen der Übersichtlichkeit nicht alles über die Kommandozeile eintragen. Man kann sich einfach ein „nacktes“ Doif anlegen und den Fhem internen Editor nutzen
define NameDesDoif DOIF (x)
legt ein „nacktes“ Doif an.
Mit einem Klick auf „DEF“ in der Deviceoverview öffnet sich ein wunderschöner Editor, der alle Eingaben farblich hervorhebt, so kann alles übersichtlich erstellt und Fehler schnell erkannt werden. Das eingeklammerte x wird selbstverständlich gelöscht.
Wie oben bereits zu sehen, gehören Zeitangaben in einer Bedingung immer in eine eckige Klammer.
([7:15]) -> Bedingung: 7:15 Uhr
([7:15-8:15]) -> Bedingung: 7:15 Uhr bis 8:15 Uhr
([7:15 |Mo]) -> Bedingung: 7:15 Uhr, nur Montags
([7:15 |Mo Mi So]) -> Bedingung: 7:15 Uhr, Montags, Mittwochs und Sonntags
Alternativ zu den Abkürzungen „Mo“, „Mi“, „So“ ist es auch möglich „1“, „3“, „7“ einzutragen. Mit dem Attribut „weekdays“ kann man die Bezeichnungen der Wochentage oder Wochenenden sogar komplett frei definieren.
([7:15-8:15] and [+00:15]) -> Bedingung: zwischen 7:15 Uhr und 8:15 Uhr und alle 15 Minuten
([+3]) -> Bedingung: alle 3 Stunden
([+:15]) -> Bedingung: alle 15 Minuten
([+[3]:15]) -> Bedingung: alle 3 Stunden, 15 Minuten nach einer vollen Stunde
Wie man sieht kann man zeitlich alles sehr exakt definieren und auf seinen persönlichen Bedarf einrichten.
hier kann man beispielsweise eine automatische Ventilator-Steuerung realisieren. Alles was man dazu braucht ist ein Temperatursensor und ein Schaltaktor (z.B. ein Sonoff Basic).
([Temperatursensor:Temperature] > 20)(set Sonoff_Basic on) DOELSEIF ([Temperatursensor:Temperature] < 20) (set Sonoff_Basic off) Hier wird ein Sonoff Basic bei einer Temperatur von „größer als“ 20° eingeschaltet und bei „kleiner als“ 20° wieder abgeschaltet. Man kann die Bedingung auch mit einer Zeit kombinieren (([7:15]) and [Temperatursensor:Temperature) > 20) ->Bedingung: um 7:15, wenn die Temperatur grösser als 20° ist.
Selbes kann man natürlich auch mit der Luftfeuchtigkeit umsetzen, dazu wird das Reading „Temperature“ durch „Humidity“ ersetzt und der entsprechende Wert angepasst – so kann man für optimales Raumklima sorgen.
ist ein Attribut für ein Doif und muss immer dann gesetzt werden, wenn eine Bedingung mehrfach erfüllt werden kann, ohne dass der (Schalt-)Zustand des Doif sich zwischenzeitlich geändert hat.
Im Commandref findet sich dazu ein Beispiel.
define di_garage DOIF ([remotecontrol:"on"]) (set garage auf) DOELSEIF ([remotecontrol:"off"]) (set garage zu)
In diesem Doif wird der Schaltzustand einer Fernbedienung abgefragt. Schaltet man die Fernbedienung auf „on“ geht die Garage „auf“ – schaltet man die Fernbedienung „off“ geht die Garage „zu“.
In dem Fall ist das so lange eine günstige Lösung, wie man die Garage jedesmal über die Fernbedienung schließt – so ein Garagentor bietet allerdings auch immer die Möglichkeit von Hand geschlossen zu werden, oder per Tastendruck am Torantrieb.
Das Doif hat in diesem Fall zwei (Schalt-)Zustände
cmd1 -> Fernbedienung „on“ -> Garage „auf“
cmd2 -> Fernbedienung „off“ -> Garage „zu“
Hat man das Tor per Hand geschlossen, verbleibt das DOIF in cmd1. Bei einem wiederholtem „on“ der Fernbedienung würde cmd1 nicht nochmal ausgeführt werden – es passiert schlicht gar nichts.
In so einem Fall muss
attr NameDesDoif do always
gesetzt werden. So wird das entsprechende cmd wiederholt ohne, dass sich der Zustand des Doif zuvor geändert hat.
Logfiles & Graphen anlegen
Eine geile Funktion ist das Anlegen von Gplots. Damit kann man ein oder mehrere beliebige Readings grafisch darstellen. Anhand von Sysmon zeige ich euch hier, wie man ein Logfile erstellt, Readings hinzufügt und einen Gplot erstellt.
Um einen Gplot zu erzeugen, muss man die ausgewählten Readings in ein Logfile schreiben. Man kann dazu auch bereits vorhandene Logfiles nehmen – falls keines existiert, muss man selbst eins erstellen.
define FileLog_sysmon FileLog ./log/sysmon-%Y.log sysmon
Sysmon hat nun ein eigenes Logfile. Dort werden alle ausgelesenen Readings gespeichert und können jederzeit eingesehen werden
Zum einsehen der Einträge klickt man oben rechts auf text
Ich habe mein Sysmon-Device mit dem Attribut event-on-change-reading auf die beiden Readings (cpu_temp und cpu_temp_avg) beschränkt. Es schreibt folglich auch nur diese beiden Readings in das Logfile.
Man kann dem Logfile auch beliebige Readings von verschiedenen Devices hinzufügen, dazu nutzt man die Zeile addRegexpPart in der Deviceoverview des eben erstellten Logfile
Aus den beiden Dropdowns kann man je ein Device und ein Reading auswählen, nach einem Klick auf set wird dieses Reading dann ebenfalls in das Logfile geschrieben. Das ist vor allem dann interessant, wenn Readings von unterschiedlichen Devices in Zusammenhang stehen – oder man z.B. anhand dieser Readings einen Gplot erstellen möchte.
Ich werde hier, zur Veranschaulichung, mal ein völlig abstraktes Reading hinzufügen – die Luftfeuchtigkeit aus meinem Wohnzimmer.
Dieser Wert wird nun ebenfalls in das Logfile vom Sysmon geschrieben. Natürlich nicht sofort, sondern erst wenn der Sensor seine gemessenen Werte erneut an Fhem überträgt.
Nachdem man mindestens ein weiteres RegexpPart hinzugefügt hat, sieht man in der Deviceoverview eine Übersicht der im Logfile erfassten RegexpParts. Mit einem Klick auf removeRegexpPart kann man ein solches aus dem Logfile auch wieder entfernen.
Mit Hilfe der addRegexpPart kann man also ganz genau bestimmen, welche Readings man in sein selbst erstelltes Logfile eintragen lassen will.
Ich habe die Humidity wieder entfernt – denn ein Zusammenhang zwischen dem Reading und der CPU-Temperatur ist natürlich nicht gegeben.
Wie oben bereits beschrieben habe ich mein Sysmon-Device mit einem Attribut auf die beiden Readings begrenzt. Alternativ hätte ich natürlich auch je einen RegexpPart für cpu_temp und cpu_temp_avg setzen können, lasst euch dadurch also nicht irritieren.
Um die Readings im Logfile jetzt schön darzustellen, erstellt man einen Gplot. Dazu klickt man in der Deviceoverview des Logfiles auf create SVG plot
Es öffnet sich ein Editor, wo man das Gplot konfigurieren kann
Hier kann man seiner Kreativität nun freien Lauf lassen. Aber erstmal schön der Reihe nach
Ich gehe hier erstmal nur auf die wichtigsten Punkte ein – alle weiteren Einstellung könnt ihr auch gern im Selbststudium einmal ausprobieren.
- Plot title: Gibt die Überschrift des Gplots an. Hier: SYSMON-2018.LOG
- Y-Axis label:
- left: Beschriftung am linken Rand der Y-Achse. Hier: Humidity
- right: Beschriftung am rechten Rand der Y-Achse. Hier: Temperature
- Diagram label: Individueller Name eines Readings. Hier: Line 1
- Source: Gibt die Quelle, also das Logfile, der Readings an, die im Gplot verwendet werden sollen. Hier: FileLog_sysmon
- Input:Column: Der Wert beschreibt die Spalte im Logfile, wo der Wert des Readings gespeichert steht. Inbesondere bei Readings, wo mehrere Werte auf einmal übertragen werden, ist das von Bedeutung. Hier: 4

Für den Zahlenwert (46.5), trägt man in die Input:Column also 4 ein.
- RegExp: In dem Dropdown kann das jeweilige Reading/RegExp separat ausgewählt werden. Man erhält dort eine Übersicht der RegExp, die im Logfile eingetragen sind (dazu müssen im Logfile natürlich auch Einträge vorhanden sein!). Hier: RegExp
- Y-Axis: Hier wird angeben, ob sich das entsprechende Reading auf die linke, oder rechte Seite der Y-Achse beziehen soll. Das gleicht man am besten an die Eingaben an, die man auch unter dem Y-Axis label vergeben hat. Die Auswahl beschränkt sich auf right und left. Hier: right
- Plot-Type: Bestimmt das Aussehen der Linie für das Reading im Diagramm. Hier: lines – das entspricht einer normalen Linie.
- Style: Setzt die Farbe der Linie. Hier: l0
- Width: Bestimmt die Dicke, der Linie. Hier: 1
Um das ganze nun mit Leben zu füllen setzen wir ein paar Angaben. Ich nehme dazu, wie oben genannt, die aktuelle CPU-Temperatur (RegExp: cpu_temp) und die durchschnittliche CPU-Temperatur (RegExp: cpu_temp_avg)
Wenn man alle Angaben, seinen Vorstellungen entsprechend, eingetragen hat, genügt ein Klick auf Write.gplot file (unten links).
Je nach Anzahl der Einträge im Logfile sieht man nun die mehr oder weniger fortgeschrittenen Linien. Klickt man oben links auf die Lupe mit dem +, so kann man die Ansicht auch etwas vergrößern, hauptsächlich bezieht sich das auf die Skala der X-Achse, die die Zeit darstellt.