NEWS
IoBroker simple-api adapter, POST mit setbulk, Fehler oder kann nicht lesen
-
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
-
Danke für die Übernahme.
Ich bin gerade beim Testen mit node 6.9 / 6.10. Bekomme beim installieren diverser Adapter ecklige Warnings und Fehlermeldungen
2017-03-10 16:36:45.823 - info: iobroker npm install iobroker.mqtt --production --prefix "/opt/iobroker" (System call) 2017-03-10 16:37:16.892 - info: iobroker In file included from ../node_modules/nan/nan.h:82:0, from ../src/bufferutil.cc:16: ../node_modules/nan/nan_new.h: In function ‘v8::Local NanIntern::To(v8::Handle<v8::integer>) [with T = v8::Int32; v8::Handle <v8::integer>= v8::Local<v8::integer>]’: ../node_modules/nan/nan_new.h:34:64: warning: ‘v8::Local <v8::int32>v8::Value::ToInt32() const’ is deprecated (declared at /opt/iobroker/.node-gyp/6.9.5/include/node/v8.h:8202): Use maybe version [-Wdeprecated-declarations] To<v8::int32>(v8::Handle <v8::integer>i) { return i->ToInt32(); } ^ 2017-03-10 16:37:16.895 - info: iobroker ../node_modules/nan/nan_new.h: In function ‘v8::Local NanIntern::To(v8::Handle<v8::integer>) [with T = v8::Uint32; v8::Handle <v8::integer>= v8::Local<v8::integer>]’:../node_modules/nan/nan_new.h:39:65: warning: ‘v8::Local <v8::uint32>v8::Value::ToUint32() const’ is deprecated (declared at /opt/iobroker/.node-gyp/6.9.5/include/node/v8.h:8196): Use maybe version [-Wdeprecated-declarations] To<v8::uint32>(v8::Handle <v8::integer>i) { return i->ToUint32(); } ^ . . . 2017-03-10 16:37:16.931 - info: iobroker In file included from ../src/bufferutil.cc:16:0:../node_modules/nan/nan.h: At global scope: ../node_modules/nan/nan.h:261:25: error: redefinition of ‘template <class t="">v8::Local _NanEnsureLocal(v8::Local)’ NAN_INLINE v8::Local _NanEnsureLocal(v8::Local val) { ^ ../node_modules/nan/nan.h:256:25: note: ‘template <class t="">v8::Local _NanEnsureLocal(v8::Handle)’ previously declared here NAN_INLINE v8::Local _NanEnsureLocal(v8::Handle val) { ^ ../node_modules/nan/nan.h: In function ‘bool NanIdleNotification(int)’: ../node_modules/nan/nan.h:289:71: warning: ‘bool v8::Isolate::IdleNotification(int)’ is deprecated (declared at /opt/iobroker/.node-gyp/6.9.5/include/node/v8.h:6113): use IdleNotificationDeadline() [-Wdeprecated-declarations] return v8::Isolate::GetCurrent()->IdleNotification(idle_time_in_ms); ^ . . .</class></class></v8::integer></v8::uint32></v8::uint32></v8::integer></v8::integer></v8::integer></v8::integer></v8::int32></v8::int32></v8::integer></v8::integer></v8::integer>
Am Schluss werden die Adapter in der Regel auch installiert und sind als Instanz vorhanden. Habe bisher nicht getestet, ob die Adapter wirklich auch funktionieren.
Weißt du, ob es an der node-Version liegt? Welche ist die letzte Version unter der alles laufen sollte?
Danke und Gruß
GH
-
Das liegt nur bedingt an node, sondern eher an den "c-binary-Teilen" die einige Libraries drin haben die der Adapter benutzt. Das sind compiler-Meldungen und viele davon Warnungen weil die Checks im Compiler recht strikt sind, aber dennoch nur warnen.
Wenn es fehlschlagen würde würdest Du nen Fehler bekommen.
In sofern: unschön, aber ignore. Wenn DU was dagegen tun willst dann verursachende Library raussuchen und dort ein Ticket aufmachen
-
bin wieder auf node 4.7 zurück, da sieht dass kompilieren besser aus.
Und das mit dem callback von meiner Nuki-Bridge mit POST setValueFromBody hat auch funktioniert. - Danke
Wie ich in meinem pull geschrieben habe, bin ich noch imer der Meinung das da etwas quer läuft bei der POST-Variante von setBulk. Entweder stimmt die Beschreibung nicht oder die Implementierung.
Gruß
GH
-
Ich musste nochmal was fixen … update auf github
-
bei mir geht noch alles, die Version war aber auch 1.5.0 oder?
Muss langsam Schluss machen, Frauchen wartet schon.
Wochenende bin ich auch Unterwegs, wohl erst Montagabend wieder on.
Gruß
GH
-
Ja, Version bleibt bis zum Release auf 1.5.0
Nach dem Update ggf manuell restarten
-
hatte ich so gemacht, sah gut aus.
Kann ich im Code verifizieren, dass meine aktive Version die richtige ist?
-
So, jetzt haben wirs … ich hab das nochmal komplett geändert nachdem ich das bisherige Konzept verstanden habe!
Es ändert sich für Deine Funktion leicht der aufruf!!
POST http://127.0.0.1:18183/setValueFromBody ... user=admin&...
bzw im Normalfall kein Fragezeichen und keine Parameter.
0.5.1 auf Github bitte testen!
-
bin wieder zu Hause und habe die neue Version getestet.
- setValueFromBody funktioniert bei mir
callback-Post http://192.168.200.110:8087/setValueFromBody/javascript.0.Nuki.Devices.NukiSL1.NukiBridgeResponse Body: {\"nukiId\": 123456789, \"state\": 3, \"stateName\": \"unlocked\", \"batteryCritical\": false}
- und set funktioniert auch
GET http://192.168.200.110:8087/set/javascript.0.alarm.Devices.Cams.Cam1.alarm_ack?value=true
-
Würde das Thema hier gerne nochmal aufgreifen. Komme mit den ganzen Beiträgen in diesem Forentopic leider nicht weiter da ich oft nur "Bahnhof" verstehe.
kann jemand Schritt für Schritt beschreiben wie ich den simple api Adapter mit Nuki genau nutze? Ich habe leider noch recht wenig Plan von APIs
Was muss ich alles Konfigurieren?
Ich nehme an die Steuerung und Statusabfrage erfolgt ausschließlich per Script, oder? Wie hat das Script auszusehen?
Objekte werden sicher nicht automatisch generiert, oder?
Ein paar Kleine Hilfestellungen mit Beispielen würden mich sicher schon etwas weiterbringen.
Danke für eure Hilfe!
-
Dann solltest du bitte ein paar mehr Infos geben. Ich kann beispielsweise mit "mit Nuki" nichts anfangen …
-
Moin eXTreMe,
hast Du Dir die Doku zum Adapter (auf Github) mal durchgelesen?
==> https://github.com/ioBroker/ioBroker.simple-api
Da ist sehr genau beschreiben, wie man über Webcommands (html) über den Adapter was alles machen kann:
-
Werte auslesen
-
Werte setzen (was auch eine Aktion auslösen kann, z.B. State auf true = Licht an)
Aber mehr Randinformationen sind immer gut.
Was genau hast Du vor?
Was hast Du bisher, mit welchem Erfolg, schon probiert?
Fehlermeldungen
Usw.
Gruß,
Eric
Von unterwegs getippert
-
-
Nuki ist ein Smart Lock, also ein fernsteuerbares Türschloss welches entweder direkt per bluetooth zwischen handy und schloss kommuniziert oder vom handy über internet an eine optional erhältliche bridge welche dann wiederum per bluetooth an das schloss funkt. hat man eine bridge so kann man auch im lokalen netz eine http api nutzen. https://nuki.io/de/
ja ich habe mir die doku zum adapter mehrmals durchgelesen aber leider nicht verstanden.
Also ich weiß über welche URL ich mir z.B. den Status des Türschlosses anzeigen lassen kann oder über welche URL ich das Schloss sperren oder öffnen kann. Das steht alles in der Nuki API gut erklärt: https://nuki.io/wp-content/uploads/2016 … I-v1.5.pdf
Das habe ich über meinen Browser durch aufruf der URL mit den jeweiligen Parametern getestet und klappt auch.
Was mir jedoch überhaupt nicht klar wird ist wie genau ich jetzt über iobroker das ganze einbinde um z.b. den status abzufragen, das schloss sperren oder öffnen zu lassen und die jewiligen antwortparameter die auf meine aktionen geantwortet werden in entsprechende datenpunkte in iobroker übernehme.
wie genau hat das javascript auszusehen?
kann mir das jemand an einem codebeispiel erklären?
Vielen Dank!
-
Hi,
Also simpleAPI ist dazu da um mit eigenen Skripten von Aussen auf ioBroker zuzugreifen.
Was Du eher brauchst ist wirklich ein JavaScript was mit deinem Türschloss kommuniziert.
Such mal im Forum nach "request", so heisst die nodejs Library um HTTP Requests (GET/POST u.ä.) zu machen. Das wäre Dein Ansatz.
Für ein Beispiel fehlt mir gerade die Zeit, sorry
-
Ich habe Nuki mit der WLAN-Bridge per Skript und VIS in Nutzung. Das ganze würde ich gerne in einen Adapter packen, aber da fehlt mir momentan die Zeit.
Ein paar Bemerkungen zu diesem Schloss und dem praktischen Einsatz bei mir: * * Ich nutze die angebotenen Möglichkeiten via Handy sehr sehr selten, stattdessen den Nuki FOB (Bluetooth-Sender).
* Für die Einbindung in mein LAN nutze ich die Bridge ohne Internetverbindung. Da Nuki den Zeitserver in der Bridge nicht konfigurierbar ausgelegt hat, haben die Logs dann leider keinen Zeitstempel. Warum will jeder Anbieter seine Nutzer entmündigen und "beschützen"? Ich hoffe, Nuki macht die WLAN-Bridge demnächst mal "voll" LAN-tauglich. * Das Schloss hat wie auch alle anderen vergleichbare Produkte keinen Sensor, um zu erkennen, ob die Tür geschlossen (eingeschnappt, in Schließposition) oder (etwas) offen ist. D. h., per App kann durchaus eine leicht offen stehende Tür "zugeschlossen" werden, was mir auch anfangs passiert ist, da der Schapper leicht verzögert nach dem Aufschließen freigegeben wird und die Tür dann u. U. nach dem vermeintlichen Schließen aus dem Türrahmen hervorsteht (hängt sicherlich von der Konstruktion der Tür und ggf. zusätzlichen Mechanismen ab). * Es fehlen einige Komfortfunktionen, wie z. B. zeitgesteuertes Zu- und Aufschließen in Abhängigkeit von Wochen- und Feiertagen (Wochentage-Zeitschaltung wird mit der letzten Version unterstützt) und der Anwesenheit (Während des Urlaubs bitte nicht aufschließen). * Jede Abfrage des Schlossstatus kostet Energie. Deshalb war die Implementierung des Callbacks in der Bridge ein großer Fortschritt. D. h., ich lasse mir via Callback Aktionen am Nuki „bestätigen“ und da kommt die Simple-API ins Spiel. * Zusätzlich löst bei mir jede Statusänderung des Türsensors (Subscription) eine Statusabfrage des Nuki aus. Ist laut Nuki der Türriegel ausgefahren und der Türsensor meldet offen, dann sollte das Skript einiges zu melden haben …
Beispiele:
Tür öffnen:
var action = 1; // öffnen // Parameter siehe Nuki-Bridge-API-Doku und Bsp. var sUrl = ‘http://’ + sServer + ‘:’ + sPort + ‘/lockAction?nukiId=’ + sNukiId + ‘&action=’ + action + ‘&token=’ + sToken; var request = require('request'); request(sUrl, function (error, response, body) { if(typeof response == ‘undefined’) { log(‘no response object!’); } else { // status only exist on valid response log(‘statusCode:’ + response.statusCode); if ((response) && !(error) && (response.statusCode == 200) { … } else { // Fehler .. } });
Callback
Per Skript trage ich in der Bridge eine callback-Methode ein, die bei Auslösung einer Nuki-Aktion von der Bridge nach der Beendigung der Aktion ausgeführt wird. D. h., die Callback-Methode wird als Bestätigung der Aktion genutzt.
var siobNukiStatus = ‘/setValueFromBody/’ + <id deines/datenpunktes/im/iobroker="">; // z. B. ‘/setValueFromBody/javascript.0.Nuki.devices.Nuki1.NukiBridgeResponse", var sUrl = ‘http://’ + sServer + ‘:’ + sPort + ‘/callback/add?url=’ + encodeURIComponent(‘http://’ + ioBrokerHostnameOrIP + ‘:’+ ioBrokerSimpleApiPort + siobNukiStatus) + ‘&token=’ + sToken; var request = require('request'); request(sUrl, function (error, response, body) { … });</id>
Löst du nun eine Aktion per Http-Request aus, sollte etwas später im Datenpunkt aus dem Callback in etwa folgendes stehen:
{\"nukiId\": 12345689, \"state\": 3, \"stateName\": \"unlocked\", \"batteryCritical\": false}
Was du dann über einen entsprechenden Subscriber auswerten kannst.
Hoffe, du kommst damit weiter.
-
Also simpleAPI ist dazu da um mit eigenen Skripten von Aussen auf ioBroker zuzugreifen. ` Vielen Dank für den Adapter, hat mir schon bei meiner ESP32 Bastelei sehr geholfen. Nutze dort setBulk, was sehr praktisch ist.
Jetzt sehe ich, daß es im "ioBroker Simple Web Adapter" ebenfalls die Möglichkeit gibt, eine (die?) simpleAPI anzukreuzen und zu nutzen. Dann wohl über Port 8082 statt 8087.
Ist das die gleiche (selbe?) simpleAPI oder etwas anderes? Was wird empfohlen?