homebridge-rinnai-touch-platform
Version:
Homebridge Plugin to control heating/cooling via a Rinnai Touch WiFi Module
207 lines • 8.78 kB
JavaScript
"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