[Modul] NUKI - Elektronisches Türschloss und Opener

Guten Morgen Slummi,

Schön, dass es dir gefällt. :wink:

Ich kann mir das gerne noch einmal ansehen, ich halte es aber mittlerweile sinnvoller, dass direkt über die App zu machen. Ich hatte das damals zur Vollständigkeit aller Befehle mit aufgenommen. Also, bitte primär die App benutzen.

Das ist damals aus der Historie so entstanden. Neben dem StartLock gibt es ja jetzt auch den Opener, die benutzen beide den Befehl, daher ist es erstmal bei der Bridge geblieben. Ich kann mir aber vorstellen, relativ zeitnah z.B. SetSmartLcokAction(int $InstanzID, int $Action) und SetOpenerAction hinzuzufügen.

Ich setzte das mal auf die ToDo: aber mangels Zeit nicht kurzfristig umsetzbar. Sofern du nicht darauf warten willst oder programmiertechnisch unterwegs bist, kannst du es auch gerne forken, erweitern und mir einen PR zusenden.

Uli

Hallo Uli,

ich schaue mal, ob ich es zwischendurch mal in das Modul einbauen kann.
Ist ja beides keine große Sache, aber ich habe aktuell auch nicht viel Zeit. Arbeiten und nebenbei Kinder betreuen ist schon schwer genug.

Würdest du das Modul denn eher fest auf Hashed Token umstellen wollen oder lieber optional, dass man es in der Bridge-Instanz konfigurieren kann?

Was das Firmware-Update angeht, so ist die Möglichkeit via API gar nicht so schlecht. Denn über die App kann man sich ja nur mit der Bridge verbinden, wenn diese im Wartungsmodus ist. An sich funktioniert das auch problemlos über die API. Aber das Modul scheint irgendwie ein Problem zu haben, wenn während des Updates die Verbindung zur Bridge weg ist. Ich schaue bei Gelegenheit mal, ob ich die Ursache finde.

Gruß
Slummi

Lass mich die Tage das erstmal anschauen, wie groß der Aufwand ist.

Uli

Gesendet von iPhone mit Tapatalk

Ist eigentlich keine große Sache. Ich habe es bei mir schon mal lokal getestet.
Man muss halt nur alle Endpoints in der bridgeAPI ändern, da dort überall der Token als URL-Parameter enthalten ist.
Ich würde den Token einfach komplett aus den Endpoints rausnehmen und nur in die SendDataToBridge() packen. Dort kann man dann auch den Hashed Token berechnen.
Dann könnte man sich noch überlegen, ob man es einfach immer als Hashed Token raus schickt oder zusätzlich noch eine neue Option auswertet, mit der man die Logik umschaltet. Aber aus meiner Sicht gibt es eigentlich keinen Grund, warum man den Plaintext-Token nutzen sollte, außer man möchte vielleicht einen Request kopieren und manuell absetzen.

Und die zusätzliche Methode im Smart Lock dürfte auch nicht viel Arbeit machen. Das habe ich aber noch nicht getestet.

Gruß
Slummi

Kann mir das am Wochenende mal ansehen.

Eilt ja jetzt nicht, Funktionen sind ja gegeben bis auf den Hashed Token.

Uli

Gesendet von iPhone mit Tapatalk

Kein Stress! Das waren ja alles nur Vorschläge. :smiley:

Wenn du dich an dem Hash versuchst, beachte, dass die Bridge intern mit UTC arbeitet.
Wenn du CET für den Timestamp nutzt, ist der Hash ungültig. Da bin ich am Anfang auch drüber gestolpert und konnte erst nicht nachvollziehen, warum die Verbindung nicht klappt.

Gruß
Slummi

Danke für den Hinweis,

funktioniert aber trotzdem nicht.

Habe:


$token = 123456;
$timestamp = gmdate("Y-m-d\TH:i:s\Z");
$randomNumber = 4711;
$data = (string) $timestamp . ',' . $randomNumber . ',' . $token;
$hash = hash('sha256', $data);
$url = "http://192.168.168.212:8080/info?ts=" . $timestamp ."&rnr=" . $randomNumber . "&hash=" . $hash;

