Nuki - Virtual Device

Für die vereinzelten Nuki Besitzer habe ich mal eine Ausbauversion für ein Virtual Device erstellt.

Warum Ausbauversion? Das ganze ist wirklich äußerst rudimentär! Öffnen, schließen, lock’n’go - fertig.
Keine json responses implementiert, d.h. auch (noch) keine Möglichkeit auf Aktionen des Schlosses zu reagieren.
Aber man kann zumindest vom HC2 aus das Schloss jetzt ansprechen, wofür auch immer…

Was muss selbst gemacht werden?

Ausgangslage ist eine freigeschaltete Api auf der Bridge

im VD die IP vom Schloss eintragen
Port ist 8080
1234567 durch die eigene nukiID ersetzen
123456 durch den eigenen Api Token ersetzen

Vielleicht kann sich ja auch jemand anderes nochmal einen Kopf machen wie ich die responses vernünftig auswerten kann.
Ein möglicher Response sieht z.B. so aus:
Frage: http://192.168.1.1:8080/lockState?nukiId=1234567&token=123456
Antwort: {“state”: 3, “stateName”: “unlocked”, “batteryCritical”: false, “success”: true}

EDIT: VD angefügt

Servus Robert, wie schon auf FB Danke für die Mühe.

Ich habe jetzt alles so eingetragen wie du es beschrieben hast nur rührt sich NUKI bei Betätigung der Tasten nicht.

Wenn sich nichts rührt, gibt es nur ganz wenige Möglichkeiten.

Ist die IP Adresse richtig?
Ist der Port auf 8080 eingestellt? (Standard ist 80 eingetragen)

nukiID und Token korrekt eingegeben?

Ansonsten zu Diagnosezwecken mal folgenden String in den Browser eingeben:

http://192.168.1.1:8080/lockState?nukiId=1234567&token=123456

hier natürlich auch IP, nukiID und Token abändern

Danke Robert,

funktioniert schon mal, leider kann ich nicht Programmieren so das ich mit dem String auswerten passen muss.

Ich verfolge aber gerne die Diskussionen hier weiter, da ich schon ein par Ideen hätte wie man das Nuki sinnvoll mit einbinden kann ohne IFTTT zu verwenden, wie z.B. lock’n’go und/oder manuelles zuschliessen schaltet den Alarm scharf, aber normales Lock nicht.

Grüße

Jürgen

Hallo,

ich bekomme morgen mein Nuki und möchte mich dann mal an der VD versuchen.
Leider scheint sich der Anhang im ersten Post nicht downloaden zu lassen.
Ist es nur ein Problem bei mir oder ein generelles Problem. Vll kann es ja mal jemand anderes versuchen die VD downzuloaden.

Gruß Peter

Bitte :slight_smile:

Dankeschön…

dann mal sehen ob ich da was hinbekomme.

Hallo Robert,

ich habe hier mal einen rudimentären Versuch gestartet verschiedene Stati aus dem Nuki auszulesen und diese dann über das Symbol der VD anzuzeigen.
Ist mal so ein erster Versuch der gerne weiter ausgebaut werden darf.

Erklärung:

Angehängte Icons herunterladen, entpacken und ins HC2 importieren
den Code unten in die Mainloop der VD kopieren.
Zeile 1: IP Eurer Nuki Bridge eintragen
Zeile 4: nukiId und token anpassen
Zeile 23: 999 mit der ID Eures Virtual Device ersetzen
Zeilen 10-20 Eventuell die 1001-1010 mit den entsprechenden ID’s eurer importierten Icons ersetzen.

nukiIP = '1.1.1.1'
local nukiport = 8080
http = Net.FHttp(nukiIP, nukiport);
response = http:GET("/lockstate?nukiId=123456789&token=aBcDef")
fibaro:debug(response)
result = json.decode(response);
fibaro:debug("name: "..result.state)

function getIcon(LockState) 
  if(LockState == 0) then return 1010         -- uncalibrated
  elseif(LockState == 1) then return 1009     -- locked
  elseif(LockState == 2) then return 1008     -- unlocking
  elseif(LockState == 3) then return 1007     -- unlocked
  elseif(LockState == 4) then return 1006     -- locking
  elseif(LockState == 5) then return 1005     -- unlatched
  elseif(LockState == 6) then return 1004     -- unlocked (lock 'n' go)
  elseif(LockState == 7) then return 1003     -- unlatching
  elseif(LockState == 254) then return 1002     -- motor blocked
  elseif(LockState == 255) then return 1001      -- undefined
  else return 1001 end                      -- error
end 

fibaro:call(999, "setProperty", "currentIcon", getIcon(result.state)) 

fibaro:sleep(30000)

Hinweis:

Der Code startet alle 30 Sekunden eine Abfrage des Schloß Status. Inwiefern sich das auf die Batterielebensdauer auswirkt kann ich noch nicht sagen.

Viel Spaß beim Testen.

Peter

Sehr gut gemacht!
Ich musste erstmal nachschauen wie ich an die ID`s der Icons komme, aber danach lief alles tadellos!

Falls noch jemand nicht weiß wie er an die ID`s der Icons kommt dieser Link sollte weiterhelfen.

