thomaskekeisen.de

Aus dem Leben eines Bildschirmarbyters

Türklingel noch smarter

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.

1: API-Zugang von nello Anfordern

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.

Screenshot: Dokumentation nello auth

2: Mit nello-API authentifizieren

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.

Screenshot: Authentifizierung mit der nello-API

3: ID des nello one herausfinden

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.

Screenshot: Liste aller Orte über die nello-API

4: OpenHAB-Item anlegen

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"]
                        
                    
Screenshot: Meine doorbell.item-Datei

5: OpenHAB-Item für externe Steuerung freigeben

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".

Screenshot: Konfiguration der OpenHAB-Cloud

6: IFTTT-WebHook anlegen

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} .

Screenshot: WebHook auf IFTTT konfigurieren
Screenshot: OpenHAB auf IFTTT konfigurieren
Screenshot: WebHook-URL auf IFTTT herausfinden

7: IFTTT-Webhook bei nello registrieren

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.

Screenshot: Webhook bei nello registrieren
Screenshot: Manueller WebHook-Aufruf auf IFTTT

8: OpenHAB-Regel anlegen

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ürt 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);
                        
                    
Screenshot: Meine OpenHAB-Klingel-Regel
Screenshot: Mein OpenHAB-Klingel-Script
Screenshot: Mein OpenHAB-Log wenn jemand klingelt

Teilen

Kommentare