verwendet. Ergibt dann als String für cURL:


http://192.168.168.212:8080/info?ts=2020-12-15T15:50:30Z&rnr=4711&hash=ee211a6575f39a224c30fa13bf469ab08f96d727a87d8293fac9247908d8b552

ist so wie in dem Beispiel der API:


http://192.168.1.50:8080/info?ts=2019-03-05T01:06:53Z&rnr=4711&hash=f52eb5ce382e356c4239f8fb4d0a87402bb95b7b3124f0762b806ad7d0d01cb6

Nimmt er aber nicht kommt false zurück bzw:


15.12.2020, 16:59:51 |     SendDataToBridge | An error has occurred: "The requested URL returned error: 401 Unauthorized"

Eine Idee?

Uli

Habe es glaube ich gefunden…

Uli

Also die Berechnung des Hashs ist korrekt. Kann dann eigentlich nur an einer Zeitdifferenz liegen.
Ich gehe mal davon aus, dass der Token bei deinem Test wirklich „123456“ war.

Den rnr solltest du dann noch generieren, statt einen statischen zu nehmen. Ich habe ihn mit random_int(0, 65535) erzeugt.

Hast du mal geprüft, was die Bridge für eine Zeit hat? Im Developer-Forum habe ich gelesen, dass die Zeit schnell abweicht, wenn sich die Bridge nicht regelmäßig die aktuelle Zeit vom Server holen kann. Ab einer Differenz von >30 Sekunden ist der Hash ungültig.

Gruß
Slummi

Das waren alles nur Platzhalter zum testen.

Der plain token muss der API Token sein…

Update kommt vermutlich nachher oder morgen…

Uli

Hehe… Ja. :smiley:

Oh je. Jetzt wolltest du‘s aber auch wissen, was? Wollte dich nicht unter Druck setzen.

Die zusätzliche Lock-Methode für die Smart Lock Instanz kann ich mir ja bei Gelegenheit mal ansehen.

Mir ist übrigens doch noch ein Grund eingefallen, warum ein Plain Token sinnvoll sein kann. Wenn die Bridge keine Internetverbindung hat und längere Zeit keine Zeit synchronisieren konnte, wird die Abweichung irgendwann zu groß sein, sodass der Hash ungültig wird.

Ich frage mal bei Nuki an, ob sie nicht einen frei konfigurierbaren Zeitserver unterstützen wollen. :wink:

Slummi

Hallo Zusammen,

ich hab bei mir einen Refresh von 10 Sekunden mit dem Befehl gesetzt:

$state = NUKI_GetSmartLockState(47172);

Jetzt stell ich aber fest, dass die Batterien (Akkus) sehr schnell leer gehen. Wie macht ihr das?

Zudem will ich, dass Nuki jeden Abend um 20 Uhr abschließt. Also erstellt:

<?php

$toggle = NUKI_ToggleSmartLock(47172, false);

Und ein Ereignis rangehängt. Jetzt ist es aber so, dass nicht immer abgeschlossen wird. An was kann das liegen?

Danke schonmal

Hi,

Warum nutzt du keinen Callback auf der Bridge (Splitter Instanz)? Der WebHook aktualisiert die SmartLock Instanz automatisch.

Zudem will ich, dass Nuki jeden Abend um 20 Uhr abschließt. Also erstellt:

<?php

$toggle = NUKI_ToggleSmartLock(47172, false);

Und ein Ereignis rangehängt. Jetzt ist es aber so, dass nicht immer abgeschlossen wird. An was kann das liegen?
Danke schonmal

Das sieht erstmal gut aus… Kommt denn eine Fehlermeldung? Ist die Bridge nah genug am SmartLock?

Alternativ könntest du, sofern du die beta installiert hast:

NUKI_SetSmartLockAction(47172, int $Action);


Lock actions for a smart lock are:
1   unlock
2   lock
3   unlatch
4   lock ‘n’ go
5   lock ‘n’ go with unlatch

verwenden.

Uli

