Amazon Dash Button mit ISC DHCPD und FHEM

Einen WLAN-Knopf für nur 5€? Den muss man doch ausprobieren 😉

nerf

Das die Amazon Dash Buttons umfunktioniert werden können ist mittlerweile weitläufig bekannt. Die aktuellen Lösungen reagieren fast alle entweder auf den DHCP-Request vom Dash Button oder dem nachfolgendem ARP Request. Meistens wird ein Script verwendet, welches auf die Netzwerkpakete horcht und bei Eintreffen eine Aktion ausführt.

Im FHEM-Forum taucht auch schon das erste Modul auf. Dieses öffnet einen Listener auf Port 67 (DHCP) und lauscht direkt auf die ankommenden DHCP-Requests.
Das FHEM-Modul können wir leider nicht verwenden, da wir auf dem FHEM-Server auch gleichzeitig unseren DHCP Server laufen lasse und der Port somit schon belegt ist.Also würde mir nur die Script-Lösung bleiben. Aber wozu ein extra Script laufen lassen, wenn das auch mein DHCP-Server übernehmen könnte?!

Der von uns eingesetzte ISC DHCPD ist in der Lage nach einem DHCP-Request ein Script auszuführen.

Das Script wird natürlich nur bei dem Button mit genau der MAC-Adresse ausgeführt. Zusätzlich überschreibe ich nur für den Button den Default-Gateway, damit der Button gar nicht erst zu Amazon durch kommt.

Achtung: Wenn AppArmor im Einsatz ist, muss man etwas entschärfen – der mag es nicht wenn der DHCP-Server plötzlich Scripte ausführt 😉

Die passende FHEM-Config besteht aus einem dummy und einem notify:

Der Notify reagiert nur auf ein „on“ vom Dummy und setzt den Status mit dem neu definierten at-Device nach 40 Sekunden wieder zurück auf „off“. Das nutze ich zum entprellen des Buttons. Mir ist beim Testen aufgefallen, das es sein kann, das der Button sich mehrmals meldet und der DHCP somit das Script mehrfach ausführt. Das Attribute „event-on-change-reading“ hilft beim entprellen, indem es das notify nur bei State-Changes ausführt und nicht jedes mal wenn der State gesetzt wird.
Es sind übrigens 40 Sekunden, weil der Dash-Button ganze 35 Sekunden wach ist, wenn man ihn nicht zu Amazon durchkommen lässt. Kommt er durch und bekommt eine Antwort von Amazon ist er nur 8 Sekunden wach. Wenn noch jemand einen Tipp hat wie man ihm den Call-Home abgewöhnt und trotzdem bei 8 Sekunden bleibt, gerne melden 😉 Man-in-the-middle wird wohl nichts, da die Kommunikation mit HTTPS gesichert ist und self-signed Zertifikate nicht angenommen werden.

Ich werde den Button jetzt unter den Wohnzimmertisch kleben und mich bei jedem Tastendruck freuen wenn die Beleuchtung in den Kino-Modus geht, die Leinwand runter fährt, der Beamer sich einschaltet, … 😀 Und beim nächsten Tastendruck wird der Kino-Modus wieder beendet.

MQTT Verstärkerumschalter mit dem ESP8266

Sonos ist ein geiles System, aber … Von Flexibilität haben die da leider noch nichts gehört. Auch die wollen Geld schöffeln und für jeden Zweck ein eigenes Gerät verkaufen. Unser Problem: Wir haben einen Sonos Connect Amp im Wohnzimmer und zusätzlich einen AVReceiver als Verstärker und HDMI-Umschalter für den Beamer. Jeder für sich braucht ein Lautsprecherpaar, d.h. es stehen vier Lautsprecher in der Gegend rum. Wir haben uns unterschiedliche Konfigurationen überlegt, auch mit anderen Sonos Geräten, kamen aber nie auf eine Zufriedenstellende und/oder bezahlbare Lösung. Also durfte ich endlich wieder was basteln 😀

Problem beim Umschalten zwischen zwei Verstärkern ist, dass die Verstärker niemals miteinander verbunden werden dürfen. Bei einem Lautsprecherumschalter ist dies nicht gegeben, da wird nicht darauf geachtet weil es unwichtig ist. Die am Markt verfügbaren Verstärkerumschalter sind alle technisch veraltet (Automation? Schnittstellen?) oder wieder sehr sehr teuer. Wir haben so viel Zeit in die Hausautomation gesteckt, da will ich doch nicht immer von Hand umschalten müssen. Vor allem nicht wenn ich bereits auf dem Sofa liege 😉

