Zum Hauptinhalt springen

LOQED lokale Bridge-API-Integration

Erweiterte Anleitung zur Verwendung der lokalen Bridge-API und ausgehenden Webhooks mit LOQED Smart Locks.

Gilt für: LOQED Touch und LOQED Pure.

Dies ist ein fortgeschrittener Entwicklerartikel für lokale Netzwerkintegrationen und ausgehende Webhooks.

Die lokale Bridge-API ist hauptsächlich Bridge-orientiert. Überprüfen Sie bei LOQED Pure- oder Gateway-basierten Setups die aktuelle API-Verfügbarkeit, bevor Sie eine neue Integration erstellen.

Bei einigen Smart-Home-Plattformen oder -Geräten verfügt LOQED über keine direkte Integration. Wenn Sie ein fortgeschrittener Benutzer sind, können Sie Ihre Integration mithilfe der LOQED-API entwickeln. Lesen Sie unbedingt zuerst unseren Artikel „Fortgeschrittene Benutzer: Verfügbare APIs“.

Beim Öffnen/Verriegeln der Tür eine URL aufrufen (ausgehender Webhook)

Wenn sich der Status des Schlosses ändert (offen, entsperrt, gesperrt) und für andere Informationen (Batterieprozentsatz, Online-Status), kann LOQED Bridge eine URL aufrufen (Daten an diese senden). Nachfolgend finden Sie, welche Daten als JSON an diese URL gesendet werden. Sie können auch GET-Parameter der URL hinzufügen, indem Sie den JSON-Schlüssel zwischen „[“ und „]“ festlegen. Zum Beispiel: https://your.server.nl/script?yourstate=[requested_state]. Sie können auch auswählen, bei welchen Änderungen ein Webhook-Aufruf ausgelöst werden soll (z. B. können Sie festlegen, dass eine URL nur dann aufgerufen wird, wenn die Tür verschlossen ist).

Die folgenden JSON-Schlüssel werden immer gesendet:

  • mac_wifi: enthält die Wi-Fi MAC-Adresse der Bridge. Dies hilft, die Brücke zu identifizieren. Der Multicast-DNS-Name der Bridge enthält diese Adresse ebenfalls.

  • mac_ble: enthält die Bluetooth MAC-Adresse der Bridge.

Zustand erreicht

Nachdem der Motor nicht mehr läuft, werden die folgenden JSON-Schlüssel für die Auslöser gesendet trigger_state_changed_open, trigger_state_changed_latch, trigger_state_changed_night_lock, trigger_state_changed_unknown:

  • angeforderter_Status

    • OFFEN

    • DAY_LOCK

    • NIGHT_LOCK

    • UNBEKANNT

  • event_type

    • STATE_CHANGED_OPEN (requested_state = OPEN)

    • STATE_CHANGED_LATCH (requested_state = DAY_LOCK)

    • STATE_CHANGED_NIGHT_LOCK (requested_state = NIGHT_LOCK)

    • STATE_CHANGED_UNKNOWN (requested_state = UNKNOWN)

    • MOTOR_STALL (requested_state = UNKNOWN)

    • STATE_CHANGED_OPEN_REMOTE (requested_state = OPEN)

    • STATE_CHANGED_LATCH_REMOTE (requested_state = DAY_LOCK)

    • STATE_CHANGED_NIGHT_LOCK_REMOTE (requested_state = NIGHT_LOCK)

    • GO_TO_STATE_TOUCH_TO_LOCK (requested_state = NIGHT_LOCK)

  • key_local_id (null, wenn z. B. manuelles Öffnen per Knopf oder Drücken der Taste). Enthält die KeyID, die den Zustand des Schlosses geändert hat.

In einen Staat gehen

Wenn sich das Schloss in eine neue Position bewegt (z. B. erreicht es die Position möglicherweise nicht, wenn die Batterien fast leer sind), werden die folgenden JSON-Schlüssel für die Auslöser gesendet trigger_state_goto_open, trigger_state_goto_latch, trigger_state_goto_night_lock:

  • go_to_state

    • OFFEN

    • DAY_LOCK

    • NIGHT_LOCK

  • event_type

    • GO_TO_STATE_INSTANTOPEN_OPEN (Touch to Open) (go_to_state = OPEN)

    • GO_TO_STATE_INSTANTOPEN_LATCH (Automatisches Entsperren) (go_to_state = DAY_LOCK)

    • GO_TO_STATE_MANUAL_UNLOCK_BLE_OPEN (go_to_state = OPEN)

    • GO_TO_STATE_MANUAL_LOCK_BLE_LATCH (go_to_state = DAY_LOCK)

    • GO_TO_STATE_MANUAL_LOCK_BLE_NIGHT_LOCK (go_to__state = NIGHT_LOCK)

    • GO_TO_STATE_TWIST_ASSIST_OPEN (go_to_state = OPEN)

    • GO_TO_STATE_TWIST_ASSIST_LATCH (go_to_state = DAY_LOCK)

    • GO_TO_STATE_TWIST_ASSIST_LOCK (go_to_state = NIGHT_LOCK)

    • GO_TO_STATE_MANUAL_UNLOCK_VIA_OUTSIDE_MODULE_PIN (go_to_state = OPEN)

    • GO_TO_STATE_MANUAL_UNLOCK_VIA_OUTSIDE_MODULE_BUTTON (go_to_state = OPEN)

    • GO_TO_STATE_TOUCH_TO_LOCK (go_to_state = NIGHT_LOCK)

  • key_local_id (255 bedeutet unbekannt, z. B. manuelles Öffnen per Knopf oder Drücken der Taste)

