Pünktlich zum neuen Jahr möchte ich mit einer Serie starten, in der ich zeige, wie ich meine FHEM Konfiguration aussieht.
Es setzt etwas Programmierkenntnisse voraus.

In meinen anderen Beiträgen habe ich ja schon grob durchblicken lassen, wie mein FHEM konfiguriert ist. Meine Konfiguration soll als Inspiration dienen und nicht als heiliger Gral. Ich habe schon viele Ansätze gesehen, für meine Zwecke bin ich mit meiner Variante sehr glücklich. Wer Verbesserungsvorschläge hat, kann diese gerne in den Kommentaren posten. Man lernt ja bekanntlich nie aus.

Generell besteht meine Konfiguration aus 3 Teilen:
1. fhem.cfg mit grundlegenden Einstellungen
2. mycfg-Verzeichnis mit allen erforderlichen Konfigurationsdateien
3. Verschiedene Dateien (z. B. 99_dkHandleMotion.pm) im Verzeichnis FHEM

1. Die Datei fhem.cfg


attr global userattr Geschoss Geschoss_map Haus Haus_map cmdIcon devStateIcon devStateStyle fm_fav fm_groups fm_name fm_order fm_type fm_view fp_homeserver genericDeviceType:switch,outlet,light,blind,speaker,thermostat,ignore,lock,window,contact icon lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0 sortby structexclude webCmd widgetOverride
attr global autoload_undefined_devices 1
attr global backup_before_update 0
attr global holiday2we Bremen
attr global latitude xx.xxxxx
attr global logfile ./log/system/fhem-%Y-%m-%d.log
attr global longitude y.yyyyy
attr global modpath .
attr global motd none
attr global sendStatistics never
attr global statefile ./log/system/fhem.save
attr global uniqueID ./FHEM/FhemUtils/uniqueID
attr global updateInBackground 1
attr global verbose 3
include /opt/fhem/mycfg/00_config.cfg
#EOF

In dieser Datei werden generelle globate User-Attribute (userattr) definiert. In meinem Fall habe ich einige für Apple Homekit ergänzt (genericDeviceType)

Zudem werden hier Angaben zu Feiertagen (holiday2we) gemacht und Angaben zu Latitude und Longitude, die wiederum für Wetter-Plugins verwendet werden.
Am Ende wird die 00_config.cfg eingebunden, die sich im Ordner mycfg befindet und als Steuerungsdatei für die Konfiguration dient.

2. Das Verzeichnis mycfg

Hier befinden sich verschiedene Dateien in denen die einzelnen Geräte und Plugins definiert und konfiguriert werden.

Folgende Dateien liegen in diesem Verzeichnis:


00_config.cfg
01_system.cfg
02_web.cfg
10_datastorage.cfg
20_EG_buero.cfg
[...]
28_structure.cfg
29_residents.cfg
30_remotes.cfg
31_actions.cfg
80_calendars.cfg
80_fritzbox.cfg
80_text2speech.cfg
[...]
90_timer.cfg
91_logs.cfg
91_plots.cfg
99_tests.cfg

Ich habe versucht die einzelnen Dateien etwas zu sortieren. Die Nummerierung entspricht der Reihenfolge wie sie in 00_config.cfg eingebunden sind. Sie dient lediglich der Übersicht in der Dateistruktur.
Die Reihenfolge ist bei mir:

00-09: Alles was zum System gehört (CUL, Web-Views, etc.)
10: Datastorage (in diesen Variabeln werden Messwerte bzw. Daten gespeichert)
20: Definition der Geräte in den einzelnen Räumen
21: Aussenbereich
28: Definition der Struktur des Hauses (EG, OG, Garten, Haus)
29: Definition der Bewohner zur Steuerung der Anwesenheit
30: Fernbedienungen
31: Aktionen im Web-View
80: Plugins (z. B. Fritzbox, Geofencing, Pushover, Text2Speech, etc.)
90: Timer
91: Logs und Plots
99: Test / Spielwiese

00_config.cfg (ein kurzer Auszug)

Hier ein kurzer Auszug wie die 00_config.cfg bei mir aussieht.
Es werden die einzelnen Konfigurationsdateien per Include geladen.

Ihr solltet ggf. darauf achten, dass eine logische Reihenfolge eingehalten wird. Also CUL definieren bevor dieser in weiteren Definitionen verwendet wird.


define TABLETUI HTTPSRV dk /opt/fhem/www/tablet/ Tablet-UI
include /opt/fhem/mycfg/01_system.cfg
include /opt/fhem/mycfg/02_web.cfg
include /opt/fhem/mycfg/10_datastorage.cfg
[...]

Die Dateien im Ordner FHEM

Die eigentliche Haussteuerung bzw. die Logik dahinter geschieht (größtenteils) in den einzelnen Dateien im FHEM-Ordner.

Folgende Dateien liegen in diesem Verzeichnis:


99_dkHandleActions.pm
99_dkhandleCalendars.pm
99_dkHandleFritzbox.pm
99_dkHandleHeating.pm
[...]
99_dkUtils.pm
99_dkTTS.pm

Für jeden Bereich habe ich eine eigene Steuerungsdatei erstellt. So kann ich immer den Überblick behalten und die Dateien werden nicht all zu lang und komplex. Von Nachteil ist, dass die Gerätenamen nur schwer geändert werden können, da diese in mehreren Dateien verwendet werden. Ein vernünftiges IDE mit dem man in mehreren Dateien suchen kann hilft hier ungemein. Zudem sollte man sich im Vorfeld Gedanken machen, wie man seine Variabeln und Gerätenamen nennen will. Der Clean-Code-Ansatz hilft hier ganz gut weiter.