Also ging es an einen Plan für einen Umschalter über Relais mit dem ESP8266 (Microcontroller mit WLAN). Ich arbeite bewusst mit vier Relais, um ein zeit verzögertes aus- und einschalten beim Wechsel zwischen den beiden Verstärkern realisieren zu können. Zudem wurde eine Schutzschaltung in Hardware eingebaut die beim Schalten des einen Verstärkers die Schalteingänge für die Relais des zweiten Verstärkers auf Masse zieht, damit diese nicht versehentlich gleichzeitig geschaltet werden können. Sollte es nun passieren, dass alle Relais gleichzeitig geschaltet werden, gibt es keinen Kurzschluss, sondern ein Verstärker gewinnt immer.

MQTTAmpSwitch

Neben den im Schaltplan ersichtlichen Bauteilen kam noch folgendes dazu:

Da die Front- und Rückseite des Gehäuses aus Metall ist und die Anschlussklemmen nicht isoliert sind, habe ich die Rückseite durch eine Epoxy-Platte ersetzt.

 

Als Software kommt MicroPython für den ESP8266 zum Einsatz. Aktuell gibt es das Binary noch nicht öffentlich sondern nur eine Preview für Unterstützer über Kickstarter.

Fazit: Die Preview ist schon mega geil! Macht viel mehr Laune damit den ESP zu bestücken als mit der ArduinoIDE. Zudem hat man eine direkte Python-Konsole auf dem ESP und kann per Kommandozeile mit dem Microcontroller arbeiten. Das macht das Programmieren und Debuggen um einiges einfacher.

Hier ein erster Entwurf des Python Codes für den Umschalter – ist aber eher ein Proof of Concept – vernünftiger Code muss noch nachträglich gebaut werden 😀
Den jeweils aktuellsten Code gibts auf github: https://github.com/Torsten-/MicroPython_MQTTAmpSwitch

Der Code schickt übrigens auch jede Statusänderung über MQTT raus – egal ob manuell über den Taster, oder ob automatisiert über MQTT. So ist FHEM immer auf dem aktuellsten Stand.

 

In FHEM wird dann ein neues Device angelegt:

 

Zu den Schaltregeln – für den Anfang gibt es folgende:

  • Wenn ein Entertainment-Programm gestartet wird (Leinwand runterfahren, Beamer an, ..) wird der Umschalter auf den AVReceiver umgestellt
  • Beim Beenden des Entertainment-Programms wird der Umschalter wieder auf Sonos zurück gestellt
  • Wenn der Umschalter auf den AVReceiver umgeschaltet wird, wird die Wiedergabe des Sonos gestoppt

RGB Temperatur Anzeige (für FHEM)

Um morgens entscheiden zu können, wie dick ich mich für die Fahrradfahrt zur Arbeit anziehen muss, werfe ich einen flüchtigen Blick auf ein Thermometer. Das Problem ist, dass die meisten Thermometer ein Display ohne Beleuchtung haben. Man muss schon genau hingucken und in der Nähe des Thermometers sein um die Zahlen erkennen zu können. Vor allem wenn man die Brille noch nicht auf hat 🙂

Zudem habe ich zwei Funkthermometer – eines zum Messen der Raumtemperatur, das andere zum Messen der Außentemperatur. Diese Thermometer funken auf 868 Mhz zu einem Raspberry Pi mit FHEM. Vorteil bei den Funkthermometern: Ich habe nicht nur eine History in FHEM sondern kann die Thermometer auch sinnvoller platzieren als Kabelgebundene.
Leider ist es noch umständlicher eine App zu öffnen, als auf ein dunkles Thermometer-Display zu gucken 😉 Auch der Versuch ein par FHEM Daten auf einem kleinen Display auszugeben waren nicht zufriedenstellend, da mir die Zahlen noch zu klein waren.

Irgendwann habe ich mich entschieden das Problem mit 7-Segment-Anzeigen zu lösen. Da leuchten die Zahlen aktiv, sie sind groß genug um sie auch aus der Ferne zu erkennen und ich habe die Anzeige nicht mit weiteren Informationen überfrachtet.

Hardware

Die Anzeige besteht aus zwei Zeilen und sechs Spalten.

2014-12-14 19.39.33

Zusätzlich wollte ich ausprobieren, ob man über RGB-LEDs ein zusätzliches visuelles Feedback zur Temperatur abgeben kann, sodass man anhand der Farbe schon auf die ungefähre Temperatur schließen kann – ob sich das bewährt, wird sich zeigen – ansonsten ist es halt nur Kunst 😀

