Fhem – ein Smart-Home Server

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.

Inhalt

 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.

installation.png

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.

zurück zum Inhalt

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!!

BasicAuth

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

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

unsorted.png

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

attr basicauth.png

und der Code aus dem Linux-Terminal eingefügt

basicauth2.png
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.

browseranmeldung

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.

save.png(man achte auf das rote Fragezeichen hinter „Save config“)

save2.png(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

webphoneHier einfach auf WEBphone klicken und das Attribut basicAuth setzen – es erscheint das selbe Anmeldefenster, wie auch im WEB.

webphonebasic

  • WEBtablet

webtabletHier das selbe wie bei WEB. Klick auf Unsorted, WEBtablet auswählen und das Attribut basicAuth setzen.

webtabletbasic.png

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.

restart

connection lost.png

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

zurück zum Inhalt

Telnet-Port

zu meckern haben, dieser kann mit einem Passwort abgesichert werden. Folgend findet alles wieder unter der Oberfläche WEB statt, sprich Port 8083!

telnetport.png

Dazu kann man sich wieder mal ein Passwort ausdenken und über die Fhem-Kommandozeile mit

attr telnetPort globalpassword Passwort

setzen.

telnetportpasswd.png

Danach wieder Config speichern & neu starten. Der Security Check sollte nun keine Meldung mehr anzeigen.

securitycheckweg.png

zurück zum Inhalt

HTTPS-Absicherung

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.

zurück zum Inhalt

Update

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).

zurück zum Inhalt

Verbesserte Optik

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

update ha theme.png

Nun kann links im Menü unter Select Style der Style hausautomatisierung_com ausgewählt werden.

ha theme.png

Danach sieht die Web-Oberfläche so aus

ha theme2.png

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.

zurück zum Inhalt

Zweite Schritte

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.

Fhem.png

  1. 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.
  2.  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.
  3. 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.
  4. 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.

 zurück zum Inhalt

Devices

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

 zurück zum Inhalt

SYSMON

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.

 zurück zum Inhalt

Readings

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!)

readings

(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

 zurück zum Inhalt

Attribute

attr

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.

 zurück zum Inhalt

Room

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!

 zurück zum Inhalt

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.

zurück zum Inhalt

Hier kommt die Sonne

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

latlong

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

zurück zum Inhalt

Standbystrom

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)

zurück zum Inhalt

Grundlagen

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.

def

zurück zum Inhalt

Zeitangaben

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.

zurück zum Inhalt

Temperaturregelung

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.

zurück zum Inhalt

do always

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.

zurück zum Inhalt

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.

zurück zum Inhalt

Logfile

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

logfilesysmon.png

Zum einsehen der Einträge klickt man oben rechts auf text

logfile2.png

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

set filelog

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.

regex

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.

removeregexp

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.

zurück zum Inhalt

Graphen

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

svg plot

Es öffnet sich ein Editor, wo man das Gplot konfigurieren kann

plot.png

Hier kann man seiner Kreativität nun freien Lauf lassen. Aber erstmal schön der Reihe nach

ploteditor

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
readingscol

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)

glotlife

Wenn man alle Angaben, seinen Vorstellungen entsprechend, eingetragen hat, genügt ein Klick auf Write.gplot file (unten links).

plot3

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.

gplot4

zurück zum Inhalt