soef / ioBroker.tr-064

tr-64 Adapter for ioBroker
MIT License
21 stars 9 forks source link

Anwesenheitserkennung: Adapter stürzt ab, wenn nicht alle WLAN-Arten angeschaltet sind #48

Closed genovoxx closed 6 years ago

genovoxx commented 7 years ago

Habe auf einen Post im iobroker Forum hin und meinen eigenen Erfahrungen mal einen Blick in den Quellcode geworfen und den debugger angeworfen, da der Adapter bei der Initialisierung die aktiven/inaktiven Devices korrekt erkennt, danach aber keine Änderungen wahrnimmt. Der Fehler entsteht wie folgt: Bei der Initialisierung des Adapters fragt dieser alle vorkommenden WLAN-Arten (Wlan24, Wlan50, WlanGuest) ab. Wenn einer dieser WLANs abgeschaltet ist in der Fritzbox, läuft der Adapter zwangsläufig in einen Error und bricht die Intialisierung ab, der Timer für den Refresh wird nicht gesetzt. Idee: Bei der Intialisierung prüfen, ob die betreffende WLAN-Art in der Fritzbox aktiviert ist, sonst nicht mehr abfragen.

Viele Grüße, Christian

soef commented 6 years ago

Hallo, wo genau tritt der Fehler auf, der dazu führt, das der Refresh-Timer nicht mehr gesetzt wird. Welches abgeschaltetes WLAN verursacht den Fehler?

genovoxx commented 6 years ago

Moin,

mal sehen, ob ich es ordentlich erklären kann :-)

Zunächst legen Sie ja alle 4 Devicetypen an und laden sie in den names array:

{ func: 'getExternalIPAddress', state: states.externalIP.name, result: 'NewExternalIPAddress', format: function (val) { return val; }}, { func: 'getWLAN', state: states.wlan24.name, result: 'NewEnable', format: function (val) { return !!(val >> 0);}} { func: 'getWLAN5', state: states.wlan50.name, result: 'NewEnable', format: function (val) { return !!(val >> 0);}},

{ func: 'getWLANGuest', state: states.wlanGuest.name, result: 'NewEnable', format: function (val) { return !!(val >> 0);}}

Danach iterieren Sie über names und fragen die Devicestates ab:

var name = names[i++]; if (!tr064Client[name.func]) { return doIt(); } tr064Client[name.func] ( function (err, res) { if (!err && res) { devStates.set(name.state, name.format ? name.format(res[name.result]) : name.result); } setTimeout(doIt, 10); });