2014-12-14 19.39.21

Die Alufolie war zunächst meine Lösung um die LEDs des darunter liegenden Arduinos zu verbergen, hat sich aber auch als Reflektor bewährt.

Die Platine mit den Anzeigen besteht tatsächlich nur aus den Anzeigen, den LEDs und Stiftleisten. Zum Multiplexen der Anzeige habe ich die gemeinsame Anode der 7-Segment-Anzeigen pro Spalte zusammengefasst, sodass bei der Spaltenauswahl sowohl das Element aus der ersten als auch das aus der zweiten Zeile gleichzeitig angesteuert wird.
Die Auswahl der entsprechenden Segmente erfolgt über Schieberegister. Die jeweils gleichen Segmente der ersten Zeile sind miteinander verbunden und die der zweiten auch. So kann ich über die Anode eine Spalte auswählen und über zwei Schieberegister (pro Zeile eins) die entsprechenden Segmente pro Zeile aufleuchten lassen.
Der Arduino geht spaltenweise durch. Es kann zwar immer nur eine Spalte leuchten, da das Auge aber träger ist, als der Arduino die Spalten durchgeht, sieht es aus als würden alle gleichzeitig leuchten.

 

Eine zweite Platine im gleichen Format beherbergt dann die restliche Elektronik und die Buchsenleisten zum Aufstecken des Display-Boards.

2014-12-14 19.40.26

In der Mitte ein Arduino Nano Nachbau – Vorteil daran ist die fertige Schaltung inklusive USB-Anschluss. Und das zu einem unschlagbaren Preis – wenn man etwas längere Versandzeiten aus China in Kauf nimmt.

Rechts die zwei Schieberegister – diese sind in Reihe geschaltet. Links oben die Transistoren zum Schalten der Spalten und unten die Anschlüsse für die RGB-LEDs.

Hier der professionelle Schaltplan zum Logik-Board 😀

2014-12-14 19.42.17

2014-12-14 19.40.19

2014-12-14 19.40.38

Hier erkennt man das Stacking der zwei Boards aufeinander mit dem Arduino in der Mitte.

2014-12-14 19.39.43

Als Gehäuse habe ich einen Ikea-Bilderrahmen genommen. Die sind schön dick und können etwas Elektronik aufnehmen.

2014-12-14 19.41.20

2014-12-14 19.39.05

2014-12-14 19.38.48

So sieht das ganze dann in Aktion aus.

2014-12-14 19.38.29

Software

Den Arduino-Quelltext habe ich auf github hochgeladen: siehe hier

Übergabeformat
Zum Anzeigen der Werte gibt es ein simples Format, was über die serielle Schnittstelle zum Arduino übertragen wird.

1:23,4\n

Mit 1 (oder 2) gibt man die Zeile an, für die man den Wert setzen will. Gefolgt von einem Doppelpunkt und dem Wert der Anzeige. Ob Komma oder Punkt zum Trennen der Dezimalstellen ist egal. Für negative Werte einfach das Minus mit angeben. Ein Zeilenumbruch schließt den Input ab und sagt dem Arduino, dass er den Wert parsen und anzeigen soll.
Das hat den Vorteil, dass die Werte der zwei Zeilen unabhängig voneinander gesetzt werden können. Die trudeln nicht gleichzeitig bei FHEM ein, daher setze ich die Werte unabhängig voneinander.

Timeout
Sollten mal die Updates der Anzeige fehlschlagen (Übertragung zum Arduino, FHEM läuft nicht, Thermometer senden nicht mehr, ..) stellt der Arduino den Wert auf „-0,0“ um zu demonstrieren, dass ihm Werte fehlen. Dies passiert über einen konfigurierbaren Timeout (derzeit 30 Minuten). Damit beuge ich dem Problem vor, dass ich tagelang eine eingefrorene Anzeige habe und nicht mitbekomme, dass die Werte veraltet sind.

FHEM
In FHEM habe ich das ganze dann stumpf umgesetzt, indem ich die Werte direkt auf das serielle Device schreibe, ohne dieses vorher zu konfigurieren. Dafür gibt es garantiert hübschere und sauberere Wege, aber dieser funktioniert einwandfrei – warum dann mehr Arbeit reinstecken?! 😀

define Outdoor_Temp_Board notify Indoor:T:.* {\
open(FILE,“>/dev/ttyUSB0″);;\
print FILE „1:“;; print FILE %EVTPART1;; print FILE „\n“;;\
close(FILE);;\
}