diff --git a/src/adapter/deconz/driver/driver.ts b/src/adapter/deconz/driver/driver.ts index cf2b1a00b2..ed4293cb61 100644 --- a/src/adapter/deconz/driver/driver.ts +++ b/src/adapter/deconz/driver/driver.ts @@ -173,10 +173,6 @@ class Driver extends events.EventEmitter { return paths.length > 0 ? paths[0] : null; } - private onPortError(error: Error): void { - debug(`Port error: ${error}`); - } - private onPortClose(): void { debug('Port closed'); this.initialized = false; @@ -188,7 +184,7 @@ class Driver extends events.EventEmitter { return this.portType === 'serial' ? this.openSerialPort(baudrate) : this.openSocketPort(); } - private async openSerialPort(baudrate: number): Promise { + public openSerialPort(baudrate: number): Promise { debug(`Opening with ${this.path}`); this.serialPort = new SerialPort({path: this.path, baudRate: baudrate, autoOpen: false}); //38400 RaspBee //115200 ConBee3 @@ -200,23 +196,21 @@ class Driver extends events.EventEmitter { this.serialPort.pipe(this.parser); this.parser.on('parsed', this.onParsed); - try { - await this.serialPort.asyncOpen(); - debug('Serialport opened'); - - this.serialPort.once('close', this.onPortClose.bind(this)); - this.serialPort.once('error', this.onPortError.bind(this)); - - this.initialized = true; - } catch (error) { - this.initialized = false; - - if (this.serialPort.isOpen) { - this.serialPort.close(); - } - - throw error; - } + return new Promise((resolve, reject): void => { + this.serialPort.open(async (error: object): Promise => { + if (error) { + reject(new Error(`Error while opening serialport '${error}'`)); + this.initialized = false; + if (this.serialPort.isOpen) { + this.serialPort.close(); + } + } else { + debug('Serialport opened'); + this.initialized = true; + resolve(); + } + }); + }); } private async openSocketPort(): Promise { @@ -246,7 +240,7 @@ class Driver extends events.EventEmitter { resolve(); }); - this.socketPort.once('close', this.onPortClose.bind(this)); + this.socketPort.once('close', this.onPortClose); this.socketPort.on('error', function () { debug('Socket error'); @@ -258,27 +252,29 @@ class Driver extends events.EventEmitter { }); } - public async close(): Promise { - debug('closing'); - queue = []; - - if (this.initialized) { - this.initialized = false; - - if (this.portType === 'serial') { - try { - await this.serialPort.asyncFlushAndClose(); - } catch (error) { - this.emit('close'); - - throw error; + public close(): Promise { + return new Promise((resolve, reject): void => { + if (this.initialized) { + if (this.portType === 'serial') { + this.serialPort.flush((): void => { + this.serialPort.close((error): void => { + this.initialized = false; + error == null ? + resolve() : + reject(new Error(`Error while closing serialport '${error}'`)); + this.emit('close'); + }); + }); + } else { + this.socketPort.destroy(); + resolve(); } } else { - this.socketPort.destroy(); + resolve(); + this.emit('close'); } - } + }); - this.emit('close'); } public readParameterRequest(parameterId: number) : Promise {