UNPKG

homebridge-tado-ac

Version:

tado° Smart AC Control plugin for homebridge: https://github.com/nfarina/homebridge

113 lines (93 loc) 3.94 kB
const AirConditioner = require('../homekit/AirConditioner') const WeatherSensor = require('../homekit/WeatherSensor') const OccupancySensor = require('../homekit/OccupancySensor') module.exports = (platform) => { return () => { platform.devices.forEach(device => { if (!device.capabilities) return // Add AirConditioner const airConditionerIsNew = !platform.activeAccessories.find(accessory => accessory.type === 'AirConditioner' && accessory.id === device.id) if (airConditionerIsNew) { const airConditioner = new AirConditioner(device, platform) platform.activeAccessories.push(airConditioner) } }) // Add Occupancy Sensors if enabled if (platform.occupancySensorsEnabled && Array.isArray(platform.users)) { platform.users.forEach(user => { const userExists = platform.activeAccessories.find(accessory => accessory.type === 'OccupancySensor' && accessory.id === user.id) if (!userExists) { const geoTrackingEnabled = user.mobileDevices.find(device => device.settings.geoTrackingEnabled && device.location) if (geoTrackingEnabled) { const occupancySensor = new OccupancySensor(user, platform) platform.activeAccessories.push(occupancySensor) } } }) if (platform.anyoneSensor) { const anyoneSensorExists = platform.activeAccessories.find(accessory => accessory.type === 'OccupancySensor' && accessory.id === 'anyoneSensor') if (!anyoneSensorExists) { const anyoneSensor = new OccupancySensor({ id: 'anyoneSensor' }, platform) platform.activeAccessories.push(anyoneSensor) } } } // Add Weather Sensor if enabled if (platform.weatherSensorsEnabled && platform.weather) { const weatherExists = platform.activeAccessories.find(accessory => accessory.type === 'WeatherSensor') if (!weatherExists) { const weatherSensor = new WeatherSensor(platform) platform.activeAccessories.push(weatherSensor) } } // find devices to remove const accessoriesToRemove = [] platform.cachedAccessories.forEach(accessory => { if (!accessory.context.type) { accessoriesToRemove.push(accessory) platform.log.easyDebug('removing old cached accessory') return } if (accessory.services && accessory.services.length === 1) { accessoriesToRemove.push(accessory) platform.log.easyDebug('removing service only with information service') return } let deviceExists, userExists switch(accessory.context.type) { case 'AirConditioner': deviceExists = platform.devices.find(device => device.id === accessory.context.deviceId) if (!deviceExists) accessoriesToRemove.push(accessory) break case 'WeatherSensor': if (!platform.weatherSensorsEnabled) accessoriesToRemove.push(accessory) break case 'OccupancySensor': if (!platform.occupancySensorsEnabled || !platform.users) accessoriesToRemove.push(accessory) else { if (accessory.context.userId === 'anyoneSensor' && platform.anyoneSensor) break userExists = platform.users.find(user => user.id === accessory.context.userId) if (!userExists) { accessoriesToRemove.push(accessory) } } break } }) if (accessoriesToRemove.length) { platform.log.easyDebug('Unregistering Unnecessary Cached Devices:') platform.log.easyDebug(accessoriesToRemove) // unregistering accessories platform.api.unregisterPlatformAccessories(platform.PLUGIN_NAME, platform.PLATFORM_NAME, accessoriesToRemove) // remove from cachedAccessories platform.cachedAccessories = platform.cachedAccessories.filter( cachedAccessory => !accessoriesToRemove.find(accessory => accessory.UUID === cachedAccessory.UUID) ) // remove from activeAccessories platform.activeAccessories = platform.activeAccessories.filter( activeAccessory => !accessoriesToRemove.find(accessory => accessory.UUID === activeAccessory.UUID) ) } } }