IFTTT Actions im Intranet mit Adafruit IO & MQTT

IoT

Ich freue mich immer wenn Entwickler von IoT Geräten Möglichkeiten einbauen auf Ereignisse zu reagieren. Bestes Beispiel ist der Echo*, dem Amazon mit IFTTT ein paar nette Trigger spendiert, z.B. wenn der Timer ausläuft oder ein Wecker losgeht.

Worüber ich nicht besonders freue, ist das diese Trigger meistens nur mit IFTTT funktionieren. Klar, Amazon versucht damit einer größere Zielgruppe von Bastlern zu erreichen als wenn Sie z.B. HTTP Requests einbauen würden. Dafür erreiche ich meine Smarthome Geräte nicht mehr, die alle hinter meiner FRITZ!Box im Intranet stehen. Während ich darauf warte das Amazon für mich diese Trigger einbaut, hab ich mich nach Übergangslösung angeschaut, wie ich (möglichst sicher) IFTTT Actions in meinem Intranet auslösen kann.

Der erste Gedanke ging natürlich an den IFTT Maker Channel, Portfreigabe im Router und ein nginx o.ä. der die Requests entgegen nimmt und Skripte ausführt. Ehrlich gesagt war mir immer etwas mulmig bei dem Gedanken Zugriff von außen in mein Intranet zu ermöglichen… Klar, mit fail2ban etc kann man vieles verhindern aber am liebsten war mir eine Möglichkeit in die andere Richtung.

Danke es sehr guten Tipps von Nils (Danke!) habe ich mir mal MQTT angeschaut, ein offenes Protokoll für M2M Kommunikation. Der häufigste Anwendungsfall im Bereich MQTT wird vermutlich sein, das Sensoren oft und ohne Aufwand Werte an einen Server schicken sollen, und Clients diese Auswerten und reagieren. Für mich besonders interessant war aber die Möglichkeit das Clients sich mit dem „Broker“ verbinden, und die Nachrichten dann in Echtzeit gepusht bekommen, es gibt kein Polling. Ein paar Sekunden Verzögerung könnte viele Aktionen schon unnütz werden lassen.

Ich habe im ersten Versuch einen MQTT Server bei CloudMQTT gemietet, und über den IFTTT Maker Channel einen PHP Datei aufgerufen die MQTT Events erstellt hat. Beim Basteln bin ich dann auf Adafruit IO getoßen. Adafruit IO bietet sogenannte Feeds. Die können auch vielen verschiedenen Quellen beschrieben werden und z.B. mit MQTT ausgelesen werden, Außerdem hat es eine native IFTTT Integration und war in meinen Tests noch ein paar Sekundenbruchteile fixer als mit PHP. Ein Applet für Alexa könnte z.B. so aussehen:

 

 

Damit wäre der Broker auch schon fertig. Als Client kann theoretisch alles fungieren; Es gibt für viele Programmiersprachen fertige Bibliotheken. Bei läuft die komplette Hausautomation auf einem C.H.I.P., und dort fast alles über Node.js. Ich hab mich deshalb auch entschieden den Client in JavaScript zu schreiben, die passende Bibliothek für Node.js trägt den passenden Namen mqtt.

So sieht mein Code im Moment aus:

var mqtt = require('mqtt');
var request = require('request');
var exec = require('child_process').exec;
var url = 'mqtts://io.adafruit.com';
var options = {
	username: 'pattyland',
	password: '*******',
};
var client = mqtt.connect(url, options);
client.on('connect', function() {
	console.log("connected");
	client.subscribe('pattyland/feeds/alexa-timer');
})
client.on('message', function(topic, message) { 
	console.log(new Date().toJSON() + " " + topic);
	switch (topic) {
	case "pattyland/feeds/alexa-timer":
		exec("/home/chip/pause-fire-tv.sh");
		request({
			url: 'http://localhost:8465/api/username/lights/4/state',
			method: 'PUT',
			json: {
				on: "true"
			}
		});
		break;
	}
})Code-Sprache: JavaScript (javascript)

Kurz erklärt:

Verbinde dich über MQTT mit io.adafruit.com und abonniere (subscribe) meinen Feed „alexa-timer“. Hier können beliebig viele Feeds abonniert werden.  Spanned wird’s dann beim Listener. Hier warte ich bis eine „message“ ankommt und schaue in welchem Feed diese gepostet worden ist, die eigentliche Nachricht ignoriere ich im Moment. Da ist hier im Intranet bin, stehen mir alle Möglichkeiten offen: In meinen Fall weise ich meine ha-bridge die Lampe Nr. 4 einzuschalten, was dazu führt das mein selbstgebautes Ambilight rot blinkt. Außerdem starte ich ein Skript dass sich via ADB mit meinem Fire TV verbindet und die Pause-Taste simuliert, damit ich den Timer nicht aus Versehen verpasse weil ein Film oder Musik läuft.

Hier ist nochmal eine kleine Grafik die den Weg von Alexa zum IoT Gerät beschreibt:

So könnte sieht das ganze dann im Ergebnis aus:

Elgato Avea mit IFTTT steuern

IoT

Die Avea Bulb von Elgato* war vor ein paar Jahren mein erstes Smart Home Gerät. Smart ist leider ein bisschen übertrieben, denn wirklich smart ist sie nicht. Über die iOS App oder eine Apple Watch lässt sich die Glühbirne ein- und ausschalten und verschiedene Farben/Szenen anzeigen; Automatisiertes steuern mit z.B. HomeKit oder Siri wird auf einer extra dafür eingerichteten Supportseite ausgeschlossen.

Ohne ein Reverse Engineering der iOS App wäre es vermutlich auch dabei geblieben, aber Elgato hat nach guten 2 Jahren eine App für Android nachgereicht. Ich hatte gehofft eventuell direkt die eine Aktivität der App steuern zu können, aber das geht scheinbar nicht. Nach einer kurzen Suche bin allerdings auf eine andere App gestoßen und möchte in diesem Blogpost meinen Proof of Concept für die Steuerung für Avea mit IFTTT vorstellen