Wenn allerdings einer der 4 Devicetypes nicht angeschaltet war (bei mir das 5GHz WLAN, bei einem anderen User in diesem Thread http://downloads.iobroker.com/forum/viewtopic.php?f=20&t=7107&p=93046&sid=ab26c6102465b3d414ec34cf9467a8fb#p93046 war es das WLANGuest) dann wird das wohl beim Funktionen anlegen nicht bemerkt, aber dann schlägt der Aufruf tr064.client(name.func) fehl und die Funktion steigt aus.

Da Sie dann ja (verständlicher Weise) erst nach (erfolgreichem) Durchlauf von alle 4 Devicetypes den Timer setzen für den Refresh:

if (i >= names.length) {...

kommt er dort nie an, da i nie >= names.length wird.

Da ich das 5GHz WLAN nicht nutzen möchte (sonst kommt das alte iPhone meiner Frau nicht mehr ins WLAN laut FritzBox), habe ich mir zunächst so erfolgreich beholfen:

{ func: 'getExternalIPAddress', state: states.externalIP.name, result: 'NewExternalIPAddress', format: function (val) { return val; }}, { func: 'getWLAN', state: states.wlan24.name, result: 'NewEnable', format: function (val) { return !!(val >> 0);}} // { func: 'getWLAN5', state: states.wlan50.name, result: 'NewEnable', format: function (val) { return !!(val >> 0);}}, // { func: 'getWLANGuest', state: states.wlanGuest.name, result: 'NewEnable', format: function (val) { return !!(val >> 0);}}

Ich habe aus Zeitmangel nicht weiter gemacht, man müsste wahrscheinlich einfach den names array nur um solche Funktionen erweitern, die von der Fritzbox auch als angeschaltet gemeldet werden, oder?

Hoffe, das war einiger Maßen verständlich?

Ansonsten ein toller Adapter, habe schon einige Skripte meiner Homeautomation erstellt, die auf der Anwesenheitserkennung über tr64 basieren und sehr gut laufen :-) - Vielen Dank!

Viele Grüße, Ihr Christian Hennig

ZELLKRAFTWERK GmbH | Christian Hennig MD | CSO | Fon: +49-511-5324168 | Fax: +49-511-87429053 | Cell: +49-175-4155794 | www.zellkraftwerk.com

Am 1. November 2017 um 19:42 schrieb Soef notifications@github.com:

Hallo, wo genau tritt der Fehler auf, der dazu führt, das der Refresh-Timer nicht mehr gesetzt wird. Welches abgeschaltetes WLAN verursacht den Fehler?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/soef/ioBroker.tr-064/issues/48#issuecomment-341200735, or mute the thread https://github.com/notifications/unsubscribe-auth/AfvdfL5jbtTnuP-RLAyn5tuVAxmQhbvbks5syLuBgaJpZM4QOFCd .

soef commented 6 years ago

Hallo,

ich kann das Problem zwar nicht nachvollziehen (bei mir funktioniert der Aufruf von getWLANGuest auch bei abgeschaltetem Guest-WLAN), aber ich habe einmal zwei Änderungen vorgenommen. Könnt ihr einmal schauen, ob es nun auch bei euch funktioniert? PS.: Welche Fritzbox habt ihr im Einsatz?

Viele Grüße.

genovoxx commented 6 years ago

Jepp, damit geht's, er refreshed den Status und merkt innerhalb weniger sekunden, wenn das Gerät ausgebucht ist:

Meine Fritzbox ist ein 6360 cable, was Heiko aus dem Thread für eine hat, weiss ich leider nicht.

Viele Grüße, Christian

ZELLKRAFTWERK GmbH | Christian Hennig MD | CSO | Fon: +49-511-5324168 | Fax: +49-511-87429053 | Cell: +49-175-4155794 | www.zellkraftwerk.com

Am 3. November 2017 um 08:44 schrieb Soef notifications@github.com:

Hallo,

ich kann das Problem zwar nicht nachvollziehen (bei mir funktioniert der Aufruf von getWLANGuest auch bei abgeschaltetem Guest-WLAN), aber ich habe einmal zwei Änderungen vorgenommen. Könnt ihr einmal schauen, ob es nun auch bei euch funktioniert? PS.: Welche Fritzbox habt ihr im Einsatz?

Viele Grüße.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/soef/ioBroker.tr-064/issues/48#issuecomment-341638345, or mute the thread https://github.com/notifications/unsubscribe-auth/AfvdfGrN2nP8EBvoR-mqgquAUOzxZ7SVks5sysRSgaJpZM4QOFCd .

Falk2109 commented 6 years ago

Hallo, vielen Dank, dass ihr euch dem Thema angenommen habt. Ich freue mich schon sehr darauf, dass bald alles funktioniert. Ich wollte den Adapter mit der neuen Funktion sofort installieren, erhalte dabei jedoch folgende Fehlermeldung.

Vielen Dank nochmal und einen schönen Abend Falk

$ ./iobroker url "https://github.com/soef/ioBroker.tr-064" install https://github.com/soef/ioBroker.tr-064/tarball/master npm install https://github.com/soef/ioBroker.tr-064/tarball/master --production --prefix "/opt/iobroker" (System call) got /opt/iobroker/node_modules/iobroker.tr-064/admin upload [2] tr-064.admin /opt/iobroker/node_modules/iobroker.tr-064/admin/words.js words.js application/javascript upload [1] tr-064.admin /opt/iobroker/node_modules/iobroker.tr-064/admin/tr-064.png tr-064.png image/png upload [0] tr-064.admin /opt/iobroker/node_modules/iobroker.tr-064/admin/index.html index.html text/html ERROR: module.js:590 throw err; ^

SyntaxError: /opt/iobroker/node_modules/iobroker.tr-064/io-package.json: Unexpected token , in JSON at position 5309 at Object.parse (native) at Object.Module._extensions..json (module.js:587:27) at Module.load (module.js:487:32) at tryModuleLoad (module.js:446:12) at Function.Module._load (module.js:438:3) at Module.require (module.js:497:17) at require (internal/module.js:20:19) at Upload.uploadAdapter (/opt/iobroker/node_modules/iobroker.js-controller/lib/setup/setupUpload.js:214:23) at /opt/iobroker/node_modules/iobroker.js-controller/lib/setup.js:675:40 at upload (/opt/iobroker/node_modules/iobroker.js-controller/lib/setup/setupUpload.js:280:57)

ERROR: process exited with code 1

genovoxx commented 6 years ago

Moin, Installer habe ich nicht getestet, habe nur die tr-064.js ausgetauscht...

Gruß Christian

ZELLKRAFTWERK GmbH | Christian Hennig MD | CSO | Fon: +49-511-5324168 | Fax: +49-511-87429053 | Cell: +49-175-4155794 | www.zellkraftwerk.com

2017-11-03 18:17 GMT+01:00 Falk2109 notifications@github.com:

Hallo, vielen Dank, dass ihr euch dem Thema angenommen habt. Ich freue mich schon sehr darauf, dass bald alles funktioniert. Ich wollte den Adapter mit der neuen Funktion sofort installieren, erhalte dabei jedoch folgende Fehlermeldung.

Vielen Dank nochmal und einen schönen Abend Falk

$ ./iobroker url "https://github.com/soef/ioBroker.tr-064" install https://github.com/soef/ioBroker.tr-064/tarball/master npm install https://github.com/soef/ioBroker.tr-064/tarball/master --production --prefix "/opt/iobroker" (System call) got /opt/iobroker/node_modules/iobroker.tr-064/admin upload [2] tr-064.admin /opt/iobroker/node_modules/iobroker.tr-064/admin/words.js words.js application/javascript upload [1] tr-064.admin /opt/iobroker/node_modules/ iobroker.tr-064/admin/tr-064.png tr-064.png image/png upload [0] tr-064.admin /opt/iobroker/node_modules/ iobroker.tr-064/admin/index.html index.html text/html ERROR: module.js:590 throw err; ^

SyntaxError: /opt/iobroker/node_modules/iobroker.tr-064/io-package.json: Unexpected token , in JSON at position 5309 at Object.parse (native) at Object.Module._extensions..json (module.js:587:27) at Module.load (module.js:487:32) at tryModuleLoad (module.js:446:12) at Function.Module._load (module.js:438:3) at Module.require (module.js:497:17) at require (internal/module.js:20:19) at Upload.uploadAdapter (/opt/iobroker/node_modules/ iobroker.js-controller/lib/setup/setupUpload.js:214:23) at /opt/iobroker/node_modules/iobroker.js-controller/lib/setup.js:675:40 at upload (/opt/iobroker/node_modules/iobroker.js-controller/lib/ setup/setupUpload.js:280:57)

ERROR: process exited with code 1

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/soef/ioBroker.tr-064/issues/48#issuecomment-341769812, or mute the thread https://github.com/notifications/unsubscribe-auth/AfvdfGoGLQ30cl1U_P1bjqn--TGDmAUJks5sy0qvgaJpZM4QOFCd .

soef commented 6 years ago

Oh, da war die io-package.json zerschossen. Ist in 0.4.9 korrigiert.