NEWS
Test Adapter rest-api
-
@haus-automatisierung Danke Matthias. Ich hab die Expertenansicht an. Ich seh sie einfach nicht. :lying_face:
-
Was soll mir denn der Parameter 'withInfo=true' sagen? Und mit welchem Parameter kann ich das ACK auf true setzen?
Ergänzung: Ich habs nach Anleitung mit '{"val": 1, "ack": true}' versucht, klaptt aber nicht. Der Wert kommt zwar an, wird aber nicht bestätigt. Hab ich die Anleitung nicht richtig verstanden?
-
-
Ich kriegs einfach nicht hin. :anguished: Kann mir jemand ein Beispiel aufzeigen, in dem ich einen Datenpunkt bestätigt und mit User/Password mit Daten beschicken kann? Mit dem 'simple_api' hab ichs hinbekommen - mit der rest-api leider nicht.
@rene55 sagte in Test Adapter rest-api:
Kann mir jemand ein Beispiel aufzeigen, in dem ich einen Datenpunkt bestätigt und mit User/Password mit Daten beschicken kann?
So wie ich das sehe, kann man momentan nicht direkt "ack=true" mitgeben.
-
@rene55 sagte in Test Adapter rest-api:
Kann mir jemand ein Beispiel aufzeigen, in dem ich einen Datenpunkt bestätigt und mit User/Password mit Daten beschicken kann?
So wie ich das sehe, kann man momentan nicht direkt "ack=true" mitgeben.
@haus-automatisierung Danke für die Mühe, mir helfen zu wollen. Dann robb ich mich mal ohne ACK ran. Ich habs gerade nochmal auf 'ohne Alles' zurück gestellt. Heist keine Authentifizierung und kein https. Dann funktioniert 'http://192.168.68.170:8093/v1/command/setState?id=0_userdata.0.Sensor.Serialino.Sensor_7&state=17' zumindest. Nehme ich wieder die Authentifizierung hinzu, bekomme ich einen "permissionError". Rechte vom Datenpunkt entsprechend angepasst. Ich hoffe, ich bin hier auf dem richtigen Weg - oder?
-
@haus-automatisierung Danke für die Mühe, mir helfen zu wollen. Dann robb ich mich mal ohne ACK ran. Ich habs gerade nochmal auf 'ohne Alles' zurück gestellt. Heist keine Authentifizierung und kein https. Dann funktioniert 'http://192.168.68.170:8093/v1/command/setState?id=0_userdata.0.Sensor.Serialino.Sensor_7&state=17' zumindest. Nehme ich wieder die Authentifizierung hinzu, bekomme ich einen "permissionError". Rechte vom Datenpunkt entsprechend angepasst. Ich hoffe, ich bin hier auf dem richtigen Weg - oder?
@rene55 Du brauchst zuerst eine Authorization (deswegen Permission Error)
echo -n username:passwort | base64Da kommt dann bspw. dabei raus
dXNlcm5hbWU6cGFzc3dvcnQ=
Die ist dann immer für die Kombination aus User+Passwort gültig.Dann nur noch
curl -kX 'GET' 'https://192.168.68.170:8093/v1/command/setState?id=0_userdata.0.example_state&state=test' -H 'accept: application/json' -H 'authorization: Basic dXNlcm5hbWU6cGFzc3dvcnQ=' -
@rene55 Du brauchst zuerst eine Authorization (deswegen Permission Error)
echo -n username:passwort | base64Da kommt dann bspw. dabei raus
dXNlcm5hbWU6cGFzc3dvcnQ=
Die ist dann immer für die Kombination aus User+Passwort gültig.Dann nur noch
curl -kX 'GET' 'https://192.168.68.170:8093/v1/command/setState?id=0_userdata.0.example_state&state=test' -H 'accept: application/json' -H 'authorization: Basic dXNlcm5hbWU6cGFzc3dvcnQ='@sborg Vielen Dank für das Beispiel. Bei mir funktioniert das einfach nicht. Grundsätzlich bekomme ich den Datenpunkt beschrieben - solange kein Benutzer im Spiel ist. Das einfache Absetzen des Befehls in der Console (natürlich mit angepasstem Hash) bringt mir den Fehler:
curl: (7) Failed to connect to 192.168.68.170 port 8093: No route to host.Ich gebs auf. Evtl muss noch etwas Zeit ins Land gehen, bevor ich das ans Laufen kriege. Solange werde ich mit SimpleAPI weitermachen. Da kann ich die Anfrage direkt vom Browser aus testen, habe user/password und kann den Status bestätigen. Möglicherweise muss mich @Bluefox hier noch etwas unterstützen.
-
@sborg Vielen Dank für das Beispiel. Bei mir funktioniert das einfach nicht. Grundsätzlich bekomme ich den Datenpunkt beschrieben - solange kein Benutzer im Spiel ist. Das einfache Absetzen des Befehls in der Console (natürlich mit angepasstem Hash) bringt mir den Fehler:
curl: (7) Failed to connect to 192.168.68.170 port 8093: No route to host.Ich gebs auf. Evtl muss noch etwas Zeit ins Land gehen, bevor ich das ans Laufen kriege. Solange werde ich mit SimpleAPI weitermachen. Da kann ich die Anfrage direkt vom Browser aus testen, habe user/password und kann den Status bestätigen. Möglicherweise muss mich @Bluefox hier noch etwas unterstützen.
@rene55 sagte in Test Adapter rest-api:
Das einfache Absetzen des Befehls in der Console (natürlich mit angepasstem Hash) bringt mir den Fehler:
Die IP-Adresse stimmt ganz sicher? Protokoll auch?
-
@rene55 sagte in Test Adapter rest-api:
Das einfache Absetzen des Befehls in der Console (natürlich mit angepasstem Hash) bringt mir den Fehler:
Die IP-Adresse stimmt ganz sicher? Protokoll auch?
@haus-automatisierung Ich habs mehrfach versucht. Die IP ist aus meinem Testsystem. Sobald ich den User für die api nehme (übrigens alles aus deinem Masterkurs) klappt es nicht mehr. Irgendwo hab ich da wohl ein Brett hängen.
-
@haus-automatisierung Ich habs mehrfach versucht. Die IP ist aus meinem Testsystem. Sobald ich den User für die api nehme (übrigens alles aus deinem Masterkurs) klappt es nicht mehr. Irgendwo hab ich da wohl ein Brett hängen.
I've reinstalled my Docker using the lateste version of Iosub Docker image from https://hub.docker.com/r/iobroker/iobroker
All works, except the Rest-Api adapter.
This is the error log.
I've tried changing ports, but same result.2024-05-22 08:26:54.002 - error: rest-api.0 (2520) Cannot create webserver: TypeError: Cannot read properties of undefined (reading 'createServerAsync') 2024-05-22 08:26:54.003 - warn: rest-api.0 (2520) Terminated (JS_CONTROLLER_STOPPED): Without reason 2024-05-22 08:26:54.510 - info: rest-api.0 (2520) terminating http server on port 8093 2024-05-22 08:26:54.528 - error: host.796b7a0bc948 instance system.adapter.rest-api.0 terminated with code 1 (JS_CONTROLLER_STOPPED) 2024-05-22 08:26:54.528 - info: host.796b7a0bc948 Restart adapter system.adapter.rest-api.0 because enabled -
I've reinstalled my Docker using the lateste version of Iosub Docker image from https://hub.docker.com/r/iobroker/iobroker
All works, except the Rest-Api adapter.
This is the error log.
I've tried changing ports, but same result.2024-05-22 08:26:54.002 - error: rest-api.0 (2520) Cannot create webserver: TypeError: Cannot read properties of undefined (reading 'createServerAsync') 2024-05-22 08:26:54.003 - warn: rest-api.0 (2520) Terminated (JS_CONTROLLER_STOPPED): Without reason 2024-05-22 08:26:54.510 - info: rest-api.0 (2520) terminating http server on port 8093 2024-05-22 08:26:54.528 - error: host.796b7a0bc948 instance system.adapter.rest-api.0 terminated with code 1 (JS_CONTROLLER_STOPPED) 2024-05-22 08:26:54.528 - info: host.796b7a0bc948 Restart adapter system.adapter.rest-api.0 because enabledis the webserver installed ?
-
Hy Leute,
Unterstützt der Adapter auch eine Funktion analog zur "setValueFromBody" vom "ioBroker.simple-api"?
Ich würde gerne von meinem Unifi Cloud Key via Alarmmanager einen Post auf mein ioBroker-System machen.
Vom Alarmmanager sollten im Body einige Infos sein, welche ich gerne in einem Datenpunkt hätte...Und da hier steht, dass dieser Adapter die simple-api ablösen soll, wärs cool, wenn ich gleich diesen verwenden könnte :)
mfg
Mike -
Ich versuche mich momentan am subscriben per rest-API.
Dafür habe ich in einem python-/flask-script einen endpoint "callback" angelegt. Dieser endpoint soll von iobroker aufgerufen werden sobald sich der abonnierte state ändert.Subscriben geht angeblich per GET und per POST.