Batterieprozentsatz

Wenn das Schloss den aktuellen Batterieprozentsatz sendet (alle paar Stunden), werden die folgenden JSON-Schlüssel für den Auslöser gesendet trigger_battery:

  • Batterietyp (0 = Alkaline, 1 = NiMH, 2 = Lithium (nicht wiederaufladbar), 3 = unbekannt)

  • Batterieprozentsatz

Online-Status

Wenn das Schloss die Verbindung zur Bridge verliert, werden die folgenden JSON-Schlüssel für den Auslöser gesendet trigger_online_status:

  • wifi_strength (aktuell in dB, bald wird sich dies in einen Prozentsatz ändern)

  • ble_strength (derzeit in dB, bald wird sich dies in einen Prozentsatz ändern. -1 bedeutet, dass die Sperre nicht verbunden ist)

Überprüfen Sie, ob die Webhook-Anfrage vom LOQED Bridge stammt

Sie könnten sensible Maßnahmen ergreifen, wenn sich die Tür öffnet (z. B. das Licht einschalten, den Alarm ausschalten, die Heizung einschalten). Daher müssen Sie sicherstellen, dass unter der von Ihnen angegebenen URL keine anderen Geräte solche Aktionen auslösen können. Sie können:

  • Stellen Sie sicher, dass keine anderen Geräte die URL aufrufen können, indem Sie die IP nur auf die IP-Adresse des LOQED Bridge beschränken. Stellen Sie außerdem sicher, dass sich die Bridge-IP-Adresse nicht ändert, indem Sie dies im DHCP-Dienst Ihres Routers festlegen.

  • Überprüfen Sie die in den Headern des Webhook-Aufrufs gesendete Hash-Signatur. Im Header finden Sie TIMESTAMP (8 Bytes) und HASH (hex). Sie können den Hash selbst berechnen, indem Sie sha256(BODY + TIMESTAMP + base64_decode(bridge_authentication_key) ausführen. Den Bridge-Authentifizierungsschlüssel finden Sie unter https://app.loqed.com/API-Config. Der BODY ist der unveränderte Text, der mit der Anfrage empfangen wurde (mit dem gesamten JSON-Code). Vergessen Sie auch nicht zu überprüfen, ob der Zeitstempel nur wenige Sekunden von der tatsächlichen Zeit entfernt ist, um Replay-Angriffe zu verhindern.

Mit unserem Tool können Sie einen Webhook auf der Bridge auflisten, hinzufügen und löschen

Der einfachste Weg, Webhooks aufzulisten, hinzuzufügen oder zu löschen, ist die Verwendung unseres Javascript-Tools:

  1. Scrollen Sie zur Überschrift „Ausgehende Webhooks über LOQED Bridge“

  2. Klicken Sie neben der richtigen Bridge auf die Schaltfläche „Webhooks hinzufügen/löschen“. Das Tool wird geöffnet und Ihre Bridge-IP-Adresse und Ihr Authentifizierungsschlüssel sind vorab ausgefüllt.

Listen Sie mit Ihrem Code einen Webhook auf der Bridge auf, fügen Sie ihn hinzu und löschen Sie ihn

Wenn Sie Benutzern Ihres Produkts die Verbindung mit LOQED erleichtern möchten, können Sie die Webhooks auch über die Bridge-API einrichten. Nachfolgend werden die API-Endpunkte beschrieben. Wenn Sie ein Beispiel suchen, können Sie sich den Code des oben genannten Javascript-Tools ansehen. Der LOQED Bridge kann mithilfe von mDNS in Ihrer Anwendung gefunden werden (versuchen Sie es beispielsweise mit „DNS-sd -B _http._tcp“ unter Windows).

Für alle /webhooks-Webservermethoden sind zwei Header obligatorisch:

  • TIMESTAMP: enthält den aktuellen Zeitstempel

  • HASH – sha256-Hash-String

Die Hash-Berechnung ist für jede Art von Anfrage spezifisch und im entsprechenden Abschnitt beschrieben. Um den Hash berechnen zu können, benötigen Sie den Authentifizierungsschlüssel der Bridge. Diesen Schlüssel finden Sie nach der Anmeldung unter https://app.loqed.com/API-Config. Es gibt keine andere Möglichkeit, diesen Schlüssel abzurufen.

Webhooks auflisten
ERHALTEN: https://bridge-ip-address/webhooks
Der HASH im Header muss formatiert sein: SHA256(TIMESTAMP + LOCK_TOKEN), wobei TIMESTAMP eine 8-Byte-Zahl und LOCK_TOKEN der Sicherheitsschlüssel der Base64-dekodierten (!) Bridge ist (der Schlüssel auf der Seite webhooks.loqed.com ist in Base64). Der HASH sollte hexadezimal sein.

Gibt ein JSON-Array mit Schlüsseln zurück:

Gibt HTTP-Codes zurück:

  • Gibt den HTTP 400 BAD REQUEST-Code und die Zeichenfolge mit Beschreibung zurück, falls Header ungültig sind oder nicht gefunden werden

  • Geben Sie HTTP 401 UNAUTHORIZED zurück, wenn die Authentifizierung fehlgeschlagen ist

Webhook erstellen
POST: http://Bridge-IP-Adresse/webhooks
Textkörper: JSON mit Schlüsseln:

Der HASH im Header muss formatiert sein: SHA256(URL + Trigger_Bitmap + TIMESTAMP + LOCK_TOKEN), URL ist eine Zeichenfolge, Trigger_Bitmap 4 Bytes, TIMESTAMP ist eine 8 Bytes lange Zahl und LOCK_TOKEN ist der Sicherheitsschlüssel der Base64-dekodierten (!) Bridge (der Schlüssel auf der Seite webhooks.loqed.com ist in Base64). Der HASH sollte hexadezimal sein. Die trigger_bitmap enthält die Trigger. Beispielsweise ist 0x000F (15 Dezimalstellen) binär 0000 0000 0000 1010, was bedeutet, dass die folgenden Trigger aktiviert sind:

  • „trigger_state_changed_open“:0

  • „trigger_state_changed_latch“:1

  • „trigger_state_changed_night_lock“:0

  • „trigger_state_changed_unknown“:1

  • „trigger_state_goto_open“:0

  • „trigger_state_goto_latch“:0

  • „trigger_state_goto_night_lock“:0

  • „trigger_battery“:0

  • „trigger_online_status“:0

Wir haben auch ein kleines PHP-Snippet, das zeigt, wie ein Webhook erstellt wird, Sie können es hier herunterladen.

Rückgaben:

  • HTTP 200 OK-Code und String mit Beschreibung im Falle einer erfolgreichen Webhook-Erstellung

  • HTTP 400 BAD REQUEST-Code und String mit Beschreibung für den Fall, dass JSON für die Webhook-Erstellung nicht gültig ist

  • HTTP 400 BAD REQUEST-Code und String mit Beschreibung für den Fall, dass Header ungültig sind oder nicht gefunden werden

  • HTTP 401 UNAUTHORIZED, wenn die Authentifizierung fehlgeschlagen ist

  • HTTP 500 INTERNER SERVER-FEHLER-Code und Zeichenfolge mit Beschreibung für den Fall, dass ein Webhook mit dieser URL bereits vorhanden ist

  • HTTP 500 INTERNER SERVER-FEHLER-Code und String mit Beschreibung für den Fall, dass die maximale Anzahl an Webhooks erreicht wird

Webhook löschen
LÖSCHEN: http://Bridge-IP-Adresse/webhooks/{webhookId}
Der HASH im Header muss formatiert sein: SHA256(id + TIMESTAMP + LOCK_TOKEN), ID ist eine 8-Byte-Zahl, TIMESTAMP ist eine 8-Byte-Zahl und LOCK_TOKEN ist der Sicherheitsschlüssel der Base64-dekodierten (!) Bridge (der Schlüssel auf der Seite webhooks.loqed.com ist in Base64). Der HASH sollte hexadezimal sein.

Rückgaben:

  • HTTP 200 OK-Code und String mit Beschreibung im Falle einer erfolgreichen Webhook-Löschung

  • HTTP 400 BAD REQUEST-Code und String mit Beschreibung für den Fall, dass Header ungültig sind oder nicht gefunden werden

  • HTTP 401 UNAUTHORIZED, wenn die Authentifizierung fehlgeschlagen ist

  • HTTP 404 NOT FOUND-Code und String mit Beschreibung für den Fall, dass der Webhook mit {webhookId} nicht gefunden wurde

  • HTTP 500 INTERNAL SERVER ERROR Code und String mit Beschreibung für den Fall, dass beim Löschen ein Fehler aufgetreten ist

Testen

Wir empfehlen die Verwendung Webhook.site wenn Sie überprüfen möchten, ob Ihr Smart Lock/Ihre Smart Bridge die Webhook-URL aufruft. Dort können Sie auch die JSON-Daten sehen.

Tür öffnen/verriegeln, wenn etwas passiert (eingehender Webhook)

Wenn Sie Ihre Sperre von einem Drittanbieterdienst oder -gerät aus steuern möchten, können Sie dies über einen HTTPS-GET-Aufruf an Ihre LOQED Bridge-URL tun.

Erstellen eines API-Schlüssels

Zuerst müssen Sie einen neuen Schlüssel für Ihr LOQED Smart Lock erstellen.

  • Öffnen Sie die Seite https://app.loqed.com/API-Config.

  • Melden Sie sich mit Ihrer E-Mail-Adresse und Ihrem Passwort an, mit denen Sie sich beim LOQED app anmelden.

image

  • Klicken Sie auf „Neuen API-Schlüssel hinzufügen“.

image

  • Geben Sie zur leichteren Identifizierung einen Namen ein. Das kann alles sein, was Ihnen gefällt.

  • Wenn Sie über mehrere Schlösser verfügen, können Sie im Dropdown-Menü direkt neben „Schloss auswählen“ das richtige Schloss auswählen.

  • Klicken Sie auf „API-Schlüssel hinzufügen“.

image


Sie haben nun den API-Schlüssel erstellt.

Rufen Sie die API auf

Derzeit unterstützt die API die folgenden Befehle:

  • Öffnen (Schloss öffnet sich und kehrt dann in die Verriegelung zurück. Wird nur bei Türen ohne Griff an der Außenseite unterstützt). Es wird ein leeres JSON-Objekt zurückgegeben.

  • Riegel (entriegelt). Es wird ein leeres JSON-Objekt zurückgegeben.

  • Nachtsperre (gesperrt). Es wird ein leeres JSON-Objekt zurückgegeben.

  • Status. ACHTUNG: Wir empfehlen, den Status nur einmal täglich abzufragen, um die Belastung der Brücke möglichst gering zu halten. Anstatt nach dem Status zu fragen, sollten Sie einen Webhook implementieren, der Ihren Server aufruft, sodass Sie sofort eine Benachrichtigung erhalten, sobald sich der Sperrstatus ändert. Es gibt die folgenden JSON-Schlüssel zurück:

    • mac_wifi (Sperrerkennung)

    • mac_bluetooth

    • lock_online (1, wenn die Sperre online ist, sonst 0)

    • batterie_prozentsatz (-1, wenn die Sperre offline ist, andernfalls 0 - 100)

    • Batterietyp (0 = Alkaline, 1 = NiMH, 2 = Lithium (nicht wiederaufladbar), 3 = unbekannt)

    • Bolt_state_numeric (0 = unbekannt, 1 = offen, 2 = Day_lock, 3 = Night_lock)

    • Bolt_state (unbekannt, offen, day_lock, night_lock)

Lassen Sie die LOQED-Bridge die digitale Signatur generieren

Befehle an das Smart Lock müssen digital signiert werden. Am einfachsten ist es, diese Signatur von der LOQED-Bridge generieren zu lassen. Verwenden Sie einfach die vier bereitgestellten URLs (Offen, Riegel, Nachtsperre, Status), die auf webhooks.loqed.com angezeigt werden. Beachten Sie, dass die HTTP-Verbindung zur Bridge nicht gesichert ist, sodass andere Personen in Ihrem lokalen Netzwerk möglicherweise den Verschlüsselungsschlüssel abrufen könnten. Wenn Sie Befehle sicher versenden möchten, müssen Sie die digitale Signatur selbst erstellen.

Erzeugen Sie die digitale Signatur selbst

Bei https://app.loqed.com/Bridge-API-example/ Wir stellen Beispielcode (Javascript und PHP) zur Verfügung, der zeigt, wie die digitale Signatur erstellt wird. Sie können diese Methode nur verwenden, wenn Sie Ihr Plugin für das Smart-Home-System erstellen können, mit dem Sie eine Verbindung herstellen möchten. Die benötigten Daten (IP, Secret, KeyID) finden Sie unter https://app.loqed.com/API-Config nachdem Sie auf die Schaltfläche „Anzeigen/Bearbeiten“ neben dem API-Schlüssel geklickt haben.

Hat dies deine Frage beantwortet?