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
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'))
Code: Alles auswählen
http%3A%2F%2Fip-deiner-ccu%3A8181%2Fnuki.exe%3Fsagt%3D(dom.GetObject(17705).State(%27tttop%27))
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
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 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