Ich würde GET vorziehen da, zumindest soweit man SwaggerUI trauen kann, bei GET ein Delta angeben kann und somit nicht jede kleine Änderung mitkriegt.Mit POST klappt soweit alles, d.h. mein endpoint und mein Skript sind korrekt.
Per GET krieg ich das aber nicht hin. Sobald ich per SwaggerUI das subscriben via GET probiere schmiert der REST-adapter ab:

Den selben Fehler (Cannot read properties of undefined (reading 'url')..." bekomme ich auch bei diversen anderen API-calls. Scheinbar erwartet der Adapter hier eine URL.
Mir scheint die Doku bzw. SwaggerUI sind hier nicht vollständig. In Swagger gibt es z.B. keine Möglichkeit, eine URL zu hinterlegen.Nutzt jemand erfolgreich diese API? Kennt jemand diesen Fehler?
-
Ich versuche mich momentan am subscriben per rest-API.
Dafür habe ich in einem python-/flask-script einen endpoint "callback" angelegt. Dieser endpoint soll von iobroker aufgerufen werden sobald sich der abonnierte state ändert.Subscriben geht angeblich per GET und per POST.

Ich würde GET vorziehen da, zumindest soweit man SwaggerUI trauen kann, bei GET ein Delta angeben kann und somit nicht jede kleine Änderung mitkriegt.Mit POST klappt soweit alles, d.h. mein endpoint und mein Skript sind korrekt.
Per GET krieg ich das aber nicht hin. Sobald ich per SwaggerUI das subscriben via GET probiere schmiert der REST-adapter ab:

Den selben Fehler (Cannot read properties of undefined (reading 'url')..." bekomme ich auch bei diversen anderen API-calls. Scheinbar erwartet der Adapter hier eine URL.
Mir scheint die Doku bzw. SwaggerUI sind hier nicht vollständig. In Swagger gibt es z.B. keine Möglichkeit, eine URL zu hinterlegen.Nutzt jemand erfolgreich diese API? Kennt jemand diesen Fehler?
@lugge86 sagte in Test Adapter rest-api:
Scheinbar erwartet der Adapter hier eine URL.
Ja, Du musst dem Adapter ja mit dem Subscribe sagen, wohin die Änderungen des States publiziert werden sollen. Oder wie stellst Du Dir ein Subscribe vor?!
-
@lugge86 sagte in Test Adapter rest-api:
Scheinbar erwartet der Adapter hier eine URL.
Ja, Du musst dem Adapter ja mit dem Subscribe sagen, wohin die Änderungen des States publiziert werden sollen. Oder wie stellst Du Dir ein Subscribe vor?!
@haus-automatisierung sagte in Test Adapter rest-api:
@lugge86 sagte in Test Adapter rest-api:
Scheinbar erwartet der Adapter hier eine URL.
Ja, Du musst dem Adapter ja mit dem Subscribe sagen, wohin die Änderungen des States publiziert werden sollen. Oder wie stellst Du Dir ein Subscribe vor?!
Klar, ist mir das klar. Habe ja auch extra einen entsprechenden Endpoint in meinem flask-script angelegt.
Und wenn ich den Subscribe per POST durchführe kann ich die URL dieses Endpoints dem iobroker auch im POST-body mitgeben. In Python sieht das dann z.B. so aus:

Aber bei der GET-Variante gibt es, zumindest laut SwaggerUI, keine Möglichkeit eine URL mitzugeben. Das sieht in Swagger so aus:

Ich kann zwar ein onchange und ein delta einstellen, aber keine URL hinterlegen.
Nun ist Swagger aber mehr oder weniger die einzige Doku die ich habe.
Die Frage lautet also: wie gebe ich die URL mit?Hab mal zur Gaudi probiert einfach ein &url= im GET-Request anzuhängen, ohne Erfolg. Der Adapter schmiert ab weil die URL fehlt:
curl -X 'GET' 'http://192.168.0.252:8093/v1/state/0_userdata.0.test.test2/subscribe?method=GET&onchange=true&url="http://192.168.0.85:5800/callback"' -H 'accept: application/json' -
@haus-automatisierung sagte in Test Adapter rest-api:
@lugge86 sagte in Test Adapter rest-api:
Scheinbar erwartet der Adapter hier eine URL.
Ja, Du musst dem Adapter ja mit dem Subscribe sagen, wohin die Änderungen des States publiziert werden sollen. Oder wie stellst Du Dir ein Subscribe vor?!
Klar, ist mir das klar. Habe ja auch extra einen entsprechenden Endpoint in meinem flask-script angelegt.
Und wenn ich den Subscribe per POST durchführe kann ich die URL dieses Endpoints dem iobroker auch im POST-body mitgeben. In Python sieht das dann z.B. so aus:

Aber bei der GET-Variante gibt es, zumindest laut SwaggerUI, keine Möglichkeit eine URL mitzugeben. Das sieht in Swagger so aus:

Ich kann zwar ein onchange und ein delta einstellen, aber keine URL hinterlegen.
Nun ist Swagger aber mehr oder weniger die einzige Doku die ich habe.
Die Frage lautet also: wie gebe ich die URL mit?Hab mal zur Gaudi probiert einfach ein &url= im GET-Request anzuhängen, ohne Erfolg. Der Adapter schmiert ab weil die URL fehlt:
curl -X 'GET' 'http://192.168.0.252:8093/v1/state/0_userdata.0.test.test2/subscribe?method=GET&onchange=true&url="http://192.168.0.85:5800/callback"' -H 'accept: application/json'@lugge86 sagte in Test Adapter rest-api:
Hab mal zur Gaudi probiert einfach ein &url= im GET-Request anzuhängen, ohne Erfolg.
Eventuell ist das auch ein Fehler im Adapter. Aber wie Du die URL übergibst ist in jedem Fall falsch. Da gehören keine Anführungszeichen drumherum und Du solltest URL Encoding verwenden. Also
&url=http%3A%2F%2F192.168.0.85%3A5800%2Fcallback -
Wie es aussieht, wird die URL immer nur aus dem Body geholt:
-
@lugge86 sagte in Test Adapter rest-api:
Hab mal zur Gaudi probiert einfach ein &url= im GET-Request anzuhängen, ohne Erfolg.
Eventuell ist das auch ein Fehler im Adapter. Aber wie Du die URL übergibst ist in jedem Fall falsch. Da gehören keine Anführungszeichen drumherum und Du solltest URL Encoding verwenden. Also
&url=http%3A%2F%2F192.168.0.85%3A5800%2FcallbackDanke nochmal für die Rückmeldung. Ja, so hab ichs auch schon mal probiert:
curl -X 'GET' 'http://192.168.0.252:8093/v1/state/0_userdata.0.test.test2/subscribe?method=GET&onchange=true&url=http%3A%2F%2F192.168.0.85%3A5800%2Fcallback' -H 'accept: application/json' curl: (52) Empty reply from server
Um ehrlich zu sein, ich habe schon recht viel probiert- Aber ich kann halt nur raten, denn die Doku ist entweder falsch oder unvollständig.
Mein Problem ist dass leider andere APIs auch davon betroffen sind. Die API zum Abfragen der bestehenden Subscriptions zeigt das selbe verhalten.
(die hier:)
Mich würds aber wundern wenn bisher noch niemand diese APIs getestet hat. Hier scheint wohl nur der Entwickler weiterhelfen zu können...
-
Wie es aussieht, wird die URL immer nur aus dem Body geholt:
@haus-automatisierung sagte in Test Adapter rest-api:
Wie es aussieht, wird die URL immer nur aus dem Body geholt:
Da scheint aber noch mehr nicht zu passen, denn eigentlich sollte im Falle einer fehlenden URL ein JSOn mit einer Fehlerbeschreibung zurückgegeben werden.

Wie man auf meinen Screenshots sieht crasht aber bei mir der Adapter.
Kannst du bei dir mal mittels curl schauen ob das Problem auch bei dir auftritt?
Update: dein Tipp mit dem Body war gold wert.
Folgender Aufruf klappt:curl -X 'GET' \ 'http://192.168.0.252:8093/v1/state/0_userdata.0.test.test2/subscribe?method=GET&onchange=true&delta=5' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "url": "http://192.168.0.85:5800/callback"}'Mal schaun ob das auch für die anderen APIs klappt.
