Integration Alexa in openHAB für Sprachsteuerung des Bus-Systems

Hier wird beschrieben, wie man in openHAB 2 einen Amazon Echo Dot (Alexa) integrieren kann. Ziel ist es unsere EIB / KNX Hausinstallation per Sprache zu steuern.

Haus.items

Die Items in openHAB müssen für die Verwedndung der Hue Emulation entsprechend angepasst werden. Folgende Eigenschaften können ergänzt werden:

  • [„Lighting“]
  • [„Switchable“]
  • [„TargetTemperature]

Ein EIB-Item bei mir im Büro sieht wie folgt aus:

Switch Licht_EG_Buero  "Licht Büro"(gEG_Buero, gLicht_EG, gLicht) ["Lighting"] {knx="<0/0/4711"}

Paper UI

In der Administrationsoberfläche „Paper UI“ muss man dann die Hue Emulation aktivieren.

Dies erfolgt unter „Addons – Misc – Hue Emulation – INSTALL“.

Danach wird das Pairing unter „Configuration – Services – Hue Emulation – CONFIGURE – Pairing enabled“ aktiviert.

Die Hue Emulation ist notwendig, da es aktuell noch kein direktes Binding für Alexa in openHAB gibt.

Amazon Alexa App

In der AlexaApp kann man dann unter Smarthome den Befehl „Geräte suchen“ ausführen (oder direkt per Sprachbefehl: Alexa: Geräte suchen).

Danach werden in der App die entsprechend konfigurierten Items angezeigt und können über Alexa per Sprache gesteuert werden.

Sprachsteuerung

Durch diese einfache Konfiguration kann ich jetzt alle meine EIB-Items per Sprache steuern.

Ich habe dies mit folgenden Befehlen integriert:

  • Alexa, schalte Licht Büro ein / aus
  • Alexa, setze Dimmen Büro auf 20 %
  • Alexa, schalte Steckdose Büro Computer ein / aus

Fazit

Das war die bis jetzt einfachste Integration eines neuen Endgeräts in openHAB.

Was meint Ihr dazu? Würdet Ihr eine Sprachsteuerung bei euch zu Hause nutzen? Würdet Ihr Amazon vertrauen um euer Smart Home zu steuern?

Erster Test mit Amachon Echo Dot

Am 23.01.2017 wurde mir ein Amazon Echo Dot geliefert. Ich habe bewusst den Dot und nicht den normalen Echo bestellt, da ich das Gerät nur zur Sprachsteuerung unserer EIB / KNX Installation verwenden möchte und damit auf die integrierten Lautsprecher nicht angewiesen bin.

Der Echo Dot ist sehr schnell in Betrieb genommen. Dazu wird auf dem Smartphone die Amazon Echo App installiert und dort kann man dann per Bluetooth die Erstkonfiguration vornehmen und das Gerät in das WLAN aufnehmen. Gleichzeitig werden die neuesten Softwareupdates auf dem System installiert.

Damit ist die Einrichtung auch schon erledigt und ein paar Kommandos können getestet werden:

  • Alexa: Spiele „Rock Antenne“
  • Alexa: Spiele Playlist „Hardrock-Klassiker“
  • Alexa: Wie ist das Wetter?
  • Alexa: Stelle einen Wecker auf 15 Uhr
  • Alexa: Aktuelle Infos des Tages

Es gibt also ein paar schöne Kommandos für den Dot. Das Gerät kann noch um „Skills“ erweitert werden (das schaue ich mir aber später an).

Jetzt wird erst einmal Alexa in openHAB integriert 🙂

Update auf die Release-Version 2.0 von openHAB

Am 23.01.2017 wurde die Version 2.0 von openHAB veröffentlicht. Die Änderungen bzw. das Changelog der Version findet ihr hier.

Das Update meiner Version vom 24.12.2016 auf die offizielle Version konnte ich wie folgt durchführen:

sudo systemctl stop openhab2.service

wget -qO - 'https://bintray.com/user/downloadSubjectPublicKey?username=openhab' | sudo apt-key add -

echo 'deb http://dl.bintray.com/openhab/apt-repo2 stable main' | sudo tee /etc/apt/sources.list.d/openhab2.list

