SmartHome Heimautomation

Inhalt:

  1. Zielsetzung
  2. Auswahl der Steuerungs-Software
  3. Allgemeine Informationen
  4. openHAB (nicht weiter verfolgt)
  5. FHEM
  6. Interfaces
  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
    9. FHEM WEB
    10. Wetter
    11. Internet-Monitoring
    12. Shell-Befehle starten
    13. Fenster
    14. Heizung
    15. Licht mit Philips Hue
    16. Zwischentecker Osram Lightify Smart+ Plug
    17. Terrasse - Markisen
    18. Text2Speech
    19. SIP-Client
    20. Mail versenden
    21. Blutspende-Termine
    22. Kirschen-Ernte
    23. Luftfeuchte Keller
    24. Erinnerungen/Benachrichtigungen
    25. Roto Dachfenster Solar-Funk-Rollladen
    26. Lampe Wohnzimmer Couch

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!

Allgemeines


openHAB (nicht weiter verfolgt)

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.

FHEM

Informationen

Basis-Installation

emerge -avt dev-perl/RPC-XML
emerge -avt dev-perl/Device-SerialPort
useradd --create-home --system --user-group fhem
# Gruppe "uucp" für Zugriff auf /dev/ttyACM?
usermod -a -G uucp 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 später per telnet (siehe defmod telnetPort ... weiter unten): 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 check
update
shutdown restart

Den Telnet Port aufmachen, um per "telnet xxx 7072" direkt Code in FHEM "füttern" zu können:
defmod telnetPort telnet 7072 global

Erlauben, dass Statistiken an die Entwickler gesendet werden:
attr global sendStatistics onUpdate
notice confirm update-20130127-001

Längen- und Breitengrad für z.B. Sonnenstand einstellen (z.B. für Frankfurt):
attr global latitude 50.112
attr global longitude 8.686

Die nicht blockierende DNS Auflösung verwenden:
attr global dnsServer 192.168.178.1

Zur Fehlersuche kann man das Attribut verbose entweder global setzen, oder auch nur für einzelne Geräte, z.B.:
attr MeinSchalter verbose 5

Um bei einem Server/FHEM Crash halbwegs aktuelle Stati zu haben, sollte man zwischendurch das State-File (fhem.save) sichern:
define SaveStateFile at +*00:15:00 {WriteStatefile}
attr SaveStateFile room Z_Internal
attr SaveStateFile comment StateFile alle 15 Minuten sichern
Aber Achtung: Ob das der richtige Ansatz ist oder nicht, da gehen die Meinungen auseinander, siehe diese Diskussion.

Interfaces

Ich zitiere aus Systemübersicht - Interfaces:
Die Verbindung zu den angeschlossenen Geräten der Hausautomation wird im Allgemeinen - geräteabhängig - über Interfaces (manchmal auch als Gateway bezeichnet) hergestellt. Diese setzen die FHEM Steuerbefehle in das jeweilige (Funk-) Protokoll um - und geben auch die (Funk-) Telegramme der Komponenten an FHEM zurück.

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.

Die HomeMatic CCU2 wird so in FHEM eingebunden:
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 ccuflags procrpc,reconnect
attr d_ccu rpcinterfaces BidCos-RF,HmIP-RF
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

Philips Hue

