NEWS
[gelöst] Listener/Events/ext. Subscriptions stoppen, wie?
-
MOD-Edit by eric2905; 15.05.2017 / 19:25; Betreff geändert
Ein kleines Problem, bei dem meine Javascript-Kenntnisse nicht reichen, um zu verstehen, was ich da tue/tun muss.
Das Skript hier funktioniert soweit. Es werden über einen CO2-USB-Messgerät die Daten Temperatur und CO2 ausgelesen.
Leider erhält der Javascript-Adapter die Antworten vom CO2-Messgerät weiterhin, auch wenn das Skript beendet wird.
! ````
log("-------- -------- -------- CO2-Monitor Skript gestartet -------- -------- --------");
! var logOn = true; // Ausgabe der Messwerte im Log
var forcecration = false; // Variablen anlegen erzwingen (überschreiben)
! var pfad = "javascript." + instance + ".co2-monitor.arbeitszimmer" + ".";
! // -----------------------------------------------------------------------------
! idCo2 = pfad + "co2";
idTemperatur = pfad + "temperatur";
! createState(idCo2, null , forcecration, {
name: 'Luftgüte co2 in ppm',
desc: 'Luftgüte co2 in ppm',
type: 'number',
unit: 'ppm',
role: 'value'
});
! createState(idTemperatur, null , forcecration, {
name: 'Temperatur in Grad Celsius',
desc: 'Temperatur in Grad Celsius',
type: 'number',
unit: '°C',
role: 'value'
});
! //const Co2Monitor = require('./co2monitor');
const Co2Monitor = require('./co2-monitor');
! //let co2Monitor = new Co2Monitor();
var co2Monitor = new Co2Monitor();co2Monitor.on('connected', (device) => {
co2Monitor.startTransfer();
log("-------- -------- -------- CO2-Monitor connect erfolgreich gestartet -------- -------- --------");
//log("Device: " + JSON.stringify(device));
});co2Monitor.on('error', (error) => {
log(error,"warn");
});co2Monitor.on('co2', (co2) => {
setState(idCo2,parseInt(co2));
if(logOn) log('co2: ' + co2);
});co2Monitor.on('temp', (temp) => {
setState(idTemperatur,parseFloat(temp));
if(logOn) log('temp: ' + temp);
});co2Monitor.on('data', (data) => {
if(logOn) log('data: ' + data);
});! /*
co2Monitor.on('rawData', (rawData) => {
log("rawData:" + rawData);
});
*/
! onStop(function skriptStop () {
stopAllListeners();
log("---------------------- **** Skript wurde gestoppt **** ----------------------");
}, 100 /ms/);
! function stopAllListeners() {
co2Monitor.removeListener('co2', Co2Monitor);
co2Monitor.removeAllListeners('connected');
co2Monitor.removeListener('connected',Co2Monitor);
}
! //stopAllListeners();
! function main() {
co2Monitor.connect();
}
! setTimeout(main, 2000);
! ````Ich hatte schon einmal so ein Thema, mit Noble. Da konnte mir Bluefox helfen:
http://forum.iobroker.net/viewtopic.php … ers#p22127
Für diese Doku reicht mein Wissen nicht:
https://nodejs.org/api/events.html#even … e_listener
Ein verzweifelter Versuch, um die Events zu stoppen, ohne zu wissen, was ich da tue:
function stopAllListeners() { co2Monitor.removeListener('co2', Co2Monitor); co2Monitor.removeAllListeners('connected'); co2Monitor.removeListener('connected',Co2Monitor); }
So verhält sich das Skript:````
Log23:05:37.596 [info] javascript.1 Start javascript script.js.Entwicklung.co2-monitor
23:05:37.596 [info] javascript.1 script.js.Entwicklung.co2-monitor: -------- -------- -------- CO2-Monitor Skript gestartet -------- -------- --------
23:05:37.596 [info] javascript.1 script.js.Entwicklung.co2-monitor: registered 0 subscriptions and 0 schedules
23:05:39.664 [info] javascript.1 script.js.Entwicklung.co2-monitor: -------- -------- -------- CO2-Monitor connect erfolgreich gestartet -------- -------- --------
23:05:41.315 [info] javascript.1 script.js.Entwicklung.co2-monitor: co2: 529
23:05:43.964 [info] javascript.1 script.js.Entwicklung.co2-monitor: temp: 24.100
23:05:43.964 [info] javascript.1 script.js.Entwicklung.co2-monitor: data: {"co2":529,"temperature":"24.100"}
23:05:46.332 [info] javascript.1 script.js.Entwicklung.co2-monitor: co2: 529
23:05:46.332 [info] javascript.1 script.js.Entwicklung.co2-monitor: data: {"co2":529,"temperature":"24.100"}
23:05:46.806 [info] javascript.1 Stop script script.js.Entwicklung.co2-monitor
23:05:46.806 [info] javascript.1 script.js.Entwicklung.co2-monitor: ---------------------- **** Skript wurde gestoppt **** ----------------------
23:05:48.981 [info] javascript.1 script.js.Entwicklung.co2-monitor: temp: 24.100
23:05:48.981 [info] javascript.1 script.js.Entwicklung.co2-monitor: data: {"co2":529,"temperature":"24.100"}
23:05:51.355 [info] javascript.1 script.js.Entwicklung.co2-monitor: co2: 528
23:05:51.355 [info] javascript.1 script.js.Entwicklung.co2-monitor: data: {"co2":528,"temperature":"24.100"}Man sieht, dass nach dem Stop des Skripts, die Messwerte weiter ermittelt werden. help :?: :|
-
Du solltest diese Funktion benutzen:
https://github.com/ioBroker/ioBroker.ja … nsubscribe
Die Funktionen, die du benutzt sind node.js Funktionen und haben mit ioBroker Skripte wenig zu tun.
-
Die Funktionen, die du benutzt sind node.js Funktionen und haben mit ioBroker Skripte wenig zu tun. `
Verstehe ich leider nicht
Die Events kommen doch von dem npm module 'co2-monitor'.
// ... const Co2Monitor = require('./co2-monitor'); var co2Monitor = new Co2Monitor(); co2Monitor.on('connected', (device) => { co2Monitor.startTransfer(); log("-------- -------- -------- CO2-Monitor connect erfolgreich gestartet -------- -------- --------"); }); co2Monitor.on('co2', (co2) => { setState(idCo2,parseInt(co2)); log('co2: ' + co2); }); // ...
Wie setzte ich denn den Part oben als "ioBroker Skript um, wenn nicht so?
-
Habe ich übersehen.
Da hast du recht.
Hast du Quellen für co2-monitor? Vielleicht werden da non-standard events verwendet?
-
Hast du Quellen für co2-monitor? Vielleicht werden da non-standard events verwendet? `
Die Quelle vom co2-monitor:
https://github.com/maddindeiss/co2-moni … monitor.js
Klassen und Events sind noch ein Buch mit sieben Siegeln für mich.
Ich würde aber sagen, dass es "Standard" ist:
-
probiers mal mit
co2Monitor.disconnect( [callback-Funktion] );
-
probiers mal mit
co2Monitor.disconnect( [callback-Funktion] );
Danke für das Feedback! Und ich denke, dass ist der Punkt, auf dem es ankommt.
Ein herber Rückschlag fürs Selbstvertrauen :shock: :oops:
Da merke ich leider, dass ich nur an den Grundlagen kratze. Ich habe versucht, das sinnvoll einzubauen. Leider fehlen mir die Grundlagen zu Objekte, Methoden, usw. Das nächste Thema, an dem ich dringend arbeiten muss.
Keine Ahnung, wie ich das einbaue (…die Callback-Funktion).
Alle Versuche sind auf einen Fehler gelaufen. Rein Try and Error und den Blick in den module Quellcode.
Vielleicht hast Du noch einen Anstoß für mich, in welche Richtung ich denken muss und wie die Callback-Funktion aussehen muss. :roll:
Was wir hier von mir erwartet?
disconnect(cb) { try { this.co2Endpoint.stopPoll(); this.co2Interface.release(true, (error) => { if(error) { this.emit('error', error); } else { this.co2Device.close(); cb(true); } }); } catch(error) { throw new Error(error); } }
-
Ich glaube, du denkst gerade zu kompliziert. Dort, wo du alle Verbindungen trennst (beim Skript-beenden), machst du folgendes anstatt den Befehlen, die nicht so richtig tun was du willst:
co2Monitor.disconnect(function() { // weitere Aktionen, die nach dem Disconnect ausgeführt werden sollen. // wenn keine, dann leer lassen. });
-
Danke für Deine Geduld!
Ich habe jetzt folgendes übernommen und beim Stop des Skripts eingebaut:
onStop(function skriptStop () { log("---------------------- **** Skript wurde gestoppt **** ----------------------"); co2Monitor.disconnect(function() { log("----- CO2 Monitor DISCONNECTED -----"); // weitere Aktionen, die nach dem Disconnect ausgeführt werden sollen. // wenn keine, dann leer lassen. }); }, 100 /*ms*/);
Wenn ich das Skript dann stoppe, bekomme ich folgende Fehlermeldungen:
host.nuc-g7-i7 2017-05-15 22:40:40.004 info Restart adapter system.adapter.javascript.1 because enabled host.nuc-g7-i7 2017-05-15 22:40:40.003 error instance system.adapter.javascript.1 terminated with code 0 (OK) javascript.1 2017-05-15 22:40:39.986 error javascript.1 2017-05-15 22:40:39.986 error at Device. (C:\ioBroker\node_modules\iobroker.javascript\node_modules\co2-monitor\node_modules\usb\usb.js:200:7) javascript.1 2017-05-15 22:40:39.986 error at Interface.co2Interface.release (C:\ioBroker\node_modules\iobroker.javascript\node_modules\co2-monitor\co2-monitor.js:101:21) javascript.1 2017-05-15 22:40:39.986 error at Device.usb.Device.close (C:\ioBroker\node_modules\iobroker.javascript\node_modules\co2-monitor\node_modules\usb\usb.js:43:7) javascript.1 2017-05-15 22:40:39.986 error at Error (native) javascript.1 2017-05-15 22:40:39.986 error Error: Can't close device with a pending request javascript.1 2017-05-15 22:40:39.986 error uncaught exception: Can't close device with a pending request javascript.1 2017-05-15 22:40:39.980 info script.js.Entwicklung.co2-monitor: ---------------------- **** Skript wurde gestoppt **** ---------------------- javascript.1 2017-05-15 22:40:39.977 info Stop script script.js.Entwicklung.co2-monitor javascript.1 2017-05-15 22:40:37.654 info script.js.Entwicklung.co2-monitor: data: {"co2":811,"temperature":"25.038"} javascript.1 2017-05-15 22:40:37.654 info script.js.Entwicklung.co2-monitor: co2: 811 javascript.1 2017-05-15 22:40:35.278 info script.js.Entwicklung.co2-monitor: data: {"co2":811,"temperature":"25.038"} javascript.1 2017-05-15 22:40:35.278 info script.js.Entwicklung.co2-monitor: temp: 25.038 javascript.1 2017-05-15 22:40:32.639 info script.js.Entwicklung.co2-monitor: data: {"co2":811,"temperature":"25.038"} javascript.1 2017-05-15 22:40:32.639 info script.js.Entwicklung.co2-monitor: co2: 811 javascript.1 2017-05-15 22:40:30.263 info script.js.Entwicklung.co2-monitor: temp: 25.038 javascript.1 2017-05-15 22:40:28.368 info script.js.Entwicklung.co2-monitor: -------- -------- -------- CO2-Monitor connect erfolgreich gestartet -------- -------- -------- javascript.1 2017-05-15 22:40:26.295 info script.js.Entwicklung.co2-monitor: registered 0 subscriptions and 0 schedules javascript.1 2017-05-15 22:40:26.150 info script.js.Entwicklung.co2-monitor: -------- -------- -------- CO2-Monitor Skript gestartet -------- -------- --------
-
javascript.1 2017-05-15 22:40:39.986 error Error: Can't close device with a pending request javascript.1 2017-05-15 22:40:39.986 error uncaught exception: Can't close device with a pending request ```` `
Aus dem Quellcode aus Github wird mir nicht klar, wie man das verhindern kann. Eventuell mal beim Programmierer nachhaken (=> Issue auf Github). Da scheint in dessen Skript nicht sauber aufgeräumt zu werden.
Die einfachste Lösung wäre ein try-catch-Block, um einen Absturz des JS-Adapters zu verhindern:
try { co2Monitor.disconnect(function() { log("----- CO2 Monitor DISCONNECTED -----"); // weitere Aktionen, die nach dem Disconnect ausgeführt werden sollen. // wenn keine, dann leer lassen. }); } catch (e) { // hat nicht geklappt }
Eventuell könnte man das in einer Schleife bei Fehler wiederholen mit Zeitverzögerung, um mehrere Versuche vorzunehmen, die Verbindung zu kappen.
-
Habe try/catch eingebaut. Der Fehler wird nicht abgefangen und bleibt.
Nun gut. Ich nehme das mal zum Anlass, mich tiefer mit der Materie zu beschäftigen
Danke noch einmal für Deine Geduld und Mühe!
-
Hi,
Bin zwar auch planlos :roll: , aber callbacks bzw. Asynchrone Funktionen können meines Kenntnisstandes nicht in try/catch abgearbeitet werden. Try catch ist beim Aufruf des Callbacks schon längst abgearbeitet.
Um das bei dir abzufangen, musste die try/catch in die callback Funktion.
co2Monitor.disconnect(function() { try{ log("----- CO2 Monitor DISCONNECTED -----"); } catch (e) { log(e); // hat nicht geklappt } });
Es ist aber auch möglich das das kompletter Quatsch ist.
-
Klingt logisch.
Hab es einfach mal schnell probiert… das Ergebnis ist trotz Logik gleich.
host.nuc-g7-i7 2017-05-17 07:03:20.211 info Restart adapter system.adapter.javascript.1 because enabled host.nuc-g7-i7 2017-05-17 07:03:20.209 error instance system.adapter.javascript.1 terminated with code 0 (OK) javascript.1 2017-05-17 07:03:20.190 error javascript.1 2017-05-17 07:03:20.190 error at Device. (C:\ioBroker\node_modules\iobroker.javascript\node_modules\co2-monitor\node_modules\usb\usb.js:200:7) javascript.1 2017-05-17 07:03:20.190 error at Interface.co2Interface.release (C:\ioBroker\node_modules\iobroker.javascript\node_modules\co2-monitor\co2-monitor.js:101:21) javascript.1 2017-05-17 07:03:20.190 error at Device.usb.Device.close (C:\ioBroker\node_modules\iobroker.javascript\node_modules\co2-monitor\node_modules\usb\usb.js:43:7) javascript.1 2017-05-17 07:03:20.190 error at Error (native) javascript.1 2017-05-17 07:03:20.190 error Error: Can't close device with a pending request javascript.1 2017-05-17 07:03:20.190 error uncaught exception: Can't close device with a pending request javascript.1 2017-05-17 07:03:20.185 info script.js.Entwicklung.co2-monitor: ---------------------- **** Skript wurde gestoppt **** ---------------------- javascript.1 2017-05-17 07:03:20.185 info Stop script script.js.Entwicklung.co2-monitor javascript.1 2017-05-17 07:03:19.137 info script.js.Entwicklung.co2-monitor: data: {"co2":604,"temperature":"25.663"} javascript.1 2017-05-17 07:03:19.137 info script.js.Entwicklung.co2-monitor: temp: 25.663 javascript.1 2017-05-17 07:03:16.491 info script.js.Entwicklung.co2-monitor: data: {"co2":604,"temperature":"25.600"} javascript.1 2017-05-17 07:03:16.491 info script.js.Entwicklung.co2-monitor: co2: 604 javascript.1 2017-05-17 07:03:14.124 info script.js.Entwicklung.co2-monitor: data: {"co2":604,"temperature":"25.600"} javascript.1 2017-05-17 07:03:14.124 info script.js.Entwicklung.co2-monitor: temp: 25.600 javascript.1 2017-05-17 07:03:11.473 info script.js.Entwicklung.co2-monitor: data: {"co2":604,"temperature":"25.600"} javascript.1 2017-05-17 07:03:11.473 info script.js.Entwicklung.co2-monitor: co2: 604 javascript.1 2017-05-17 07:03:09.105 info script.js.Entwicklung.co2-monitor: data: {"co2":603,"temperature":"25.600"} javascript.1 2017-05-17 07:03:09.105 info script.js.Entwicklung.co2-monitor: temp: 25.600 javascript.1 2017-05-17 07:03:06.458 info script.js.Entwicklung.co2-monitor: co2: 603 javascript.1 2017-05-17 07:03:03.616 info script.js.Entwicklung.co2-monitor: -------- -------- -------- CO2-Monitor connect erfolgreich gestartet -------- -------- -------- javascript.1 2017-05-17 07:03:01.548 info script.js.Entwicklung.co2-monitor: registered 0 subscriptions and 0 schedules javascript.1 2017-05-17 07:03:00.547 info script.js.Entwicklung.co2-monitor: -------- -------- -------- CO2-Monitor Skript gestartet -------- -------- -------- javascript.1 2017-05-17 07:03:00.540 info Start javascript script.js.Entwicklung.co2-monitor
-
Asynchrone Funktionen können meines Kenntnisstandes nicht in try/catch abgearbeitet werden. Try catch ist beim Aufruf des Callbacks schon längst abgearbeitet. `
Jein. Wenn der Fehler in der Asynchronen Funktion auftritt, bevor sie die Kontrolle an den Aufrufer zurückgibt, sollte es per try-catch abfangbar sein. try-catch im Callback fängt nur Fehler in der eigenen Callback-Funktion ab.In diesem Fall scheint der Fehler zwischendrin aufzutreten:
ruhr's code -> * disconnect -> | ruhr's code (nach Aufruf von disconnect) | |__ disconnect arbeitet noch, bzw hat selbst asynchron was aufgerufen | | -> fehler | ** |__ hier käme der Callback
Fehler in * und ** lassen sich mit try-catch um disconnect (*) bzw. im callback (**) abfangen.
Fehler in internen asynchronen Aktionen der disconnect-Methode nicht.
-
Was passiert wenn man sowas schreibt…..?
co2Monitor.disconnect(function() { // weitere Aktionen, die nach dem Disconnect ausgeführt werden sollen. // wenn keine, dann leer lassen. }).on ('error', function (e) { console.error (e);});
-
interessante Erklärungen!
ich probiere den Vorschlag nachher aus
Gesendet von iPhone mit Tapatalk
-
host.nuc-g7-i7 2017-05-17 16:49:29.792 error instance system.adapter.javascript.1 terminated with code 0 (OK) javascript.1 2017-05-17 16:49:29.770 error error in onStop callback: TypeError: Cannot read property 'on' of undefined javascript.1 2017-05-17 16:49:29.770 info script.js.Entwicklung.co2-monitor: ---------------------- **** Skript wurde gestoppt **** ----------------------
-
Eine möglichkeit wäre noch (z.b. am Ende des Skripts):
process.on('uncaughtException', function (err) { // sicherstellen, dass es wirklich der Fehler aus co2Monitor ist, den wir abfangen wollen. Diesen dann ignorieren oder darauf irgendwie reagieren // Ansonsten Fehler weitergeben per throw err });
-
javascript.1 2017-05-18 20:40:16.857 error script.js.Entwicklung.co2-monitor: ReferenceError: process is not defined
-
Oh… dann funktioniert das nur in Adaptern. Fürchte, es muss in dem Modul nachgebessert werden.