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