Für Hue/ZigBee gibt es mehrere Anbieter: Ich beschreibe hier die Einrichtung der Philips Hue Bridge, zentrales, intelligentes Steuerelement des Hue Systems.
Das Philips Hue System funkt per ZigBee.
ZigBee ist zwar prinzipiell herstellerübergreifend, aber Firmware-Updates werden in der Regel immer über die Hersteller eigene Bridge durchgeführt.
(Wenn man auf die Firmware-Updates verzichtet, dann kann man auch ein Zigbee-Gateway selber bauen, siehe c't 24/2018 S.164.)
Die ZigBee Kanäle befinden sich ja im selben Frequenzband wie WLAN.
Die Bereiche sind wie folgt: Das bedeutet, dasss ZigBee bei einer üblichen WLAN-Kanalbelegung (1, 6, 11) nur noch die "Lücken" ZigBee 15, 20 und 25 hat.
Bei Problemen sollte man also einen Kanalwechsel versuchen.
Hue wird in FHEM ganz einfach laut Wiki eingerichtet:
Hue Bridge ans Heimnetz anschließen, App fürs Handy installieren, Einrichtung per App starten und ggf. die Lampen mit der Bridge verbinden, dann:
define HueBridge HUEBridge philips-hue.fritz.box
attr HueBridge httpUtils 1
set HueBridge autocreate

Z-Wave

Z-Wave ist super im FHEM-Wiki: Z-Wave beschrieben!
Da der "Aeotec AEOEZW090-C Aeon Labs USB Stick" sehr für seine hohe Funk-Reichweite gelobt wird, habe ich mich für diesen und gegen den günstigeren "ZMEEUZB1" entschieden.
Ich kann die hohe Funk-Leistung bestätigen: Es geht durch drei Stahlbeton-Decken!
Einbindung in FHEM:
Stick einstecken.
usb scan
Fertig!
Evtl. noch in den richtigen Raum schieben:
attr ZWDongle_0 room ZWave
Nach jeder größeren Änderung (neue Geräte) sollte man das NVRAM des Controllers sichern:
set ZWDongle_0 backupCreate 256k

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:.* "/usr/sl/sip-ring 192.168.178.1 624 SeCrEt **701"
attr n_Haustuerklingel room Haustuer
Eine noch bessere Variante baut eine zeitgesteuerte Klingel-Sperre ein:
Die Kurzwahl 702 läßt alle Telefone außer Schlafzimmer klingeln, die Kurzwahl 701 läßt alle klingeln.
defmod di_Haustuerklingel DOIF (["Haustuerklingel:\d.PRESS_SHORT:.*"] and ([8:00-17:00] or [19:30-22:00]))\
("/usr/sl/sip-ring 192.168.178.1 624 SeCrEt **702")\
DOELSEIF (["Haustuerklingel:\d.PRESS_SHORT:.*"])\
("/usr/sl/sip-ring 192.168.178.1 624 SeCrEt **701")
attr di_Haustuerklingel do always
attr di_Haustuerklingel cmdState Alle_ohne_SZ|Alle
attr di_Haustuerklingel room Haustuer
attr di_Haustuerklingel comment Bei Klingeln an der Haustüre klingeln auch alle Telefone. Während Klingelsperre-Zeiten klingeln alle außer im Schlafzimmer.
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.
Es gibt auch sehr elegante Lösungen mit nur einem einzigen DOIF:
Waschmaschine, Trockner und Spülmaschine Fertigmeldung
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
Es gibt auch sehr elegante Lösungen mit nur einem einzigen DOIF:
Waschmaschine, Trockner und Spülmaschine Fertigmeldung
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:
defmod TrocknerReinigung DOIF ([TrocknerLaeufe] == 5)\
(\
## Zaehler wieder auf Null setzen\
set TrocknerLaeufe 0\
,\
{sendmail('[MailAdresseStephan]','Trockner Filter reinigen','Filter im Trockner reinigen!')}\
)
attr TrocknerReinigung do always
attr TrocknerReinigung room Heizungskeller
attr TrocknerReinigung group Trockner
attr TrocknerReinigung comment Sendet eine Mail als Erinnerung, wenn die maximale Anzahl der Trockner Läufe erreicht ist und der Filter gereinigt werden muss.

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.
defmod Weihnachtszeit DOIF (([00:00] or ["^global$:^MODIFIED $SELF$"]) and ($md ge "11-23" or $md le "01-15")) DOELSE
attr Weihnachtszeit room Weihnachten
attr Weihnachtszeit group Allgemein
attr Weihnachtszeit cmdState true|false
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.
Hinweis:
Der HM Aktor ist nicht für den Außenbereich gedacht, da er nicht Spritzwasser-geschützt ist! Daher muß er sicher und trocken untergebracht werden!
Alternativ könnte man sich z.B. den Gardena Smart Power anschauen, welcher die Schutzklasse IP44 erfüllt, aber leider nur mit Gardena Cloud funktioniert. Siehe: FHEM Wiki: GardenaSmartSystem
Lösung (mit HM):
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
attr LichterGartenSued webCmd on:off
attr LichterGartenSued devStateIcon 1:on:off 0:off:on
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
attr LichterGartenNord webCmd on:off
attr LichterGartenNord devStateIcon 1:on:off 0:off:on
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
attr LichterGarten webCmd on:off
attr LichterGarten devStateIcon 1:on:off 0:off:on
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 (inkl. Sonnenauf-/untergang abhängige Zeiten!):
defmod LichterGartenSteuerung DOIF \
(\
([Weihnachtszeit] eq "true") and\
(["LichterGarten.+:1.WORKING"] and\
([6:30-([Sonnenaufgang]+[0:25])] or [([Sonnenuntergang]-[0:25])-22:50]))\
)\
(set LichterGarten "on")\
DOELSE\
(set LichterGarten "off")
attr LichterGartenSteuerung do always
attr LichterGartenSteuerung cmdState on|off
attr LichterGartenSteuerung room Weihnachten
attr LichterGartenSteuerung group WeihnachtsBeleuchtungAussen
attr LichterGartenSteuerung comment Schaltet die Weihnachtsbeleuchtung im Garten von 6:30 bis 25 Minuten nach Sonnenaufgang und 25 Minuten vor Sonnenuntergang bis 22:50 ein, sonst aus.
Und schon hat man eine smarte Zeitschaltuhr inklusive Verhinderung von manuellen Eingriffen!
Hinweis: In diesem speziellen DOIF funktioniert leider kein {sunrise()}, da das DOIF durch das WORKING getriggert wird und dann der Sonnenaufgang des nächsten Tages eingestellt wird.

Weihnachts-Innenbeleuchtung

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.
Es gäbe auch noch diese etwas größeren Gehäuse:
Universal-Gehäuse 123 x 72 x 39 Kunststoff Schwarz Kemo G02B
Universal-Gehäuse 123 x 71 x 30 ABS Grau TRU COMPONENTS TC-6512 GR203 (nicht ganz so optimal, da die Rundung des Gehäuses auch innen rund ist.)
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 auf die Idee kommen und 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.
Das funktioniert zwar im Prinzip, aber der Step-Down-Wandler hat anscheinend so viel Verlust, dass das Ganze leider nur einen Abend leuchtet und dann ist der 9V Block leer.
Daher sollte man doch mit separaten Batterien für den HM-Aktor und die LEDs arbeiten.
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 Wohnzimmer
attr LichterWohnzimmer1 webCmd on:off
attr LichterWohnzimmer1 devStateIcon 1:on:off 0:off:on
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 Wohnzimmer
set LichterWohnzimmer2 config LOW_BAT_LIMIT=8.0
attr LichterWohnzimmer2 webCmd on:off
attr LichterWohnzimmer2 devStateIcon 1:on:off 0:off:on

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 Wohnzimmer
set LichterWohnzimmer3 config LOW_BAT_LIMIT=8.0
attr LichterWohnzimmer3 webCmd on:off
attr LichterWohnzimmer3 devStateIcon 1:on:off 0:off:on

rename HM_HM_LC_Sw1_Ba_PCB_OEQ0162806 LichterKueche
attr LichterKueche statedatapoint 1.STATE
attr LichterKueche statevals on:true,off:false
attr LichterKueche room Weihnachten
attr LichterKueche group Kueche
set LichterKueche config LOW_BAT_LIMIT=8.0
attr LichterKueche webCmd on:off
attr LichterKueche devStateIcon 1:on:off 0:off:on

rename HM_HM_LC_Sw1_Ba_PCB_OEQ0996955 LichterTreppe
attr LichterTreppe statedatapoint 1.STATE
attr LichterTreppe statevals on:true,off:false
attr LichterTreppe room Weihnachten
attr LichterTreppe group Treppe
set LichterTreppe config LOW_BAT_LIMIT=8.0
attr LichterTreppe webCmd on:off
attr LichterTreppe devStateIcon 1:on:off 0:off:on

rename HUEDevice5 Kripperl
deleteattr Kripperl alias
attr Kripperl room Weihnachten
attr Kripperl group Wohnzimmer
attr Kripperl devStateIcon on:FS20.on@orange:off off:light_light@green:on unreachable:WLAN_Status.0
Am besten eine Struktur erstellen, um nur ein Device schalten zu müssen:
defmod LichterZimmer structure Weihnachten LichterWohnzimmer1 LichterWohnzimmer2 LichterWohnzimmer3 LichterTreppe
attr LichterZimmer room Weihnachten
attr LichterZimmer group Zimmer
Dann eine einfache Zeitschaltung per DOIF:
define LichterZimmerSteuerung DOIF (([Urlaub] ne "true") and\
([Weihnachtszeit] eq "true") and ([18:00-23:00]))\
(set LichterZimmer "on")\
DOELSE\
(set LichterZimmer "off")
attr LichterZimmerSteuerung cmdState on|off
attr LichterZimmerSteuerung room Weihnachten
attr LichterZimmerSteuerung group Zimmer
Dann einfach die weiteren Geräte in die Struktur aufnehmen und fertig!
Das gleiche nochmal mit etwas anderen Zeiten fürs Kripperl:
define KripperlSteuerung DOIF (([Urlaub] ne "true") and\
([Weihnachtszeit] eq "true") and ([16:30-23:00]))\
(set Kripperl on)\
DOELSE\
(set Kripperl off)
attr KripperlSteuerung cmdState on|off
attr KripperlSteuerung room Weihnachten
attr KripperlSteuerung group Zimmer

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.
Siehe zu dieser Thematik auch: DHT22 ESP8266/1 mit ESPEasy und Batteriebetrieb.
Daher werde ich die Innen-Deko doch lieber mit der HomeMatic-Lösung steuern.

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:
Die readings LOWBAT und LOW_BAT in battery umbenennen und Reading UNREACH in activity umbenennen:
attr d_ccu ccudef-readingname ^(.+\.)?LOW_?BAT$:battery;;^(.+\.)?UNREACH$:activity
Werte von Readings durch sprechende Ausdrücke ersetzen:
attr d_ccu ccudef-substitute LOWBAT,LOW_BAT!(0|false):ok,(1|true):low;;UNREACH!(0|false):alive,(1|true):dead
In einer readingsGroup alle Geräte mit "battery"-Reading zusammenfassen und visualisieren, die mit Großbuchstabe+Kleinbuchstabe beginnen, aber nicht mit HM oder HmIP:
defmod rg_Batteriestatus readingsGroup ^[A-Z][a-z]\w+:FILTER=NAME!=(HM_HM|HmIP_HmIP)_.+: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 mapping %ALIAS
attr rg_Batteriestatus room Status
attr rg_Batteriestatus group Batteriestatus
Dann noch eine Benachrichtigung einrichten:
defmod di_battery DOIF (["^[A-Z][a-z]\w+:battery: low"] and [?$SELF:Battery_$DEVICE] ne "low")\
(\
set BenachrichtigungStephan message Batteriewarnung von $DEVICE | Batteriewarnung,\
{sendmail('[MailAdresseStephan]','Batteriewarnung','Batteriewarnung von $DEVICE!')},\
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
attr di_battery comment Sendet Eine Pushbullet- und Mail-Nachricht, wenn bei einem Gerät eine Batteriewarnung auftritt.
Die UNREACH (Alive/Dead) Stati, also ob ein Gerät da ist oder nicht, in einer readingsGroup zusammenfassen und visualisieren:
defmod rg_Activity readingsGroup .+:FILTER=NAME!=(HM_HM|HmIP_HmIP)_.+:(activity|reachable)
attr rg_Activity alias Activity
attr rg_Activity valueIcon {'activity.alive' => 'message_ok@green', 'reachable.1' => 'message_ok@green', 'activity.dead' => 'control_x@red', 'reachable.0' => 'control_x@red'}
attr rg_Activity mapping %ALIAS
attr rg_Activity room Status
attr rg_Activity group Activity
Auch die RSSI-Werte kann man so darstellen:
defmod rg_RSSI readingsGroup <>,<DEVICE>,<PEER> .+:FILTER=NAME!=(HM_HM|HmIP_HmIP)_.+:\d+.RSSI_DEVICE,\d+.RSSI_PEER
attr rg_RSSI alias RSSI Werte
attr rg_RSSI room Status
attr rg_RSSI group RSSI
Oder die Firmware:
defmod rg_Firmware readingsGroup .+:FILTER=NAME!=(HM_HM|HmIP_HmIP)_.+:+(firmware|swversion)
attr rg_Firmware alias Firmware
attr rg_Firmware room Status
attr rg_Firmware group Firmware
attr rg_Firmware mapping %ALIAS
Der Filter (FILTER) filtert alle Geräte, die mit HM_HM_ beginnen heraus.
Fertig.

Zu den Zuständen kann man auch einen "Urlaubs" Status definieren, um gewisse Steuerungen Urlaubs abhängig zu modifizieren:
define Urlaub dummy
attr Urlaub room Status
attr Urlaub group Allgemein
attr Urlaub webCmd true:false

Außerdem ist es für diverse Automatismen wissenswert, ob der aktuelle Tag ein Arbeitstag oder Wochenende/Feiertag ist.
Dazu bindet man die Feiertagsdatei des jeweiligen Bundeslandes ein, hier Bayern (daher "by"!):
define by holiday
attr by room Status
attr by group Allgemein
attr global holiday2we by
attr by alias Feiertag
Dadurch "weiß" dann die globale Variable $we bzw. das DOIF, wann welcher Tag ist.
Über ein DOIF kann man den Wert elegant anzeigen lassen:
defmod Wochentag DOIF \
([3:10|WE])\
DOELSEIF \
([3:10|AT])
attr Wochentag cmdState Wochenende/Feiertag|Wochentag/Arbeitstag
attr Wochentag room Status
attr Wochentag group Allgemein
attr Wochentag comment Zeigt an, ob der aktuelle Tag ein Wochentag/Arbeitstag oder ein Wochenende/Feiertag ist.

Eine Anwendung für die Unterscheidung Wochentag/Feiertag ist die Wahl des Radiosenders für die morgendliche Nachrichten-Aufzeichnung. Der Sender-Kanal wird ein einer Datei abgelegt und kann dann in dem Aufzeichnungs-Skript weiterverwendet werden.
defmod NachrichtenSender DOIF \
([3:10|WE] or (([3:10] or ["^global$:^MODIFIED $SELF$"]) and ($md ge "12-24" or $md le "01-01")))\
({system("/bin/echo 201 > /tmp/nachrichten_sender")})\
DOELSEIF \
([3:10|AT])\
({system("/bin/echo 200 > /tmp/nachrichten_sender")})
attr NachrichtenSender cmdState Antenne|Sunshine
attr NachrichtenSender room Status
attr NachrichtenSender group Allgemein
attr NachrichtenSender comment Zeigt an, ob die Radio-Nachrichten von Antenne oder Sunshine aufgenommen werden sollen. Wochentags Sunshine, an freien Tagen und in der Weihnachtszeit Antenne.
Update:
Da Sunshine irgendwie um 6:00 keine Nachrichten mehr sendet, habe ich das deaktiviert.

Als Grundlage für eine Überwachung der FHEM-zu-CCU Kommunikation, dient folgendes DOIF: Es wird jede volle Stunde ([:00]) gezählt, wieviele Homematic Geräte (TYPE==^HMCCU) einen Status haben, der nicht älter ist als eine Stunde. Sollte hier eine Null herauskommen, dann ist wahrscheinlich die CCU oder die Verbindung dorthin ausgefallen.
Zur Funktionsweise bitte in der DOIF Hilfe unter "Aggregieren von Werten" suchen.
defmod Aktuelle_CCU_Readings DOIF ([:00])\
(setreading $SELF dev_namen [@:"":state:((ReadingsAge($name,"state",0)<3600)&&($TYPE=~/^HMCCU/)),"keine"],\
setreading $SELF anzahl [#:"":state:((ReadingsAge($name,"state",0)<3600)&&($TYPE=~/^HMCCU/)),0])
attr Aktuelle_CCU_Readings state [$SELF:anzahl]
attr Aktuelle_CCU_Readings do always
attr Aktuelle_CCU_Readings room Status
attr Aktuelle_CCU_Readings group Allgemein
attr Aktuelle_CCU_Readings comment Jede volle Stunde wird gezählt, wieviele Homematic Geräte einen Status haben, der nicht älter ist als eine Stunde. Sollte hier Null stehen, dann ist wahrscheinlich die CCU oder die Verbindung dorthin ausgefallen.

Für Benachrichtigungen sollte man die konstanten Mailadressen an einer zentralen Stelle speichern:
defmod MailAdresseStephan DOIF (["^global$:^ATTR $SELF state "])
attr MailAdresseStephan state xxx@gmx.de
attr MailAdresseStephan do always
attr MailAdresseStephan room Benachrichtigungen
attr MailAdresseStephan group Konstanten
attr MailAdresseStephan comment Konstante: Stephans Mail-Adresse

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, ein PRESENCE Gerät, also z.B. für die Notebooks und das Tablet:
define x200 PRESENCE lan-ping x200 60
attr x200 event-on-change-reading .*
attr x200 room Anwesenheit
attr x200 group Notebook_Tablet

define galaxy_tab_a PRESENCE lan-ping galaxy-tab-a 60
attr galaxy_tab_a event-on-change-reading .*
attr galaxy_tab_a room Anwesenheit
attr galaxy_tab_a group Notebook_Tablet

define steffi_x201_Windows PRESENCE lan-ping steffi-x201-Windows 60
attr steffi_x201_Windows event-on-change-reading .*
attr steffi_x201_Windows room Anwesenheit
attr steffi_x201_Windows group Notebook_Tablet

define steffi_x201 PRESENCE lan-ping steffi 60
attr steffi_x201 event-on-change-reading .*
attr steffi_x201 room Anwesenheit
attr steffi_x201 group Notebook_Tablet
Dann fasst man diese Geräte zu einer Struktur zusammen:
define st_AnwesendWohnzimmer structure AnwesendWohnzimmer x200 steffi_x201_Windows galaxy_tab_a steffi_x201
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 Anwesenheit
attr st_AnwesendWohnzimmer group Notebook_Tablet
attr st_AnwesendWohnzimmer sortby AA
attr x200 sortby Z1
attr steffi_x201 sortby Z2
attr steffi_x201_Windows sortby Z3
attr galaxy_tab_a sortby Z4
attr st_AnwesendWohnzimmer comment Zeigt an, ob mindestens eine Person im Wohnzimmer anwesend ist. Prüfung anhand der üblichen Geräte, die im Wohnzimmer im Einsatz sind.
Erklärung: Durch das Attribut clientstate_priority wird der Status auf present gesetzt, sobald auch nur ein Gerät present ist. Siehe: FHEM Wiki structure.
(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" nach 21:15 die Lichter ausschalten:
defmod di_LichterZimmerSteuerungAnwesenheit DOIF \
(\
([Weihnachtszeit] eq "true") and\
( [21:15-23:59] and ([st_AnwesendWohnzimmer] eq "absent") )\
)\
(set LichterZimmer "off",\
set Kripperl off)\
DOELSE
attr di_LichterZimmerSteuerungAnwesenheit cmdState on|off
attr di_LichterZimmerSteuerungAnwesenheit room Weihnachten
attr di_LichterZimmerSteuerungAnwesenheit group Zimmer
attr di_LichterZimmerSteuerungAnwesenheit comment Schaltet die Weichnachtsbeleuchtung im Wohnzimmer vorzeitig aus, wenn niemand mehr anwesend ist.
Dann kann man gleich noch analog dazu die ping-Erreichbarkeit der Handies prüfen:
define galaxy_stephan PRESENCE lan-ping galaxy-stephan 60
attr galaxy_stephan event-on-change-reading .*
attr galaxy_stephan room Anwesenheit
attr galaxy_stephan group Handy

define galaxy_steffi PRESENCE lan-ping galaxy-steffi 60
attr galaxy_steffi event-on-change-reading .*
attr galaxy_steffi room Anwesenheit
attr galaxy_steffi group Handy
Bei aktuellen Handies wird aber zum Stromsparen das Netzwerk soweit ausgeschaltet, dass das Handy nicht einmal mehr auf ping antwortet.
Daher sollte man das besser wie in Anwesenheitserkennung von Smartphones mit Fritzbox beschrieben über eine FritzBox machen, weil diese das Handy auch noch "kennt", wenn es im Stromspar-Tiefschlaf ist.
FritzBoxen werden so eingerichtet:
Ggf. fehlende Perlmodule nachinstallieren:
emerge -avt dev-perl/Net-Telnet dev-perl/SOAP-Lite
Optional die Icons (WLAN_off.png, WLAN_on_gWLAN_off.png, WLAN_on_gWLAN_on.png) von hier nach ./www/images/default/ kopieren, dann
set WEB rereadicons
Dann:
define FritzBox1 FRITZBOX 192.168.178.1
set FritzBox1 password XXX
attr FritzBox1 event-on-change-reading .*
attr FritzBox1 room FritzBox
attr FritzBox1 devStateIcon .*on.*off:WLAN_on_gWLAN_off .*on.*on.*:WLAN_on_gWLAN_on WLAN..off.*:WLAN_off .*:control_x@red

define FritzBox2 FRITZBOX 192.168.178.2
set FritzBox2 password XXX
attr FritzBox2 event-on-change-reading .*
attr FritzBox2 room FritzBox
attr FritzBox2 devStateIcon .*on.*off:WLAN_on_gWLAN_off .*on.*on.*:WLAN_on_gWLAN_on WLAN..off.*:WLAN_off .*:control_x@red

define FritzBox3 FRITZBOX 192.168.178.3
set FritzBox3 password XXX
attr FritzBox3 event-on-change-reading .*
attr FritzBox3 room FritzBox
attr FritzBox3 devStateIcon .*on.*off:WLAN_on_gWLAN_off .*on.*on.*:WLAN_on_gWLAN_on WLAN..off.*:WLAN_off .*:control_x@red

define FileLog_FritzBox FileLog ./log/FritzBox.log FritzBox\d:mac_70_28_8B_91_3D_CA.*|FritzBox\d:mac_C0_BD_D1_DB_E1_C0.*
attr FileLog_FritzBox room FritzBox

Die Kennworte werden in /opt/fhem/FHEM/FhemUtils/uniqueID gespeichert.

define pr_FritzBox1 PRESENCE lan-ping 192.168.178.1 60
attr pr_FritzBox1 event-on-change-reading .*
attr pr_FritzBox1 room Anwesenheit
attr pr_FritzBox1 group FritzBox

define pr_FritzBox2 PRESENCE lan-ping 192.168.178.2 60
attr pr_FritzBox2 event-on-change-reading .*
attr pr_FritzBox2 room Anwesenheit
attr pr_FritzBox2 group FritzBox

define pr_FritzBox3 PRESENCE lan-ping 192.168.178.3 60
attr pr_FritzBox3 event-on-change-reading .*
attr pr_FritzBox3 room Anwesenheit
attr pr_FritzBox3 group FritzBox

define galaxy_stephan_FB2 PRESENCE event FritzBox2:mac_70_28_8B_91_3D_CA:\s+inactive FritzBox2:mac_70_28_8B_91_3D_CA:\s+.+\s+\(WLAN,.+\)
attr galaxy_stephan_FB2 room Anwesenheit
attr galaxy_stephan_FB2 group Handy
attr galaxy_stephan_FB2 comment Präsenz-Test über FritzBox WLAN

define galaxy_stephan_FB3 PRESENCE event FritzBox3:mac_70_28_8B_91_3D_CA:\s+inactive FritzBox3:mac_70_28_8B_91_3D_CA:\s+.+\s+\(WLAN,.+\)
attr galaxy_stephan_FB3 room Anwesenheit
attr galaxy_stephan_FB3 group Handy
attr galaxy_stephan_FB3 comment Präsenz-Test über FritzBox WLAN

define galaxy_steffi_FB2 PRESENCE event FritzBox2:mac_C0_BD_D1_DB_E1_C0:\s+inactive FritzBox2:mac_C0_BD_D1_DB_E1_C0:\s+.+\s+\(WLAN,.+\)
attr galaxy_steffi_FB2 room Anwesenheit
attr galaxy_steffi_FB2 group Handy
attr galaxy_steffi_FB2 comment Präsenz-Test über FritzBox WLAN

define galaxy_steffi_FB3 PRESENCE event FritzBox3:mac_C0_BD_D1_DB_E1_C0:\s+inactive FritzBox3:mac_C0_BD_D1_DB_E1_C0:\s+.+\s+\(WLAN,.+\)
attr galaxy_steffi_FB3 room Anwesenheit
attr galaxy_steffi_FB3 group Handy
attr galaxy_steffi_FB3 comment Präsenz-Test über FritzBox WLAN

define st_galaxy_stephan structure st_galaxy_stephan galaxy_stephan galaxy_stephan_FB2 galaxy_stephan_FB3
attr st_galaxy_stephan clientstate_behavior relative
attr st_galaxy_stephan clientstate_priority present|1 absent|0
attr st_galaxy_stephan event-on-change-reading state
attr st_galaxy_stephan room Anwesenheit
attr st_galaxy_stephan group Handy
attr st_galaxy_stephan sortby 01
attr galaxy_stephan sortby 11
attr galaxy_stephan_FB2 sortby 12
attr galaxy_stephan_FB3 sortby 13
attr st_galaxy_stephan comment Zeigt an, ob das Handy an mindestens einer FritzBox angemeldet ist oder per Ping erreichbar ist.

define st_galaxy_steffi structure st_galaxy_steffi galaxy_steffi galaxy_steffi_FB2 galaxy_steffi_FB3
attr st_galaxy_steffi clientstate_behavior relative
attr st_galaxy_steffi clientstate_priority present|1 absent|0
attr st_galaxy_steffi event-on-change-reading state
attr st_galaxy_steffi room Anwesenheit
attr st_galaxy_steffi group Handy
attr st_galaxy_steffi sortby 02
attr galaxy_steffi sortby 21
attr galaxy_steffi_FB2 sortby 22
attr galaxy_steffi_FB3 sortby 23
attr st_galaxy_steffi comment Zeigt an, ob das Handy an mindestens einer FritzBox angemeldet ist oder per Ping erreichbar ist.

define FileLog_Anwesenheit FileLog ./log/Anwesenheit.log (st_)?galaxy_(stephan|steffi)(_FB\d)?:(absent|present)
attr FileLog_Anwesenheit room Anwesenheit
attr FileLog_Anwesenheit group Handy
attr FileLog_Anwesenheit sortby Z01

define n_FritzBox_Korrektur_Anwesenheit notify pr_FritzBox3:absent deletereading FritzBox3 ^mac_.+;;setreading galaxy_stephan_FB3 state absent;;setreadinggalaxy_steffi_FB3 state absent
attr n_FritzBox_Korrektur_Anwesenheit room Anwesenheit
attr n_FritzBox_Korrektur_Anwesenheit group Handy
attr n_FritzBox_Korrektur_Anwesenheit sortby Z02
attr n_FritzBox_Korrektur_Anwesenheit comment Wenn die FritzBox ausgeschaltet wird, dann bleiben die mac_*-Reading stehen, was eine Geräte Anwesenheit vortäuscht, die nicht stimmt. Daher werden mit diesem notify bei "abwesender" FritzBox die mac_*-Readings gelöscht.

(vorerst) fertig!

FHEM WEB

Ein paar Einstellungen, um das FHEM WEB (bzw. WEBphone) übersichtlicher zu gestalten:
Den "Heizungskeller" zweispaltig darstellen und die Waschmaschine und den Trockner nebeneinander und den "Weihnachten" Raum etwas umsortieren und zweispaltig:
attr WEB column \
Heizungskeller:Waschmaschine|Trockner \
Weihnachten:WeihnachtsBeleuchtungAussen,Allgemein|Zimmer,Wohnzimmer,Kinderzimmer,Kueche,Treppe \
Status:Allgemein,Internet,Batteriestatus,Activity,Firmware,RSSI \
Anwesenheit:Handy,Notebook_Tablet,FritzBox\
Aktionen:Nachrichten,Markise

attr WEBphone hiddenroom Benachrichtigungen,Fenster,FritzBox,Haustuer,Heizungskeller,HUEDevice,Unsorted,Weihnachten,Everything,Logfile,Commandref,Remote doc,Edit files,Select style,Event monitor,save
attr WEBphone column \
Status:Allgemein,Internet,Batteriestatus,Activity,Firmware,RSSI \
Anwesenheit:Handy,Notebook_Tablet,FritzBox\
Aktionen:Nachrichten,Markise

Wetter

Eine einfache Anzeige (ohne einzelne Readings) geht auch nach FHEM-Forum: Thema: Wetter.com ganz einfach mit DOIF:
Dazu einfach von https://www.wetter.com/apps_und_mehr/website/homepagewidget/ den HTML-Code kopieren, die einfachen Anführungszeichen in doppelte ändern, Strichpunkte durch doppelte Strichpunkte ersetzen und den ganzen Ausdruck in {('...')} als Status definieren:
defmod di_Wetter_Anzeige_Vorhersage DOIF ([+[1]:00])
attr di_Wetter_Anzeige_Vorhersage do always
attr di_Wetter_Anzeige_Vorhersage state {('<div id="wcom-878ee2cb66a6bacfacaf30050fad7a88" style="border: 0px none;; background-color: rgb(252, 252, 252);; border-radius: 5px;;" class="wcom-default w300x250"><link rel="stylesheet" href="//cs3.wettercomassets.com/woys/5/css/w.css" media="all"><div class="wcom-city"><a style="color: #000" href="https://www.wetter.com/deutschland/groebenzell/DE0003583.html" target="_blank" rel="nofollow" title="Wetter Gröbenzell">Wetter Gröbenzell</a></div><div id="wcom-878ee2cb66a6bacfacaf30050fad7a88-weather"></div><script type="text/javascript" src="//cs3.wettercomassets.com/woys/5/js/w.js"></script><script type="text/javascript">_wcomWidget({id: "wcom-878ee2cb66a6bacfacaf30050fad7a88",location: "DE0003583",format: "300x250",type: "summary"});;</script></div>')}
attr di_Wetter_Anzeige_Vorhersage alias Wetter-Vorhersage
attr di_Wetter_Anzeige_Vorhersage room Wetter
attr di_Wetter_Anzeige_Vorhersage comment Anzeige der Wettervorhersage der nächsten Tage, aktualisiert zu jeder vollen Stunde.
set di_Wetter_Anzeige_Vorhersage cmd_1

defmod di_Wetter_Anzeige_Heute DOIF ([+[1]:00])
attr di_Wetter_Anzeige_Heute do always
attr di_Wetter_Anzeige_Heute state {('<div id="wcom-a07a78a83e00c5dacce8668b2aff6fab" style="border: 0px none;; background-color: rgb(252, 252, 252);; border-radius: 5px;;" class="wcom-default w300x250"><link rel="stylesheet" href="//cs3.wettercomassets.com/woys/5/css/w.css" media="all"><div class="wcom-city"><a style="color: #000" href="https://www.wetter.com/deutschland/groebenzell/DE0003583.html" target="_blank" rel="nofollow" title="Wetter Gröbenzell">Wetter Gröbenzell</a></div><div id="wcom-a07a78a83e00c5dacce8668b2aff6fab-weather"></div><script type="text/javascript" src="//cs3.wettercomassets.com/woys/5/js/w.js"></script><script type="text/javascript">_wcomWidget({id: "wcom-a07a78a83e00c5dacce8668b2aff6fab",location: "DE0003583",format: "300x250",type: "spaces"});;</script></div>')}
attr di_Wetter_Anzeige_Heute alias Wetter-Heute
attr di_Wetter_Anzeige_Heute room Wetter
attr di_Wetter_Anzeige_Heute comment Anzeige der Wettervorhersage für heute, aktualisiert zu jeder vollen Stunde.
set di_Wetter_Anzeige_Heute cmd_1

Oder sogar noch einfacher über https://www.meteoblue.com/:
defmod di_Wetter_Anzeige DOIF ([+[1]:00])
attr di_Wetter_Anzeige do always
attr di_Wetter_Anzeige state {('<iframe src="https://www.meteoblue.com/de/wetter/widget/three/gr%c3%b6benzell_deutschland_2917221?geoloc=fixed&nocurrent=0&noforecast=0&days=7&tempunit=CELSIUS&windunit=KILOMETER_PER_HOUR&layout=bright" frameborder="0" scrolling="NO" allowtransparency="true" sandbox="allow-same-origin allow-scripts allow-popups allow-popups-to-escape-sandbox" style="width: 805px;;height: 628px"></iframe>')}
attr di_Wetter_Anzeige alias Wetter-Anzeige
attr di_Wetter_Anzeige room Wetter
attr di_Wetter_Anzeige comment Anzeige der Wettervorhersage der nächsten Tage, aktualisiert zu jeder vollen Stunde.
set di_Wetter_Anzeige cmd_1

Es gibt viele Möglichkeiten, Wetter-Daten in FHEM einzubinden, siehe:
Wetterdienste in FHEM einbinden
Wetter in Fhem einbinden
Kurzfassung für das Weather Modul:
Zuerst bei z.B. DarkSky sich registrieren um einen einen API Key (987498ghjgf864) zu bekommen. Dann:
defmod Wetter Weather API=DarkSkyAPI,cachemaxage=600 apikey=987498ghjgf864 interval=3600 lang=de
attr Wetter room Wetter
defmod symbolWetterTag weblink htmlCode {'<hr>Gr&ouml;;benzell aktuell:<br>'.WeatherAsHtmlH("Wetter",1,'h').'<hr>'}
attr symbolWetterTag room Wetter
defmod symbolWetterWoche weblink htmlCode {'<hr>Gr&ouml;;benzell Vorhersage:<br>'.WeatherAsHtmlD("Wetter",10).'<hr>'}
attr symbolWetterWoche room Wetter

Der Sonnenauf- und untergang ist ganz interessant und kann auch für Außenbeleuchtung gebraucht werden:
define Sonnenaufgang dummy
attr Sonnenaufgang room Wetter
define Sonnenuntergang dummy
attr Sonnenuntergang room Wetter
define sun_riseSet_timer at *03:10:00 { my $s = sunrise_abs();; fhem("set Sonnenaufgang $s");; $s = sunset_abs();; fhem("set Sonnenuntergang $s");; }
attr sun_riseSet_timer room Wetter

Für Automatismen bzgl. Windstärke (Windwarner) ist der zu erwartende Wind in den nächsten 2 Stunden interessant:
defmod Windstaerke2h DOIF
attr Windstaerke2h state [#max"^Wetter$":"^(hfc[12]_)*wind(Gust)*$"]
attr Windstaerke2h room Wetter
attr Windstaerke2h comment Zeigt das Maximum der erwarteten Windstärke in den nächsten 2 Stunden in km/h an.

Bei Windwarnung eine Mail senden:
defmod WindWarnungMail DOIF ([Windstaerke2h]>[MarkiseMaxWind])\
(\
{sendmail('[MailAdresseStephan]',"Windwarnung [Windstaerke2h] km/h","\
Achtung: Demnächst Windstärke bis [Windstaerke2h] km/h:\n\n\
Wind      aktuell:       [Wetter:wind] km/h\n\
Wind-Böen aktuell:       [Wetter:windGust] km/h\n\n\
Wind      1h Vorhersage: [Wetter:hfc1_wind] km/h\n\
Wind-Böen 1h Vorhersage: [Wetter:hfc1_windGust] km/h\n\n\
Wind      2h Vorhersage: [Wetter:hfc2_wind] km/h\n\
Wind-Böen 2h Vorhersage: [Wetter:hfc2_windGust] km/h\n\
")}\
)
attr WindWarnungMail do always
attr WindWarnungMail room Wetter
Vorübergehend deaktiviert:
attr WindWarnungMail disable 1

Um zu überprüfen, ob der vorhergesagte Bewölkungsgrad mit dem tatsächlichen halbwegs übereinstimmt, dann man das ganze in ein Log schreiben und dann ein SVG erstellen:
defmod Wetter_Log FileLog ./log/wetter.log Wetter:(cloudCover|fc1_cloudCover).*
attr Wetter_Log room Wetter

Man könnte noch einiges weiter optimieren:

Internet-Monitoring

Um einen Überblick zu bekommen, wann mal wieder "das Internet weg" ist, kann man die online/offline Event so loggen:
define Internet PRESENCE lan-ping 8.8.8.8 60
attr Internet eventMap present:online absent:offline
attr Internet event-on-change-reading .*
attr Internet room Status
attr Internet group Internet
define InternetLog FileLog ./log/internet.log Internet:(online|offline)
attr InternetLog room Status
attr InternetLog group Internet
Dazu macht sich auch eine grafische Darstellung ganz gut:
Einfach beim FileLog das "Create SVG plot" anklicken und wie folgt ausfüllen:

Plot title: Internet
Y-Axis label, left: Feld komplett löschen
Y-Axis label, right: Feld komplett löschen
Range as [min:max],left: [-0.2:1.2]
Range as [min:max],right: [-0.2:1.2]
Tics as ("Txt" val, ...),left: ("online" 1, "offline" 0)
Tics as ("Txt" val, ...),right: ("online" 1, "offline" 0)
Diagramm label: notitle
Source: InternetLog
Column: 3
Regexp: Internet.*
DefaultValue: Feld leer lassen
Function: $fld[2]=~/online/?1:0
Y-Axis: right
Plot-Type: steps
Style: I0
Width: 1

Dann noch:
attr SVG_InternetLog_1 group Internet
attr SVG_InternetLog_1 room Status
Leider bewirkt das "event-on-change-reading" den bekannten Plot-Abriss.
Diesen vermeidet man am einfachsten durch zusätzliche Logeinträge, in dem man in seiner 99_myUtils.pm diese Funktion definiert:
sub
addLog($$) {
  my ($logdevice, $reading) = @_; # device and reading to be used
  my $logentry = ReadingsVal($logdevice,$reading,"addLog: invalid reading");
  if ($reading =~ m,state,i) {
    fhem "trigger $logdevice $logentry";
  } else {
    fhem "trigger $logdevice $reading: $logentry";
  }
}
und dann per DOIF aktiviert:
define addLogHourly_Internet DOIF ([:59] or [:01]) ({addLog("Internet", "state")})
attr addLogHourly_Internet group Internet
attr addLogHourly_Internet room Status
attr addLogHourly_Internet do always


Shell-Befehle starten

FHEM kann auch dazu genutzt werden, ein Shell Kommando auszuführen.
Ich nutze es wie folgt, um meine aufgenommenen Nachrichten wieder zu löschen:
define NachrichtenLoeschen dummy
attr NachrichtenLoeschen room Aktionen
attr NachrichtenLoeschen devStateIcon .*:message_garbage:delete
attr NachrichtenLoeschen alias Nachrichten (mp4) auf Server löschen
define nt_NachrichtenLoeschen notify NachrichtenLoeschen:delete "/usr/bin/sudo /bin/rm -r /xtemp/mp4/Nachrichten"
attr nt_NachrichtenLoeschen room Aktionen

Noch schöner geht das mit einem DOIF. Daher ist es aktuell so implementiert:
defmod Taster_Nachrichten_Loeschen DOIF (1) ("/usr/bin/sudo /bin/rm -r /xtemp/mp4/Nachrichten") ()
attr Taster_Nachrichten_Loeschen wait 0,0.7
attr Taster_Nachrichten_Loeschen cmdState on,off
attr Taster_Nachrichten_Loeschen devStateIcon on:message_garbage@gold initialized|off:message_garbage:cmd_1
attr Taster_Nachrichten_Loeschen alias Nachrichten (mp4) auf Server löschen
attr Taster_Nachrichten_Loeschen room Aktionen
attr Taster_Nachrichten_Loeschen group Nachrichten

Fenster (Stand 12/2019)

Die Information, ob ein Fenster offen oder geschlossen ist kann ganz einfach mit dem Homematic Funk-Tür-/Fensterkontakt, optisch (HM-Sec-SCo)
ins SmartHome integrieren, siehe auch den FHEM Wiki Eintrag zu HM-Sec-SCo.
Einrichtung:
get d_ccu devicelist create ^HM-Sec.* t=all f=HM_%n
save
rename HM_HM_Sec_SCo_OEQ2137517 Fenster_Kinderzimmer_Nord
set Fenster_Kinderzimmer_Nord defaults
attr Fenster_Kinderzimmer_Nord event-on-change-reading .*
attr Fenster_Kinderzimmer_Nord room Fenster
attr Fenster_Kinderzimmer_Nord group Fenster
Die Events "open" und "closed" kann man z.B. für die Heizkörperthermostat-Steuerung nutzen.

Dann noch das Fenster auf der Süd-Seite mit einem Homematic IP Fenster- und Türkontakt HMIP-SWDO, optisch:
get d_ccu devicelist create ^HMIP-.* t=all f=HmIP_%n
rename HmIP_HMIP_SWDO_0000DA4994C95D Fenster_Kinderzimmer_Sued
set Fenster_Kinderzimmer_Sued defaults
attr Fenster_Kinderzimmer_Sued event-on-change-reading .*
attr Fenster_Kinderzimmer_Sued room Fenster
attr Fenster_Kinderzimmer_Sued group Fenster

Noch an noch offene/vergessene Fenster erinnern:
defmod di_Kinderzimmer_Nord_Erinnerung DOIF \
(([Fenster_Kinderzimmer_Nord] eq "open") and ([Wetter:temperature] < 15))\
(set Telefon call **612* 30 /home/loescher/fhem/audio/kinderzimmer-nord-fenster-offen.alaw)\
DOELSE
attr di_Kinderzimmer_Nord_Erinnerung wait 900
attr di_Kinderzimmer_Nord_Erinnerung repeatcmd 600
attr di_Kinderzimmer_Nord_Erinnerung repeatsame 2
attr di_Kinderzimmer_Nord_Erinnerung room Fenster
attr di_Kinderzimmer_Nord_Erinnerung comment Erinnerung nach 15 Mintuen an vergessenes offenes Fenster, wenn es draußen kühl ist mit max. 2 Erinnerungen alle 10 Minuten.

Heizung

Klassische (nicht smarte) Heizkörperthermostate haben meines Erachtens zwei große Nachteile, die zu Energierverlusten führen können:
Nicht-elektronische Thermostate erkennen keine offenen Fenster und selbst elektronische merken das nicht immer zuverlässig.
Nach dem Lüften heizen normale Thermostate den Raum wieder voll hoch, obwohl in kurzer Zeit bei passender Wetterlage das Zimmer auch durch Sonneneinstrahlung genau so warm werden würde.
Mit einer intelligenten Steuerung kann man das lösen.
Als Heizkörperthermostat bietet sich der Homematic Funk-Heizkörperthermostat (HM-CC-RT-DN) an.
Siehe auch den FHEM Wiki Eintrag zu HM-CC-RT-DN.
Einrichtung:
get d_ccu devicelist create ^HM-CC-.* t=all f=HM_%n
save
rename HM_HM_CC_RT_DN_OEQ2090635 Heizung_Kinderzimmer_Nord
set Heizung_Kinderzimmer_Nord defaults
attr Heizung_Kinderzimmer_Nord event-on-change-reading .*
attr Heizung_Kinderzimmer_Nord room Heizung
attr Heizung_Kinderzimmer_Nord group Heizung
# Tastensperre funktioniert leider noch nicht via FHEM (TODO!):
set Heizung_Kinderzimmer_Nord config BUTTON_LOCK=1 GLOBAL_BUTTON_LOCK=1
deleteattr Heizung_Kinderzimmer_Nord ccureadingfilter
Ich habe mich bewusst entschieden, den Fensterkontakt nicht direkt mit dem Thermostat zu koppeln. So bleibt man viel flexibler bei der "Fenster offen" Logik.
Wenn das Fenster geöffnet wird, dann wird die Soll-Temperatur auf Minimum reduziert. Beim Schließen wieder auf den vorherigen Wert zurückgestellt, wenn dieser höher als 15 Grad war (Heiz-Modus), ansonsten auf 15 Grad.
defmod LueftungsLogik DOIF ([Fenster_Kinderzimmer_Nord] eq "open")\
(\
setreading $SELF lueften 1,\
(setreading Heizung_Kinderzimmer_Nord last_state \
{( maxNum(15,ReadingsVal("Heizung_Kinderzimmer_Nord","state","0")) )}\
),\
set Heizung_Kinderzimmer_Nord control 4.5\
)\
DOELSEIF ([Fenster_Kinderzimmer_Nord] eq "closed")\
(\
setreading $SELF lueften 0,\
set Heizung_Kinderzimmer_Nord control [Heizung_Kinderzimmer_Nord:last_state]\
)
attr LueftungsLogik cmdState Absenkung_wg._Lüften|Heizen
attr LueftungsLogik room Heizung
attr LueftungsLogik group Steuerung
attr LueftungsLogik comment Bei offenem Fenster Temperatur auf Minimum, nachher wieder auf vorherigen Wert bzw. 15 Grad zurück.

Wenn gerade gelüftet wird und im Thermostat der nächste planmäßige Schaltpunkt schaltet, dann die neue Schaltpunkt-Temperatur abspeichern, aber wieder die Minimal-Temperatur erzwingen:
defmod LueftungsLogik2 DOIF \
(\
([LueftungsLogik:lueften] == 1) &&\
([Heizung_Kinderzimmer_Nord:control] > 6.0)\
)\
(\
setreading Heizung_Kinderzimmer_Nord last_state [Heizung_Kinderzimmer_Nord],\
set Heizung_Kinderzimmer_Nord control 4.5\
)\
DOELSE
attr LueftungsLogik2 cmdState AbsenkungErzwingen|Kein_Eingriff
attr LueftungsLogik2 room Heizung
attr LueftungsLogik2 group Steuerung
attr LueftungsLogik2 comment Falls im Thermostat der nächste Schaltpunkt schaltet während des Lüftens, dann die neue gewünschte Temperatur abspeichern, aber weiterhin Temperatur auf Minimum erzwingen

Während Urlaub die Temperatur absenken:
define UrlaubsLogik DOIF \
(\
([Urlaub] eq "true") &&\
([Heizung_Kinderzimmer_Nord:control] > 18)\
)\
(\
setreading Heizung_Kinderzimmer_Nord last_state_vor_Urlaub [Heizung_Kinderzimmer_Nord],\
set Heizung_Kinderzimmer_Nord control 18\
)\
DOELSEIF ([Urlaub] eq "false")\
(\
set Heizung_Kinderzimmer_Nord control [Heizung_Kinderzimmer_Nord:last_state_vor_Urlaub],\
)
attr UrlaubsLogik cmdState AbsenkungUrlaub|Kein_Eingriff
attr UrlaubsLogik do always
attr UrlaubsLogik room Heizung
attr UrlaubsLogik group Steuerung
attr UrlaubsLogik comment Während Urlaub die Temperatur absenken
Bei "Urlaub" könnte man auch von "AUTO" auf "MANUAL" umstellen. Also: 4.CONTROL_MODE auf "MANU".

Ein paar Werte in ein Logfile schreiben und es visualisieren:
defmod Klima_Kinderzimmer_Log FileLog ./log/klima_kinderzimmer.log Heizung_Kinderzimmer_Nord:(control:|4.VALVE_STATE|4.ACTUAL_TEMPERATURE|4.CONTROL_MODE)|Fenster_Kinderzimmer_Nord:(open|closed)|LueftungsLogik:(Absenkung.*|Heizen)|LueftungsLogik2:(Absenkung.*|Kein_Eingriff)|UrlaubsLogik
attr Klima_Kinderzimmer_Log room Heizung
attr Klima_Kinderzimmer_Log group Auswertung
Dann einen SVG Plot erstellen, der
4.ACTUAL_TEMPERATURE
4.VALVE_STATE
control
beinhaltet.
attr SVG_Klima_Kinderzimmer_Log_1 room Heizung
attr SVG_Klima_Kinderzimmer_Log_1 group Auswertung
und noch ein paar Zwischenwerte erzeugen:
define addLogHourly_Klima_Kinderzimmer DOIF ([:59] or [:01])\
({\
addLog("Heizung_Kinderzimmer_Nord", "control");;\
addLog("Fenster_Kinderzimmer_Nord", "state")\
})
attr addLogHourly_Klima_Kinderzimmer room Heizung
attr addLogHourly_Klima_Kinderzimmer group Auswertung
attr addLogHourly_Klima_Kinderzimmer do always

Dann gäbe es noch viele weitere Möglichkeiten und Lesestoff:
Noch offenes To-Do: Wettervorhersage einbauen!

Dann das gleiche nochmal für das andere Kinderzimmer mit einem Homematic IP Heizkörperthermostat HMIP-eTRV-2:
get d_ccu devicelist create ^HmIP-.* t=all f=HmIP_%n
rename HmIP_HmIP_eTRV_2_000A1A499BA889 Heizung_Kinderzimmer_Sued
set Heizung_Kinderzimmer_Sued defaults
attr Heizung_Kinderzimmer_Sued event-on-change-reading .*
attr Heizung_Kinderzimmer_Sued room Heizung
attr Heizung_Kinderzimmer_Sued group Heizung
deleteattr Heizung_Kinderzimmer_Sued ccureadingfilter
Lüftungs-Steuerung:
defmod LueftungsLogik_KiZi_Sued DOIF ([Fenster_Kinderzimmer_Sued] eq "open")\
(\
setreading $SELF lueften 1,\
(setreading Heizung_Kinderzimmer_Sued last_state \
{( maxNum(15,ReadingsVal("Heizung_Kinderzimmer_Sued","state","0")) )}\
),\
set Heizung_Kinderzimmer_Sued control 4.5\
)\
DOELSEIF ([Fenster_Kinderzimmer_Sued] eq "closed")\
(\
setreading $SELF lueften 0,\
set Heizung_Kinderzimmer_Sued control [Heizung_Kinderzimmer_Sued:last_state]\
)
attr LueftungsLogik_KiZi_Sued cmdState Absenkung_wg._Lüften|Heizen
attr LueftungsLogik_KiZi_Sued room Heizung
attr LueftungsLogik_KiZi_Sued group Steuerung
attr LueftungsLogik_KiZi_Sued comment Bei offenem Fenster Temperatur auf Minimum, nachher wieder auf vorherigen Wert bzw. 15 Grad zurück.

Wenn gerade gelüftet wird und im Thermostat der nächste planmäßige Schaltpunkt schaltet, dann die neue Schaltpunkt-Temperatur abspeichern, aber wieder die Minimal-Temperatur erzwingen:
defmod LueftungsLogik2_KiZi_Sued DOIF \
(\
([LueftungsLogik_KiZi_Sued:lueften] == 1) &&\
([Heizung_Kinderzimmer_Sued:control] > 6.0)\
)\
(\
setreading Heizung_Kinderzimmer_Sued last_state [Heizung_Kinderzimmer_Sued],\
set Heizung_Kinderzimmer_Sued control 4.5\
)\
DOELSE
attr LueftungsLogik2_KiZi_Sued cmdState AbsenkungErzwingen|Kein_Eingriff
attr LueftungsLogik2_KiZi_Sued room Heizung
attr LueftungsLogik2_KiZi_Sued group Steuerung
attr LueftungsLogik2_KiZi_Sued comment Falls im Thermostat der nächste Schaltpunkt schaltet während des Lüftens, dann die neue gewünschte Temperatur abspeichern, aber weiterhin Temperatur auf Minimum erzwingen

Während Urlaub die Temperatur absenken:
define UrlaubsLogik_KiZi_Sued DOIF \
(\
([Urlaub] eq "true") &&\
([Heizung_Kinderzimmer_Sued:control] > 18)\
)\
(\
setreading Heizung_Kinderzimmer_Sued last_state_vor_Urlaub [Heizung_Kinderzimmer_Sued],\
set Heizung_Kinderzimmer_Sued control 18\
)\
DOELSEIF ([Urlaub] eq "false")\
(\
set Heizung_Kinderzimmer_Sued control [Heizung_Kinderzimmer_Sued:last_state_vor_Urlaub],\
)
attr UrlaubsLogik_KiZi_Sued cmdState AbsenkungUrlaub|Kein_Eingriff
attr UrlaubsLogik_KiZi_Sued do always
attr UrlaubsLogik_KiZi_Sued room Heizung
attr UrlaubsLogik_KiZi_Sued group Steuerung
attr UrlaubsLogik_KiZi_Sued comment Während Urlaub die Temperatur absenken

Ein paar Werte in ein Logfile schreiben und es visualisieren:
defmod Klima_Kinderzimmer_Sued_Log FileLog ./log/klima_kinderzimmer_sued.log Heizung_Kinderzimmer_Sued:(control:|1.VALVE_STATE|1.ACTUAL_TEMPERATURE|1.CONTROL_MODE)|Fenster_Kinderzimmer_Sued:(open|closed)|LueftungsLogik_KiZi_Sued:(Absenkung.*|Heizen)|LueftungsLogik2_KiZi_Sued:(Absenkung.*|Kein_Eingriff)|UrlaubsLogik_KiZi_Sued
attr Klima_Kinderzimmer_Sued_Log room Heizung
attr Klima_Kinderzimmer_Sued_Log group Auswertung
Dann einen SVG Plot erstellen, der
4.ACTUAL_TEMPERATURE
4.VALVE_STATE
control
beinhaltet.
attr SVG_Klima_Kinderzimmer_Sued_Log_1 room Heizung
attr SVG_Klima_Kinderzimmer_Sued_Log_1 group Auswertung
und noch ein paar Zwischenwerte erzeugen:
define addLogHourly_Klima_Kinderzimmer_Sued DOIF ([:59] or [:01])\
({\
addLog("Heizung_Kinderzimmer_Sued", "control");;\
addLog("Fenster_Kinderzimmer_Sued", "state")\
})
attr addLogHourly_Klima_Kinderzimmer_Sued room Heizung
attr addLogHourly_Klima_Kinderzimmer_Sued group Auswertung
attr addLogHourly_Klima_Kinderzimmer_Sued do always

Licht mit Philips Hue(Stand: 11/2018)

Als neue Weihnachts-Deko wurden zwei Papiersterne (Lunartec Papierstern Lampe: 3D-Weihnachtsstern-Lampe, Stern aus Papier, 60 cm, rot) mit E14 Fassung angeschafft.
Das kann man jeden Tag per Schalter "unsmart" ein- und ausschalten, oder per schaltbarer Steckdose oder noch viel schöner mit einer Philips Hue White Ambiance E14 LED Kerze Doppelpack, dimmbar, alle Weißschattierungen.
Dazu braucht man am besten noch die Philips Hue Bridge.
Zuerst die Lampen mit der Bridge verbinden und dann können schon die Devices und Steuerung angelegt werden:
rename HUEDevice1 DekoSternKinderzimmer1
deleteattr DekoSternKinderzimmer1 alias
attr DekoSternKinderzimmer1 room Weihnachten
attr DekoSternKinderzimmer1 group Kinderzimmer

rename HUEDevice2 DekoSternKinderzimmer2
deleteattr DekoSternKinderzimmer2 alias
attr DekoSternKinderzimmer2 room Weihnachten
attr DekoSternKinderzimmer2 group Kinderzimmer

define LichterKinderzimmer structure Weihnachten DekoSternKinderzimmer1 DekoSternKinderzimmer2
attr LichterKinderzimmer room Weihnachten
attr LichterKinderzimmer group Kinderzimmer

defmod LichterKinderzimmerSteuerung DOIF (\
([Weihnachtszeit] eq "true") and ([16:30-19:15]))\
(set LichterKinderzimmer on : bri 100 : ct 400,\
set LichterKueche on)\
DOELSE\
(set LichterKinderzimmer off,\
set LichterKueche off)
attr LichterKinderzimmerSteuerung cmdState on|off
attr LichterKinderzimmerSteuerung room Weihnachten
attr LichterKinderzimmerSteuerung group Kinderzimmer
attr LichterKinderzimmerSteuerung comment Zur Weihnachtszeit am Nachmittag die Deko-Sterne leuchten lassen. Die Deko in der Küche folgt ebenfalls dieser Steuerung.

Zwischentecker Osram Lightify Smart+ Plug (Stand: 12/2018)

Unter den "gängigen" Funksystemen ist die Osram Smart+ Plug (ZigBee) zur Zeit mit 19,95 EUR die preiswerteste.
Zeitweise wird diese auch für um die 10 EUR angeboten! Damit schlägt sie meines Erachtens in jeder Hinsicht die ganzen billig-WLAN-China-Schalter.
Ich habe sie an die bestehende Philips Hue Bridge angelernt:
Dazu einfach in der Hue App auf Lampeneinstellungen und "Leuchte hinzufügen", dann den Zwischenstecker in die Steckdose stecken und abwarten.
Wenn der Stecker nicht gleich erkannt wird, dann das gleiche noch mal deutlich näher an der Hue Bridge versuchen!
Sollte das nicht klappen, helfen evtl. noch die Tips zur Einbindung von dieser Seite.
Dann im FHEM die Geräte aktualisieren:
get HueBridge devices
set HueBridge autocreate
Nur noch umbenennen:
rename HUEDevice4 SteckdoseStaubsauger
deleteattr SteckdoseStaubsauger alias
attr SteckdoseStaubsauger room Schlafzimmer
attr SteckdoseStaubsauger comment Zwischenstecker für Akku-Staubsauger-Ladestation
attr SteckdoseStaubsauger icon ge_wht_steckdose
attr SteckdoseStaubsauger devStateIcon on:FS20.on@orange:off off:light_light@green:on unreachable:WLAN_Status.0
Und eine etwas bessere Zeitschaltuhr daraus machen, um zu verhindern, dass der Akkustaubsauger ständig lädt:
defmod di_SteckdoseStaubsauger DOIF (([15:00-18:00]) and ([Urlaub] ne "true"))\
(set SteckdoseStaubsauger on)\
DOELSE\
(set SteckdoseStaubsauger off)
attr di_SteckdoseStaubsauger cmdState on|off
attr di_SteckdoseStaubsauger room Schlafzimmer
attr di_SteckdoseStaubsauger devStateIcon on:FS20.on@orange off:light_light@green
attr di_SteckdoseStaubsauger comment Schaltet nachts, großteils tagsüber und während Urlaub den Strom für die die Akku-Staubsauger-Ladestation ab
Manchmal schaltet der Zwischenstecker nicht aus, weil der nicht erreicht wird. Aber auch das kann man lösen:
defmod di_SteckdoseStaubsauger2 DOIF (([18:01-14:59]) and ([SteckdoseStaubsauger:"on"]))\
(set SteckdoseStaubsauger off)
attr di_SteckdoseStaubsauger2 do always
attr di_SteckdoseStaubsauger2 room Schlafzimmer
attr di_SteckdoseStaubsauger2 comment Falls der Schalter mal wieder unreachable war und leider doch nicht aus ist, dann ausschalten.
Dann kann man noch die "Steckdose Staubsauger Erreichbarkeit" protokollieren:
defmod SteckdoseStaubsaugerLog FileLog ./log/hue.log SteckdoseStaubsauger:reachable.*
attr SteckdoseStaubsaugerLog room Schlafzimmer
Und daraus ein SVG zeichnen lassen.

Terrasse - Markise (Stand: 9/2019)

Für die beiden Aufdach-Markisen sind zwei HmIP-BROLL verbaut.
Lesenswert: Vergleich der HomeMatic und HomeMatic IP Rollladen & Jalousie Aktoren - Beschattungssteuerung
Für diese Aktoren benötigt man noch (in meinem Fall): Einbindung in FHEM:
get d_ccu devicelist create ^HmIP-.* t=all f=HmIP_%n

rename HmIP_HmIP_BROLL_001118A9AC0E58 Markise_oben_rechts
set Markise_oben_rechts defaults
attr Markise_oben_rechts room Terrasse
attr Markise_oben_rechts ccureadingfilter (ERROR_CODE|ERROR_OVERHEAT|ACTUAL_TEMPERATURE|LEVEL|ACTIVITY_STATE|SELF_CALIBRATION_RESULT|RSSI|UNREACH)

rename HmIP_HmIP_BROLL_001118A9AC0E61 Markise_oben_links
set Markise_oben_links defaults
attr Markise_oben_links room Terrasse
attr Markise_oben_links ccureadingfilter (ERROR_CODE|ERROR_OVERHEAT|ACTUAL_TEMPERATURE|LEVEL|ACTIVITY_STATE|SELF_CALIBRATION_RESULT|RSSI|UNREACH)

Sinnvolle Logik Einstellungen ("1" bedeutet "OR", "0" bedeutet "keine"):
set Markise_oben_links config 4 LOGIC_COMBINATION=1
set Markise_oben_links config 5 LOGIC_COMBINATION=0
set Markise_oben_links config 6 LOGIC_COMBINATION=0
set Markise_oben_rechts config 4 LOGIC_COMBINATION=1
set Markise_oben_rechts config 5 LOGIC_COMBINATION=0
set Markise_oben_rechts config 6 LOGIC_COMBINATION=0
(Aber siehe dazu unten bei TODO!)

Kalibrierungsfahrt starten:
set Markise_oben_rechts startCalibration
set Markise_oben_links startCalibration

Nach Stromausfall sollen die Markisen eingefahren bleiben/werden, also die Option "Aktion bei Spannungszufuhr" auf "Hochgefahren" setzen:
set Markise_oben_rechts config 4 POWERUP_JUMPTARGET=2
set Markise_oben_rechts config 5 POWERUP_JUMPTARGET=2
set Markise_oben_rechts config 6 POWERUP_JUMPTARGET=2
set Markise_oben_links config 4 POWERUP_JUMPTARGET=2
set Markise_oben_links config 5 POWERUP_JUMPTARGET=2
set Markise_oben_links config 6 POWERUP_JUMPTARGET=2
(Aber siehe dazu unten bei TODO!)

Dann sind noch ein paar Taster ganz nett, um mit einem Klick aus-/einfahren zu können.
Allerdings ist ein Ausfahren mit einem "versehentlichen" Klick schon etwas riskant, wenn es z.B. regnet.
Daher werden die Taster erst durch einen "Freischaltungstaster" aktiviert.
defmod Taster_Markise_Oben_Links_Raus DOIF (1) (set Markise_oben_links down) ()
attr Taster_Markise_Oben_Links_Raus wait 0,0.7
attr Taster_Markise_Oben_Links_Raus cmdState on,off
attr Taster_Markise_Oben_Links_Raus devStateIcon on:control_arrow_downward@gold initialized|off:control_arrow_downward:cmd_1
attr Taster_Markise_Oben_Links_Raus alias Ausfahren Links
attr Taster_Markise_Oben_Links_Raus room Aktionen
attr Taster_Markise_Oben_Links_Raus group Markise

defmod Taster_Markise_Oben_Links_Rein DOIF (1) (set Markise_oben_links up) ()
attr Taster_Markise_Oben_Links_Rein wait 0,0.7
attr Taster_Markise_Oben_Links_Rein cmdState on,off
attr Taster_Markise_Oben_Links_Rein devStateIcon on:control_arrow_upward@gold initialized|off:control_arrow_upward:cmd_1
attr Taster_Markise_Oben_Links_Rein alias Einfahren Links
attr Taster_Markise_Oben_Links_Rein room Aktionen
attr Taster_Markise_Oben_Links_Rein group Markise

defmod Taster_Markise_Oben_Rechts_Raus DOIF (1) (set Markise_oben_rechts down) ()
attr Taster_Markise_Oben_Rechts_Raus wait 0,0.7
attr Taster_Markise_Oben_Rechts_Raus cmdState on,off
attr Taster_Markise_Oben_Rechts_Raus devStateIcon on:control_arrow_downward@gold initialized|off:control_arrow_downward:cmd_1
attr Taster_Markise_Oben_Rechts_Raus alias Ausfahren Rechts
attr Taster_Markise_Oben_Rechts_Raus room Aktionen
attr Taster_Markise_Oben_Rechts_Raus group Markise

defmod Taster_Markise_Oben_Rechts_Rein DOIF (1) (set Markise_oben_rechts up) ()
attr Taster_Markise_Oben_Rechts_Rein wait 0,0.7
attr Taster_Markise_Oben_Rechts_Rein cmdState on,off
attr Taster_Markise_Oben_Rechts_Rein devStateIcon on:control_arrow_upward@gold initialized|off:control_arrow_upward:cmd_1
attr Taster_Markise_Oben_Rechts_Rein alias Einfahren Rechts
attr Taster_Markise_Oben_Rechts_Rein room Aktionen
attr Taster_Markise_Oben_Rechts_Rein group Markise

defmod Taster_Markise_allow DOIF (1)\
(set Taster_Markise_Oben_Links_Rein enable,\
set Taster_Markise_Oben_Rechts_Rein enable,\
set Taster_Markise_Oben_Links_Raus enable,\
set Taster_Markise_Oben_Rechts_Raus enable)\
(set Taster_Markise_Oben_Links_Rein disable,\
set Taster_Markise_Oben_Rechts_Rein disable,\
set Taster_Markise_Oben_Links_Raus disable,\
set Taster_Markise_Oben_Rechts_Raus disable)
attr Taster_Markise_allow wait 0,20
attr Taster_Markise_allow cmdState on,off
attr Taster_Markise_allow devStateIcon on:awning@green initialized|off:awning@red:cmd_1
attr Taster_Markise_allow alias Bedienung freischalten
attr Taster_Markise_allow room Aktionen
attr Taster_Markise_allow group Markise
attr Taster_Markise_allow comment Aktiviert für kurze Zeit die Markisen-Taster im FHEMWEB, um eine unbeabsichtigte Auslösung zu vermeiden.

Speichern der maximal zulässigen Windgeschwindigkeit:
defmod MarkiseMaxWind DOIF (["^global$:^ATTR $SELF state "])
attr MarkiseMaxWind state 35
attr MarkiseMaxWind do always
attr MarkiseMaxWind room Terrasse
attr MarkiseMaxWind comment Konstante: Maximale Windgeschwindigkeit in km/h, ab der die Markise eingefahren werden sollte. (Markise hat Windwiderstandsklasse bis 38-48 km/h)
(Ein Attribut im DOIF ist hier m.E. besser als ein Reading eines Dummy, da es nicht nur im FHEM Statefile liegt, sondern in der fhem.cfg)

Ein Windwächter nach online Wettervorhersage:
defmod MarkisenWindWaechter DOIF (\
(\
(([Markise_oben_links] ne "open") && ([Markise_oben_links] ne "Initialized"))\
||\
(([Markise_oben_rechts] ne "open") && ([Markise_oben_rechts] ne "Initialized"))\
)\
&&\
([Windstaerke2h] > [MarkiseMaxWind])\
)\
(\
set Markise_oben_links up,\
set Markise_oben_rechts up,\
{sendmail('[MailAdresseStephan]','Markise wird wegen Windwarnung eingefahren!',"Markise wird wegen Windwarnung eingefahren!")},\
set Telefon call **612* 30 /home/loescher/fhem/audio/markise-windwarnung.alaw\
)
attr MarkisenWindWaechter do always
attr MarkisenWindWaechter cmdpause 300
attr MarkisenWindWaechter room Terrasse
attr MarkisenWindWaechter comment Wenn eine der beiden Markisen nicht eingefahren ist (nicht "open") und die vorhergesagte Windstärke größer der maximalen Belastbarkeit ist, dann Markisen einfahren. Durch cmdpause wird verhindert, dass während des Einfahrens weiterhin versucht wird einzufahren.

Dafür sorgen, dass die Stati auch nach dem FHEM Start aktuell sind:
defmod di_startup DOIF
attr di_startup startup sleep 20 ;; get Markise_oben_.+ devstate
attr di_startup room Z_Internal
attr di_startup comment Aktionen direkt nach FHEM Start: Status der Markisen aktualisieren
Das braucht es doch nicht! (War ein fehlender RPC Server der HMCCU, wegen falscher Konfiguration), also:
attr di_startup disable 1

Jetzt noch zu der Frage: Wie kann man beim HmIP-BROLL die Tasten sperren?
Das wäre als Kindersicherung oder Sicherung gegen ungewolltes Ausfahren der Markise (z.B. im Winter) nützlich.
Dazu gibt es zwei Möglickeiten:
  1. Man kann Hauptkanal (4) auf logische NAND Verknüpfung schalten, dann führt jeder Tastendruck zum Hinauffahren:
    set Markise_oben_rechts config 4 LOGIC_COMBINATION=5
    Wieder zurück auf normales Verhalten ("OR"):
    set Markise_oben_rechts config 4 LOGIC_COMBINATION=1
  2. Man kann den virtuellen Kanal 5 mit OR mit dem Hauptkanal verknüpfen und den Kanal 5 dann auf 100% (Hochgefahren) setzen, dann fährt der Rollladen ggf. hoch und bleibt dort gesperrt.
    set Markise_oben_rechts config 5 LOGIC_COMBINATION=1
    set Markise_oben_rechts datapoint 5.LEVEL 100.0
    Wieder zurück auf normales Verhalten ("keine Verknüpfung"):
    set Markise_oben_rechts config 5 LOGIC_COMBINATION=0
Zum Verständnis der Logik und Verknüpfungen empfehle ich eines der Videos:
HomeMatic Usertreffen 2018: Virtuelle Aktorkanäle
Virtuelle Aktorkanäle Frank Grass
und die zugehörigen Handouts:
Meetup-2019-Expertenparameter
Die Verknüpfungslogik der virtuellen Aktorkanäle ist identisch mit der Verknüpfungslogik der virtuellen Kanäle. Ausgangswert ist immer 0. Dieser wird mit dem ersten virtuellen Kanal verknüpft. Das Ergebnis dann mit dem nächsten usw.
Variante 1:
0 NAND CH4 = 100 für alle Werte im Kanal 4.
Variante 2:
( ( 0 OR CH4 ) OR CH5 ) = 100 für alle Werte im Kanal 4 wenn CH5 auf 100 gesetzt wird.
TODO: Leider funktionieren diese set Befehle (noch) nicht. Die Änderungen sind in der CCU sichtbar, aber der Aktor ändert sein Verhalten nicht. Man sieht sogar in der CCU die Konfigurationsdatenübertragung bei den Servicemeldungen.

Text2Speech (Stand: 5/2019)

Für Sprachausgaben ist eine Text-zu-Sprache Funktion nötig.
Dafür bietet FHEM das Text2Speech an.
Einrichtung:
emerge -avt media-sound/mp3wrap
Dann:
defmod mytts Text2Speech none
attr mytts icon audio_volume_high
attr mytts TTS_UseMP3Wrap 1
attr mytts room Z_Internal
Test:
set mytts tts Hier spricht dein FHEM.
Das Ergebnis landet in /opt/fhem/fhem/cache.
Standardmäßig wird hier Google TTS verwendet, aber da gibt es noch viele andere Möglichkeiten:
Linux - Sprachausgabe
Online Dienste:
pollyvoices.com (Online Demo)
notevibes.com
www.fromtexttospeech.com
www.acapela-group.com
www.linguatec.de
ispeech.org (Download nach Registrierung)
Die Ausgabe kann über Browser-Frontend erfolgen:
FTUI_Widget_Tts
Tonausgabe am Tablet
Oder auch über einen Telefonanruf per SIP, aber dazu im nächsten Kapitel...

SIP-Client (Stand: 5/2019)

FHEM kann auch telefonieren dank SIP-Client.
Einrichtung:
define Telefon SIP
attr Telefon sip_user fhem-sip
attr Telefon sip_from sip:fhem-sip@fritz.box
set Telefon password SAGICHNICHT
attr Telefon T2S_Device mytts
attr Telefon audio_converter sox
attr Telefon room Z_Internal
Test-Anruf:
set Telefon call **610
Test-Anruf mit Ansage über TTS:
set Telefon call **610 30 !Hier spricht dein FHEM.
Test-Anruf mit Wiedergabe einer Audio-Datei:
set Telefon call **610 30 /home/loescher/fhem/audio/waschmaschine-fertig.alaw
Test-Anruf als direkte Durchsage am FritzFox mit Wiedergabe einer Audio-Datei:
set Telefon call **610* 30 /home/loescher/fhem/audio/waschmaschine-fertig.alaw
Ein MP3 kann man so in ein ALAW umwandeln:
sox input.mp3 -t raw -r 8000 -c 1 -e a-law output.alaw
Man kann auch der eigentlichen Durchsage einen Hinweis-Ton z.B. www.orangefreesounds.com/notification-tone voranstellen, indem man verschiedene Sounds zusammenbaut.
Die Wave-Files kann man so zusammenhängen:
wavmerge -o result.wav Notification-tone.wav durchsage.wav

Mail versenden (Stand: 5/2019)

Um E-Mails zu versenden ist es am einfachsten laut "Wiki - E-Mail senden" eine Unterfunktion in 99_myUtils.pm dafür einzufügen:
sub sendmail ($$$)
{
  my $rcpt = $_[0];
  my $subject = $_[1];
  my $text = $_[2];
  system("/bin/echo \"$text\" | /usr/bin/mail -a 'Content-Type: text/plain; charset=UTF-8' -s \"$subject\" \"$rcpt\"");
  return 0;
}
Dann kann eine Mail so gesendet werden:
{ sendmail('empfaenger@mail.com,'Betreff,'Das ist der Inhalt.') }

Blutspende-Termine (Stand: 5/2019)

Der Blutspendedienst bietet zwar eine Erinnerungsfunktion für die nächsten Blutspendetermine im eigenen Ort oder Umkreis, aber leider funktioniert diese Benachrichtigung nicht.
Warum also nicht einfach mit FHEM selber machen?!
So sieht die Lösung aus:
Ggf. erst ein Perl Modul nach installieren:
emerge -avt dev-perl/XML-Simple
Dann:
defmod BlutspendenGroebenzell rssFeed https://www.blutspendedienst.com/blutspendetermine/suche.rss?radius=5&term=82194 86400
attr BlutspendenGroebenzell rfAllReadingsEvents 1
attr BlutspendenGroebenzell rfDisplayTickerReadings 1
attr BlutspendenGroebenzell room Benachrichtigungen
attr BlutspendenGroebenzell group Blutspenden
attr BlutspendenGroebenzell comment Blutspendetermine in Gröbenzell

defmod BlutspendenPuchheim rssFeed https://www.blutspendedienst.com/blutspendetermine/suche.rss?radius=1&term=82178 86400
attr BlutspendenPuchheim rfAllReadingsEvents 1
attr BlutspendenPuchheim rfDisplayTickerReadings 1
attr BlutspendenPuchheim room Benachrichtigungen
attr BlutspendenPuchheim group Blutspenden
attr BlutspendenPuchheim comment Blutspendetermine in Puchheim

defmod BlutspendenGroebenzellWert DOIF
attr BlutspendenGroebenzellWert state [BlutspendenGroebenzell:tickerToast]
attr BlutspendenGroebenzellWert event-on-change-reading .*
attr BlutspendenGroebenzellWert room Benachrichtigungen
attr BlutspendenGroebenzellWert group Blutspenden
attr BlutspendenGroebenzellWert comment Speichert den Wert, um das im rssFeed fehlende event-on-change-reading nachzubilden

defmod BlutspendenGroebenzellMail DOIF ([BlutspendenGroebenzellWert])\
(\
{sendmail('[MailAdresseStephan]','Blutspendetermine Gröbenzell',"\
[BlutspendenGroebenzell:n00_title] [BlutspendenGroebenzell:n00_description]\n\n\
[BlutspendenGroebenzell:n01_title] [BlutspendenGroebenzell:n01_description]\n\n\
[BlutspendenGroebenzell:n02_title] [BlutspendenGroebenzell:n02_description]\n\n\
[BlutspendenGroebenzell:n03_title] [BlutspendenGroebenzell:n03_description]\n\n\
[BlutspendenGroebenzell:n04_title] [BlutspendenGroebenzell:n04_description]\n\n\
[BlutspendenGroebenzell:n05_title] [BlutspendenGroebenzell:n05_description]\n\n\
Siehe: [BlutspendenGroebenzell:&URL]")}\
)
attr BlutspendenGroebenzellMail do always
attr BlutspendenGroebenzellMail room Benachrichtigungen
attr BlutspendenGroebenzellMail group Blutspenden
attr BlutspendenGroebenzellMail comment Sendet die Blutspendetermine per Mail
set BlutspendenGroebenzell update

defmod BlutspendenPuchheimWert DOIF
attr BlutspendenPuchheimWert state [BlutspendenPuchheim:tickerToast]
attr BlutspendenPuchheimWert event-on-change-reading .*
attr BlutspendenPuchheimWert room Benachrichtigungen
attr BlutspendenPuchheimWert group Blutspenden
attr BlutspendenPuchheimWert comment Speichert den Wert, um das im rssFeed fehlende event-on-change-reading nachzubilden

defmod BlutspendenPuchheimMail DOIF ([BlutspendenPuchheimWert])\
(\
{sendmail('[MailAdresseStephan]','Blutspendetermine Puchheim',"\
[BlutspendenPuchheim:n00_title] [BlutspendenPuchheim:n00_description]\n\n\
[BlutspendenPuchheim:n01_title] [BlutspendenPuchheim:n01_description]\n\n\
[BlutspendenPuchheim:n02_title] [BlutspendenPuchheim:n02_description]\n\n\
[BlutspendenPuchheim:n03_title] [BlutspendenPuchheim:n03_description]\n\n\
[BlutspendenPuchheim:n04_title] [BlutspendenPuchheim:n04_description]\n\n\
[BlutspendenPuchheim:n05_title] [BlutspendenPuchheim:n05_description]\n\n\
Siehe: [BlutspendenPuchheim:&URL]")}\
)
attr BlutspendenPuchheimMail do always
attr BlutspendenPuchheimMail room Benachrichtigungen
attr BlutspendenPuchheimMail group Blutspenden
attr BlutspendenPuchheimMail comment Sendet die Blutspendetermine per Mail
set BlutspendenPuchheim update


Kirschen-Ernte (Stand: 8/2019)

Die Seite Pflückspaß bietet zwar eine Erinnerungsfunktion, um informiert zu werden, wann das Kirschen-Feld offen hat und die Ernte beginnt, aber leider funktioniert diese Benachrichtigung nicht oder kommt viel zu spät.
Warum also nicht einfach mit FHEM selber machen?!
So sieht die Lösung aus:
defmod Kirschen HTTPMOD https://www.pflueckspass.de/ 86400
attr Kirschen enableControlSet 1
attr Kirschen reading01Name Bild
attr Kirschen reading01Regex \/kirsche-(.+?).png"
attr Kirschen stateFormat {ReadingsVal($name,"Bild",0)}
attr Kirschen room Benachrichtigungen
attr Kirschen group Kirschen
set Kirschen reread

defmod KirschenNachricht DOIF ([Kirschen:Bild] eq "offen")\
({sendmail('[MailAdresseStephan]','Kirschenfeld hat offen!',\
"Kirschenfeld hat offen!\nSiehe: https://www.pflueckspass.de/\n")})\
DOELSE\
({sendmail('[MailAdresseStephan]','Kirschenfeld ist geschlossen!',\
"Kirschenfeld ist geschlossen!\nSiehe: https://www.pflueckspass.de/\n")})
attr KirschenNachricht room Benachrichtigungen
attr KirschenNachricht group Kirschen

Luftfeuchte Keller (Stand: 9/2019)

Gerade in den Sommermonaten sollte man ein Auge auf die Luftfeuchte im Keller haben.
Lösung ist ein HmIP-STHD
Einbindung in FHEM:
get d_ccu devicelist create ^HmIP-.* t=all f=HmIP_%n
Dann:
rename HmIP_HmIP_STHD_000E9A498BACF4 Klima_Keller_Hobby
set Klima_Keller_Hobby defaults
attr Klima_Keller_Hobby ccureadingname 1.ACTUAL_TEMPERATURE$:+temperature;;1.HUMIDITY$:+humidity
attr Klima_Keller_Hobby stateFormat T: temperature°C, H: humidity%rH
attr Klima_Keller_Hobby room Klima
get Klima_Keller_Hobby update
get Klima_Keller_Hobby config 1 SHOW_HUMIDITY
# Geht aktuell noch nicht und muss per CCU gemacht werden (TODO!):
set Klima_Keller_Hobby config 1 SHOW_HUMIDITY=1
# siehe dazu auch: https://forum.fhem.de/index.php?topic=96176.0
Die Werte in ein Logfile schreiben und es visualisieren:
defmod Klima_Keller_Hobby_Log FileLog ./log/klima_keller_hobby.log Klima_Keller_Hobby:(temperature|humidity).+
attr Klima_Keller_Hobby_Log room Klima
Dann einen SVG Plot erstellen, der temperature und humidity beinhaltet und
attr SVG_Klima_Keller_Hobby_Log_1 room Klima
und noch ein paar Zwischenwerte erzeugen:
defmod addLogHourly_Klima_Keller_Hobby DOIF ([:59] or [:01])\
({\
addLog("Klima_Keller_Hobby", "temperature");;\
addLog("Klima_Keller_Hobby", "humidity")\
})
attr addLogHourly_Klima_Keller_Hobby room Klima
attr addLogHourly_Klima_Keller_Hobby do always
Und die Statistiken dazu aktivieren:
define Statistik statistics Klima_Keller_Hobby
attr Statistik room Klima
Dann noch den Taupunkt dazu:
defmod dew_Keller dewpoint dewpoint Klima_Keller_Hobby temperature humidity dewpoint
attr dew_Keller room Klima
Bezüglich Taupunkt und Schimmelvermeidung sollte man
FHEM Wiki: Energiesparende Schimmelbekämpfung / Luftentfeuchtung in kritischen Räumen
und auf jeden Fall
HowTo: Schimmelvermeidung - Richtig Lüften und Entfeuchten
lesen.
Für eine Warn-Meldung gibt es auch schon Ideen:
Taupunktbenachrichtigung
Erst mal eine Warn-Mail senden, wenn die Luftfeuchte zu hoch ist:
defmod Keller_Luftfeuchte_Warnung DOIF ([Klima_Keller_Hobby:humidity] > 65)\
({sendmail('[MailAdresseStephan]',"Luftfeuchte im Keller ist [Klima_Keller_Hobby:humidity]%!","")})
attr Keller_Luftfeuchte_Warnung do always
attr Keller_Luftfeuchte_Warnung cmdpause 86400
attr Keller_Luftfeuchte_Warnung room Klima
attr Keller_Luftfeuchte_Warnung comment Warnung senden, wenn die Luftfeuchtigkeit im Keller höher 65% ist. Aber nur eine Meldung in 24 Stunden (cmdpause).

Erinnerungen/Benachrichtigungen (Stand: 9/2019)

Eine kleine Erinnerung an das regelmäßige Rück-Spülen des Wasser-Druck-Filters:
defmod DruFiSpuelen DOIF (\
[03:15] and\
(\
($md eq "02-01") ||\
($md eq "05-01") ||\
($md eq "08-01") ||\
($md eq "11-01")\
)\
)\
(\
({sendmail('[MailAdresseStephan]',"DruFi spülen","DruFi spülen")})\
)
attr DruFiSpuelen do always
attr DruFiSpuelen room Benachrichtigungen
attr DruFiSpuelen comment Sendet eine Mail, wenn der Wasser-Druck-Filter wieder rück-gespült werden muss. (Alle 3 Monate)
Man könnte so eine Erinnerung ggf. auch mit dem "Timer" Modul machen, siehe "help Timer".

Roto Dachfenster Solar-Funk-Rollladen (Stand: 10/2019)

Ausgangslage:
Ich bin leidgeplagter Besitzer zweier Roto Solar-Funk-Rollläden.
Einer fährt sporadisch selber rauf oder runter, aber nicht wenn ich es will und der andere nur noch manchmal.
Ins SmartHome läßt sich das so gut wie gar nicht integrieren.
Wenn durch zu wenig Sonne der Akku fast leer ist, geht auch nichts mehr.
Regelmäßig Akku tauschen geht auf Dauer ins Geld.
Umrüsten auf 230V ist extrem kostspielig: Da kommt man schnell für beide Fenster auf 3000 EUR. Wahnsinn.
Das muß auch günstiger gehen!
Der Plan wurde durch den Thread Geschafft: Roto-Dachfenster mit Solar-Funk-Rollade und Qubino Flush Shutter DC inspiriert:
Man könnte doch mit einem 12V Netzteil und dem Qubino Flush Shutter DC das ganze Sonnen- und Akku-unabhängig machen.
Erst einmal nur zum Strom-/Spannung-Messen diesen Stecker mit Kabel bestellt:
LUT 0800 0 2 Sensorleitungen, M8, 4 pol, Kupplung > offenes Ende, 2 m
Auf der anderen Seite braucht man diesen Stecker:
LUT 0830 T8CW04 Einbausteckverbinder, M8, 4 pol, Stecker, 0,5 m
Damit habe ich beim Betätigen des Rollladens zwischen der weißen und braunen Ader plus/minus 14,35V gemessen und weniger als 1A.
Der Rollladen fährt auch mit 12V.
Dann den Z-Wave Qubino (Qubino ZMNHOD1 Flush Shutter DC) ins Z-Wave Netz integrieren:
Inklusion:
set ZWDongle_0 addNode on
Aktor mit 12V verbinden. Kurz warten. Fertig.
Abruf der assozierten Geräte für alle Assoziationsgruppen:
get ZWave_SWITCH_MULTILEVEL_2 associationAll
ggf. Sichern des NVRAM des Controllers, siehe Z-Wave - Sicherung

... demnächst geht es weiter...

Lampe Wohnzimmer Couch(Stand: 12/2019)

Im Wohnzimmer war bisher immer eine kleine Dekokugel in der Couchecke.
Nachteil: Manchmal ist sie zu hell und manchmal zu dunkel.
Also muss etwas helles und dimmbares her!
Da ich bei Licht sehr gute Erfharungen mit ZigBee und Philips Hue gemacht habe, habe ich nach einer hellen E27 Birne gesucht.
Die hellste zu einem super Preis ist die IKEA TRADFRI LED-Leuchtmittel E27 1000 lm, Modell LED1732G11
Dazu kann man gleich noch den IKEA TRADFRI Kabelloser Dimmer dazunehmen.
Wenn man die Birne und den Dimmer gleichzeitig mit der Hue Bridge verwenden will, dann muß man das in dieser Reihenfolge machen: Dann im FHEM die Geräte aktualisieren:
get HueBridge devices
set HueBridge autocreate
Nur noch umbenennen:
rename HUEDevice10 LichtCouch
set LichtCouch rename LichtCouch
Test:
set LichtCouch color 3600
set LichtCouch color 2000
set LichtCouch color 6500
set LichtCouch bri 0
# gedimmt auf ca. 200lm:
set LichtCouch bri 50
# voll:
set LichtCouch bri 255

Mal sehen, was sich noch damit machen lässt...!

Zurück zur Hauptseite
Valid HTML 4.01 Transitional   Valid CSS!