UNPKG

homebridge-rinnai-touch-platform

Version:

Homebridge Plugin to control heating/cooling via a Rinnai Touch WiFi Module

207 lines 8.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RinnaiTouchPlatform = void 0; const settings_1 = require("./settings"); const Settings_1 = require("./models/Settings"); const RinnaiService_1 = require("./rinnai/RinnaiService"); const AccessoryService_1 = require("./accessories/AccessoryService"); const MqttService_1 = require("./mqtt/MqttService"); const PushoverService_1 = require("./services/PushoverService"); const TemperatureService_1 = require("./services/TemperatureService"); const fs = require("fs"); const path = require("path"); class RinnaiTouchPlatform { constructor(log, config, api) { this.log = log; this.config = config; this.api = api; this.deletedAccessories = []; this.Service = this.api.hap.Service; this.Characteristic = this.api.hap.Characteristic; this._serviceInitialised = false; this._serviceInitialising = false; try { this.settings = new Settings_1.Settings(config); this.service = new RinnaiService_1.RinnaiService({ log: this.log, address: this.settings.address, port: this.settings.port, showModuleEvents: this.settings.showModuleEvents, showModuleStatus: this.settings.showModuleStatus, invertComfortLevel: this.settings.invertComfortLevel, bootTime: this.settings.bootTime, bootPassword: this.settings.bootPassword, }); this.accessoryService = new AccessoryService_1.AccessoryService(this); this.mqttService = new MqttService_1.MqttService(this); this.pushoverService = new PushoverService_1.PushoverService(this); this.temperatureService = new TemperatureService_1.TemperatureService(this); this.api.on('didFinishLaunching', () => { this.discoverDevices(); }); this.api.on('shutdown', () => { this.log.info('Shutting down plugin'); this.service.session.stop(); }); } catch (error) { if (error instanceof Error) { log.error(error.message); } } } async configureAccessory(platformAccessory) { this.log.debug(this.constructor.name, 'configureAccessory'); if (this.settings.clearCache) { this.deletedAccessories.push(platformAccessory); return; } await this.initService(); this.accessoryService.configure(platformAccessory); } async initService() { this.log.debug(this.constructor.name, 'initService'); return new Promise((resolve) => { if (this._serviceInitialised) { resolve(); } this.service.session.once('status', () => { this._serviceInitialised = true; this._serviceInitialising = false; resolve(); }); if (!this._serviceInitialising) { this._serviceInitialising = true; this.service.init(); } }); } async discoverDevices() { try { this.log.debug(this.constructor.name, 'discoverDevices'); // Clear cached accessories if required if (this.settings.clearCache) { this.log.info('Clear Cached Accessories'); this.api.unregisterPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, this.deletedAccessories); this.deletedAccessories = []; } await this.initService(); // Display discovered devices const devices = await this.getDevices(); this.displayDevices(devices); // Add/Remove accessories this.accessoryService.discover(devices); // Initialise MQTT this.mqttService.init(); // Initialise Pushover notifications this.pushoverService.init(); } catch (error) { if (error instanceof Error) { this.log.error(error.message); } } } async getDevices() { this.log.debug(this.constructor.name, 'getDevices'); let devices; const cacheFolder = path.join(this.api.user.storagePath(), 'RinnaiTouchPlatform'); const cacheFile = path.join(cacheFolder, `${this.settings.name}.json`); try { if (this.settings.forceAutoDiscovery) { this.log.info('Forcing Auto-Discovery'); } else { const content = await fs.promises.readFile(cacheFile, { encoding: 'utf8' }); this.log.info(`Read config from cache [${cacheFile}]`); devices = JSON.parse(content); } } catch (_a) { this.log.info('Performing Auto-Discovery as cache file not found'); devices = undefined; } finally { if (devices !== undefined) { if ((this.service.getHasMultiSetPoint() && devices.controllers.includes('U')) || (!this.service.getHasMultiSetPoint() && !devices.controllers.includes('U'))) { this.log.info('Performing Auto-Discovery as cache file is invalid'); devices = undefined; } } if (devices === undefined) { devices = await this.findDevices(); try { this.log.info(`Writing config to cache [${cacheFile}]`); const content = JSON.stringify(devices); await fs.promises.mkdir(cacheFolder, { recursive: true }); await fs.promises.writeFile(cacheFile, content, { encoding: 'utf8' }); } catch (error) { if (error instanceof Error) { this.log.warn(`Writing config failed [${error.message}]`); } } } } return devices; } async findDevices() { this.log.debug(this.constructor.name, 'findDevices'); const powerState = this.service.getPowerState(); const fanState = this.service.getFanState(); const operatingMode = this.service.getOperatingMode(); await this.service.setFanState(false); await this.service.setPowerState(true); const devices = { controllers: this.service.getHasMultiSetPoint() ? this.service.getZonesInstalled() : ['U'], }; if (this.service.getHasHeater()) { await this.service.setOperatingMode(RinnaiService_1.OperatingModes.HEATING); devices['heat'] = this.service.getZonesInstalled(); } if (this.service.getHasCooler()) { await this.service.setOperatingMode(RinnaiService_1.OperatingModes.COOLING); devices['cool'] = this.service.getZonesInstalled(); } if (this.service.getHasEvaporative()) { await this.service.setOperatingMode(RinnaiService_1.OperatingModes.EVAPORATIVE_COOLING); devices['evap'] = this.service.getZonesInstalled(); } await this.service.setOperatingMode(operatingMode); await this.service.setPowerState(powerState); await this.service.setFanState(fanState); return devices; } async displayDevices(devices) { this.log.debug(this.constructor.name, 'displayDevices', devices); if ('controllers' in devices) { this.log.info(`Controllers found: ${devices.controllers.length}`); for (const controller of devices.controllers) { this.log.info(` ${this.service.getZoneName(controller)}`); } } if ('heat' in devices) { this.log.info(`Gas Heater found. Zones: ${devices.heat.length}`); for (const zone of devices.heat) { this.log.info(` ${this.service.getZoneName(zone)}`); } } if ('cool' in devices) { this.log.info(`Add-On Cooler found. Zones: ${devices.cool.length}`); for (const zone of devices.cool) { this.log.info(` ${this.service.getZoneName(zone)}`); } } if ('evap' in devices) { this.log.info(`Evaporative Cooler found. Zones: ${devices.evap.length}`); for (const zone of devices.evap) { this.log.info(` ${this.service.getZoneName(zone)}`); } } } } exports.RinnaiTouchPlatform = RinnaiTouchPlatform; //# sourceMappingURL=platform.js.map