NEWS
[Frage] WEB-Instanz/-Schnittstelle in eigenem Adapter?
-
Ich habe eine NodeJS-Anwendung die einen eigenen HTTP-Server bereitstellt und so verschiedene Ansichten/Einstellungen ermöglicht. In Zukunft würde ich die gerne in einen ioBroker-Adapter migrieren, um wie in den Admin-Tabs auf SocketIO setzen zu können.
Da gibt es ja schon ioBroker.web, das auch LetsEncrypt, integrierten SocketIO etc. unterstützt. Kann ich darauf irgendwie aufbauen mit einer Schnittstelle, sodass ich nur noch die Hintergrundlogik implementieren muss?
Simple-API scheint das Tandem aus HTTP-Server und Extra-Logik auch irgendwie zu machen. Nur ist mir mangels Doku (oder war ich blind) nicht 100% klar, was hier an Schnittstellen existiert, und wie viel vom Server ich selbst programmieren muss.
-
Wenn Du schon einen http-Server laufen hast (z.B. node.js + für etwas mehr Komfort vielleicht Express), dann kannst Du den Code einfach in den Adapter (z.B. in main.js) mit aufnehmen (z.B. für eine REST-API). Wenn es Dir um bidirektionale-Kommunikation via Sockets geht, dann ist ein guter Einstieg das Beispiel beim socketio-Adapter. Den solltest Du immer laufen haben, wenn Du Änderungen von Datenpunkten Realtime mitbekommen möchtest, um diese z.B. in Deinem Web-FE immer aktuell anzuzeigen, oder wenn Du Datenpunkte selber im FE ändern möchtest, um Aktionen im iobroker auszulösen (Szenen, Skripte oder was auch immer). Welche Funktionen der Socket dann serverside zur Verfügung stellt, findest Du in der Datei:
https://github.com/ioBroker/ioBroker.so … /socket.js
Hier insbesondere alles was mit socket.on('… anfängt. Clientseitig kannst Du dann wie im Beispiel gezeigt conn.js einbinden. Hier sind dann schon eine ganze menge Funktionen vordefiniert, die Du nutzen kannst. Im ersten Augenblick ist die Anzahl der Funktionen ziemlich erschlagend, weswegen Du clientseitig auch ersteimal zum "reinkommen" ganz easy anfangen kannst.
In dem Quellcode-Schnipsel habe ich mal reingeschrieben, wie Du z.B. starten könntest (verdeutlicht nur das Prinzip):
War das in etwa das was Du wissen wolltest? Ansonsten noch einmal genauer beschreiben.
Grüße
Carsten
-
Also der Simply-API-Adapter als Beispiel macht das so …
Ich bin immer noch nicht 100% durchgestiegen, aber grob was ich gefunden habe:
In io-package.json gibt es in "common":
"webExtension": "lib/simpleapi.js",
Das verweist auf eine Klasse die die echte Logik enthält.
Der Konstruktor bekommt einige Parameter:
SimpleAPI(server, webSettings, adapter, instanceSettings, app) {
Und der letzte ist nur gesetzt wenn das ganze im web-Adapter eingebunden ist und dafür gibts dann Sondercode der das behandelt.
adapter.log.info('Install extension on /' + that.namespace + '/'); that.app.use('/' + that.namespace + '/', function (req, res, next) { that.restApi.call(that, req, res); });
So als Ansatz vllt mal ein erster Schritt zum ausprobieren.
Vllt kann ja @Bluefox noch was dazu sagen
-
Zuzüglich zu simple-api, kann man noch iobroker.proxy https://github.com/ioBroker/ioBroker.proxy
anschauen.
-
War das in etwa das was Du wissen wolltest? Ansonsten noch einmal genauer beschreiben. `
Nicht so ganz. Die einzelnen Bestandteile sind mir bekannt. Ebenfalls wollte ich vermeiden, selbst den Server zu starten und eine externe Socket.IO-Instanz zu verwenden. Mit dem Web-Adapter geht ja irgendwie alles in einem, und auch noch HTTPS."webExtension": "lib/simpleapi.js", ```` `
Das sorgt also dafür, dass der Web-Adapter einen HTTPS-Server für meinen Adapter bereitstellt? Muss ich noch irgendwas für die socketio-Instanz machen?
iobroker.proxy https://github.com/ioBroker/ioBroker.proxy
anschauen. `
Danke, da schau ich mal rein. -
Das zusammen mit dem genannten Code gibt an unter welcher URL dann dein Code erreichbar ist (Route ) und gibt den request weiter. So habe ich es verstanden.
Eigentlich schreibe das nach nem "Web Extension Adapter Template"
-
War das in etwa das was Du wissen wolltest? Ansonsten noch einmal genauer beschreiben. `
Nicht so ganz. Die einzelnen Bestandteile sind mir bekannt. Ebenfalls wollte ich vermeiden, selbst den Server zu starten und eine externe Socket.IO-Instanz zu verwenden. Mit dem Web-Adapter geht ja irgendwie alles in einem, und auch noch HTTPS."webExtension": "lib/simpleapi.js", ```` `
Das sorgt also dafür, dass der Web-Adapter einen HTTPS-Server für meinen Adapter bereitstellt? Muss ich noch irgendwas für die socketio-Instanz machen?
iobroker.proxy https://github.com/ioBroker/ioBroker.proxy
anschauen.
Danke, da schau ich mal rein.
Socket.io ist schon da. Allerdings es werden natürlich nur die Befehle unterstützt die schon vorprogrammiert sind. Aber falls irgendwas fehlt, das kann man nachbauen.