UNPKG

homebridge-bond

Version:

A homebridge plugin to control your Bond devices over the v2 API.

120 lines (119 loc) 5.09 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ShadesAccessory = void 0; const Device_1 = require("../interface/Device"); const Observer_1 = require("../Observer"); const Services_1 = require("../Services"); class ShadesAccessory { constructor(platform, accessory, bond) { this.platform = platform; this.accessory = accessory; const device = accessory.context.device; this.windowCoveringService = new Services_1.WindowCoveringService(platform, accessory); if (platform.config.include_toggle_state) { this.toggleStateService = new Services_1.ButtonService(platform, accessory, 'Toggle State', 'ToggleState'); } else { this.removeService('Toggle State'); } if (Device_1.Device.MShasPreset(device)) { this.presetService = new Services_1.ButtonService(platform, accessory, 'Preset', 'Preset'); } this.observe(bond); } updateState(state) { if (this.windowCoveringService) { // If position is available, use it, otherwise fall back to open state if (state.position !== undefined) { // Convert Bond's extended percentage (0=open, 100=closed) to HomeKit's open percentage (0=closed, 100=open) const homekitPosition = 100 - state.position; this.windowCoveringService.currentPosition.updateValue(homekitPosition); this.windowCoveringService.targetPosition.updateValue(homekitPosition); } else { this.windowCoveringService.currentPosition.updateValue(state.open === 1 ? 100 : 0); this.windowCoveringService.targetPosition.updateValue(state.open === 1 ? 100 : 0); } } } observe(bond) { const device = this.accessory.context.device; this.observeWindowCovering(bond, device); this.observePreset(bond, device); this.observeToggleState(bond, device); } observeWindowCovering(bond, device) { if (!Device_1.Device.MShasToggle(device)) { this.platform.error(this.accessory, 'ShadesAccessory does not have required ToggleOpen action.'); return; } // Set initial state bond.api.getState(device.id).then(state => { this.updateState(state); }); const props = { minValue: 0, maxValue: 100, minStep: Device_1.Device.MShasPosition(device) ? 1 : 100, }; this.windowCoveringService.targetPosition.setProps(props); Observer_1.Observer.set(this.windowCoveringService.targetPosition, (value, callback) => { if (Device_1.Device.MShasPosition(device)) { // Convert HomeKit's open percentage (0=closed, 100=open) to Bond's extended percentage (0=open, 100=closed) const bondPosition = 100 - value; bond.api.setPosition(device, bondPosition, callback) .then(() => { this.platform.debug(this.accessory, `Set position: ${bondPosition} (HomeKit: ${value})`); }) .catch((error) => { this.platform.error(this.accessory, `Error setting position: ${error}`); }); } else { // Otherwise, toggle open/closed based on target position bond.api.toggleOpen(device, callback) .then(() => { this.platform.debug(this.accessory, `Toggled open: ${value}`); }) .catch((error) => { this.platform.error(this.accessory, `Error toggling open: ${error}`); }); } }); } observePreset(bond, device) { if (!this.presetService) { return; } Observer_1.Observer.set(this.presetService.on, (_, callback) => { bond.api.preset(device, callback) .then(() => { this.platform.debug(this.accessory, 'Executed shade preset'); }) .catch((error) => { this.platform.error(this.accessory, `Error executing preset: ${error}`); }); }); } observeToggleState(bond, device) { if (!this.toggleStateService) { return; } Observer_1.Observer.set(this.toggleStateService.on, (_, callback) => { bond.api.toggleState(device, 'open', callback) .then(() => { this.platform.debug(this.accessory, `${device.name} open state toggled`); }) .catch((error) => { this.platform.error(this.accessory, `Error toggling open state: ${error}`); }); }); } removeService(serviceName) { const service = this.accessory.getService(serviceName); if (service) { this.accessory.removeService(service); } } } exports.ShadesAccessory = ShadesAccessory;