NEWS
IoBroker simple-api adapter, POST mit setbulk, Fehler oder kann nicht lesen
-
Schönen Abend,
versuche gerade die callback-Funktion meiner Nuki-Bridge (WLAN-Bridge zum Nuki-Türschloß) zu nutzen.
Bisher habe ich den simple-api-adapter benutzt, um per callback via set über einen eingehendes Alarmsignal bei meinen Cams informiert zu werden.
Ich meine verstanden zu haben, das "set" NUR via HTTP-GET funktioniert. Was ich mit Fiddler und meinen Cams nachvollziehen kann und funktioniert.
Die Nuki-Bridge führt den callback per HTTP-POST aus. Nach dem Lesen der readme bin ich zu der Erkenntnis gekommen, das "setbulk" die geeignete Methode sein müsste.
Laut readme unterstützt der simple-api-adapter nach meiner Interpretation "setbulk" sowohl als HTTP-GET als auch HTTP-POST –> "You can send this request as POST too."
Ich habe dies nun mit Fiddler getestet:
Response:[ { "error": "error: datapoint \"javascript.0.Nuki.Devices.NukiSL1:NukiBridgeResponse\" not found" }, { "id": "feiertage.0.next", "val": null } ]
Ich hatte die Syntax wie folgt verstanden:
http://<server>:<port>/setBulk?<objektpfad>:<datenpunktname1>=<wert1>[&<datenpunktnamen>=<wert2>, …]
Habe ich da ein Verständnisproblem?
Irritierend ist auch die Rückgabe des 2. Node, den ich gar nicht angesprochen habe. Dummy-Rückgabe?
Sende ich http://192.168.200.110:8082/setBulk?jav … rettyPrint per HTTP-GET gibt es einen HTTP-Error 500.
Aktiviere ich die simple-api im "simple web Adapter", dann funktioniert GET mit "set", aber "setbulk" liefert bei GET und POST einen Fehler 404 Not Found.
Bin ich völlig daneben oder wie mache ich es richtig
–------------------
node 4.7.2
ioBroker.js-controller 0.15.3
ioBroker simple web Adapter 2.0.2
simpleAPI Adapter 1.3.0
Danke und Gruß
GH</wert2></datenpunktnamen></wert1></datenpunktname1></objektpfad></port></server>
-
Hallo,
benutzt niemand weiter die simple-api?
Gruß
GH
-
Nur zur Kenntnis
habe mir die Doku der Simple-API noch einmal angeschaut und einiges ausprobiert.
Wenn ich in der Nuki-Bridge als callback "http://192.168.200.110:8087/setBulk/jav … e={0123456}" hinterlege, funktioniert es mit dem Eintragen des Wertes.
Die Beschreibung der Methode 'setBulk' und die Auswahl der Beispiele ist in meinen Augen da etwas unglücklich, weil zum einen durch den fehlenden Pfad das "?" gleich hinter setBulk steht
"setBulk": "http://ipaddress:8087/setBulk?stateID1=0.7&stateID2=0&prettyPrint", ````und auch das ausführliche Beispiel fehlerhaft ist:
http://ip:8087/setBulk?hm-rpc.0.FEQ1234567:1.LEVEL=0.7&Anwesenheit=0&prettyPrint
http://ip:8087/setBulk/hm-rpc.0.FEQ1234567:1?LEVEL=0.7&Anwesenheit=0&prettyPrint
D. h., die Syntax wäre folgende
http://<ipaddress>:8087/setBulk[/<path to/channel="">]?<stateid1>=<value1>[{&<stateid2>=<value2>}][&prettyPrint]</value2></stateid2></value1></stateid1></path></ipaddress>
Wie aus der Syntax erkennbar, können nur Datenpunkte direkt unterhalb des ****selben**** Channels referentiert werden.
-
Hm, also vom Code her kann ich das nicht nachvollziehen!
/setBulk?state1=val1&state2=val2…
Ist de Syntax und so wird auch im Code geparst. Jeder "stateX" kann anders sein und aus nem anderen Channel sein. Es wird dort der state-Name erwartet und auch gesucht. Also ein Channel-name im Pfad dürfte an sich nicht funktionieren weil dann im ersten namen plötzlich ein"Slash" drin wäre der auch falsch ist.
Bei einem Aufruf per GET werden die zu setzenden States erst nach dem Fragezeichen verarbeitet. Also ein "/setBulk/?state1=val1&state2=val2..." wäre damit auch valide.
Bei /setBulk/wasauchimmer?state1=val1&state2=val2... wird am Ende das "wasauchimmer" ignoriert werden.
Also die Beispiele sind korrekt und ich nutze es auch so.
-
Test mit Fiddler
POST http://192.168.200.110:8087/setBulk?javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse={0123456xx}&javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2={123456xx} ````müsste dann ja gehen Response```` [{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse"},{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2"},{"id":"feiertage.0.next","val":null}] ````>> Wert nicht gesetzt in ioBroker
POST http://192.168.200.110:8087/setBulk/javascript.0.Nuki.Devices.NukiSL1?NukiBridgeResponse={0123456yy}&NukiBridgeResponse2={123456yy}
Response
[{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse","val":"{0123456yy}"},{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2","val":"{123456yy}"},{"id":"feiertage.0.next","val":null}]POST http://192.168.200.110:8087/setBulk?NukiBridgeResponse={0123456zz}&NukiBridgeResponse2={123456zz}
[{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse","val":"{0123456zz}"},{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2","val":"{123456zz}"},{"id":"feiertage.0.next","val":null}]
Ein Aufruf von setBulk via GET liefert bei mir immer "HTTP/1.1 500 Internal Server Error"
GET http://192.168.200.110:8087/setBulk?NukiBridgeResponse={0123456aa}&NukiBridgeResponse2={123456aa}
getestet mit js.controller 0.15.3 simple-api 1.3.0 node 4.7.2
-
Kannst Du mal ohne die geschweiftren Klammern testen?
Ansonsten: Entweder GET oder POST! Bei GET werden die Daten aus der URL genommen und verarbeitet. Der Body wird ignoriert. Bei POST werden die Daten aus dem Body genommen und die URL ignoriert! Mischen geht kaputt
Kommt bei deinen POST-beispielen noch irgendewas im Body mit?
Error500 bei GET kommt in dem Fall wohl weil die State-ID nicht gefunden wird - Es sei denn "NukiBridgeResponse" ist im entsprechenden Objekt als "Name" gesetzt.
-
POST http://192.168.200.110:8087/setBulk?javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse=1.0&javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2=2.0
Response: [{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse"},{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2"},{"id":"feiertage.0.next","val":null}]
Response: [{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse","val":1.1},{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2","val":2.1},{"id":"feiertage.0.next","val":null}] ````>> Erfolg ```` POST http://192.168.200.110:8087/setBulk?NukiBridgeResponse=1.2&NukiBridgeResponse2=2.2
Response: [{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse","val":1.2},{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2","val":2.2},{"id":"feiertage.0.next","val":null}]
Bei den POST-Beispielen ist Response == Body. ~~@apollon77:~~ > Bei POST werden die Daten aus dem Body genommen und die URL ignoriert! Mischen geht kaputt ` Bist du dir da sicher? Was sind denn die Daten im Body?  ~~@apollon77:~~ > Error500 bei GET kommt in dem Fall wohl weil die State-ID nicht gefunden wird - Es sei denn "NukiBridgeResponse" ist im entsprechenden Objekt als "Name" gesetzt. `  Der Anbieter von Nuki hat gerade geschrieben, dass sie ihre Daten```` {"nukiId": 91049449, "state": 3, "stateName": "unlocked", "batteryCritical": false} ````nicht so ohne weiters in der URL kodiert senden werden, da dies auf ihrer Seite doch einige Konfigurationsvarianten nach sich ziehen würde. Danke GH
-
Die Erfolge liegen daran das er an der Stelle den "Namen" nutzt und nicht die "state-id".
Ich habe in der Version auf Github mal debug logging für setBulk eingebaut. Also bitte:
-
update vo github
-
instanz in debug mode schalten (Instanzen -> Expertenmodus)
-
instanz neu starten (sollte autmatisch mit debug aktivieren passieren)
-
mal ANfrage machen … dann logs raussuchen und mal schicken ... dann wissen wir vllt mehr.
Da die Nutzung der direkten namen ja scheinbar geht wäre der Aufruf mit
POST http://192.168.200.110:8087/setBulk?javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse={0123456xx}&javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2={123456xx}
der interessante
-
-
Habe das jetzt auf einem meiner Testinstallationen gemacht (W10), also andere IP
POST http://192.168.200.210:8087/setBulk?javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse={0123456xx}&javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2={123456xx}
Response: [{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse","val":"{0123456xx}"},{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2","val":"{123456xx}"},{"id":"feiertage.0.next"}] ````>> Erfolg Das das Log nicht so lang ist, hänge ich es hier mit rein
2017-03-07 16:20:30.384 - [34mdebug[39m: simple-api.0 objectDB connected
2017-03-07 16:20:30.400 - [34mdebug[39m: simple-api.0 statesDB connected
2017-03-07 16:20:30.415 - [32minfo[39m: simple-api.0 starting. Version 1.4.0 in C:/ioBroker/node_modules/iobroker.simple-api, node: v4.5.0
2017-03-07 16:20:30.428 - [32minfo[39m: simple-api.0 simpleAPI server listening on port 8087
2017-03-07 16:20:30.430 - [32minfo[39m: simple-api.0 http server listening on port 8087
2017-03-07 16:24:39.407 - [34mdebug[39m: simple-api.0 POST-setBulk: values = {"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse":"{0123456xx}","javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2":"{123456xx}","user":"system.user.admin","":null}
2017-03-07 16:24:39.407 - [34mdebug[39m: simple-api.0 "javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse"
2017-03-07 16:24:39.408 - [34mdebug[39m: simple-api.0 "javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2"
2017-03-07 16:24:39.408 - [34mdebug[39m: simple-api.0 ""
2017-03-07 16:24:39.409 - [34mdebug[39m: simple-api.0 POST-setBulk for id=javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse, oid=NukiBridgeResponseused=javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse, value={0123456xx}
2017-03-07 16:24:39.410 - [34mdebug[39m: simple-api.0 Add to Response: {"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse","val":"{0123456xx}"}
2017-03-07 16:24:39.411 - [34mdebug[39m: simple-api.0 POST-setBulk for id=javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2, oid=NukiBridgeResponse2used=javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2, value={123456xx}
2017-03-07 16:24:39.411 - [34mdebug[39m: simple-api.0 POST-setBulk for id=feiertage.0.next, oid=used=feiertage.0.next, value=undefined
2017-03-07 16:24:39.413 - [34mdebug[39m: simple-api.0 Add to Response: {"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2","val":"{123456xx}"}
2017-03-07 16:24:39.414 - [34mdebug[39m: simple-api.0 Add to Response: {"id":"feiertage.0.next"} -
Und ein Update der Werte findet nicht statt? Mindestens kann man sehen wo das komische "feiertage.0" herkommt
Fixe ich
-
doch, die Werte werden gesetzt~~@greyhound:~~
Erfolg `
-
noch eine Frage zur Konfiguration
Was bewirkt diese Einstellung?Kann ich das irgendwo nachlesen?
-
doch, die Werte werden gesetzt~~@greyhound:~~
Erfolg
Ok, damit "solved", oder ?!
Bzw nur noch das komische "feiertage" Ding offen, korrekt?! Dann bitte nochmal vom github checken
Zu Der "Erweitere Web-Adapter"-Frage: Du kannst auch weg vom eigenen Server/Port hin zur Nutzung eines der existierenden Web-Adapter gehen. Wenn ich es richtig verstehe kannst Du einen Web-Adapter dort wählen. Dann müsste die "Port"-Abfrage und so verschwindet weil dann das vom gewählten Web-Adapter genommen wird. Dort ist es dann unter /simple-api/… erreichbar (also extra Pfadteil mit dem Adapternamen).
Ist aber theoretisch ... habs auch noch nicht versucht :-))
-
[{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse","val":"{0123456xx}"},{"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2","val":"{123456xx}"},{"id":"feiertage.0.next"}]
Die Feiertage sind noch in der Antwort, habe ich den Adapter aktualisiert, habe dann den Adapter beendet, neu geladen und gestartet, selbes Ergebnis.
Im Log ist merkwürdigerweise das Update nicht zu sehen
2017-03-07 18:05:54.920 - [32minfo[39m: simple-api.0 starting. Version 1.4.0 in C:/ioBroker/node_modules/iobroker.simple-api, node: v4.5.0 2017-03-07 18:05:54.929 - [32minfo[39m: simple-api.0 simpleAPI server listening on port 8087 2017-03-07 18:05:54.931 - [32minfo[39m: simple-api.0 http server listening on port 8087 2017-03-07 18:06:38.962 - [34mdebug[39m: simple-api.0 POST-setBulk: values = {"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse":"{0123456xx}","javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2":"{123456xx}","user":"system.user.admin","":null} 2017-03-07 18:06:38.963 - [34mdebug[39m: simple-api.0 "javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse" 2017-03-07 18:06:38.964 - [34mdebug[39m: simple-api.0 "javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2" 2017-03-07 18:06:38.964 - [34mdebug[39m: simple-api.0 "" 2017-03-07 18:06:38.965 - [34mdebug[39m: simple-api.0 POST-setBulk for id=javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse, oid=NukiBridgeResponseused=javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse, value={0123456xx} 2017-03-07 18:06:38.966 - [34mdebug[39m: simple-api.0 POST-setBulk for id=javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2, oid=NukiBridgeResponse2used=javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2, value={123456xx} 2017-03-07 18:06:38.967 - [34mdebug[39m: simple-api.0 POST-setBulk for id=feiertage.0.next, oid=used=feiertage.0.next, value=undefined 2017-03-07 18:06:38.968 - [34mdebug[39m: simple-api.0 Add to Response: {"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse","val":"{0123456xx}"} 2017-03-07 18:06:38.969 - [34mdebug[39m: simple-api.0 Add to Response: {"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2","val":"{123456xx}"} 2017-03-07 18:06:38.970 - [34mdebug[39m: simple-api.0 Add to Response: {"id":"feiertage.0.next"}
Wie stellte ich am einfachsten fest, ob ich die version installiert habe, die ich haben sollte?
-
ääähm räusper … hab vergessen zu committen ... kommt in 30 mins oder :-((
-
Jetzt :-))
-
Moin, Moin,
habe mir zwischenzeitlich den Code angeschaut und die mir fehlende Methode "setValueFromBody" eingebaut.
Response
[ { "id": "javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2", "val": "{\"nukiId\": 91049449, \"state\": 3, \"stateName\": \"unlocked\", \"batteryCritical\": false}" } ] ````Log
2017-03-08 11:47:10.210 - [32minfo[39m: simple-api.0 starting. Version 1.4.0 in C:/ioBroker/node_modules/iobroker.simple-api, node: v4.5.0
2017-03-08 11:47:10.219 - [32minfo[39m: simple-api.0 simpleAPI server listening on port 8087
2017-03-08 11:47:10.222 - [32minfo[39m: simple-api.0 http server listening on port 8087
2017-03-08 11:47:18.064 - [34mdebug[39m: simple-api.0 POST-setBulk: body = ""
2017-03-08 11:47:18.064 - [34mdebug[39m: simple-api.0 POST-setBulk: values = {"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2":""{12345678}"","prettyPrint":true,"user":"system.user.admin"}
2017-03-08 11:47:18.064 - [34mdebug[39m: simple-api.0 "javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2"
2017-03-08 11:47:18.066 - [34mdebug[39m: simple-api.0 POST-setBulk for id=javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2, oid=NukiBridgeResponse2used=javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2, value="{12345678}"
2017-03-08 11:47:18.068 - [34mdebug[39m: simple-api.0 Add to Response: {"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2","val":""{12345678}""}
2017-03-08 11:53:49.255 - [34mdebug[39m: simple-api.0 POST-setValueFromBody: values = {"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2":"{"nukiId": 91049449, "state": 3, "stateName": "unlocked", "batteryCritical": false}","prettyPrint":true,"user":"system.user.admin"}
2017-03-08 11:53:49.255 - [34mdebug[39m: simple-api.0 POST-setValueFromBody: _id2="javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2"
2017-03-08 11:53:49.256 - [34mdebug[39m: simple-api.0 POST-setValueFromBody for id=javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2, oid=NukiBridgeResponse2used=javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2, value={"nukiId": 91049449, "state": 3, "stateName": "unlocked", "batteryCritical": false}
2017-03-08 11:53:49.258 - [34mdebug[39m: simple-api.0 Add to Response: {"id":"javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse2","val":"{"nukiId": 91049449, "state": 3, "stateName": "unlocked", "batteryCritical": false}"}Werde meine Erweiterung als Pull-request einreichen. Nochmal Danke für deine Hilfe und Geduld Gruß GH
-
Super, reiche ein, ich checke und dann gehts fix
-
ist drin
-
1.5.0 auf github … bitte testen