NEWS
Adapter.setObjectNotExists - Objekt wird nicht angelegt…
-
Hallo,
Ich mache irgendetwas falsch wenn ich in meinem Adapter ein Objekt anlegen will. Es gibt weder ein Objekt zur Adapter Instanz "etamon.0" noch das Testobjekt. Einen Fehler sehe ich aber auch nicht im Log. Vielleicht kann mir jemand helfen was ich hier falsch mache?
Die Syntax ist
adapter.setObjectNotExists("test", { type: 'channel', common: { name: "test" }, native: {} });
Der gesamte Sourcode der main.js wäre hier zu lesen:
https://github.com/frankhirsch/ioBroker … er/main.js
Komischerweise hatte das schon mal funktioniert...
-
Komisch - er hat jetzt EINEN Knoten angelegt - ich hätte aber insgesamt 5 auf der obersten Ebene (etamon.0.xxx) erwartet…
Stattdessen gabe es jetzt einen Fehler
2019-01-12 21:09:40.210 - debug: etamon.0 ** Try to add ETA menu node [220/222]: /40/10241/0/0/12256 2019-01-12 21:09:40.491 - silly: etamon.0 outUri : _40_10241._40_10241_0_0_12256 2019-01-12 21:09:40.492 - silly: etamon.0 strValue : 2019-01-12 21:09:40.492 - silly: etamon.0 unit : 2019-01-12 21:09:40.492 - silly: etamon.0 decPlaces : 0 2019-01-12 21:09:40.492 - silly: etamon.0 scaleFactor : 0 2019-01-12 21:09:40.492 - silly: etamon.0 advTextOffset: 0 2019-01-12 21:09:40.492 - silly: etamon.0 text() : 0 2019-01-12 21:09:40.492 - silly: etamon.0 outType : text 2019-01-12 21:09:40.492 - silly: etamon.0 outValue : 2019-01-12 21:09:40.492 - silly: etamon.0 outUnit : 2019-01-12 21:09:40.492 - silly: etamon.0 outRole : state 2019-01-12 21:09:40.493 - debug: etamon.0 ** Try to add ETA menu node [221/222]: /40/10241/0/0/12197 2019-01-12 21:09:40.774 - silly: etamon.0 outUri : _40_10241._40_10241_0_0_12256._40_10241_0_0_12197 2019-01-12 21:09:40.774 - silly: etamon.0 strValue : 4,0 2019-01-12 21:09:40.774 - silly: etamon.0 unit : °C 2019-01-12 21:09:40.774 - silly: etamon.0 decPlaces : 1 2019-01-12 21:09:40.774 - silly: etamon.0 scaleFactor : 10 2019-01-12 21:09:40.774 - silly: etamon.0 advTextOffset: 0 2019-01-12 21:09:40.775 - silly: etamon.0 text() : 40 2019-01-12 21:09:40.775 - silly: etamon.0 outType : number 2019-01-12 21:09:40.775 - silly: etamon.0 outValue : 40 2019-01-12 21:09:40.775 - silly: etamon.0 outUnit : °C 2019-01-12 21:09:40.775 - silly: etamon.0 outRole : value.temperature 2019-01-12 21:09:40.850 - error: etamon.0 websocket error 2019-01-12 21:09:40.851 - error: etamon.0 Error: websocket error at WS.Transport.onError (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/engine.io-client/lib/transport.js:64:13) at WebSocket.ws.onerror (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/engine.io-client/lib/transports/websocket.js:150:10) at WebSocket.onError (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/ws/lib/EventTarget.js:109:16) at emitOne (events.js:96:13) at WebSocket.emit (events.js:188:7) at WebSocket.finalize (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/ws/lib/WebSocket.js:182:41) at emitOne (events.js:96:13) at Socket.emit (events.js:188:7) at onwriteError (_stream_writable.js:345:10) at onwrite (_stream_writable.js:363:5) at WritableState.onwrite (_stream_writable.js:90:5) at fireErrorCallbacks (net.js:479:13) at Socket._destroy (net.js:520:3) at WriteWrap.afterWrite (net.js:808:10) 2019-01-12 21:09:40.852 - silly: etamon.0 transport error 2019-01-12 21:09:41.422 - debug: etamon.0 statesDB connected 2019-01-12 21:09:41.428 - debug: etamon.0 statesDB connected
-
Also der Code ist an sich ok, du kannst einen Callback an die Methode übergeben die bekommt als ersten einen "err" Parameter. den kannst Du mal loggen falls irgendwas passiert, siehst Du es dann.
Ggf im Admin auch mal neu laden (unter Objekte der Button mit den zwei Pfeilen), nicht das die neuen Objekte nicht an Admin gemeldet wurden. Und auch im Admin die gesetzten Filter checken
Rein Formal ist jede setObjectNotExist Aktion asynchron, du arbeitest hier aber sequenziell in einer Schleife. Das ist erstmal nicht ganz so wichtig, bedeutet nur das ggf erste Werte die Du setzt nicht angelegt werden wiel das Objekt noch gar nicht da ist oder so.
-
Ok - ich vermute als Nodejs Anfänger habe ich hier am ehesten ein klassisches Problem mit der “hell of callback”…
1. Ich hatte Anfangs schon Probleme dass meine XML Rest calls noch liefen während ich das Ergebnis aber schon verarbeiten wollte. Aus diesem Grund habe ich dann “request-promise” verwendet
2. In einer früheren Version hatte ich dann schon mal eine manuelle asynchrone Schleife gebaut (Rekursive Funktion die nicht mehr aufgerufen wird wenn die Liste der zu verarbeitenden Objekte leer ist…)
3. Ich würde es jetzt mal mit dem “async” Modul probieren, aber den ganzen Code wieder auf async.waterfall oder async.series umzubauen...
Spezielle Fragen hätte ich noch zum Verständnis von ioBroker die Du mir bestimmt beantworten kannst:
1. Wenn der Apater gestartet wird (auch manuell in CLI) und der Code so gebaut ist wie bei mir mit einzelnen Funktionen, wird die Instanz dann automatisch beendet oder muss ich den Apapter dann explizit mit adapter.stop() in meiner letzten Funktion beenden?
2. Angenommen die Instanz wird mit adapter.stop() beendet oder läuft in den Timeout, kann dann ein vorher abgesetztes adapter.setObject… überhaupt noch funktionieren?
Scheinbar stellt sich das weniger als Problem dar wenn man nur kleinere Datenmengen verarbeitet, bei mir sind das aber immer gleich ca. 200 Werte die ich schreiben will?
-
Könnte mir jemand bei der Funktion mit dem Callback helfen?
Irgendwie will der bei mir nicht…
1. channels sei ein Array mit n-Einträgen
2. createChannel() soll das Objekt anlegen
3. Als Callback von adapter.setObject soll das angelegte Objekt aus der Liste geslöscht werden und createChannels() erneut aufgerufen werden
Leider bekomme ich den Callback aber <u>gar nicht</u> dazu eine Ausgabe im Log oder der Console zu erzeugen… weder für adapter.setObject noch adapter.setObjectNotExists
function createChannels() { console.log("** Channels to create: "+channels.length); if(channels.length>0) { createChannel(); } else { adapter.log.debug("** Channels created - next: setObjects"); //createObjects(); adapter.stop(); } } function createChannel() { console.log("setChannel 01 - " + channels[0][0]); adapter.setObject(channels[0][0], { type: 'channel', common: { name: channels[0][1] }, native: {} }, function(err) { adapter.log.debug("callback createChannel..."); }); console.log("setChannel 02 - " + channels[0][0]); channels.shift(); createChannels(); }
-
Schau mal wie ich das im Oilfox drin habe:
-
Ein bisschen Glück… aber nachdem ich mal etwas tiefer gegraben habe und die Fehlermeldung gegoogelt habe fand ich dann hier im Forum Hinweise dass ioBroker immer mal wieder abstürzt, abhängig von der verwendeten NodeJS Version...
https://www.forum.iobroker.net/viewtopic.php?t=17499
Ich habe mich dann dazu entschlossen mal die Version von NodeJS und npm zu prüfen - ich verwende das <u>buanet-iobroker</u> Docker Image auf einer Synology. Siehe da - die installierten Versionen waren noch npm 3.10.10 und node v6.14.4
Einfach mal aktualisiert und Neustart.. voila - die Channels werden sofort angelegt.
Ich habe dann node der Einfachheit mit NVM aktualisiert und npm auf der Kommandozeile: npm install npm -g (node v8.15.0 und npm 6.5.0).
-
Also das hat nichts mit der nodejs Version zu tun. ich nuzue nahezu die gleiche Kombi wie du (node 6 und npm3) in meinem Produktivsystem … und es geht alles
Aber super das jetzt gelöst.
Je nach Geschwindigkeit des Systems können 200 Objekte schon kurz dauern
-
Ich werde es beobachten wenn ich den Apapter dann auf dem produktiven (nicht aktualisierten) System installiere… vielleicht ergibt sich dann da noch etwas. Danke für die Unterstützung!