SmartHome Heimautomation

Inhalt:

  1. Zielsetzung
  2. Auswahl der Steuerungs-Software
  3. FHEM
  4. openHAB
  5. Allgemeines
  6. Zentrale: HomeMatic CCU2
  7. Projekte:
    1. Haustürklingel läßt alle Telefone klingeln
    2. Waschmaschine sendet Nachricht, wenn fertig
    3. Wäsche-Trockner sendet Nachricht, wenn fertig
    4. Weihnachtszeit
    5. Weihnachts-Außenbeleuchtung
    6. Weihnachts-Innenbeleuchtung
    7. Status-Übersicht und Meldungen
    8. Anwesenheitserkennung

Zielsetzung

Das Ziel des SmartHome sollte ein Komfortgewinn durch Automatisierung sein.
An die viel gepriesene Kosteneinsparung durch z.B. Heizungssteuerung glaube ich nicht wirklich, denn für die z.B. ca. 50 EUR eines Heizkörperthermostats kann man ziemlich viel "falsch" heizen, bis sich der Kauf amortisiert.

Auswahl der Steuerungs-Software

Wichtigste Kriterien, die eine SmartHome Steuerungs-Software erfüllen muss: In der End-Auswahl standen bei mir daher: Zuerst fiel meine Entscheidung auf FHEM.
Es unterstützt sehr viele Protokolle/Geräte, steht unter der GPL, existiert als Projekt seit ca. 2005 und benötigt als einzige Voraussetzung Perl und ist damit auf so gut wie jedem Linux sofort einsatzbereit.
Aber die Konfiguration setzt sehr viel Einarbeitung voraus!
Daher wollte ich mal sehen, wie sich openHAB dazu im Vergleich verhält.
Erst einmal gleicher Nachteil wie bei FHEM: Es gibt keine Gentoo ebuilds dafür.
Allerdings sind die ersten Schritte in openHAB größtenteils so selbsterklärend, dass nach wenig Tutorial lesen schon die ersten Regeln laufen.
Daher startete ich nach den ersten Versuchen mit FHEM doch mit openHAB.
Allerdings stellte sich dabei heraus, dass im openHAB 2 die Interaktion zwischen PaperUI und der textbasierten Konfiguration nicht richtig funktoniert und kein schlüssiges Backup-Verfahren existiert.
Daher mein Favorit: FHEM!

FHEM

Informationen

Basis-Installation

