UNPKG

homebridge-econet-rheem

Version:

Homebridge plugin based on pyeconet for control of Rheem water heaters

117 lines 6.19 kB
import strings from '../lang/en.js'; import { TemperatureUnits } from '../model/constants.js'; import { toCelsius, fromCelsius } from '../tools/temperature.js'; import getVersion from '../tools/version.js'; export class WaterHeaterAccessory { platform; accessory; waterHeater; alwaysUseCurrentTemp; service; Characteristic; constructor(platform, accessory, waterHeater, alwaysUseCurrentTemp) { this.platform = platform; this.accessory = accessory; this.waterHeater = waterHeater; this.alwaysUseCurrentTemp = alwaysUseCurrentTemp; this.Characteristic = platform.api.hap.Characteristic; const Service = platform.api.hap.Service; this.accessory.getService(Service.AccessoryInformation) .setCharacteristic(this.Characteristic.Manufacturer, strings.brand) .setCharacteristic(this.Characteristic.Model, strings.waterHeater) .setCharacteristic(this.Characteristic.SerialNumber, this.waterHeater.serialNumber) .setCharacteristic(this.Characteristic.FirmwareRevision, getVersion()); this.service = this.accessory.getService(Service.HeaterCooler) || this.accessory.addService(Service.HeaterCooler); this.service.setCharacteristic(this.Characteristic.Name, this.waterHeater.deviceName); this.service.getCharacteristic(this.Characteristic.StatusFault) .onGet(this.getStatusFault.bind(this)); this.service.getCharacteristic(this.Characteristic.Active) .onGet(this.getActive.bind(this)) .onSet(this.setActive.bind(this)); this.service.getCharacteristic(this.Characteristic.CurrentHeaterCoolerState) .onGet(this.getCurrentState.bind(this)); this.service.getCharacteristic(this.Characteristic.TargetHeaterCoolerState) .setValue(this.Characteristic.TargetHeaterCoolerState.HEAT) .setProps({ validValues: [this.Characteristic.TargetHeaterCoolerState.HEAT] }) .onGet(this.getTargetState.bind(this)) .onSet(this.setTargetState.bind(this)); this.service.getCharacteristic(this.Characteristic.CurrentTemperature) .onGet(this.getCurrentTemperature.bind(this)); const minTemp = toCelsius(this.waterHeater.limits[0], this.waterHeater.units); const maxTemp = toCelsius(this.waterHeater.limits[1], this.waterHeater.units); const setpoint = toCelsius(this.waterHeater.setPoint, this.waterHeater.units); this.service.getCharacteristic(this.Characteristic.HeatingThresholdTemperature) .setProps({ maxValue: maxTemp, minStep: 0.1 }) .setValue(setpoint) .setProps({ minValue: minTemp }) .onGet(this.getHeatingThresholdTemperature.bind(this)) .onSet(this.setHeatingThresholdTemperature.bind(this)); this.waterHeater.setOnUpdateCallback(this.handleEquipmentUpdate.bind(this)); this.updateCharacteristics(); } handleEquipmentUpdate(serial) { if (serial === this.waterHeater.serialNumber) { this.updateCharacteristics(); } } updateCharacteristics() { this.service.updateCharacteristic(this.Characteristic.StatusFault, this.waterHeater.hasAlert ? this.Characteristic.StatusFault.GENERAL_FAULT : this.Characteristic.StatusFault.NO_FAULT); this.service.updateCharacteristic(this.Characteristic.Active, this.waterHeater.isEnabled ? 1 : 0); this.service.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, this.waterHeater.isRunning ? this.Characteristic.CurrentHeaterCoolerState.HEATING : this.Characteristic.CurrentHeaterCoolerState.IDLE); this.service.updateCharacteristic(this.Characteristic.TargetHeaterCoolerState, this.Characteristic.TargetHeaterCoolerState.HEAT); this.service.updateCharacteristic(this.Characteristic.CurrentTemperature, toCelsius(this.waterHeater.currentTemp(this.inputTemperature), this.waterHeater.units)); this.service.updateCharacteristic(this.Characteristic.HeatingThresholdTemperature, toCelsius(this.waterHeater.setPoint, this.waterHeater.units)); } async getStatusFault() { return this.waterHeater.hasAlert ? this.Characteristic.StatusFault.GENERAL_FAULT : this.Characteristic.StatusFault.NO_FAULT; } async getActive() { return this.waterHeater.isEnabled ? 1 : 0; } async getCurrentState() { return this.waterHeater.isRunning ? this.Characteristic.CurrentHeaterCoolerState.HEATING : this.Characteristic.CurrentHeaterCoolerState.IDLE; } async getTargetState() { return this.Characteristic.TargetHeaterCoolerState.HEAT; } // eslint-disable-next-line @typescript-eslint/no-unused-vars async setTargetState(value) { // Always HEAT, no-op for other states } async getCurrentTemperature() { return toCelsius(this.waterHeater.currentTemp(this.inputTemperature), this.waterHeater.units); } async getHeatingThresholdTemperature() { return toCelsius(this.waterHeater.setPoint, this.waterHeater.units); } async setHeatingThresholdTemperature(value) { const setPointC = value; const setPointNative = fromCelsius(setPointC, this.waterHeater.units); this.waterHeater.setSetPoint(setPointNative); } async setActive(value) { const enabled = value === 1; this.waterHeater.setEnabled(enabled); } get inputTemperature() { if (this.alwaysUseCurrentTemp) { return null; } const month = new Date().getMonth(); // Coldest: Jan, Feb, Dec if (month === 0 || month === 1 || month === 11) { return this.waterHeater.units === TemperatureUnits.FAHRENHEIT ? 50 : 10; } // Hottest: Jun, Jul, Aug if (month === 5 || month === 6 || month === 7) { return this.waterHeater.units === TemperatureUnits.FAHRENHEIT ? 70 : 20; } // All other months return this.waterHeater.units === TemperatureUnits.FAHRENHEIT ? 60 : 15; } } //# sourceMappingURL=waterHeaterAccessory.js.map