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.