Achtung: Diese Seite enthält Partner- und Werbe-Links. Daher ist diese Seite im Gesamten als Werbeanzeige zu verstehen!
Ich habe erst kürzlich in meinem Artikel Erfahrungsbericht: Smarte Gegensprechanlage: nello one meine Erfahrungen geschildert. Nun habe ich nello one komplett in mein Smarthome mit OpenHAB 2 integriert. Wenn es jetzt an der Tür klingelt, wird automatisch kurzzeitig die Musik leiser gestellt und die hue-Lampen bei der Eingangstüre blinken rot auf. Da die Einrichtung doch relativ umständlich war, hier eine kleine Anleitung, was zu tun ist.
Grundvoraussetzung dieser Anleitung ist, dass bereits eine Installation von OpenHAB existiert, das über eine Implementierung der OpenHAB-Cloud verbunden ist. Vorzugsweise eignet sich hier die Nutzung von myopenhab.org. Außerdem wird ein Account bei IFTTT benötigt, der letztlich mit der gewählten OpenHAB-Cloud verbunden sein muss.
Leider kann nicht jeder neue nello one-Nutzer einfach so auch die API verwenden. Der Support muss, wie in der "nello auth"-Dokumentation beschrieben, erst per E-Mail an hello@nello.io um eine entsprechende Freischaltung eines eigenen "API-Zugangs" gebeten werden. Bei mir hat diese Freischaltung etwa neun Tage gedauert.
Der nello one-Support hat mir letztlich ein client_secret
sowie eine client_id
zugeteilt. Diese Daten können dann zusammen mit einem username
und password
per POST
an https://auth.nello.io/oauth/token/
geschickt werden. Der dann vom nello-Server zurück geschickte access_token
wird für die weiteren Schritte benötigt.
Ich habe für diesen API-Aufruf das Programm Postman verwendet. Weitere Informationen können auch aus der Dokumentation zur nello Public API entnommen werden.
Im meinem Fall besitze ich nur einen nello one, dennoch muss ich über die "Locations"-API einen GET
-Aufruf an die URL https://public-api.nello.io/v1/locations/
senden und herausfinden, welche ID meine Wohnung hat. Damit das klappt, muss im Authorization
-Header Bearer
gefolgt vom zuvor notierten access_token
gesendet werden.
In meiner OpenHAB-Installation führe ich die Türklingel als separates Item unter dem Namen item_doorbell
, das letztlich einfach angeschalten werden kann und dann automatisch von einer Regel wieder ausgeschaltet wird. Die folgende Konfiguration führe ich als doorbell.items
im items
-Ordner von OpenHAB:
Switch item_doorbell "Türklingel" ["Switchable"]
Nun muss das neu erstellte Itemitem_doorbell
für die Verwendung in der OpenHAB-Cloud freigegeben werden. Ich habe das direkt über das mitgelieferte Backend Paper UI erledigt. Konkret findet sich das Menü unter "Configuration > Services > openHAB cloud" unter der Überschrift "Items to expose to apps such as IFTTT".
Ist das alles erledigt, muss ein Applet auf IFTTT angelegt werden. Hierfür muss "WebHooks" als Service bei "this" ausgewählt werden. Als Event Name
für den "Receive a web request" habe ich door_bell
gewählt. Anschließend muss für "that" der "OpenHAB"-Service ausgewählt werden. Neben dem auszuwählenden Item muss als "Command to send" ein einfaches ON
angegeben werden.
Um die Adresse des WebHooks herauszufinden, muss die Webseite des IFTTT Maker-WebHooks aufgerufen werden. Aus dem Settings-Bereichs der WebHooks benötigen wir den Schlüssel ( key
) nach dem use/
in der "URL" um daraus die WebHook-URL zu berechnen: https://maker.ifttt.com/trigger/{event}/with/key/{key}
.
Um den Webhook letztlich beim nello one zu registrieren, muss ein PUT
-Request mit ebenfalls gültigem Authorization
-Header an die URL https://public-api.nello.io/v1/locations/{location_id}/webhook/
geschickt werden. Das {location_id}
ist natürlich entsprechend zu ersetzen. Der Content-Type
des Aufrufs sollte application/json
sein. Als Payload muss folgendes JSON-Objekt geschickt werden:
{
"url": "https://maker.ifttt.com/trigger/door_bell/with/key/{key}",
"actions": [
"tw",
"deny"
]
}
Der {key}
muss natürlich entsprechend ersetzt werden. Durch die Nennung der Actions
tw
sowie deny
registriere ich den WebHook auf Klingel-Ereignisse von Zeitfenstern oder, wenn der nello one die Türe gar nicht automatisch öffnet.
Kurzum möchte ich nur auf Klingeln der Post oder Gästen registrieren, nicht etwa, wenn ich selbst nach Hause komme oder die Türe manuell öffne. Weitere Aktionen können der API-Dokumentation zum Update-Befehl entnommen werden.
Die WebHook-URL auf IFTTT kann zum Testen auch manuell aufgerufen werden, sie sollte im Erfolgsfall den Text "Congratulations! You've fired the door_bell event" ausgeben.
Jetzt kann in OpenHAB eine Regel erstellt werden, die aktiviert wird, wenn das Itemitem_doorbell
den Befehl ON
erhält. In meinem Fall führe ich das von mir geschriebene Scripthue_doorbell
auf und Schalte den virtuellen Klingelschalter dann mit dem Code sendCommand(item_doorbell, OFF)
direkt wieder aus.
doorbell.rules
rule "item_doorbell"
when
Item item_doorbell received command ON
then
logWarn("door", "Someone is on the door");
callScript("hue_doorbell");
sendCommand(item_doorbell, OFF)
end
An Stelle von callScript("hue_doorbell");
kann jetzt jeder beliebige Code ausgeführt werden. Nachfolgend der Inhalt meiner hue_doorbell.script
-Datei, die sich beim Ausführen die Lautstärker all meiner Lautsprecher merkt, dann die Lautstärke auf 0
setzt, meine Lampe im Flur rot blinken lässt und dann nach zwölf Sekunden alles wieder auf seinen Ursprungszustand zurücksetzt:
hue_doorbell.script
logWarn("hue", "hue_doorbell");
var HSBType redColor = HSBType::fromRGB(255, 0, 0);
var initialValue = item_flur_decke_richtung_eingang_color.state as HSBType;
var volume_item_bad_raumfeld_one_s_volume = item_bad_raumfeld_one_s_volume.state as DecimalType;
var volume_item_bett_raumfeld_one_s_volume = item_bett_raumfeld_one_s_volume.state as DecimalType;
var volume_item_buero_raumfeld_stereo_s_volume = item_buero_raumfeld_stereo_s_volume.state as DecimalType;
var volume_item_esszimmer_raumfeld_stereo_s_volume = item_esszimmer_raumfeld_stereo_s_volume.state as DecimalType;
var volume_item_fitness_raumfeld_one_m_volume = item_fitness_raumfeld_one_m_volume.state as DecimalType;
var volume_item_kueche_raumfeld_stereo_s_volume = item_kueche_raumfeld_stereo_s_volume.state as DecimalType;
var volume_item_treppe_raumfeld_one_s_volume = item_treppe_raumfeld_one_s_volume.state as DecimalType;
var volume_item_wohnzimmer_raumfeld_stereo_m_volume = item_wohnzimmer_raumfeld_stereo_m_volume.state as DecimalType;
sendCommand(item_flur_decke_richtung_eingang_color, redColor);
sendCommand(item_bad_raumfeld_one_s_volume, 0);
sendCommand(item_bett_raumfeld_one_s_volume, 0);
sendCommand(item_buero_raumfeld_stereo_s_volume, 0);
sendCommand(item_esszimmer_raumfeld_stereo_s_volume, 0);
sendCommand(item_fitness_raumfeld_one_m_volume, 0);
sendCommand(item_kueche_raumfeld_stereo_s_volume, 0);
sendCommand(item_treppe_raumfeld_one_s_volume, 0);
sendCommand(item_wohnzimmer_raumfeld_stereo_m_volume, 0);
sendCommand(item_flur_decke_richtung_eingang_color, ON);
Thread::sleep(500);
sendCommand(item_flur_decke_richtung_eingang_color, OFF);
Thread::sleep(500);
sendCommand(item_flur_decke_richtung_eingang_color, ON);
Thread::sleep(500);
sendCommand(item_flur_decke_richtung_eingang_color, OFF);
Thread::sleep(500);
sendCommand(item_flur_decke_richtung_eingang_color, ON);
Thread::sleep(500);
sendCommand(item_flur_decke_richtung_eingang_color, initialValue);
Thread::sleep(12000);
sendCommand(item_bad_raumfeld_one_s_volume, volume_item_bad_raumfeld_one_s_volume);
sendCommand(item_bett_raumfeld_one_s_volume, volume_item_bett_raumfeld_one_s_volume);
sendCommand(item_buero_raumfeld_stereo_s_volume, volume_item_buero_raumfeld_stereo_s_volume);
sendCommand(item_esszimmer_raumfeld_stereo_s_volume, volume_item_esszimmer_raumfeld_stereo_s_volume);
sendCommand(item_fitness_raumfeld_one_m_volume, volume_item_fitness_raumfeld_one_m_volume);
sendCommand(item_kueche_raumfeld_stereo_s_volume, volume_item_kueche_raumfeld_stereo_s_volume);
sendCommand(item_treppe_raumfeld_one_s_volume, volume_item_treppe_raumfeld_one_s_volume);
sendCommand(item_wohnzimmer_raumfeld_stereo_m_volume, volume_item_wohnzimmer_raumfeld_stereo_m_volume);