NEWS
[Adapter] Sonoff- Tasmota
-
Diese Fehler "Error: This socket has been ended by the other party" hatte ich auch eine zeitlang täglich im ioBroker log,
jedoch seit 2 Wochen nicht mehr.
Die Lösung war aber etwas kompliziert, da ich meine "eigene" Firmware geflasht habe.
1.) Die Sonoffs per FTDI komoplett löschen mit einem leeren 1MB-bin-File.
2.) Die letzte Firmware aus dem Tasmota-Repo geholt (war die 5.12d).
3.) Diese Firmware dann in Atom.io/Platform.io eingebunden und die Datei
user_config.h auf meine Bedürfnisse angepat (insbes. die Webeinstellungen).
USE_DOMOTICZ und USE_HOME_ASSISTANT dabei auch auskommentiert.
MY_LANGUAGE auf de_DE gesetzt, damit alles schön in deutsch daher kommt.
In der IDE kann man nun alles bauen lassen.
Oder eben einzeln per FTDI flashen.
Seitdem hatte ich keinen einzigen dieser Fehler mehr.
Wichtig ist eben nur Tasmota 5.12.d zu verwenden oder aber die 5.11.1,
da es mit der 5.12.0 Probleme damit gibt.
Jedoch kann es dann noch zu Problemen kommen, daß der Sonoff-Adapter irgendwann mal
die Verbindung verliert und dann wieder kein Connect hinbekommt, obwohl der Sonoff selber
noch fleißig schickt.
Im Datenpunkt "sonoff.0.info.connection" kann man auch sehen, welche Sonoffs verbunden sind.
Meist verbinden sich die Sonoffs dann gleich wieder; aber selten eben auch nicht mehr,
obwohl der Sonoff noch funktioniert.
Dafür habe ich dann ein Skript geschrieben, was mir dann einen Neustart ermöglich.
Bei mir sieht das zwar anders aus als üblich, da ich virtuelle Geräte verwenden (Forum-Suche nach virtualDevice),
aber vielleicht hilft das ja etwas.
! ```
`// definierte Hosts
var devices = [];
devices.push({hostName: 'sonoff1', virtual: 'virtualDevice.Schalter.Sonoff1'});
! // bei Änderung an connections auslösen
on('sonoff.0.info.connection', function (obj) {
var connections = obj.state.val;
! // prüfe ob jedes Gerät noch verbunden ist
for (var i = 0; i < devices.length; i++) {var hostName = devices[i].hostName; var virtual = devices[i].virtual;
! if (connections.indexOf(hostName) == -1) {
// CASE: Gerät nicht verbunden
! var delays = getStateDelayed(virtual+'.reconnects');
if ((delays.length === 0) && (getState(virtual+'.reconnects').val === 0)) {
// setze reconnects in 3 Minuten auf 1
setStateDelayed(virtual+'.reconnects', 1, true, 180000);
}
} else {
// CASE: Gerät verbunden// lösche laufende schedules und counter clearStateDelayed(virtual+'.reconnects') setStateIfChanged(virtual+'.reconnects', 0, true); } }
})
! // bei Skriptstart
for (var i = 0; i < devices.length; i++) {
var virtualDevice = devices[i].virtual;
log('Create subscription for ' + virtualDevice, 'debug');
! on({id: 'javascript.'+instance+'.'+virtualDevice+'.reconnects', change: 'gt'}, function (obj) {
var virtual = obj.id.replace('javascript.0.','').replace('.reconnects','');
var reconnects = obj.state.val;if (reconnects === 4) { // nach 3 erfolglosen Reconnect-Versuchen Push-Over-Nachrichten versenden sendTo('pushover', { title : 'Sonoff-Neustart erfolglos', message: virtual }); } else if (reconnects < 4) { log('Neustart von Sonoff: ' + virtual); var ip = getState(virtual+'.ipAddress').val;
! request('http://'+ip+'/cm?cmnd=Restart 1', function(error, response, body) {
if (error || response.statusCode !== 200) {
log('Fehler beim Neustart von Sonoff: ' + virtual + ' (StatusCode = ' + response.statusCode + ')');
}
// erhöhe reconnects in 3 Minuten um 1
setStateDelayed(virtual+'.reconnects', reconnects+1, true, 180000);
});
}
});
}`
! Aber im Grunde sehe ich das Problem beim Sonoff-Adaper, da er Meldungen vom Sonoff machmal anscheinend verschluckt.
! Genauso wie das "alive" auch nicht wirklich funktioniert.[/i][/i][/i] -
Vielen Dank für die Impulse zum workaround.
Deine Beobachtungen kann ich nur bestätigen. Und ich teile Deine Meinung, daß das Thema am besten beim Adapter zu beseitigen oder zumindest zu mitigieren ist.
Ist das bei Dir auch so, daß vom "abgehängten" Sonoff weiterhin Botschaften empfangen werden? Spätestens dann könnte man den Adapter neu starten.
-
Danke für die Tipps.
Drücke dir die Daumen das das Problem lösen konntest.
Nach dem selben Weg bin ich auf vorgegangen. Hatte dann ca 3 Wochen Ruhe und ohne das ich was an den Sonoff geändert habe ging das Problem wieder los.
Werde ma die neuste Firmware Flaschen und die Daumen drücken.
Mfg Timm
-
Bei mir ist das Problem auch so, daß der Sonoff was schickt, aber der Adapter nix verarbeitet.
Der Sonoff erscheint nicht mehr unter "sonoff.0.info.connection".
Und wenn der da nicht mehr drin ist (auch wenn der per Web noch erreichbar ist),
dann meldet der Sonoff-Adapter beim Sendern auch den Fehler, daß der Sonoff nicht verbunden ist.
Wird wohl vor jedem senden geprüft, ob der Sonoff in der connections-Liste drin ist; anstatt auf
das ALIVE des Sonoff zu setzen oder dergleichen.
Mein Skript habe ich eben noch mal umgeschrieben, so daß es von jedem verwendet werden kann.
Es erzeugt dann ein paar neue States im Javascript-Adapter und darüber funzt dann der Neustart.
Einzugtragen sind nur alle Geräte, die man im Sonoff-Adapter hat; könnte man sicherlich auch eleganter lösen,
so daß man nicht alle Sonoffs eintragen muß, aber da es bei mir anderes benutzt wird, sollte das reichen.
Hab das Skript nun aber nicht ausführlich getestet, sondern lediglich umgeschrieben
und geprüft, damit es lauffähig ist.
! ```
`// definierte devices
var devices = [];
devices.push('sonoff_1');
! // bei Änderung an connections auslösen
on('sonoff.0.info.connection', function (obj) {
var connections = obj.state.val;
! // prüfe ob jedes Gerät noch verbunden ist
for (var i = 0; i < devices.length; i++) {
var deviceName = devices[i];
! if (connections.indexOf(deviceName) == -1) {
// CASE: Gerät nicht verbunden
! var delays = getStateDelayed('sonoff.reconnects.'+deviceName);
if ((delays.length === 0) && (getState('sonoff.reconnects.'+deviceName).val === 0)) {
// setze reconnects in 3 Minuten auf 1, wenn keine Delay läuft und reconnects=0 ist
setStateDelayed('sonoff.reconnects.'+deviceName, 1, true, 180000);
}
} else {
// CASE: Gerät verbunden// lösche laufende schedules und counter clearStateDelayed('sonoff.reconnects.'+deviceName); setState('sonoff.reconnects.'+deviceName, 0, true); } }
})
! // bei Skriptstart
for (var i = 0; i < devices.length; i++) {
var deviceName = devices[i];
log('Create subscription for ' + deviceName, 'debug');
createState('sonoff.reconnects.'+deviceName, 0, {type: 'number', read: true, write: false, role: 'value', name: deviceName});
! on({id: 'javascript.0.sonoff.reconnects.'+deviceName, change: 'gt'}, function (obj) {
var sonoffDevice = obj.id.replace('javascript.0.sonoff.reconnects.','');
var reconnects = obj.state.val;if (reconnects === 4) { // nach 3 erfolglosen Reconnect-Versuchen Push-Over-Nachricht versenden sendTo('pushover', { title : 'Sonoff-Neustart erfolglos', message: virtual }); } else if (reconnects < 4) { log('Neustart von Sonoff: ' + sonoffDevice); var ip = getState('sonoff.0.'+sonoffDevice+'.INFO.IPAddress').val;
! request('http://'+ip+'/cm?cmnd=Restart 1', function(error, response, body) {
if (error || response.statusCode !== 200) {
log('Fehler beim Neustart von Sonoff: ' + sonoffDevice + ' (StatusCode = ' + response.statusCode + ')');
}
// erhöhe reconnects in 3 Minuten um 1
setStateDelayed('sonoff.reconnects.'+sonoffDevice, reconnects+1, true, 180000);
});
}
});
}` [/i][/i] -
Einzugtragen sind nur alle Geräte, die man im Sonoff-Adapter hat; könnte man sicherlich auch eleganter lösen,
so daß man nicht alle Sonoffs eintragen muß, aber da es bei mir anderes benutzt wird, sollte das reichen. `
Danke erstmal für die Mühe.
Kannst du mir bitte noch verraten wo und in welcher Form ich die Geräte eintragen muss.
Würd das Skript gerne mal testen.
Mfg Timm
-
Die Geräte stehen automatisch in der Liste
sonoff.0.info.connection
Wenn sich an dieser Liste was ändert, wird das Skript getriggert.
-
Kannst du mir bitte noch verraten wo und in welcher Form ich die Geräte eintragen muss. `
Eingetragen werden die direkt im Skript.
Wenn Du z.B. Sonoffs hast (also das was Du unter sonoff.0 siehst)
die da lauten: wc-lampe,flur-licht,..
Dann mußt Du im Skript am Anfang folgendes ergänzen.
devices.push('wc-lampe'); devices.push('flur-licht');
Das eine Device was da bereits im Skript steht ist nur zur Verdeutlichung
und kann gelöscht werden.
Die Namen entsprechen genau den Namen, die Du auf den Sonoffs
bei den MQTT-Einstellungen vergeben hast.
-
Danke …
Hab es mal so eingetragen und Teste jetzt. Ich melde mich mal wie es läuft.
schönen Abend noch Timm
-
Ich habe in Zeile 67 eine Fehlermeldung: "Don't make functions within a loop"
-
Hab ich auch … :-
Ist aber nur ne Warnung .... Kein Fehler .... Und funktioniert trotzdem
-
Hab glaub ich was verpasst?
Wo schreib ihr das Script hin?
-
Ja, die Funktion ist da. Ich wollte nur darauf hinweisen.
Mal sehen ob das jetzt besser wird.
Wobei ich immer noch meine Fritzbox im Verdacht habe. Die ist kaum noch zu bedienen seit IOBroker läuft.
-
Ich hab mir mal den AdapterCode angesehen und da ist mir (vielleicht) etwas aufgefallen.
Vielleicht kannst Du da den Fehler erkennen .. oder ich habe noch nicht die Logik von Javascript und Adaptern komplett kapiert.
Oder meine Erkenntnisse sind voll daneben oder passen eben nicht; und bei asynchronem Javascript passe ich eh meistens.
Ist ab Zeile 467 in der "lib/server.js" zu finden.
client.on('disconnect', function (/*packet*/) { if (client._sendOnStart) { clearTimeout(client._sendOnStart); client._sendOnStart = null; } adapter.log.info('Client [' + client.id + '] disconnected'); client.stream.end(); if (clients[client.id]) { delete clients[client.id]; sendLWT(client); updateClients(); } }); client.on('close', function (had_error) { if (client._sendOnStart) { clearTimeout(client._sendOnStart); client._sendOnStart = null; } if (had_error) adapter.log.error('Closed because of error'); adapter.log.info('Client [' + client.id + '] closed'); if (clients[client.id]) { delete clients[client.id]; sendLWT(client); updateClients(); } }); client.on('error', function (err) { if (client._sendOnStart) { clearTimeout(client._sendOnStart); client._sendOnStart = null; } adapter.log.warn('Client error [' + client.id + ']: ' + err); if (!clients[client.id]) return; delete clients[client.id]; sendLWT(client, function () { updateClients(); client.stream.end(); }); });
1.) Nur ne Kleinigkeit: in der client.on('error',…) die Zeile
adapter.log.warn('Client error [' + client.id + ']: ' + err);
hinter die Zeile
if (!clients[client.id]) return;
setzen.
Dann würde die Fehlermeldung nur einmal ausgegeben.
2.) Die sendLWT-Befehle sind mir noch irgendwie fremd, bzw. der Ablauf nicht ganz klar,
aber die werden in den 3 Methoden anders aufgerufen.
bei "disconnect" und "close". nämlich so:
if (clients[client.id]) { delete clients[client.id]; sendLWT(client); updateClients(); }
Bei "error" aber mittels callback:
delete clients[client.id]; sendLWT(client, function () { updateClients(); client.stream.end(); }; });
Ich würde für alle 3 Fälle disconnect,close,error erwarten, daß sowas ausreichen würde.
if (clients[client.id]) { delete clients[client.id]; updateClients(); sendLWT(client); }
Also erst Stream schließen, dann Client aus Liste löschen und dann erst LWT wieder senden.
Sind wie gesagt nur meine Erkenntnisse und ich bin auch kein Experte in Javascript,
aber es fiel mir eben ins Auge und deswegen die Frage ob das "nicht wiederverbinden"
wie hier im Thread auf den letzten Seiten beschrieben ist evtl. auf das Handling von "error" zurückzuführen ist.
Testen kann ich das aktuell auch nicht wirklich, sondern habe mich anhander
der hier geposteten Logfiles da durch gehangelt.
MfG Markus
-
@Skript-Benutzer
Wie ich selber feststellen mußte funktioniert mein Skript zu gut.
Es triggert auch, wenn der Sonoff-Adapter geschlossen wird,
da dann auch die connections zurückgesetzt werden.
Daher müßte man das Skript folgendermaßen ergänzen:
.... // bei Änderung an connections auslösen on('sonoff.0.info.connection', function (obj) { if (getState('system.adapter.sonoff.0.alive').val === false) { // Sonoff-Adapter gestoppt; nichts zu tun return; } ....
-
Soeben ist das Skript zum Einsatz gekommen.
Hat 1a funktioniert.
sonoff.0 2018-03-13 19:27:03.577 info Client [Musik_Wohnzimmer] connected javascript.0 2018-03-13 19:26:56.123 info script.js.scripte.Sonoff.Sonoff_restart: Neustart von Sonoff: Musik_Wohnzimmer sonoff.0 2018-03-13 19:23:56.083 warn Client error [Musik_Wohnzimmer]: Error: This socket has been ended by the other party sonoff.0 2018-03-13 19:23:56.083 warn Client error [Musik_Wohnzimmer]: Error: This socket has been ended by the other party sonoff.0 2018-03-13 19:23:56.082 warn Client error [Musik_Wohnzimmer]: Error: This socket has been ended by the other party sonoff.0 2018-03-13 19:23:56.081 warn Client error [Musik_Wohnzimmer]: Error: This socket has been ended by the other party sonoff.0 2018-03-13 19:23:56.081 warn Client error [Musik_Wohnzimmer]: Error: This socket has been ended by the other party sonoff.0 2018-03-13 19:23:56.080 warn Client error [Musik_Wohnzimmer]: Error: This socket has been ended by the other party
Vielen Dank!
Hoffe trotzdem das Bluefox etwas Zeit hat um sich den Adapter mal anzusehen.
Mfg Timm
-
Im Github vom Tasmota hatten einige Probleme mit Neustarts und haben eine Lösung gefunden.
-
Danke für die Info Walter,
das Problem dort betrifft aber nur Neustarts und DNS-Auflösung;
also Eingabe von IP (192.168.12.12) statt Name (iobroker.myhost.de) wäre dann zu verwenden.
Hier in diesem Thread geht es aber um Verlust der Connection aus undefinierten Gründen.
Das Problem ist hier, daß ioBroker zu jedem Sonoff eine dauerhafte Verbindung (Input- und Outputstream),
aufrecht erhält; aber nicht mitkriegt, wenn dieser Stream aus netztechnischen Gründen abbricht
(z.B. WLAN-Aussetzer, abrupter Stromverlust eines Sonoffs etc. pp).
Der sonoff-Adapter baut dann keine neue Connection auf, denn dies ist Aufgabe des Clients.
Doch der Client (also Sonoff) sendet ja was, aber der Sonoff-Adapter kriegt reagiert darauf nicht korrekt;
so daß nur ein Neustart des Sonoff hilft … oder des Sonoff-Adapters.
MfG Markus
-
Bitte 2.0.0 direkt vom github ausprobieren?
-
Herzlichen Dank @bluefox für Deine Mühe.
Habe den 2.0.0 installiert. Man kann eine timeout Zeit einstellen, 300sec ist default.
Grundfunktion ist gegeben.
Habe einen "remote Sonoff", der über VPN angebunden ist. Habe jetzt mal VPN unterbrochen, um festzustellen, was bei einer Verbindungsstörung passiert.
-
Bei meinen Tests funktioniert es nun.
Habe den VPN Tunnel zu meinem remote Sonoff geschlossen. Der Verbindungsabbruch wurde registriert und dieser Sonoff nicht mehr alle 15 sec angepingt.
Habe die Unterbrechung > 10 min aufrecht erhalten, so daß der Sonoff sicher einen vergeblichen Sendeversuch unternommen hat. Mit dem alten Adapter hat er ab da nicht mehr auf Sonoff Kommandos reagiert.
Nach dem Wiederherstellen des VPN-Tunnels hat der Adapter den Sonoff wieder verbunden und konnte ihn ansteuern.
Ändert man whrend der Unterbrechung den Schaltzustand im Adapter geht der korrekterweise auf rot. Nach Wiederherstellen der Verbindung dauert es einige Minuten, bis sich die Schaltstellung wieder selbstständig synchronisiert und wieder schwarz wird.
Beim Umstellen des Adapters von debug auf info bekam ich einige Fehlermeldungen. Vielleicht sind bei mir einige Systemkomponenten zu alt.
!
sonoff.0 2018-03-16 23:22:25.108 info starting. Version 2.0.0 in /opt/iobroker/node_modules/iobroker.sonoff, node: v6.13.1 host.orangepiplus2e 2018-03-16 23:22:21.654 info instance system.adapter.sonoff.0 started with pid 2065 host.orangepiplus2e 2018-03-16 23:22:20.287 info instance system.adapter.sonoff.0 terminated with code 6 (uncaught exception) Caught 2018-03-16 23:22:20.286 error by controller[9]: 2018-03-16 23:22:19.171 - debug: sonoff.0 stateChange sonoff.0.SonoffS20-01.alive: {"val":false,"ack":true,"ts":1521238939099,"q":0,"from":"system.adapter.sonoff.0","lc":1521238939 Caught 2018-03-16 23:22:20.286 error by controller[8]: at Manager.ondata (/opt/iobroker/node_modules/socket.io-client/lib/manager.js:322:16) Caught 2018-03-16 23:22:20.285 error by controller[8]: at Decoder.add (/opt/iobroker/node_modules/socket.io-parser/index.js:246:12) Caught 2018-03-16 23:22:20.284 error by controller[8]: at Decoder.Emitter.emit (/opt/iobroker/node_modules/component-emitter/index.js:134:20) Caught 2018-03-16 23:22:20.284 error by controller[8]: at Decoder. (/opt/iobroker/node_modules/component-bind/index.js:21:15) Caught 2018-03-16 23:22:20.283 error by controller[8]: at Manager.ondecoded (/opt/iobroker/node_modules/socket.io-client/lib/manager.js:332:8) Caught 2018-03-16 23:22:20.283 error by controller[8]: at Manager.Emitter.emit (/opt/iobroker/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20) Caught 2018-03-16 23:22:20.282 error by controller[8]: at Manager. (/opt/iobroker/node_modules/component-bind/index.js:21:15) Caught 2018-03-16 23:22:20.281 error by controller[8]: at Socket.onpacket (/opt/iobroker/node_modules/socket.io-client/lib/socket.js:236:12) Caught 2018-03-16 23:22:20.280 error by controller[8]: at Socket.onack (/opt/iobroker/node_modules/socket.io-client/lib/socket.js:312:9) Caught 2018-03-16 23:22:20.280 error by controller[8]: at Socket.adapter.setForeignState (/opt/iobroker/node_modules/iobroker.sonoff/lib/server.js:30:36) Caught 2018-03-16 23:22:20.279 error by controller[8]: 2018-03-16 23:22:19.166 - sonoff.0 TypeError: server.destroy is not a function Caught 2018-03-16 23:22:20.278 error by controller[7]: 2018-03-16 23:22:19.162 - sonoff.0 uncaught exception: server.destroy is not a function Caught 2018-03-16 23:22:20.278 error by controller[6]: at Manager.ondata (/opt/iobroker/node_modules/socket.io-client/lib/manager.js:322:16) Caught 2018-03-16 23:22:20.277 error by controller[6]: at Decoder.add (/opt/iobroker/node_modules/socket.io-parser/index.js:246:12) Caught 2018-03-16 23:22:20.271 error by controller[6]: at Decoder.Emitter.emit (/opt/iobroker/node_modules/component-emitter/index.js:134:20) Caught 2018-03-16 23:22:20.270 error by controller[6]: at Decoder. (/opt/iobroker/node_modules/component-bind/index.js:21:15) Caught 2018-03-16 23:22:20.270 error by controller[6]: at Manager.ondecoded (/opt/iobroker/node_modules/socket.io-client/lib/manager.js:332:8) Caught 2018-03-16 23:22:20.269 error by controller[6]: at Manager.Emitter.emit (/opt/iobroker/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20) Caught 2018-03-16 23:22:20.269 error by controller[6]: at Manager. (/opt/iobroker/node_modules/component-bind/index.js:21:15) Caught 2018-03-16 23:22:20.268 error by controller[6]: at Socket.onpacket (/opt/iobroker/node_modules/socket.io-client/lib/socket.js:236:12) Caught 2018-03-16 23:22:20.267 error by controller[6]: at Socket.onack (/opt/iobroker/node_modules/socket.io-client/lib/socket.js:312:9) Caught 2018-03-16 23:22:20.267 error by controller[6]: at Socket.adapter.setForeignState (/opt/iobroker/node_modules/iobroker.sonoff/lib/server.js:30:36) Caught 2018-03-16 23:22:20.266 error by controller[6]: TypeError: server.destroy is not a function Caught 2018-03-16 23:22:20.265 error by controller[5]: 2018-03-16 23:22:19.102 - debug: sonoff.0 stateChange sonoff.0.TestSonPow.alive: {"val":false,"ack":true,"ts":1521238939092,"q":0,"from":"system.adapter.sonoff.0","lc":152123893909 Caught 2018-03-16 23:22:20.265 error by controller[4]: 2018-03-16 23:22:14.865 - debug: sonoff.0 Client [TestSonPow] pingreq Caught 2018-03-16 23:22:20.264 error by controller[3]: 2018-03-16 23:22:11.565 - debug: sonoff.0 Client [SonoffS20-01] pingreq Caught 2018-03-16 23:22:20.263 error by controller[2]: 2018-03-16 23:21:59.864 - debug: sonoff.0 Client [TestSonPow] pingreq Caught 2018-03-16 23:22:20.260 error by controller[1]: 2018-03-16 23:21:56.564 - debug: sonoff.0 Client [SonoffS20-01] pingreq sonoff.0 2018-03-16 23:22:19.170 debug stateChange sonoff.0.SonoffS20-01.alive: {"val":false,"ack":true,"ts":1521238939099,"q":0,"from":"system.adapter.sonoff.0","lc":1521238939099} sonoff.0 2018-03-16 23:22:19.166 error at Manager.ondata (/opt/iobroker/node_modules/socket.io-client/lib/manager.js:322:16) sonoff.0 2018-03-16 23:22:19.166 error at Decoder.add (/opt/iobroker/node_modules/socket.io-parser/index.js:246:12) sonoff.0 2018-03-16 23:22:19.166 error at Decoder.Emitter.emit (/opt/iobroker/node_modules/component-emitter/index.js:134:20) sonoff.0 2018-03-16 23:22:19.166 error at Decoder. (/opt/iobroker/node_modules/component-bind/index.js:21:15) sonoff.0 2018-03-16 23:22:19.166 error at Manager.ondecoded (/opt/iobroker/node_modules/socket.io-client/lib/manager.js:332:8) sonoff.0 2018-03-16 23:22:19.166 error at Manager.Emitter.emit (/opt/iobroker/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20) sonoff.0 2018-03-16 23:22:19.166 error at Manager. (/opt/iobroker/node_modules/component-bind/index.js:21:15) sonoff.0 2018-03-16 23:22:19.166 error at Socket.onpacket (/opt/iobroker/node_modules/socket.io-client/lib/socket.js:236:12) sonoff.0 2018-03-16 23:22:19.166 error at Socket.onack (/opt/iobroker/node_modules/socket.io-client/lib/socket.js:312:9) sonoff.0 2018-03-16 23:22:19.166 error at Socket.adapter.setForeignState (/opt/iobroker/node_modules/iobroker.sonoff/lib/server.js:30:36) sonoff.0 2018-03-16 23:22:19.166 error TypeError: server.destroy is not a function sonoff.0 2018-03-16 23:22:19.161 error uncaught exception: server.destroy is not a function sonoff.0 2018-03-16 23:22:19.101 debug stateChange sonoff.0.TestSonPow.alive: {"val":false,"ack":true,"ts":1521238939092,"q":0,"from":"system.adapter.sonoff.0","lc":1521238939092} host.orangepiplus2e 2018-03-16 23:22:19.027 info stopInstance system.adapter.sonoff.0 killing pid 27739 host.orangepiplus2e 2018-03-16 23:22:19.024 info stopInstance system.adapter.sonoff.0 host.orangepiplus2e 2018-03-16 23:22:18.994 info object change system.adapter.sonoff.0 !