UNPKG

homebridge-syntex-tuya

Version:
244 lines (186 loc) 5.82 kB
const { DimmedBulbService } = require('homebridge-syntex-dynamic-platform'); module.exports = class SynTexDimmedBulbService extends DimmedBulbService { constructor(homebridgeAccessory, deviceConfig, serviceConfig, manager) { super(homebridgeAccessory, deviceConfig, serviceConfig, manager); this.DeviceManager = manager.DeviceManager; this.min = serviceConfig.min || 10; this.max = serviceConfig.max || 100; this.changeHandler = (state) => { this.setToCurrentBrightness(state, (failed) => { if(!failed) { this.service.getCharacteristic(this.Characteristic.On).updateValue(this.value); this.service.getCharacteristic(this.Characteristic.Brightness).updateValue(this.brightness); } }); }; } getState(callback) { super.getState((value) => { if(super.hasState('value')) { this.value = value; this.logger.log('read', this.id, this.letters, '%read_state[0]% [' + this.name + '] %read_state[1]% [value: ' + value + ', brightness: ' + this.brightness + '] ( ' + this.id + ' )'); callback(null, value); } else { this.DeviceManager.getState(this).then((state) => { if(state.value != null) { this.value = state.value; super.setState(state.value, () => this.logger.log('read', this.id, this.letters, '%read_state[0]% [' + this.name + '] %read_state[1]% [value: ' + state.value + ', brightness: ' + state.brightness + '] ( ' + this.id + ' )')); } callback(null, this.value); }); } }); } setState(value, callback) { this.setToCurrentBrightness({ value }, (failed) => { if(!failed) { callback(); } else { callback(new Error('Failed')); } }); } getBrightness(callback) { super.getBrightness((brightness) => { if(super.hasState('brightness')) { this.brightness = brightness; callback(null, brightness); } else { this.DeviceManager.getState(this).then((state) => { if(state.brightness != null) { this.brightness = state.brightness; super.setBrightness(state.brightness, () => {}); } callback(null, this.brightness); }); } }); } setBrightness(brightness, callback) { this.setToCurrentBrightness({ brightness }, (failed) => { if(!failed) { callback(); } else { callback(new Error('Failed')); } }); } updateState(state) { if(!this.running) { var changed = false; if(state.value != null && !isNaN(state.value) && (!super.hasState('value') || this.value != state.value)) { this.value = this.tempState.value = state.value; super.setState(state.value, () => this.service.getCharacteristic(this.Characteristic.On).updateValue(state.value)); changed = true; } if(state.brightness != null && !isNaN(state.brightness) && (!super.hasState('brightness') || this.brightness != state.brightness)) { this.brightness = this.tempState.brightness = state.brightness; super.setBrightness(state.brightness, () => this.service.getCharacteristic(this.Characteristic.Brightness).updateValue(state.brightness)); changed = true; } if(changed) { this.logger.log('update', this.id, this.letters, '%update_state[0]% [' + this.name + '] %update_state[1]% [value: ' + this.value + ', brightness: ' + this.brightness + '] ( ' + this.id + ' )'); } this.AutomationSystem.LogikEngine.runAutomation(this, { value : this.value, brightness : this.brightness }); } } setToCurrentBrightness(state, callback) { const setPower = (resolve) => { this.DeviceManager.setState(this, this.tempState.value).then((success) => { this.offline = !success; if(success) { this.value = this.tempState.value; super.setState(this.value, () => {}); this.logger.log('update', this.id, this.letters, '%update_state[0]% [' + this.name + '] %update_state[1]% [value: ' + this.value + ', brightness: ' + this.brightness + '] ( ' + this.id + ' )'); } if(callback != null) { callback(this.offline); } this.setConnectionState(!this.offline, () => resolve(), true); this.AutomationSystem.LogikEngine.runAutomation(this, { value : this.value, brightness : this.brightness }); }); }; const setBrightness = (resolve) => { this.DeviceManager.setBrightness(this, this.tempState.brightness).then((success) => { this.offline = !success; if(success) { this.value = this.tempState.value; this.brightness = this.tempState.brightness; super.setState(this.value, () => {}); super.setBrightness(this.brightness, () => {}); this.logger.log('update', this.id, this.letters, '%update_state[0]% [' + this.name + '] %update_state[1]% [value: ' + this.value + ', brightness: ' + this.brightness + '] ( ' + this.id + ' )'); } if(callback != null) { callback(this.offline); } this.setConnectionState(!this.offline, () => resolve(), true); this.AutomationSystem.LogikEngine.runAutomation(this, { value : this.value, brightness : this.brightness }); }); }; super.setToCurrentBrightness(state, (resolve) => { if(this.tempState.value) { setBrightness(resolve); } else { setPower(resolve); } }, (resolve) => { if(this.tempState.value) { setBrightness(resolve); } else { if(callback != null) { callback(this.offline); } resolve(); } }, (resolve) => { if(callback != null) { callback(this.offline); } resolve(); }); } }