sudo apt-get update
sudo apt-get upgrade

sudo systemctl start openhab2.service

Die Aktualisierung hat ca. 15 Minuten benötigt. Nach dem Update habe ich einmal alle Logs kontrolliert und die Funktionen getestet. Das Update war ohne weitere Anpassungen erfolgreich 🙂

Wie nutze ich meinen Beddi-Wecker?

Aktuell habe ich in meinem Beddi-Wecker folgende Alarme definiert (hier kann man beliebig variieren):

  • Wochentags zu einer bestimmten Uhrzeit z.B. 06:30 Uhr von Montag – Freitag
  • Sonntags einen Einzelalarm z.B. 06:00 Uhr zum Laufen
  • Einen individuellen Alarm, wenn ich mal zu anderen Zeiten aufstehen muss / will

Im Alarm habe ich für mich einen ruhigen Ton zum Wecken eingestellt (FM-Radio benötige ich in der Früh zum Aufstehen eher nicht, auch wollte ich nicht eine extra Playlist beim Wecken zusammenstellen).

Beim Wecken habe ich dann noch eingestellt, dass die aktuellen Wetterinformationen vorgelesen werden.

Der wichtigste Punkt war für mich dann die Weckation „HTTP Request“. Damit kann ich wie folgt direkt meine openHAB-Installation ansprechen und dort Regeln auslösen (hier geht dann auch IFTTT etc.):

http://IP:PORT/classicui/CMD?VARIABLE=ON

Damit wird momentan das Licht im Schlafzimmer automatisch eingeschalten. Hier benötige ich noch etwas mehr Intelligenz, dass in der Früh das Licht nicht auf 100 % angeht, sondern auf ca. 30 % automatisch gedimmt wird 😉

Viele der Funktionen des Beddi nutze ich aktuell nicht z.B. individuelle Smartbuttons, FM-Radio, Lichtsteuerung, bestimmte Töne / Melodien die beim Einschlafen helfen sollen oder die Ansteuerung externer Services wie Spotify, Nest, Philips hue etc.

Was meint Ihr dazu? Würdet Ihr euch einen „smarten Wecker“ in das Schlafzimmer stellen? Welche Szenarien fallen euch dazu ein?

Unschärfen des „Beddi“ Weckers

Ich habe mir vor ein paar Wochen einen Intelligenten Beddi Wecker für zu Hause gekauft.

Der Wecker hat bis jetzt zuverlässig funktioniert. Ich nutze aber nur einen Teil der Funktionen. Ziel war es, über den Wecker ein Gerät zu haben, mit dem ich bestimmte Funktionen beim Aufstehen automatisieren kann.

Ich bin beim Kauf davon ausgegangen, dass der Wecker sich direkt in das Netzwerk per WLAN integriert. Der Wecker wird aber von der Logik direkt von einer Smartphone-App per Bluetooth gesteuert d.h. es muss das Smartphone im Schlafzimmer sein. Normalerweise liegt mein Telefon aber zum Laden über Nacht immer im Büro.

Fazit ist, dass ich jetzt mein Smartphone in das Schlafzimmer legen muss, damit eine Bluetooth-Verbindung zum Wecker hergestellt wird. Der Beddi hat einen USB-Anschluss d.h. das Telefon kann direkt von dort geladen werden. Auch ist das Smartphone automatisch auf lautlos gestellt, wenn es geladen wird.

Außerdem kann man ohne Smartphone nicht erkennne, ob ein Alarm am Gerät aktiv ist. Auch ist es ohne Smartphone nicht möglich einen Alarm zu aktivieren oder zu deaktivieren. Das ist bei einem solchen Gerät etwas schade, aber „works as designed“.

Ich habe bei Wittidesign nachgefragt, ob dort auch ein Gerät zur Verfügung ist, dass direkt im WLAN integriert ist und ohne weiteres Gerät funktioniert. Ein solches Gerät ist für 2017 in Planung. Das könnte dann eine interessante Alternative für mich sein …

 

Erstes eigenes Binding für openHAB

Nachdem der Aufbau der Entwicklungsumgebung beschrieben wurde, muss natürlich auch ein eigenes Binding programmiert werden 🙂

