UNPKG

homebridge-econet-rheem

Version:

Homebridge plugin for control of Rheem and Ruud thermostats and water heaters

129 lines 5.67 kB
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js'; import { initEveCharacteristics } from '../accessory/characteristic/eve.js'; import { createAccessory } from '../accessory/abstract/helper.js'; import { DeviceAuth, UserAuth } from '../model/auth.js'; import { EconetApi } from '../model/http.js'; import { History } from '../model/history.js'; import { setLanguage, strings } from '../i18n/i18n.js'; import { Log } from '../tools/log.js'; import { Properties } from '../tools/properties.js'; import getVersion from '../tools/version.js'; export class EconetRheemPlatform { config; api; log; platformAccessories = new Map(); accessories = []; constructor(logger, config, api) { this.config = config; this.api = api; setLanguage(api.user.configPath()); this.log = new Log(logger, config.debug === true); this.log.ifDebug('v%s | System %s | Node %s | HB v%s | HAPNodeJS v%s', getVersion(), process.platform, process.version, api.serverVersion, api.hap.HAPLibraryVersion()); initEveCharacteristics(api); this.api.on('didFinishLaunching', () => { this.setup(); }); this.api.on('shutdown', () => { this.teardown(); }); } configureAccessory(accessory) { this.log.ifDebug(strings.startup.restoringDevice, accessory.displayName); this.platformAccessories.set(accessory.context.serialNumber, accessory); } teardown() { this.accessories.forEach(accessory => { accessory.teardown(); }); } async setup() { await Properties.initStorage(this.api.user.persistPath()); const email = this.config.email; const password = this.config.password; const devices = this.config.devices || []; if (!email || email.length === 0 || !password || password.length === 0) { this.log.error(strings.startup.badConfig); return; } const dependency = { log: this.log, email, password, devices, disableLogging: this.config.disableLogging === true, debug: this.config.debug === true, }; const equipmentsData = await EconetApi.connect(dependency); if (equipmentsData === undefined) { return; } if (equipmentsData.length === 0) { this.log.warning(strings.startup.noEquipment); this.teardown(); return; } const Service = this.api.hap.Service; const Characteristic = this.api.hap.Characteristic; const history = new History(this.api, this.log, this.config.enableHistory === true); const keepSerials = new Set(); const userAuth = UserAuth.load(email); if (userAuth === undefined) { this.log.error('User auth object is missing'); return; } for (const equipmentData of equipmentsData) { const name = equipmentData['@NAME']?.value ?? equipmentData.device_type; let platformAccessory = this.platformAccessories.get(equipmentData.serial_number); if (!platformAccessory) { const uuid = this.api.hap.uuid.generate(equipmentData.serial_number); platformAccessory = new this.api.platformAccessory(name, uuid); platformAccessory.context.serialNumber = equipmentData.serial_number; this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [platformAccessory]); this.platformAccessories.set(equipmentData.serial_number, platformAccessory); this.log.always(strings.startup.newEquipment, name); } if (name !== platformAccessory.displayName) { platformAccessory.updateDisplayName(name); } let deviceAuth; const device = devices.find((device) => device.serialNumber === equipmentData.serial_number); if (device !== undefined) { deviceAuth = DeviceAuth.load(equipmentData.serial_number, email); if (deviceAuth === undefined) { this.log.warning('Device auth object is missing'); } } const dependency = { Service, Characteristic, platformAccessory, log: this.log, history, disableLogging: this.config.disableLogging === true, debug: this.config.debug === true, email: this.config.email, auth: deviceAuth ?? userAuth, }; const accessory = createAccessory(dependency, equipmentData); if (accessory === undefined) { continue; } keepSerials.add(equipmentData.serial_number); this.accessories.push(accessory); this.platformAccessories.forEach(accessory => { if (!keepSerials.has(accessory.context.serialNumber)) { this.removeAccessory(accessory); } }); } const randIndex = Math.floor(Math.random() * strings.startup.welcome.length); this.log.always(`${strings.startup.complete}\n${strings.startup.welcome[randIndex]}`); } removeAccessory(accessory) { this.log.always(strings.startup.removeDevice, accessory.displayName); this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]); this.platformAccessories.delete(accessory.context.serialNumber); } } //# sourceMappingURL=platform.js.map