Danke für die Mühe Peter, langsam gehts ja voran mit NUKI :slight_smile:
Bilder IDs etc. hab ich aber wie ich zur ID vom Virtual Device von NUKI komme weiss ich nicht mehr, kann jemand helfen?

Die ID von jedem VD findest du in der URL-Leiste.

Gruß

Danke Daniel, zu spät, habs mit der Devicesuche mühevoll rausgesucht, aber gut zu Wissen das es viiiiiel einfacher geht.

Servus,
ich würde gerne mein NUKI beim aufschliessen den Alarmstatus an der Haustüre auf “unscharf” und beim abschliessen auf “scharf” stellen lassen.
Da ich LUA nicht kann habe ich versucht dies mit einer Blockszenen zu realisiern versucht, geht aber nicht da ich bei “wenn” NUKI in den VD`s nicht auswählen kann.
Erst bei “dann” wird mir in der VD Auswahl NUKI zur Auswahl angeboten.
Könnte man meinen obigen Wunsch mit LUA umsetzen?

Die Buttons sind ja auch kein Status sondern eine Aktion. Deshalb kannst du die dort nicht auswählen. Setz in den Buttons noch einen Status einer GV. Die kannst du dann in Blockszenen auswählen.

Gruß

Danke Daniel, könntest mir bitte noch erklären was, wie und wo ich den “GV?” Status eintragen soll?

Ich denke eintragen hier

HC2.jpg

So geht das nicht. Das musst du von GET auf LUA umstellen & dann mit LUA den GET-Befehl Absenden. Hier auf siio gibt es genug Beispiele dafür.

Gruß

Es müsste so gehen, dass man in der Mainloop des VD neben dem Icon auch gleich den Alarmstatus setzt:

nukiIP = '1.1.1.1'
local nukiport = 8080
http = Net.FHttp(nukiIP, nukiport);
response = http:GET("/lockstate?nukiId=123456789&token=aBcDef")
fibaro:debug(response)
result = json.decode(response);
fibaro:debug("name: "..result.state)

function getIconAlarm(LockState) 

  if(LockState == 0) then return 1010,0         -- uncalibrated
  elseif(LockState == 1) then return 1009,1     -- locked + Alarm scharf 
  elseif(LockState == 2) then return 1008,0     -- unlocking
  elseif(LockState == 3) then return 1007,0     -- unlocked
  elseif(LockState == 4) then return 1006,1     -- locking + Alarm scharf 
  elseif(LockState == 5) then return 1005,0     -- unlatched
  elseif(LockState == 6) then return 1004,0     -- unlocked (lock 'n' go)
  elseif(LockState == 7) then return 1003,0     -- unlatching
  elseif(LockState == 254) then return 1002,0     -- motor blocked
  elseif(LockState == 255) then return 1001,0      -- undefined
  else return 1001,0 end                      -- error
end 
 
local Icon,AlarmState =  getIconAlarm(result.state)

fibaro:call(999, "setProperty", "currentIcon", Icon) -- Setze Icon
fibaro:call( <ID Alarm-Zielgerät> , "setArmed", AlarmState) --Setze Alarm
 
fibaro:sleep(30000)

Die obige Lösung gefällt mir noch nicht. Das direkte Setzen des Alarms ist eine “schmutzige” Lösung. Eleganter ist es eine globale Variable zu setzen, die dann über Szenen (insbesondere Blockszenen) abgefragt werden kann.

Dazu eine Globale Variable “nukiState” anlegen mit den Werten “locked” und “unlocked”. Dann dieses Script verwenden:

nukiIP = '1.1.1.1'
local nukiport = 8080
http = Net.FHttp(nukiIP, nukiport);
response = http:GET("/lockstate?nukiId=123456789&token=aBcDef")
fibaro:debug(response)
result = json.decode(response);
fibaro:debug("name: "..result.state)
 
function getIconAlarm(LockState) 

  if(LockState == 0) then return 1010, "unlocked"         -- uncalibrated
  elseif(LockState == 1) then return 1009,"locked"     -- locked  
  elseif(LockState == 2) then return 1008,"unlocked"     -- unlocking
  elseif(LockState == 3) then return 1007,"unlocked"     -- unlocked
  elseif(LockState == 4) then return 1006,"locked"     -- locking
  elseif(LockState == 5) then return 1005,"unlocked"     -- unlatched
  elseif(LockState == 6) then return 1004,"unlocked"     -- unlocked (lock 'n' go)
  elseif(LockState == 7) then return 1003,"unlocked"     -- unlatching
  elseif(LockState == 254) then return 1002,"unlocked"     -- motor blocked
  elseif(LockState == 255) then return 1001,"unlocked"      -- undefined
  else return 1001,"unlocked" end                      -- error
end 
 
local Icon, NukiState =  getIconAlarm(result.state)

fibaro:call(999, "setProperty", "currentIcon", Icon) -- Setze Icon
fibaro:setGlobal("nukiState", NukiState) -- Setze Nuki Status

fibaro:sleep(30000)

Danke Christian für deine unermüdliche Hilfe <top> es funktioniert <freu>

Im Endeffekt ist es genau das was ich vorgeschlagen habe :slight_smile:

Gruß