Hier gibt es auch schon eine kurze Einführung dazu:

Ich habe neben dem Video noch folgende Anpassungen durchführen müssen:

  • Maven herunterladen und den PATH um das BIN-Verzeichnis erweitern
  • Systemvariable JAVA_HOME auf das aktuelle Java-Verzeichnis erstellen (ansonsten kann man den Befehl „mvn“ nicht ausführen)
  • Das Binding (Code-Gerüst) wie folgt erstellen:
    • create_openhab_binding_skeleton.cmd CoolStuff coolstuff
    • Danach den Author eingeben und die restlichen Vorgaben mit „Yes“ akzeptieren
  • Damit wird das Projekt „org.openhab.binding.coolstuff“ erzeugt

Das Projekt kann jetzt direkt in Eclipse ausgeführt und erweitert werden.

Folgende wichtige Dateien habe ich mir aus dem Video noch notiert:

  • \org.openhab.binding.coolstuff\pom.xm (Build-File für Maven)
  • \org.openhab.binding.coolstuff\ESH-INF\binding\binding.xml (Binding-File für openHAB)
  • \org.openhab.binding.coolstuff\ESH-INF\thing\thing-types.xml (Thing-File für openHAB)
  • \org.openhab.binding.coolstuff\src\main\java\org\openhab\binding\coolstuff\handler\CoolStuffHandler.java (Ablageort für die Logik des Bindings)

Die Erstellung eines eigenen Bindings war damit doch recht einfach. Jetzt muss ich mal schauen, wie man ein UPnP-Radio in ein Binding integriert.

Happy Coding 🙂

Entwicklungsumgebung für openHAB 2.x aufbauen

Ich habe mittlerweile zwei Geräte bei uns gefunden, für die keine openHAB-Bindings existieren. Dazu gehören auch unsere Philips Streamium MP3 Radios. Diese sind per UPnP im Netzwerk erreichbar und ich würde die Radios gerne per Binding anbinden.

Für den Aufbau der Eclipse-Entwicklungsumgebung gibt es hier bereits ein Video (auf Basis von Eclipse Mars):

