homebridge-econet-rheem
Version:
Homebridge plugin based on pyeconet for control of Rheem water heaters
86 lines • 4.56 kB
JavaScript
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