Nuki Callback nutzen

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

ueffchen
Beiträge: 176
Registriert: 29.03.2011, 10:35
Hat sich bedankt: 4 Mal
Danksagung erhalten: 13 Mal

Nuki Callback nutzen

Beitrag von ueffchen » 03.03.2019, 23:07

Zur Erklärung:
Beim Nuki Türschloss (oder präzise in der Bridge) kann man eine Callback IP eintragen, API Beschreibung hier https://developer.nuki.io/page/nuki-bri ... api-170/4/
An die IP schickt das Nuki den neuen Status, wenn zB die Tür geöffnet wurde. Das erspart einem, dass man das Nuki immer wieder aufrufen muss, um zu wissen, ob sich was geändert hat.
Leider habe ich noch nirgends gesehen, wie man das direkt in eine SV in der CCU lenken kann und habe auch keine Zeit mich länger damit zu beschäftigen. Daher habe ich mir über einen Umweg etwas gebaut, was bei mir gut funktioniert.

Als erstes musst du die Callback URL (hier xxxxx) im Nuki eintragen:

Code: Alles auswählen

http://ip-deiner-bridge:8080/callback/add?url=xxxxx&token=token-deines-nuki
Für xxxxx brauchst Du:
Die IP Deiner CCU
Die ISE_ID der Systemvariable, die du befüllen willst. Meine heisst NukiCallback und ist als Text definiert, ID 17705.
Falls Du die ISE_ID nicht kennst, dann nimm http://ip-deiner-ccu/config/xmlapi/sysvarlist.cgi zum Auslesen, dafür musst du XML API installiert haben.
Irgendeinen Text als State, warum erkläre ich unten, den musst Du zwischen Hochkommata eintragen.

Dazu musst Du xxxxx encodieren, in Klarschrift:

Code: Alles auswählen

