NEWS
[gelöst] sendTo() in eigenem Adapter funktioniert nicht
-
Hallo zusammen,
ich versuche mich gerade an einem eigenen Adapter und wollte sendTo() für das Weiterreichen von Daten vom Adapter (main()) zu seinem Admin (admin/index.html) verwenden. Das klappt aber nicht, da der übergebene callback nie aufgerufen wird.
Ich bin dann hingegangen und habe iobroker noch einmal neu aufgesetzt und das adapter.template installiert, mit nur einer Ergänzung, nämlich dem Aufruf von sendTo() und einer minimalen Anpassung in adapter.on(…), aber auch hier der gleiche Effekt.
iobroker läuft bei mir unter win7.
Zur Verdeutlichung hier mal der Quellcode
(1) main.js aus dem template mit minimaler Anpassung :
// Some message was sent to adapter instance over message box. Used by email, pushover, text2speech, ... adapter.on('message', function (obj) { /* if (typeof obj == 'object' && obj.message) { */ if (typeof obj == 'object') { if (obj.command == 'send') { // e.g. send email or pushover or whatever console.log('send command'); // Send response in callback if required if (obj.callback) adapter.sendTo(obj.from, obj.command, 'Message received', obj.callback); } } });
(2) admin/index.html mit minimaler Anpassung in load() -> nur sendTo ergänzt:
// the function loadSettings has to exist ... function load(settings, onChange) { // example: select elements with id=key and class=value and insert value for (var key in settings) { // example: select elements with id=key and class=value and insert value if ($('#' + key + '.value').attr('type') == 'checkbox') { $('#' + key + '.value').prop('checked', settings[key]).change(function () { onChange(); }); } else { $('#' + key + '.value').val(settings[key]).change(function () { onChange(); }).keyup(function () { $(this).trigger('change'); }); } } sendTo(null, 'send', null, function (list) { alert(list); }); // Signal to admin, that no changes yet onChange(false); }
Es rührt sich einfach nichts. Ich würde jetzt erwarten, dass mein Alert die Meldung "Message received" ausgibt. Einer eine Idee was ich falsch mache?
Ein weiterer Effekt, der mir aufgefallen ist: beim Neuladen der Testinstanz wird anscheinend niemals das unload-Ereignis geschmissen, da der Text 'cleand everything up …' nie im Log erscheint. Hat diesen Effekt auch schon jemand beobachtet?
Quellcode zu unload:
// is called when adapter shuts down - callback has to be called under any circumstances! adapter.on('unload', function (callback) { try { adapter.log.info('cleaned everything up...'); callback(); } catch (e) { callback(); } });
Jemand eine Idee?
Grüße
Carsten
-
Wäre mir neu das alert in Verbindung mit nodejs/iobroker funktioniert.
Du musst "Adapter.log.info" nutzen.
Gesendet von meinem m8 mit Tapatalk
-
Damit das Message-Handling funktioniert musst Du im io-package folgendes angeben:
"messagebox": true, "subscribe": "messagebox",
unter "common".
Kannst es bei iobroker.sql o.ä. prüfen. Ansonsten kommen keine Nachrichten an.
Hast Du das drin?
-
Das war der Fehler. Super vielen dank. Die Info sollte auf jeden Fall in der Doku unter:
https://github.com/ioBroker/ioBroker/wi … mon-fields
nachgepflegt werden. Wenn man das nicht weiss, sucht man sich blöde. Wo sollten eigentlich Dokuergänzungen gemeldet werden, hier im Forum in einem betimmten Thread, oder in Jira, oder …?
@JeyCee: Das hat erst mal nichts mit node.js zu tun, da der code im Browser ausgeführt wird, also ganz normales Javascript.
-
Dann habe ich nicht begriffen wie nodejs funktioniert.
Ich dachte nodejs ist eine Server Anwendung die es möglich macht JS ohne Browser auszuführen.
Und demnach würden alle Skripte und Adapter code auf dem Server ausgeführt.
Bitte um Aufklärung.
Gesendet von meinem m8 mit Tapatalk
-
@Jey Cee: was Du schreibst ist ja richtig. Der serverseitige Teil eines Adapters läuft ja auch unter node.js, also das was ich unter main.js aufgeführt habe. Der clientseitige Teil, also admin/index.html für die Parametrierung des Adapters läuft im Browser, egal ob Firefox, Chrome, Safari oder was auch immer und ist schnödes javascript.
-
Aufklärung ist einfach: Der Teil wo "alert" verwendet wurde war aus der "admin.html"-Datei. Das ist HTML/JS was den Adapter-Konfigurationsdialog darstellt. Daher läuft dieser Teil im Browser und ist normales JavaScript und kein Serverseitiges nodejs.
Andere Teile von oben (der Teil der hier die Nachricht empfängt) ist Serverside-code und läuft in nodejs,
Konnte ich es klarer machen?
Hehe doppelt
-
Das war der Fehler. Super vielen dank. Die Info sollte auf jeden Fall in der Doku unter:
https://github.com/ioBroker/ioBroker/wi … mon-fields
nachgepflegt werden. Wenn man das nicht weiss, sucht man sich blöde. Wo sollten eigentlich Dokuergänzungen gemeldet werden, hier im Forum in einem betimmten Thread, oder in Jira, oder …?
@JeyCee: Das hat erst mal nichts mit node.js zu tun, da der code im Browser ausgeführt wird, also ganz normales Javascript. `
Habe in der Doku aufgenommen:https://github.com/ioBroker/ioBroker/wi … ackagejson
Ich glaube es reicht jetzt nur "messagebox" auf true zu setzen.
-
Danke für die Erklärung, jetzt ist das Klar und ergibt Sinn.
Gesendet von meinem m8 mit Tapatalk
-
Jetzt muss ich den Thread nochmal hoch holen.
Die 'sendTo' Funktion will einfach nicht funktionieren. Ich hab alles gelesen was ich dazu finden konnte und natürlich hab ich die io-packages.js angepasst.
-
Adapter instanz neu anlegen
-
Adapter löschen & neu installieren
-
ioBroker neustart
Nichts hat geholfen.
Um Tippfehler zu vermeiden hab ich sogar den code per copy & paste eingefügt.
Was übersehe ich?
{ "common": { "name": "upnp", "version": "0.3.7", "title": "UPnP Adapter", "desc": { "en": "ioBroker UPnP Adapter", "de": "ioBroker UPnP Adapter", "ru": "ioBroker UPnP драйвер как образец" }, "platform": "Javascript/Node.js", "license": "MIT", "mode": "daemon", "icon": "upnp-discovery.png", "keywords": ["upnp"], "extIcon": "https://raw.githubusercontent.com/Jey-Cee/ioBroker.upnp/master/admin/upnp-discovery.png", "readme": "https://github.com/Jey-Cee/ioBroker.upnp/blob/master/README.md", "loglevel": "info", "type": "hardware", "messagebox": true, "subscribe": "messagebox" }, "native": { "enableAutoDiscover": "", "enableAutoSubscription": "" }, "instanceObjects": [ {} ] }
/ Some message was sent to adapter instance over message box. Used by email, pushover, text2speech, ... adapter.on('message', function (obj) { adapter.log.info('incoming message'); });
-
-
Hast du auch ein iobroker upload adaptername gemacht?!
-
Nein das hab ich noch nicht gemacht. Das werde ich heute Abend noch testen.
-
Die io-package wird per "upload" aktualisiert und quasi "integriert". Kannst Danach sachauen das in der Instanzdefinition auf die Messagebox drin steht.
Ansonsten danach ggf nochmal iobroker stop und start
-