Aktuell ist Eclipse Neon (4.6.1). Ich habe die IDE ähnlich wie in dem Video aufgebaut. Hier noch einmal die Änderungen, die bei mir notwendig waren:

  • Java JDK 8 installieren (die neueste Version war 8u111
  • Danach den Eclipse Installer für Neon herunterladen (bei mir Windows in der 64 Bit Architektur)
  • Danach rechts oben den „Advanced Mode“ aktivieren
  • Unter „Product“ die „Eclipse IDE for Java Devlopers“ auswählen“
  • Unter „Projects“ – „Github.com – openHAB“ alle benötigten Projekte auswählen (ich habe alle selektiert, das sieht im Video anders aus!)
  • Unter Variables habe ich dann den „Root install folder“ und den „Github user“ entsprechend angepasst
  • Danach wird Eclipse automatisch gestartet und die notwendigen Konfigurationen aus den Repositories geladen

Für einen Funktionstest kann man nun unter „Run – Run Configurations“ die „Eclipse Application openHAB_Runtime“ starten und sich mit http://localhost:8080 darauf verbinden.

Als ich das letzte Mal mit Eclipse zu tun hatte (dürfte so Version 3.2 – Callisto gewesen sein), war das alles noch nicht so einfach 🙂

Kodi / XBMC per openHAB fernsteuern

Auf unserem Fire TV Stick von Amazon läuft das Media-Center Kodi. Es macht dann natürlich auch Sinn die Mediensteuerung in die Hausautomatisierung zu integrieren.

Hier in dem Beispiel möchte ich die Informationen von Kodi in openHAB darstellen und Kodi damit fernsteuern. Es sollen auch bestimmte Aktionen ausgeführt werden z.B. wenn ich Pause drücke, soll das Licht automatisch gedimmt werden.

Vorbereitung Kodi

Im ersten Schritt sollte man kontrollieren, ob man im Fire TV Stick eine feste IP-Adresse hinterlegt hat (das kann man im WLAN-Dialog unter erweitert etwas versteckt einstellen).

Danach Kodi starten und kontrollieren, ob das Einstellungslevel mindestends „Standard“ ist (oder wie bei mir „Fortgeschritten“.

Dann kann man unter „System – Einstellungen – Dienste – Webserver“ die „Steuerung über HTTP zulassen“ aktivieren.

Außerdem muss man noch unter „System – Einstellungen – Dienste – Fernsteuerung“ die „Steuerung über lokale Programme zulassen“ und „Steuerung über entferne Programme zulassen“ einschalten.

Das Ergebnis kann man mit dem Aufruf http://IP-ADRESSE:8080 kontrollieren.

Binding

Nun wird das Binding in openHAB 2.x aktiviert – „Paper UI – Add-ons – BINDINGS – XBMC Binding“ – dazu INSTALL auswählen.

Nun kann man das Binding über den Eclipse SmartHome Desinger unter „Services – xbmc.cfg“ parametrieren:

# Hostname / IP address of your XBMC host (required). Example:
livingRoom.host=IP-ADRESSE

# Port number for the json rpc service (optional, defaults to 8080). Example:
livingRoom.rsPort=8080

# Port number for the web socket service (optional, defaults to 9090). Example:
livingRoom.wsPort=9090

# Username to connect to XBMC. (optional, defaults to xbmc). Example:
livingRoom.username=xbmc

# Password to connect to XBMC. (optional, defaults to xbmc). Example:
livingRoom.password=xbmc

#Refresh interval in ms (optional, defaults to 60000ms [1 minute])
refreshInterval=60000

In diesem Beispiel muss die IP-ADRESSE noch getauscht und optional Benutzer und Passwort gesetzt werden.

Items

Danach kann man beginnen seine gewünschten Items einzufügen. Eine Übersicht der Möglichkeiten findet Ihr hier.

Meine erste Test-Konfiguration sieht wie folgt aus:

Switch XBMC_System_State "XBMC - System.State [%s]" {xbmc="<[#livingRoom|System.State]"}
Switch XBMC_System_Shutdown "XBMC - System.Shutdown" {xbmc=">[#livingRoom|System.Shutdown]", autoupdate="false"}

String XBMC_Player_State "XBMC - Player.State [%s]" {xbmc="<[#livingRoom|Player.State]"}
String XBMC_Player_Title "XBMC - Player.Title [%s]" {xbmc="<[#livingRoom|Player.Title]"}
Switch XBMC_Player_PlayPause "XBMC - Player.PlayPause" {xbmc=">[#livingRoom|Player.PlayPause]", autoupdate="false"}
Switch XBMC_Player_Stop "XBMC - Player.Stop" {xbmc=">[#livingRoom|Player.Stop]", autoupdate="false"}

String XBMC_GUI_ShowNotification "XBMC - GUI.ShowNotification [%s]" {xbmc="<[#livingRoom|GUI.ShowNotification]", autoupdate="false"}

String XBMC_Label_Player_FinishTime "XBMC - Label.Player.FinishTime [%s]" {xbmc="<[#livingRoom|Label.Player.FinishTime]"}
String XBMC_Label_Player_Time "XBMC - Label.Player.Time [%s]" {xbmc="<[#livingRoom|Label.Player.Time]"}
String XBMC_Label_System_Uptime "XBMC - Label.System.Uptime [%s]" {xbmc="<[#livingRoom|Label.System.Uptime]"}
String XBMC_Label_VideoPlayer_VideoCodec "XBMC - Label.VideoPlayer.VideoCodec [%s]" {xbmc="<[#livingRoom|Label.VideoPlayer.VideoCodec]"}

Sitemap

Die Visualisierung in der Sitemap habe ich mir wie folgt aufgeteilt:

 Text label="Kodi (Fire TV Stick)" icon="video" {
 Frame label="System" { 
 Text item=XBMC_System_State label="Systemstatus [%s]"
 Text item=XBMC_Label_System_Uptime label="Systemlaufzeit [%s]"
 //Switch item=XBMC_System_Shutdown label="Herunterfahen" mappings=[OFF="OK"] visibility=[XBMC_System_State==ON]
 }
 Frame label="Mediensteuerung" {
 Switch item=XBMC_Player_PlayPause label="Wiedergabe starten" mappings=[ON="Play"] visibility=[XBMC_Player_State==Pause]
 Switch item=XBMC_Player_PlayPause label="Wiedergabe pausieren" mappings=[ON="Pause"] visibility=[XBMC_Player_State==Play]
 Switch item=XBMC_Player_Stop label="Wiedergabe beenden" mappings=[ON="Stop"] visibility=[XBMC_Player_State==Play, XBMC_Player_State==Pause] 
 }
 Frame label="Medieninformationen" {
 Text item=XBMC_Player_State label="Medienstatus [%s]"
 Text item=XBMC_Player_Title label="Gerade läuft [%s]"
 Text item=XBMC_Label_Player_Time label="Aktuelle Laufzeit [%s]"
 Text item=XBMC_Label_Player_FinishTime label="Ende um [%s]"
 Text item=XBMC_Label_VideoPlayer_VideoCodec label="Video-Codec [%s]"
 } 
 }

Rules

Um das Zusammenspiel etwas besser darzustellen wird mit dieser Regel sobald man Pause drückt per KNX das Licht gedimmt (und bei Play wieder ausgeschalten):

var Number brightnessBeforePause

rule "Licht an bei Pause"
 when
 Item XBMC_Player_State changed from Play to Pause 
 then
 brightnessBeforePause = Dimmen_EG_Wohnen.state as DecimalType
 logInfo("TEST","Licht vor Pause: " + brightnessBeforePause)

if (brightnessBeforePause < 50){
 sendCommand(Dimmen_EG_Wohnen,50)
 }
end

rule "Licht aus bei Pauseende"
 when
 Item XBMC_Player_State changed from Pause to Play 
 then
 if (Dimmen_EG_Wohnen.state == 50){ 
 sendCommand(Dimmen_EG_Wohnen,OFF)
 }
 
end

Fazit

Mit dem XBMC / Kodi Binding ist es recht einfach das Media-Center in openHAB zu integrieren. Damit kann ich zukünftig wieder auf eine Fernbedienung verzichten.

Leider habe ich keine Möglichkeit gefunden Kodi auf dem Fire TV Stick automatisch zu starten (das geht scheinbar nur, wenn es auf eigenständiger Hardware läuft). Auch funktioniert in meiner Kodi-Version 15.1 der Befehl „System.Shudown“ nicht um Kodi abzuschalten.

Welche Anwendungsfälle fallen euch im Zusammenspiel mit Kodi ein?

Sonnenaufgang und Sonnenuntergang mit openHAB berechnen

Ab und zu benötigt man zur Steuerung nicht nur fixe Uhrzeiten, sondern auch astronomische Ereignisse z.B. Sonnenaufgang oder Sonnenuntergang.

Wir möchten zum Beispiel die Weihnachtsbeleuchtung einschalten, wenn die Sonne untergegangen ist. Oder die Jalousien öffnen, eine Stunde bevor die Sonne aufgegangen ist.

Dazu benötigt man in openHAB das Astro-Binding.

Astro.things

In der Things-Datei dazu die notwendige Konfiguration vornehmen und mit den GPS-Koordinaten vervollständigen:

astro:sun:home [ geolocation="xx.xxxxxx,xx.xxxxxx", interval=60]
astro:moon:home [ geolocation="xx.xxxxxx,xx.xxxxxx", interval=60]

Orte kann man sich hier in GPS-Koordinaten darstellen lassen.

Astro.items

Nun kann man aus der Dokumentation die Items in seine Konfiguration übernehmen:

DateTime Sunrise_Time "Sonnenaufgang [%1$tH:%1$tM]" {channel="astro:sun:home:rise#start"}
DateTime Sunset_Time "Sonnenuntergang [%1$tH:%1$tM]" {channel="astro:sun:home:set#start"}
Number Azimuth "Azimut" {channel="astro:sun:home:position#azimuth"}
Number Elevation "Höhenlage" {channel="astro:sun:home:position#elevation"}
String MoonPhase "Mondphase" {channel="astro:moon:home:phase#name"}

Astro.rules

Etwas komplizierter wird es mit den Regeln. Hier fehlt im Gegensatz zu openHAB 1.x in der 2.x Version noch die Funktion „trigger channels“ anzusprechen (das Verhalten ist hier und hier beschrieben).

Behelfen kann man sich aber, indem man die Regel z.B. alle 8 Minuten startet und dann entsprechend reagiert (bis die oben genannten Requests umgesetzt wurden):

rule "sunrise-sunset"
when
 //Channel 'astro:sun:home:rise#event' triggered START 
 Time cron "8 * * * * ?"
then
 val now_ms = now.millis
 val sunrise = (Sunrise_Time.state as DateTimeType)
 val sunset = (Sunset_Time.state as DateTimeType)

 logInfo("Astro Rules", "sunrise: "+ sunrise)
 logInfo("Astro Rules", "sunset: "+ sunset)
 logInfo("Astro Rules", "now in ms: "+ now_ms)
end

 

Onkyo AV Receiver in openHAB integrieren

Ich habe gerade noch gesehen, dass es auch ein Binding für Onkyo-Receiver für openHAB 2.x gibt. Mein Receiver Onkyo TX-NR515 wird dort zwar nicht offiziell unterstützt, aber funktioniert trotzdem einwandfrei. 🙂

Things

Als erstes wieder die „Dinge“ erkennen lassen. Bei der manuellen Erkennung hat leider die Steuerung bei mir nicht funktioniert:

onkyo:onkyoAVR:myOnkyo [ipAddress="xxx.xxx.xxx.xxx", port=60128]

Es muss im Binding noch die richtige IP-Adresse angegeben werden.

Ich habe also über Paper UI das Gerät automatisch erkennen lassen. Damit läuft es dann einwandfrei.

Items

Ich nutze an dem Receiver nur die Zone 1 und auch keine NET-Funktionen. Für einen ersten Test kann man die Funktionen wie folgt in seine Item-Datei aufnehmen:

Switch Onkyo_Power "Onkyo - Power" {channel="onkyo:onkyoAVR:xxxIDxxx:zone1#power"}
Number Onkyo_Input "Onkyo - Eingang" {channel="onkyo:onkyoAVR:xxxIDxxx:zone1#input"}
Dimmer Onkyo_Volume "Onkyo - Lautstärke" {channel="onkyo:onkyoAVR:xxxIDxxx:zone1#volume"}
Switch Onkyo_Mute "Onkyo - Stumm" {channel="onkyo:onkyoAVR:xxxIDxxx:zone1#mute"}

Die xxxIDxxx muss noch gegen den richtigen Unique Device Name getauscht werden.

Sitemap

Dann kann man den AVR wie folgt im Web / App visualisieren:

 Text label="Onkyo AVR" icon="video" {
 Switch item=Onkyo_Power label="Ausschalten"
 Setpoint item=Onkyo_Volume label="Lautstärke ändern" minValue=0 maxValue=50 step=1 visibility=[Onkyo_Power==ON]
 Switch item=Onkyo_Mute label="Stumm" visibility=[Onkyo_Power==ON]
 Selection item=Onkyo_Input label="Eingang wechseln" mappings=[01="CBL/SAT", 02="GAME", 03="AUX", 05="PC", 16="BD/DVD", 34="PHONO", 35="TV/CD", 36="FM", 37="AM", 39="NETWORK", 41="USB", 46="BLUETOOTH"] visibility=[Onkyo_Power==ON]
 }

Fazit

Mittlerweile bin ich bei der Einbindung von neuen Geräten in openHAB recht schnell geworden. Man muss aber immer schauen, ob man aus einer Einbindung eines Geräts den entsprechenden Nutzen hat.

Beim Onkyo-Receiver ist mir aufgefallen, dass das entfernte Einschalten nicht funktioniert (aber das Ausschalten). Da ich dafür scheinbar ein Firmeware-Update benötige, werde ich das jetzt erst einmal so belassen (bis ich ein vernünftiges Szenario dafür habe). Leider gab es im Internet einige Beiträge, bei denen nach einem Firmeware-Update der Receiver nicht mehr bedienbar war.

Ich habe zufällig auch bemerkt, dass der Receiver über vTuner auch als Internetradio verwendet werden kann. Das macht natürlich nur Sinn, wenn ich den Radio über openHAB auch einschalten kann 😉