UNPKG

homebridge-econet-rheem

Version:

Homebridge plugin based on pyeconet for control of Rheem water heaters

86 lines 4.56 kB
import { toCelsius, fromCelsius } from '../model/utils.js'; export class WaterHeaterAccessory { platform; accessory; waterHeater; service; Characteristic; constructor(platform, accessory, waterHeater) { this.platform = platform; this.accessory = accessory; this.waterHeater = waterHeater; this.Characteristic = platform.api.hap.Characteristic; const Service = platform.api.hap.Service; this.accessory.getService(Service.AccessoryInformation) .setCharacteristic(this.Characteristic.Manufacturer, 'Rheem') .setCharacteristic(this.Characteristic.Model, 'Water Heater') .setCharacteristic(this.Characteristic.SerialNumber, this.waterHeater.serialNumber); 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.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) .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); this.service.getCharacteristic(this.Characteristic.HeatingThresholdTemperature) .setProps({ minValue: minTemp, maxValue: maxTemp, minStep: 0.1 }) .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(); this.platform.log.debug(`Received update for ${serial}, refreshed accessory state`); } } updateCharacteristics() { 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.waterHeater.units)); this.service.updateCharacteristic(this.Characteristic.HeatingThresholdTemperature, toCelsius(this.waterHeater.setPoint, this.waterHeater.units)); } 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.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; await this.waterHeater.setEnabled(enabled); } } //# sourceMappingURL=waterHeaterAccessory.js.map