http://ip-deiner-ccu:8181/nuki.exe?sagt=(dom.GetObject(17705).State('tttop'))
oder encodiert (mit https://meyerweb.com/eric/tools/dencoder ):

Code: Alles auswählen

http%3A%2F%2Fip-deiner-ccu%3A8181%2Fnuki.exe%3Fsagt%3D(dom.GetObject(17705).State(%27tttop%27))
Das kopierst Du in xxxxx, dann kommt das raus.

Code: Alles auswählen

http://ip-deiner-bridge:8080/callback/add?url=http%3A%2F%2Fip-deiner-ccu%3A8181%2Fnuki.exe%3Fsagt%3D(dom.GetObject(17705).State(%27tttop%27))&token=token-deines-nuki
Ab damit in die Browserzeile, aufrufen, wird im Nuki gespeichert.

Wenn Du Deine Tür jetzt zB öffnest, passiert folgendes:
Das Nuki schickt "tttop" und auch noch den Status, aber den kann ich nicht abfangen. Also musst Du Dir den Status abholen. Deswegen kommt jetzt der kleine Umweg:
Leg eine zweite Systemvariable an, ich habe sie Nuki genannt. Darin wird der mittels des kleinen Scripts der Lockstate geschrieben, numerisch.

Mach Dir ein kurzes Programm, siehe Bild
Nuki.JPG
Nutze das Script:

Code: Alles auswählen

string stdout;
string stderr;

integer anfang;
integer ende;
integer i;

string url="http://IP-Deiner-Bridge:8080/list?token=TOKEN_DEINES_NUKI";

system.Exec("wget -q -O - " # url, &stdout, &stderr);
WriteLine(stdout);

anfang=stdout.Find("state");
anfang=anfang+8;
ende=anfang+1;

i=stdout.Substr(anfang,1);

WriteLine(i);

dom.GetObject("Nuki").State(i);

Was passiert?
Das Nuki meldet sich über die Callback URL.
Der Inhalt der SysVar ändert sich nicht, weil Nuki ja immer den gleichen Wert schreibt (tttop), daher wird das Script in der sonst-Schleife ausgeführt. Das Script ruft das Nuki auf und holt sich den Lockstate und schreibt den Lockstate in die Variable Nuki.
Daher überwacht die CCU nur die eine Variable, und pollt erst das Nuki, wenn es sich einmal gemeldet hat.
Dafür habe ich eine 10 Sekunden Verzögerung eingetragen, sonst pollt die CCU sofort, und dann ist der Lockstate 0.

Bei mir funktioniert es, das kann man auch schön bei dem Zeitversatz der beiden Variablen sehen.
Zuerst wird die NukiCallback geändert, dann 10 Sekunden später Nuki.

Probiert mal aus, ob es bei Euch auch klappt. Falls nicht, habe ich vielleicht einen Schritt nicht richtig beschrieben.

Was ihr mit dem Lockstate macht, ist der nächste Schritt.
Das würde mich interessieren, schreibt mal eure Ideen.

VG, ueffchen

AWeiden
Beiträge: 39
Registriert: 07.01.2017, 10:37
Hat sich bedankt: 20 Mal
Danksagung erhalten: 1 Mal

Re: Nuki Callback nutzen

Beitrag von AWeiden » 09.03.2019, 18:28

Hallo ueffchen,

genau die Funktion suche ich schon länger - danke für deine Mühe und für den genialen Ansatz.
Habe die Callback URL erstellt und eingebunden -


http://172.20.20.155:8080/callback/add? ... %3Fsagt%3D(dom.GetObject(13472).State(%27tttop%27))&token=meintokenistgeheim

Beim Auflisten der Callbacks taucht diese URL auch auf - allerdings wird der Update der Systemvariablen (Text) auf der CCU2 nicht durchgeführt :roll:
Also hab ich noch was vergessen - oder falsch gemacht...

Was mir nicht klar ist - der Aufruf erfolgt mit NUKI.EXE?sagt=...
Muss ich die NUKI.EXE noch irgendwo ablegen, installieren?

Danke für einen Tipp!
Gruß
AWeiden

ueffchen
Beiträge: 176
Registriert: 29.03.2011, 10:35
Hat sich bedankt: 4 Mal
Danksagung erhalten: 13 Mal

Re: Nuki Callback nutzen

Beitrag von ueffchen » 11.03.2019, 12:24

Hi

"Nuki.exe" ist nur ein Platzhalter, spielt gar keine Rolle.
Da kann alles stehen.

Zu Deinem Problem:
"tttop" wird ja immer (!) in die Variable geschrieben, das beinhaltet Die URL, die Du im Nuki eingetragen hast.
Den wirklichen Status muss Du Dir vom Nuki mit dem Programm und Skript abholen.
Ob Nuki sich meldet, siehst Du an der Aktualisierungszeit Deiner Variable ID 13472), in die tttop geschrieben wird.
Wird die Zeit aktualisiert, sobald Du Nuki zB auf oder zuschliesst? Guck mal im WebUi nach.

VG, ueffchen

schumla
Beiträge: 13
Registriert: 20.05.2016, 10:17
Hat sich bedankt: 1 Mal

Re: Nuki Callback nutzen

Beitrag von schumla » 16.04.2019, 12:19

Hi ueffchen,

der Callback funktioniert bei mir tedellos. Besten Dank dafür...
wie kann ich mit die Attribute anzeigen lassen oder bekomme diese noch besser aus dem Callback in einzelne Variablen? Mich interessiert der state, der batterystate und timestate.
gruß lars

ueffchen
Beiträge: 176
Registriert: 29.03.2011, 10:35
Hat sich bedankt: 4 Mal
Danksagung erhalten: 13 Mal

Re: Nuki Callback nutzen

Beitrag von ueffchen » 21.04.2019, 21:51

Im Prinzip sehen die Informationen, die Du Dir vom Nuki mit

Code: Alles auswählen

string url="http://IP-Deiner-Bridge:8080/list?token=TOKEN_DEINES_NUKI";
holst, immer so aus:

Code: Alles auswählen

[{"nukiId": 123456789, "name": "DeinName", "firmwareVersion": "2.5.0", "lastKnownState": {"state": 3, "stateName": "unlocked", "batteryCritical": false, "timestamp": "2019-04-21T17:59:59+00:00"}}]
Guck Dir mal den Scriptcode an

Code: Alles auswählen

anfang=stdout.Find("state");
anfang=anfang+8;
ende=anfang+1;

i=stdout.Substr(anfang,1);

WriteLine(i);

dom.GetObject("Nuki").State(i);
Das Beispiel sucht nach dem String "state" und findet ihn, gefolgt von der numerischen Deklaration des States:
state": 3
Wenn Du jetzt zählst, dann
state": 3
anfang=anfang+8
anfang=1 ="s"
...
anfang=7 =":"
anfang=8 =" " (Leerzeichen)
dann ist das nächste Zeichen der Lockstate 3.
Der wird in i geschrieben; nur ein Zeichen, deswegen
i=stdout.Substr(anfang,1)

In die SV Nuki wird dann "i" geschrieben.

So kannst Du das mit jedem anderen String machen.
Nimm einfach das Script, modifzier es und guck Dir das Ergebnis an.
Die "WriteLine" im Script helfen Dir bei der Testausführung zu gucken, ob Deine Implementierung klappt.
Hilft Dir das?

hasenr1
Beiträge: 11
Registriert: 19.04.2019, 19:56

Re: Nuki Callback nutzen

Beitrag von hasenr1 » 01.12.2019, 19:18

Hey Super Beitrag und habe es auch hinbekommen das die Variable arbeitet, aber das Programm fängt nicht an zu arbeiten heisst die Variable in der Übersicht Systemvariablen mit den Uhrzeiten steht und wo dann tttop steht ist alles in Ordnung aber das was in der Nuki stehen soll aktualisiert nicht, heisst vermutlich das das Programm nicht gestartet wird, weiss aber auch nicht warum habe alles das gemacht und kopiert sowie angeglichen was ich machen sollte, HILFE
wenn ich das Programm manuell starte dann zeigt er mir auch den Status mit allem was dahinter kommt an,
was auch mich zur nächsten Frage haut, wie kann ich das einkürzen?

ueffchen
Beiträge: 176
Registriert: 29.03.2011, 10:35
Hat sich bedankt: 4 Mal
Danksagung erhalten: 13 Mal

Re: Nuki Callback nutzen

Beitrag von ueffchen » 02.12.2019, 22:11

Hast Du gemacht, was ich in meinen ersten Post ab

>>>>
Leg eine zweite Systemvariable an, ich habe sie Nuki genannt. Darin wird der mittels des kleinen Scripts der Lockstate geschrieben, numerisch.
....
<<<<

geschrieben habe?
Wichtig ist, dass das Script in der SONST-Bedingung steht, weil das Nuki ja immer nur tttop schreibt.
Die Homematic merkt also, dass an der Variablen was passiert, weil sich aber NCHTS ÄNDERT, wird die SONST-Schleife ausgeführt. Mit 10 Sekunden Verzögerung.
Das Skript holt dann die aktuellen Infos vom Nuki (den ganzen String) und extrahiert nur den Lockstate. Habe das seit Montaten am laufen, gerade nochmal überprüft; geht immer noch.

hasenr1
Beiträge: 11
Registriert: 19.04.2019, 19:56

Re: Nuki Callback nutzen

Beitrag von hasenr1 » 03.12.2019, 19:45

Vielen Dank deiner schnellen Antwort, habe ich gemacht wie du gesagt hast. ich poste das nochmal wie das bei mir aussieht
callback 1.GIF
Callback.GIF
callback 2.GIF
bei mir passiert bei Nuki nichts, was ist verkehrt?

HILFE

hasenr1
Beiträge: 11
Registriert: 19.04.2019, 19:56

Re: Nuki Callback nutzen

Beitrag von hasenr1 » 03.12.2019, 19:54

Oh Man habe den Fehler gefunden, habe nicht , sonst gemacht. jetzt läuft es, super vielen Dank.
Nun zum nächsten Problem, ich bekomme alles angezeigt was nach dem unlocked und locked ist wie kann ich das abkürzen, das ich nur den Status bekomme?

ueffchen
Beiträge: 176
Registriert: 29.03.2011, 10:35
Hat sich bedankt: 4 Mal
Danksagung erhalten: 13 Mal

Re: Nuki Callback nutzen

Beitrag von ueffchen » 03.12.2019, 23:42

Wenn Du das Skript mit "Ausführen" testest, dann kommt wahrscheinlich durch

Code: Alles auswählen

Writeline(stdout);
eine Ausgabe ähnlich

Code: Alles auswählen

[{"deviceType": 0, "nukiId": xxxxxxxx, "name": "yyyy", "firmwareVersion": "2.7.4", "lastKnownState": {"mode": 2, "state": 1, "stateName": "locked", "batteryCritical": false, "timestamp": "2019-12-03T22:11:04+00:00"}}]
Als nächstes kommt

Code: Alles auswählen

i=stdout.Substr(anfang,1);
und der

Code: Alles auswählen

WriteLine(i);
ergibt in meinem Fall.
Du hast das Skript ja etwas modifiziert und willst den "statename" abfragen. Dass sollte prinzipiell gehen.
Allerdings musst Du im Skript dann die Variable i anders deklarieren, da i zur Zt integer ist.
Das dürfte allerdings das kleinere Problem sein. Das grössere (und darum habe ich nur die state abgefragt): der stateName ändert sich in der Länge. Mal locked, mal unlocked mal irgendwas anderes. Schwer abzufragen.
Da ich nur etwas auswerten (und nicht lesen will), ist mir egal, ob dass ich "1" anstatt "locked" bekomme.
Wenn Du das ändern willst, würde ich gerne wissen, wie Du mit den unterschiedlichen Wortlängen umgehst. Rein interessehalber.

Antworten

Zurück zu „HomeMatic allgemein“