emerge -avt dev-perl/RPC-XML
useradd --create-home --system --user-group fhem
mkdir -p /opt/fhem
mkdir -p /var/log/fhem
chown fhem:fhem /opt/fhem
chown fhem:fhem /var/log/fhem
su - fhem
cd /opt/fhem
wget http://fhem.de/fhem-5.7.tar.gz
gunzip -cd fhem-5.7.tar.gz | tar -xf -
ln -s fhem-5.7 fhem
cd fhem
mv log/* /var/log/fhem/
rmdir log
ln -s /var/log/fhem log
./fhem.pl fhem.cfg
Dann sollte man zumindest in Teilen diese Anleitungen lesen: Ansteuern kann man FHEM dann schon per Browser über http://localhost:8083/ oder per telnet: telnet localhost 7072
Dann sollte man gleich das erste Update durch Eingabe folgender Befehle in die Kommandozeile der FHEM Browser-Schnittstelle unter http://localhost:8083/:
update
shutdown restart

HomeMatic CCU2 einbinden

Nach dieser Anleitung folgende Befehle in die Kommandozeile der FHEM Browser-Schnittstelle unter http://localhost:8083/ eingeben:
define d_ccu HMCCU homematic-ccu2
attr d_ccu rpcport 2001,9292
attr d_ccu rpcqueue /tmp/ccuqueue
attr d_ccu rpcinterval 5
set d_ccu rpcserver on
attr d_ccu rpcserver on
get d_ccu devicelist
get d_ccu devicelist create ^HM-ES.* t=all f=HM_%n
get d_ccu devicelist create ^HM-Sen.* t=all f=HM_%n
save

openHAB

Basis-Installation

Nach dieser Anleitung in Kurzform:
echo "dev-java/oracle-jre-bin javafx" >> /etc/portage/package.use
emerge -avt dev-java/oracle-jre-bin
# Oracle Java 8 revision 101 oder höher prüfen:
java -version
Da es leider noch kein funktionsfähiges ebuild gibt, muß man manuell installieren:
useradd --create-home --system --user-group openhab
mkdir -p /opt/openhab2
chown openhab:openhab /opt/openhab2
su - openhab
cd /tmp
wget https://openhab.ci.cloudbees.com/job/openHAB-Distribution/lastSuccessfulBuild/artifact/distributions/openhab/target/openhab-2.1.0-SNAPSHOT.zip
unzip openhab-2.1.0-SNAPSHOT.zip -d /opt/openhab2
exit
su - openhab -c '/opt/openhab2/start.sh server </dev/null' >/tmp/openhab-start.log 2>&1 &
tail -f /opt/openhab2/userdata/logs/openhab.log
# Beenden würde so gehen:
kill $(runs org.apache.karaf.main.Main | awk '{print $2}')
Warten, bis der openHAB Konsolen-Prompt erscheint.
Danach sollte man mit dem Beginner Tutorial weitermachen. Das Dashboard öffnen: http://localhost:8080/
→ Standard
→ PaperUI
Für HomeMatic: → Add-ons
→ Bindings
→ Homematic Binding
→ Install
→ Configration
→ Things
→ Add things
→ Homematic Binding
→ Add manually
→ Gateway Address: homematic-ccu2
→ Inbox
weiter in diesem Teil der Anleitung
Nach den ersten Versuchen stellen sich ein paar noch offene Baustellen heraus:
Die Dokumentation ist an vielen Stellen noch unvollständig.
Außerdem existiert noch keine Backup-Strategie, siehe dazu auch issue #299
Alles, was man per PaperUI macht, landet (hoffentlich) in /opt/openhab2/userdata{etc|jsondb} und die manuell erstellten Textdateien sind ja sowieso in /opt/openhab2/conf.
Daher denke ich, dass man nur das sichern muß:
/opt/openhab2/userdata/etc
/opt/openhab2/userdata/jsondb
/opt/openhab2/conf/items
/opt/openhab2/conf/rules
/opt/openhab2/conf/sitemaps
/opt/openhab2/conf/things
Ein sehr gutes Beispiel einer Konfiguration ist von ThomDietrich zur Verfügung gestellt.

Allgemeines


Zentrale: HomeMatic CCU2

Die HomeMatic CCU2 ist schnell einsatzbereit:
Wichtig zu wissen:
Die Funkreichweite ist bestens, selbst durch 3 Stahlbeton-Zimmerdecken hindurch ist eine problemlose Verbindung möglich.

Projekte

Haustürklingel läßt alle Telefone klingeln

Zutaten: Motivation:
Die bestehende Haustürklingel mit 12V Wechselspannung ist zusätzlich an eine Auerswald Telefonanlage mit Haustürklingel-Eingang angeschlossen, welche alle Telefone mitklingeln läßt.
Da die Programmier-Software für die Auerwald nur auf sehr altem Windows läuft (3.11, 95 und 98) und einen seriellen Port benötigt, welches beides stark vom Aussterben bedroht ist, muß etwas modernes her.
Lösung:
Auf der Suche nach einer Lösung bin auf FHEM ruft FRITZ!Box gestoßen.
Allerdings halte ich das erwähnte simcmd für (noch) unbrauchbar, da der Code an vielen Stellen noch sehr unfertig ist: Zum Beispiel funktioniert die Kommando-Option "w" für die Wartezeit noch überhaupt nicht. Jeder, der das ernsthaft in einer Steuerung einsetzt, sollte erst einmal einen Blick in den Quelltext werfen.
Ebenfalls das bei c't empfohlene sipsak führte bei mir nicht zum gewünschten Ergebnis.
Also Weiter suchen... SIP ist doch ein Protokoll... und für Perl gibt es doch eigentlich für alle Protkolle ein Paket. Treffer:
Mit Net::SIP kann man sich mit ganz wenig Zeilen Perl einen SIP-Client bauen, der Telefone der FritzBox klingeln läßt.
Installation:
emerge -avt app-portage/g-cpan
emerge -avt dev-perl/Net-DNS
g-cpan -ai Net::SIP
Dann kann man so das Telefon 623 der FritzBox klingeln lassen:
sip-ring 192.168.178.1 624 SeCrEt '**623'
Dazu muss man vorher auf der FritzBox ein SIP Telefon (624) einrichten:
Und dann noch einen Gruppenruf einrichten, damit alle Telefone klingeln:
Dazu einfach eine neue Kurzwahl in der FritzBox einrichten, die dann die gewünschten Rufnummern der Nebenstellen klingeln läßt:
Telefonie → Telefonbuch → Neuer Eintrag → Beliebigen Namen vergeben
Unter Rufnummern im ersten Feld die Ziffernfolge **1#, gefolgt von den gewünschten internen Telefonnummern, ebenfalls durch # getrennt, eintragen, z.B.**1#51#620#621#622#623 um die Nebenstellen 51 und 620 bis 623 klingeln zu lassen.
Im Feld Kurzwahl die gewünschte Kurzwahl, z.B. 01, eintragen.
Dann kann man so alle Telefone klingeln lassen:
sip-ring 192.168.178.1 624 SeCrEt '**701'
Dann kann es in FHEM losgehen:
Hauptdevice umbenennen:
rename HM_HM_Sen_DB_PCB_NEQ0956189 Haustuerklingel
Raum zuordnen
attr Haustuerklingel room Haustuer
Dann den Event mit der Aktion verknüpfen.
(Event-Beispiel: HMCCUDEV Haustuerklingel 1.PRESS_SHORT: 1)
define n_Haustuerklingel notify Haustuerklingel:\d.PRESS_SHORT:.* "sip-ring 192.168.178.1 624 SeCrEt **701"
attr n_Haustuerklingel room Haustuer
Fertig!
Man sollte sich aber zur weiteren Vereinfachung folgende FHEM Module anschauen:

Waschmaschine sendet Nachricht, wenn fertig

Zutaten: Motivation:
Wie oft liegt fertige Wäsche in der Waschmaschine und die Hemden knittern vor sich hin? Da wäre es doch schön, wenn man eine Erinnerung bekäme, wenn die Maschine fertig ist.
Lösung:
Auf der Suche nach einer Lösung bin auf HomeMatic Funk-Steckdose mit Leistungsmessung: Deine Waschmaschine ist fertig gestoßen, die meinen Wünschen angepasst und etwas optimiert habe.
Maßgeblich sind die Ideen des Forumsbeitrags Waschmaschinenstatus mit eingeflossen.
Zuerst natürlich die CCU2 in FHEM einbinden.
Wenn man möchte, dass die schaltbare Steckdose nach einem Stromausfall nicht in den OFF Status geht, dann braucht man eine aktuelle Firmware.
Update auf Version 2.5 bei www.eq-3.de herunterladen, dann auf die CCU2 hochladen, dann "Geräte" → "Einstellen" → "Update".
Dann: "Aktion bei Spannungszufuhr" → "kurzen Tastendruck simulieren"
Dann kann es losgehen. Es wird gleich eine Zuordnung zu Räumen vorgenommen. Außerdem wird auch gleich gruppiert, um die Übersichtlichkeit zu wahren.
Hauptdevice umbenennen:
rename HM_HM_ES_PMSw1_Pl_LEQ1345527 Waschmaschine
Raum zuordnen:
attr Waschmaschine room Heizungskeller
attr Waschmaschine group Waschmaschine
Channel umbenennen, welcher die Leistung in Watt anzeigt:
rename HM_HM_ES_PMSw1_Pl_LEQ1345527_2 Waschmaschine_Power
attr Waschmaschine_Power room Heizungskeller
attr Waschmaschine_Power group Waschmaschine
Dummy WaschmaschineWatt für die Anzeige des aktuellen Watt-Verbrauchs definieren:
define WaschmaschineWatt dummy
attr WaschmaschineWatt room Heizungskeller
attr WaschmaschineWatt group Waschmaschine
Dummy WaschmaschineWatt mit Werten versorgen:
(Event-Beispiel: Waschmaschine_Power 2.POWER: 19.210000)
define WaschmaschineWattSet notify Waschmaschine_Power:\d.POWER:.* set WaschmaschineWatt $EVTPART1
attr WaschmaschineWattSet room Heizungskeller
attr WaschmaschineWattSet group Waschmaschine
Alle erfassten Daten in ein Logfile speichern:
define WaschmaschineLog FileLog ./log/waschmaschine.log WaschmaschineWatt|WaschmaschineStatus|WaschmaschineFertig
attr WaschmaschineLog room Heizungskeller
attr WaschmaschineLog group Waschmaschine
Dummy WaschmaschineStatus definieren zur Signalisierung, ob die Waschmaschine gerade arbeitet (on), oder nicht (off):
define WaschmaschineStatus dummy
attr WaschmaschineStatus event-on-change-reading state
attr WaschmaschineStatus room Heizungskeller
attr WaschmaschineStatus group Waschmaschine
Dann mit einem DOIF den WaschmaschineStatus setzen:
Wenn länger als 10 Sekunden weniger als 1 Watt verbraucht wird: off
Wenn "off" und mehr als 1 Watt verbraucht wird: on
Wenn länger als 5 Minuten mehr als 5 Watt verbraucht wird: running
Wenn "running" und länger als 5 Minuten weniger als 5 Watt verbraucht werden: done
define Programm.Waschmaschine.Status DOIF ([WaschmaschineWatt] < 1)\
(\
set WaschmaschineStatus off\
)\
DOELSEIF ([WaschmaschineWatt] >= 1 and [WaschmaschineStatus] eq 'off')\
(\
set WaschmaschineStatus on\
)\
DOELSEIF ([WaschmaschineWatt] >= 5)\
(\
set WaschmaschineStatus running\
)\
DOELSEIF ([WaschmaschineWatt] < 5 and [WaschmaschineStatus] eq 'running')\
(\
set WaschmaschineStatus done\
)
attr Programm.Waschmaschine.Status wait 10:300:0:300
attr Programm.Waschmaschine.Status room Heizungskeller
attr Programm.Waschmaschine.Status group Waschmaschine
Für die Benachrichtigung aus Handy habe ich mich für Pushbullet entschieden.
Dazu einfach dort kostenlos anmelden, einen Access-Token generieren lassen und die App auf dem Handy installieren.
Auf dem FHEM-Server benötigt man noch JSON:
emerge -avt dev-perl/JSON
Die Pushbullet Benachrchtigung einrichten:
define BenachrichtigungStephan Pushbullet dein_pushbullet_access_token
attr BenachrichtigungStephan room Benachrichtigungen
Und testen:
set BenachrichtigungStephan message Ein erster Test! | Test
Eine Variable definieren, in der die Verzögerung der Fertig-Benachrichtigung hochgezählt wird, um die Abstände der Nachrichten sukkzesive zu verlängern:
define WaschmaschineMeldungVerzoegerung dummy
set WaschmaschineMeldungVerzoegerung 1800
attr WaschmaschineMeldungVerzoegerung room Heizungskeller
attr WaschmaschineMeldungVerzoegerung group Waschmaschine
Dummy für "Fertig" Status:
define WaschmaschineFertig dummy
attr WaschmaschineFertig room Heizungskeller
attr WaschmaschineFertig group Waschmaschine
Benachrichtigung und Meldung ins Log:
define WaschmaschineFertigBenachrichtigung DOIF ([WaschmaschineStatus] eq 'done')\
(\
## das Wiederholungsintervall verdoppeln\
set WaschmaschineMeldungVerzoegerung {([WaschmaschineMeldungVerzoegerung]*2)}\
,\
set WaschmaschineFertig 'Fertig.'\
,\
## Nur beim ersten mal an Stephan senden\
IF ([WaschmaschineMeldungVerzoegerung] == 3600)\
(set BenachrichtigungStephan message Waschmaschine ist fertig! | Waschmaschine)\
,\
set BenachrichtigungSteffi message Waschmaschine ist fertig! | Waschmaschine\
)\
DOELSE \
(\
## Wieder den Inital-Wert (30 Minuten) setzen \
set WaschmaschineMeldungVerzoegerung 1800\
)
attr WaschmaschineFertigBenachrichtigung repeatcmd [WaschmaschineMeldungVerzoegerung]
attr WaschmaschineFertigBenachrichtigung repeatsame 5
attr WaschmaschineFertigBenachrichtigung do always
attr WaschmaschineFertigBenachrichtigung room Heizungskeller
attr WaschmaschineFertigBenachrichtigung group Waschmaschine
Für die ersten Tests kann man das "set Benachrichtung..." ja weglassen.
Die Benachrichtigung kommt sofort, dann nach 30 Minuten, dann jeweils um das doppelte zeitlich verlängert, bis Watt auf Null ist (Status "off"), also jemand ganz ausgeschaltet hat. Aber maximal 5 mal.
Und schon wird keine Wäsche mehr in der Maschine vergessen!

Wäsche-Trockner sendet Nachricht, wenn fertig

Zutaten: Motivation:
Wie oft liegt fertige Wäsche im Trockner und feuchtet noch etwas vor sich hin? Da wäre es doch schön, wenn man eine Erinnerung bekäme, wenn der Trockner fertig ist.
Lösung:
Analog zu obiger Anleitung: Waschmaschine sendet Nachricht, wenn fertig
Zuerst natürlich die CCU2 in FHEM einbinden.
Wenn man möchte, dass die schaltbare Steckdose nach einem Stromausfall nicht in den OFF Status geht, dann braucht man eine aktuelle Firmware.
Update auf Version 2.5 bei www.eq-3.de herunterladen, dann auf die CCU2 hochladen, dann "Geräte" → "Einstellen" → "Update".
Dann: "Aktion bei Spannungszufuhr" → "kurzen Tastendruck simulieren"
Dann kann es losgehen. Es wird gleich eine Zuordnung zu Räumen vorgenommen. Außerdem wird auch gleich gruppiert, um die Übersichtlichkeit zu wahren.
Hauptdevice umbenennen:
rename HM_HM_ES_PMSw1_Pl_DN_R1_NEQ1662991 Trockner
Raum zuordnen:
attr Trockner room Heizungskeller
attr Trockner group Trockner
Channel umbenennen, welcher die Leistung in Watt anzeigt:
rename HM_HM_ES_PMSw1_Pl_DN_R1_NEQ1662991_2 Trockner_Power
attr Trockner_Power room Heizungskeller
attr Trockner_Power group Trockner
Dummy TrocknerWatt für die Anzeige des aktuellen Watt-Verbrauchs definieren:
define TrocknerWatt dummy
attr TrocknerWatt room Heizungskeller
attr TrocknerWatt group Trockner
Dummy TrocknerWatt mit Werten versorgen:
(Event-Beispiel: Trockner_Power 2.POWER: 19.210000)
define TrocknerWattSet notify Trockner_Power:\d.POWER:.* set TrocknerWatt $EVTPART1
attr TrocknerWattSet room Heizungskeller
attr TrocknerWattSet group Trockner
Alle erfassten Daten in ein Logfile speichern:
define TrocknerLog FileLog ./log/trockner.log TrocknerWatt|TrocknerStatus|TrocknerFertig|TrocknerLaeufe
attr TrocknerLog room Heizungskeller
attr TrocknerLog group Trockner
Dummy TrocknerStatus definieren zur Signalisierung, ob die Trockner gerade arbeitet (on), oder nicht (off):
define TrocknerStatus dummy
attr TrocknerStatus event-on-change-reading state
attr TrocknerStatus room Heizungskeller
attr TrocknerStatus group Trockner
Dummy TrocknerLaeufe definieren zur Zählung, wann die nächste Filter-Reinigung fällig ist:
define TrocknerLaeufe dummy
set TrocknerLaeufe 0
attr TrocknerLaeufe room Heizungskeller
attr TrocknerLaeufe group Trockner
Dann mit einem DOIF den TrocknerStatus setzen:
Wenn länger als 10 Sekunden weniger als 1 Watt verbraucht wird: off
Wenn "off" und mehr als 1 Watt verbraucht wird: on
Wenn länger als 5 Minuten mehr als 200 Watt verbraucht wird: running
Wenn "running" und länger als 5 Minuten weniger als 200 Watt verbraucht werden: done
define Programm.Trockner.Status DOIF ([TrocknerWatt] < 1)\
(\
set TrocknerStatus off\
)\
DOELSEIF ([TrocknerWatt] >= 1 and [TrocknerStatus] eq 'off')\
(\
set TrocknerStatus on\
)\
DOELSEIF ([TrocknerWatt] >= 200)\
(\
set TrocknerStatus running\
)\
DOELSEIF ([TrocknerWatt] < 200 and [TrocknerStatus] eq 'running')\
(\
set TrocknerStatus done\
,\
## Anzahl der Laeufe hochzaehlen\
set TrocknerLaeufe {([TrocknerLaeufe]+1)}\
)
attr Programm.Trockner.Status wait 10:300:0:300
attr Programm.Trockner.Status room Heizungskeller
attr Programm.Trockner.Status group Trockner
Für die Benachrichtigung aus Handy habe ich mich für Pushbullet entschieden.
Dazu einfach dort kostenlos anmelden, einen Access-Token generieren lassen und die App auf dem Handy installieren.
Auf dem FHEM-Server benötigt man noch JSON:
emerge -avt dev-perl/JSON
Die Pushbullet Benachrchtigung einrichten:
define BenachrichtigungStephan Pushbullet dein_pushbullet_access_token
attr BenachrichtigungStephan room Benachrichtigungen
Und testen:
set BenachrichtigungStephan message Ein erster Test! | Test
Eine Variable definieren, in der die Verzögerung der Fertig-Benachrichtigung hochgezählt wird, um die Abstände der Nachrichten sukkzesive zu verlängern:
define TrocknerMeldungVerzoegerung dummy
set TrocknerMeldungVerzoegerung 1800
attr TrocknerMeldungVerzoegerung room Heizungskeller
attr TrocknerMeldungVerzoegerung group Trockner
Dummy für "Fertig" Status:
define TrocknerFertig dummy
attr TrocknerFertig room Heizungskeller
attr TrocknerFertig group Trockner
Benachrichtigung und Meldung ins Log:
define TrocknerFertigBenachrichtigung DOIF ([TrocknerStatus] eq 'done')\
(\
## das Wiederholungsintervall verdoppeln\
set TrocknerMeldungVerzoegerung {([TrocknerMeldungVerzoegerung]*2)}\
,\
set TrocknerFertig 'Fertig.'\
,\
## Nur beim ersten mal an Stephan senden\
IF ([TrocknerMeldungVerzoegerung] == 3600)\
(set BenachrichtigungStephan message Trockner ist fertig! | Trockner)\
,\
set BenachrichtigungSteffi message Trockner ist fertig! | Trockner\
)\
DOELSE \
(\
## Wieder den Inital-Wert (30 Minuten) setzen \
set TrocknerMeldungVerzoegerung 1800\
)
attr TrocknerFertigBenachrichtigung repeatcmd [TrocknerMeldungVerzoegerung]
attr TrocknerFertigBenachrichtigung repeatsame 5
attr TrocknerFertigBenachrichtigung do always
attr TrocknerFertigBenachrichtigung room Heizungskeller
attr TrocknerFertigBenachrichtigung group Trockner
Für die ersten Tests kann man das "set Benachrichtung..." ja weglassen.
Die Benachrichtigung kommt sofort, dann nach 30 Minuten, dann jeweils um das doppelte zeitlich verlängert, bis Watt auf Null ist (Status "off"), also jemand ganz ausgeschaltet hat. Aber maximal 5 mal.
Und schon wird keine Wäsche mehr im Trockner vergessen!
Ganz nebenbei spart das eine Menge Strom, da der Knitterschutz intervallmäßig immerwieder bis knapp 100 Watt braucht.

Dann noch die Benachrichtigung für die Reinigung:
define TrocknerReinigung DOIF ([TrocknerLaeufe] == 5)\
(\
## Zaehler wieder auf Null setzen\
set TrocknerLaeufe 0\
,\
set BenachrichtigungStephan message Trockner Filter REINIGEN! | Trockner\
)
attr TrocknerReinigung do always
attr TrocknerReinigung room Heizungskeller
attr TrocknerReinigung group Trockner

Zum Schluß kann man noch den "Heizungskeller" zweispaltig darstellen und die Waschmaschine und den Trockner nebeneinander:
attr WEB column Heizungskeller:Waschmaschine|Trockner

Weihnachtszeit

Motivation:
Die weiter unten beschriebenen Weihnachts-Beleuchtungen sollten nur schalten, wenn auch Weihnachten ist. Daher benötigt man einen Status "Weihnachtszeit".
Lösung:
Ein DOIF, das zwischen Ende November und Mitte Januar die Weihnachtszeit anzeigt.
Trigger ist jeden Tag um 00:00 bzw. eine Modifikation des DOIF und gleich beim Erstellen ein manueller Trigger.
define Weihnachtszeit DOIF (([00:00] or ["^global$:^MODIFIED $SELF$"]) and ($md ge "11-25" or $md le "01-08")) DOELSE
attr Weihnachtszeit room Weihnachten
attr Weihnachtszeit group Allgemein
attr Weihnachtszeit cmdState true|false
attr WEB column Weihnachten:Allgemein| Weihnachten:WeihnachtsBeleuchtungInnen|WeihnachtsBeleuchtungAussen
trigger global MODIFIED Weihnachtszeit

Weihnachts-Außenbeleuchtung

Zutaten: Motivation:
Nachdem die alte analoge Zeitschaltuhr für die Weihnachts-Außenbeleuchtung auseinandergefallen ist, muß ein zeitgemäßer Ersatz her.
Hauptnachteil der alten Lösung: Die Gartensteckdose ist durch einen Schalter schaltbar und da kommt es schon des öfteren vor, dass unsere Kinderlein das zeitweise ausschalten, was zu einer verstellten Uhrzeit der Zeitschaltuhr führte.
Lösung:
Falls noch nicht im FHEM sichtbar, dann:
get d_ccu devicelist create ^HM-LC.* t=all f=HM_%n
save
Namen vergeben:
rename HM_HM_LC_Sw1_Pl_DN_R1_OEQ0478896 LichterGartenSued
Raum zuordnen:
attr LichterGartenSued room Weihnachten
attr LichterGartenSued group WeihnachtsBeleuchtungAussen
attr LichterGartenSued statedatapoint 1.STATE
attr LichterGartenSued statevals on:true,off:false
Erster Test:
set LichterGartenSued on
set LichterGartenSued off
Gleich das Ganze nochmal für die Garten Nordseite:
rename HM_HM_LC_Sw1_Pl_DN_R1_OEQ0816247 LichterGartenNord
attr LichterGartenNord room Weihnachten
attr LichterGartenNord group WeihnachtsBeleuchtungAussen
attr LichterGartenNord statedatapoint 1.STATE
attr LichterGartenNord statevals on:true,off:false
Am besten eine Struktur aus beiden erstellen, um nur ein Device schalten zu müssen:
define LichterGarten structure Weihnachten LichterGartenNord LichterGartenSued
attr LichterGarten room Weihnachten
attr LichterGarten group WeihnachtsBeleuchtungAussen
Test der Struktur:
set LichterGarten on
set LichterGarten off
Dann eine einfache Zeitschaltung per DOIF:
define LichterGartenSteuerung DOIF (([Weihnachtszeit] eq "true") and ([6:00-9:00] or [16:00-22:00]))\
(set LichterGarten "on")\
DOELSE\
(set LichterGarten "off")
Das schaltet allerdings nur zu den angegebenen Zeiten.
Wenn die Stromzufuhr zum Funk-Schaltaktor unterbrochen wird oder jemand manuell am Aktor schaltet, dann reagiert das DOIF (richtigerweise) nicht.
Das kann man einfach beheben, indem man auf den 1.WORKING Event reagiert, also:
define LichterGartenSteuerung DOIF (([Weihnachtszeit] eq "true") and (["LichterGarten.+:1.WORKING"] and ([6:00-9:00] or [16:00-22:00]) ))\
(set LichterGarten "on")\
DOELSE\
(set LichterGarten "off")
attr LichterGartenSteuerung do always
attr LichterGartenSteuerung room Weihnachten
attr LichterGartenSteuerung group WeihnachtsBeleuchtungAussen
Und schon hat man eine smarte Zeitschaltuhr inklusive Verhinderung von manuellen Eingriffen!

Weihnachts-Innenbeleuchtung


ACHTUNG: Das ganze ist noch NICHT fertig!


Motivation:
In der Weihnachtszeit ist das Wohnzimmer mit diversen batteriebetriebenen Lichterkettchen geschmückt (3V und 4,5V).
Diese haben aber den großen Nachteil, dass man sie alle einzeln am Batteriefach ein- bzw. ausschalten muss.
Das sollte mit FHEM doch deutlich eleganter gehen...
Lösungen:
Dazu gibt es mindestens drei Lösungsmöglichkeiten:
  1. Die teuerste Variante, die mit dem wenigsten Bastelaufwand auskommt: HomeMatic HM-LC-Sw1-Ba-PCB 1-Kanal-Funk-Schaltaktor für Batteriebetrieb.
  2. Die Variante im preislichen Mittelfeld, die mehr Basteln und viel Löten erfordert: WeMos D1 mini WIFI ESP8266.
  3. Die wahrscheinlich preiswerteste Lösung mit dem höchsten Bastel- aber evtl. weniger Lötaufwand: Sonoff SV, hier nicht näher betrachtet.
Hier die Details im Einzelnen:
Lösung 1:
Zutaten: Infos im FHEM Forum findet man unter diesen Links:
Anschluß des Moduls
weitere Ideen
Achtung: Manche LED Lichterketten haben zwar ein Batteriefach für 2xAA (3V) oder 3xAA (4,5V) aber schalten die LEDs in Reihe und haben am Ausgang daher Spannung im Hundert-Volt-Bereich anliegen. Das würde den HM-Aktor zerstören! Diese Lösung funktioniert daher nur mit parallel geschalteten LEDs, bei denen aus dem Batteriefach wirklich nur die 3V herauskommen.
Am besten erkennt man das an den Kabel der einzelnen LEDs: Es sollten zwei Adern hinführen und auch wieder zwei herauskommen zur nächsten LED, also so:
... -------------|LED|-------------|LED|-------------|LED|------------- ...
... -------------| 1 |-------------| 2 |-------------| 3 |------------- ...
Dann wird das Batteriefach und das HM-Moduls so angeschlossen:
Für die Versorgung des HM-Moduls:
Bat+ an Input+ und Bat- an Input-
Für die zu steuernde Licherkette:
Bat+ an LED+, LED- an Output+, Bat- an Output-
Das HM-Modul funktioniert dann quasi als zwischengeschalteter Schalter.
Als Gehäuse für das HM-Modul mit den Abmessungen BxHxT 45x24x45mm bietet sich z.B. das "Universalgehäuse G03B 104x62x30mm" an, welches ein Fach für einen 9V Block als Spannungsversorgung für das HM-Modul hat.
Falls man die LED-Ketten wechseln möchte, kann man das leichter mit einem Stecker und Kupplung machen, z.B. MagiDeal 2.1mm x 5.5mm DC Stecker Netzstecker Buchse Steckverbinder Adapter Kupplung
Außerdem könnte man auch das Ganze mit nur einer Batterie versorgen, indem man die 9V durch einen Spannungswandler auf die von den LEDs nötige Spannung reduziert, z.B. durch diesen Step Down Converter WINOMO LM2596 1.23-30V DC DC-Einstellbare Spannung Regler Konverter.
Aber Achtung: Von dem LM2596 gibt es genug billige "Nachbauten", die man definitiv nicht nutzen sollte.
Dann kann es auch schon in FHEM losgehen:
get d_ccu devicelist create ^HM-LC.* t=all f=HM_%n
Umbenennen und Gruppieren:
rename HM_HM_LC_Sw1_Ba_PCB_OEQ0162861 LichterWohnzimmer1
attr LichterWohnzimmer1 statedatapoint 1.STATE
attr LichterWohnzimmer1 statevals on:true,off:false
attr LichterWohnzimmer1 room Weihnachten
attr LichterWohnzimmer1 group WeihnachtsBeleuchtungInnen
Als ersten Test die Status LED des HM-Moduls einschalten:
set LichterWohnzimmer1 config DEVICE_LED_MODE=1
und wieder aus:
set LichterWohnzimmer1 config DEVICE_LED_MODE=0
Batteriewarnung auf 8V setzen:
set LichterWohnzimmer1 config LOW_BAT_LIMIT=8.0
Dann noch die weiteren Aktoren:
rename HM_HM_LC_Sw1_Ba_PCB_OEQ0997464 LichterWohnzimmer2
attr LichterWohnzimmer2 statedatapoint 1.STATE
attr LichterWohnzimmer2 statevals on:true,off:false
attr LichterWohnzimmer2 room Weihnachten
attr LichterWohnzimmer2 group WeihnachtsBeleuchtungInnen
set LichterWohnzimmer2 config LOW_BAT_LIMIT=8.0

rename HM_HM_LC_Sw1_Ba_PCB_OEQ0997214 LichterWohnzimmer3
attr LichterWohnzimmer3 statedatapoint 1.STATE
attr LichterWohnzimmer3 statevals on:true,off:false
attr LichterWohnzimmer3 room Weihnachten
attr LichterWohnzimmer3 group WeihnachtsBeleuchtungInnen
set LichterWohnzimmer3 config LOW_BAT_LIMIT=8.0
Am besten eine Struktur erstellen, um nur ein Device schalten zu müssen:
define LichterWohnzimmer structure Weihnachten LichterWohnzimmer1 LichterWohnzimmer2 LichterWohnzimmer3
attr LichterWohnzimmer room Weihnachten
attr LichterWohnzimmer group WeihnachtsBeleuchtungInnen
Dann eine einfache Zeitschaltung per DOIF:
define LichterWohnzimmerSteuerung DOIF (([Weihnachtszeit] eq "true") and ([18:00-22:30]))\
(set LichterWohnzimmer "on")\
DOELSE\
(set LichterWohnzimmer "off")
attr LichterWohnzimmerSteuerung room Weihnachten
attr LichterWohnzimmerSteuerung group WeihnachtsBeleuchtungInnen
Dann einfach die weiteren Geräte in die Struktur aufnehmen und fertig!

Lösung 2:
Nach folgenden Anleitungen:
ESP8266 12F
ESP8266 in FHEM
Einbindung von ESPEasy Schaltern in FHEM
Wemos D1 mini
Wemos D1 mini Battery Shield
Zutaten: Den Wemos und die Shield müssen zusammengesteckt und gelötet werden.
Achtung beim Anschluß des Kabels an den Akku: Die Polung ist in der Regel vertauscht!
Die LED Lichterkette wird am Relais an NO und C angeschlossen, siehe auch Getting Started With Relays.
Wenn die Hardware fertig ist, kann es losgehen.
Zu aller erst die Anlage des Bridge Geräts in FHEM:
define espBridge ESPEasy bridge 8383
Danach erst einmal muß man auf den Wemos das ESPEasy flashen.
Von ESPEasy Wiki das ESPEasy_R147_RC8 herunterladen.
Für das Flashen muss unter Gentoo der Benutzer in der Gruppe uucp sein, um auf den /dev/ttyUSB0 zugreifen zu dürfen.
Dann:
esptool.py --port /dev/ttyUSB0 flash_id
esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --verify --flash_mode dio --flash_size 32m 0x00000 ESPEasy_R147_4096.bin
Nach dem Vorgang den Reset Knopf des Wemos drücken.
Warten bis (z.B. auf dem Handy) das WLAN "ESP_0" erscheint und mit dem Kennwort "configesp" verbinden.
Dann http://192.168.4.1/ aufrufen.
Dort das eigene WLAN auswählen und den WPA Key eingeben.
Achtung: Die Version R147 hat anscheinend noch Probleme mit manchen Sonderzeichen im WPA Key!
Dann sollte nach kurzer Zeit der Wemos vom AP Modus umschalten in die WLAN Client Modus, zu dem man sich dann zur finalen Einrichtung unter http://newdevice/config verbinden kann.
Hier sollten diese Felder belegt werden:
Name: Eindeutiger Name, um der Wemos wiederzufinden, z.B. wemos01
Protocol: FHEM HTTP
Locate Controller: Use Hostname
Controller Hostname: Hostname des FHEM Servers
Controller Port: 8383 (gleicher Port wie beim Define der Bridge oben)
Dann noch unter Tools → Reboot kurz Booten und danach das erste Gerät anlegen: Devices → Edit. Dort z.B. für WLAN RSSI Report diese Werte eintragen:
Device: System Info
Name: RSSI
Delay: 600
IDX / Var: 1
Indicator: Wifi RSSI
Send Data: Haken
Formula dBm: leer lassen
Decimals: 0
Value Name 1: dBm
Dann sollte nach kurzer Zeit im FHEM das zugehörige Gerät auftauchen.
Nun zum Relais.
Das Shield nutzt den Port D1, also 5.
Erster Test:
Unter http://wemos01/ → Tools → Command mit "gpio,5,1" ein- und "gpio,5,0" ausschalten.
Unter Config muss man noch den SCL auf einen anderen IO legen, wie z.B. 5. Sonst funktioniert der nächste Schritt nicht.
Dann ein neues Gerät im Wemos anlegen:
Unter http://wemos01/ → Devices:
Device: Switch input
Name: SW1
Delay: 0
IDX/Var: 0
1st GPIO: GPIO-5 (D1)
Pull UP: Haken
Inversed: kein Haken
Switch Type: Switch
Switch Button Type: Normal Switch
Send Boot state: kein Haken
Send Data: Haken
Dann sollte im FHEM das schon gehen:
set ESPEasy_wemos01_SW1 gpio 5 on
Um direkt mit on/off arbeiten zu können braucht man noch eine eventMap:
attr ESPEasy_wemos01_SW1 eventMap /gpio 5 on:on/gpio 5 off:off/
Dann geht es so:
set ESPEasy_wemos01_SW1 gpio 5 on
Und noch für die korrekte Statusanzeige:
attr ESPEasy_wemos01_SW1 stateFormat {ReadingsVal($name,"presence","") eq "absent" ? "absent" : ReadingsVal($name,"Switch","")}
Damit funktioniert das alles schon wie es soll.
Es hat leider nur einen gravierenden Nachteil: Der Wemos braucht einfach zu viel Strom und der Akku müsste ca. alle eineinhalb Tage nachgeladen werden.
Daher werde ich die Innen-Deko doch lieber mit der HomeMatic-Lösung steuern.

Dann zu guter letzt noch die Innen- und Außenbeleuchtung zweispaltig darstellen:
attr WEB column Weihnachten:WeihnachtsBeleuchtungInnen|WeihnachtsBeleuchtungAussen

Status-Übersicht und Meldungen

Zutaten: Motivation:
Eine Übersicht über die aktuellen Batterie-Zustände der batteriebetriebenen Komponenten und eine Benachrichtigung bei LOW muss man haben.
Lösung:
Zuerst sollte man die LOWBAT Readings normieren:
Readings LOWBAT und LOW_BAT in battery umbenennen:
attr d_ccu ccudef-readingname ^(.+\.)?LOW_?BAT$:battery
Werte von Readings durch sprechende Ausdrücke ersetzen:
attr d_ccu ccudef-substitute LOWBAT,LOW_BAT!(0|false):ok,(1|true):low
In einer readingsGroup zusammenfassen und visualisieren:
define rg_Batteriestatus readingsGroup Haustuerklingel:battery LichterWohnzimmer\d:battery
attr rg_Batteriestatus alias Batteriestatus
attr rg_Batteriestatus valueIcon {'battery.ok' => 'measure_battery_100@green', 'battery.low' => 'measure_battery_0@red'}
attr rg_Batteriestatus room Status
attr rg_Batteriestatus group Batteriestatus
Dann noch eine Benachrichtigung einrichten:
define di_battery DOIF (["(^Haustuerklingel|^LichterWohnzimmer\d):battery: low"] and [?$SELF:Battery_$DEVICE] ne "low")\
(\
set BenachrichtigungStephan message Batteriewarnung von $DEVICE | Batteriewarnung,\
setreading $SELF Battery_$DEVICE low\
)\
DOELSEIF ([":battery: ok"] and [?$SELF:Battery_$DEVICE] ne "ok")\
(setreading $SELF Battery_$DEVICE ok)
attr di_battery do always
attr di_battery room Status
attr di_battery group Batteriestatus
Fertig.

Anwesenheitserkennung

Zutaten: Motivation:
Eines vorweg: Das ist noch keine vollständige Anwesenheitserkennung!
Ich möchte damit nur (im ersten Schritt) ermöglichen, dass die Weihnachtsbeleuchtung im Wohnzimmer ausgeht, wenn keiner mehr da ist.
Lösung:
Zuerst definiert man für alle Geräte, die auf eine Anwesenheit hindeuten könnten, eine PRESENCE Gerät, also z.B. für mein Notebook:
define x200 PRESENCE lan-ping x200 60
attr x200 room Status
attr x200 group Anwesenheit
define galaxy_tab_a PRESENCE lan-ping galaxy-tab-a 60
attr galaxy_tab_a room Status
attr galaxy_tab_a group Anwesenheit
define galaxy_stephan PRESENCE lan-ping galaxy-stephan 60
attr galaxy_stephan room Status
attr galaxy_stephan group Anwesenheit
define galaxy_steffi PRESENCE lan-ping galaxy-steffi 60
attr galaxy_steffi room Status
attr galaxy_steffi group Anwesenheit
define steffi_x201_Windows PRESENCE lan-ping steffi-x201-Windows 60
attr steffi_x201_Windows room Status
attr steffi_x201_Windows group Anwesenheit
Dann fasst man diese Geräte zu einer Struktur zusammen:
define st_AnwesendWohnzimmer structure AnwesendWohnzimmer x200 steffi_x201_Windows
attr st_AnwesendWohnzimmer clientstate_behavior relative
attr st_AnwesendWohnzimmer clientstate_priority present|1 absent|0
attr st_AnwesendWohnzimmer event-on-change-reading state
attr st_AnwesendWohnzimmer room Status
attr st_AnwesendWohnzimmer group Anwesenheit
(Hinweis: Mit "addstruct" kann man zwar neue Komponenten einer Struktur hinzufügen, aber der "struct_type" (hier: "AnwesendWohnzimmer") wird dann nicht gesetzt!)
Dann kann man bei "Abwesenheit" die Lichter ausschalten:
define di_LichterWohnzimmerSteuerungAnwesenheit DOIF ([st_AnwesendWohnzimmer] eq "absent")\
(set LichterWohnzimmer "off")
attr di_LichterWohnzimmerSteuerungAnwesenheit room Weihnachten
attr di_LichterWohnzimmerSteuerungAnwesenheit group WeihnachtsBeleuchtungInnen
Fertig.
Zurück zur Hauptseite
Valid HTML 4.01 Transitional   Valid CSS!