Das wundert mich nicht. Damit lässt du das Schloss ja permanent funken. Dafür ist es nicht ausgelegt.
Aus meiner Sicht ist eine manuelle Akatualisierung unnötig. Über das Callback meldet sich das Schloss ja, wenn sich etwas ändert und triggert von sich aus die Aktualisierung des Status. Das reicht aus meiner Sicht vollkommen aus.
Wenn du da nicht drauf vertraust, kannst du ja noch drei mal am Tag oder so den Status manuell abfragen, aber viel mehr ist aus meiner Sicht nicht drin, wenn du nicht permanent ein Ladekabel am Schloss hast.

Wird das Skript denn korrekt ausgeführt? Hast du auch die Aktionen in der Instanz entsprechend konfiguriert?
Warum nutzt du nicht den NUKI-internen Zeitplan bzw. den Nachtmodus?

Gruß
Slummi

Danke den hab ich jetzt genutzt. War mir nicht bewusst das das so geht.

Das hatte ich tatsächlich nicht richtig angelegt. Jetzt aber hoffentlich richtig angelegt. Wie oft wird der Status aktualisiert?

Kurz und knapp, wenn sich was ändert.

Die Bridge schickt aktiv den Status, wenn sich etwas ändert.

Uli

Gesendet von iPhone mit Tapatalk

Danke dir.
Ich beobachte ob das funktioniert.
Danke für die schnelle Hilfe

Zunächst danke Uli für das tolle Modul und die Arbeit die du da reingesteckt hast!

Ich habe mehrere Fragen, leider komme ich mit meinem Wissen nicht weiter …:banghead:

Ich würde gerne für den aktuellen Status CallBack nutzen da ich denke, dass damit
sofort der Status des SL erkannt wird.

Nun habe ich ein ServerSocket Port 8085 Callback ist damit konfguriert, eine Registervariable
diese ist mit dem ServerGateway verbunden
und ein Empfangsscript für die RegVar, das ganze kommt noch aus Version 4.x IP Symcon.
Ich bin nun mit meinem RPI auf 5.5 und Dein Modul ist auf aktuellem Stand.

Bisher hatte ich die SmartLock Instanz nicht genutzt und alles aus dem Empfangsscript mühselig
extrahiert, das wollte ich nun ändern… Habe also eine SmartLock Instanz manuell erstellt und konfiguriert
die ID, dezimal :smiley: und nicht hex…habe ich korrekt eingetragen, es funktioniert auch alles beim aktualisieren…

Im Empfangsscript kann ich die Daten empfangen, in der RegVar kommen alle Daten an.

Mein Problem ist nun folgendes:

Die SL Instanz wird nicht aktualisiert…muss ich die SmartLock Instanz (Variablen) über den eigenen PHP Befehl aktualisieren
oder müsste das nicht automatisch irgendwie passieren?

Im Thread wird vom WebHook gesprochen, der ist vorhanden dort ist die Bridge als Script hinterlegt ist das korrekt??
nur was mach ich damit, müssen dort auch Daten ankommen?

und letzter Punkt, ich bekomme beim Debug der Bridge folgende Fehlermeldung… was könnte das sein?

07.01.2021, 23:58:26 | SendDataToBridge | An error has occurred: „The requested URL returned error: 503 Service Unavailable“

Ich hoffe du kannst mir bei Gelegenheit helfen.

Gruß
Jürgen

Guten Morgen Jürgen,

Den Server Socket gibt es nicht mehr und wurde durch den Callback ersetzt.

Du musst den Callbacks noch auf der Bridge manuell anlegen, sofern du das noch nicht getan hast.
Das kannst du in der Bridge Instanz machen, dort kannst du dir auch die angelegten Callbacks anzeigen und löschen.

Ich empfehle immer alle Instanzen über das Discovery Modul, beziehungsweise den Konfigurator automatisch anlegen zu lassen. Damit ist gewährleistet, dass schon mal die Grunddaten alle stimmen.

Zum Empfangsskript und RegVar kann ich leider nicht sagen, da ich das selber nicht nutze.

Zu deinem Fehler fällt mir folgendes ein, es könnte sein, dass bei zu vielen schnell hintereinander abgesetzten Befehlen die Bridge nicht mehr nachkommt. Das ist leider bei NUKI technisch so bedingt, soll aber geändert werden.

Uli

Gesendet von iPhone mit Tapatalk