homebridge-econet-rheem
Version:
Homebridge plugin for control of Rheem and Ruud thermostats and water heaters
94 lines • 5.79 kB
JavaScript
import { BaseAccessory } from '../abstract/base.js';
import { strings } from '../../i18n/i18n.js';
import { CustomCharacteristicKey, HKCharacteristicKey, MQTTKey, MQTTKeys } from '../../model/enums.js';
import { HistoryType } from '../../model/history.js';
import { fromCelsius, TemperatureUnits, toCelsius } from '../../tools/temperature.js';
export function TemperatureDefaults(setPoint, lowerLimit, upperLimit) {
return { setPoint, lowerLimit, upperLimit };
}
export class TemperatureControlAccessory extends BaseAccessory {
defaults;
units;
constructor(dependency, data, defaults) {
super(dependency, data);
this.defaults = defaults;
this.units = data['@SETPOINT']?.constraints?.units?.includes('F') ? TemperatureUnits.FAHRENHEIT : TemperatureUnits.CELSIUS;
const temperatureDisplayUnits = this.units === TemperatureUnits.FAHRENHEIT ?
dependency.Characteristic.TemperatureDisplayUnits.FAHRENHEIT : dependency.Characteristic.TemperatureDisplayUnits.CELSIUS;
this.setCharacteristicValue(HKCharacteristicKey.TemperatureDisplayUnits, temperatureDisplayUnits);
const setPoint = data['@SETPOINT']?.value ? toCelsius(data['@SETPOINT']?.value, this.units) : defaults.setPoint;
const startingTemperature = (this.isDeviceAuth ? this.getProperty(HKCharacteristicKey.CurrentTemperature) : setPoint) ?? setPoint;
this.setup(HKCharacteristicKey.CurrentTemperature, startingTemperature, MQTTKeys(MQTTKey.CURRENT_TEMP_D, MQTTKey.SETPOINT_U), this.bindOnUpdateTemperature(HKCharacteristicKey.CurrentTemperature, this.units, strings.temperatureControl.current, (value) => {
this.recordHistory(HistoryType.WEATHER, { temp: value });
}));
this.recordHistory(HistoryType.WEATHER, { temp: startingTemperature });
const hasAlert = typeof data['@ALERTCOUNT'] === 'number' && data['@ALERTCOUNT'] > 0;
const faultStatus = hasAlert ? this.Characteristic.StatusFault.GENERAL_FAULT : this.Characteristic.StatusFault.NO_FAULT;
this.setup(HKCharacteristicKey.StatusFault, faultStatus, MQTTKeys(MQTTKey.ALERT_COUNT_D, MQTTKey.ALERT_COUNT_U), this.bindOnAlertCountUpdate());
this.setUpdateHandler(MQTTKeys(MQTTKey.ALARM_D, MQTTKey.UNDEFINED), this.bindOnAlarmUpdate());
}
setupThreshold(charKey, setPoint, mqttKeys) {
const setpointValue = setPoint?.value ? toCelsius(setPoint?.value, this.units) : this.defaults.setPoint;
const minimum = setPoint?.constraints?.lowerLimit ? toCelsius(setPoint?.constraints.lowerLimit, this.units) : this.defaults.lowerLimit;
const maximum = setPoint?.constraints?.upperLimit ? toCelsius(setPoint?.constraints.upperLimit, this.units) : this.defaults.upperLimit;
this.service.getCharacteristic(this.characteristicFromKey(charKey))
.setProps({ maxValue: maximum, minStep: 0.1 })
.setValue(setpointValue)
.setProps({ minValue: minimum });
this.setup(charKey, setpointValue, mqttKeys, this.bindOnUpdateTemperature(charKey, this.units, strings.temperatureControl.target), this.bindOnSetTemperature(charKey, this.units, mqttKeys, strings.temperatureControl.targetSet, true));
return { minimum, maximum };
}
bindOnAlertCountUpdate() {
return (async (value) => {
if (typeof value !== 'number') {
this.log.error(strings.accessory.badValue, this.name, 'number', HKCharacteristicKey.StatusFault, `${JSON.stringify(value)}`);
return;
}
const hasAlert = value > 0;
const faultStatus = hasAlert ? this.Characteristic.StatusFault.GENERAL_FAULT : this.Characteristic.StatusFault.NO_FAULT;
if (this.onUpdate(HKCharacteristicKey.StatusFault, faultStatus) && hasAlert) {
this.log.warning(strings.accessory.alert, this.name);
}
}).bind(this);
}
bindOnAlarmUpdate() {
return (async (value) => {
if (typeof value !== 'string') {
this.log.error(strings.accessory.badValue, this.name, 'string', CustomCharacteristicKey.AlarmDescription, `${JSON.stringify(value)}`);
return;
}
const alarmDescription = value.trim();
if (value === this.getProperty(CustomCharacteristicKey.AlarmDescription)) {
return;
}
this.setProperty(CustomCharacteristicKey.AlarmDescription, value);
if (alarmDescription.length > 0) {
this.log.warning(`${this.name} - ${alarmDescription}`);
}
}).bind(this);
}
bindOnUpdateTemperature(charKey, units, logTemplate, callback) {
return (async (value) => {
if (typeof value !== 'number') {
this.log.error(strings.accessory.badValue, this.name, 'number', charKey, `'${value}'`);
return;
}
const temperature = toCelsius(value, units);
const logString = logTemplate.replace('%d°%s', `${value}°${units}`);
this.onUpdate(charKey, temperature, logString);
callback?.(temperature);
}).bind(this);
}
bindOnSetTemperature(charKey, units, mqttKeys, logTemplate, debounce = false) {
return (async (value) => {
if (typeof value !== 'number') {
this.log.error(strings.accessory.badValue, this.name, 'number', charKey, `'${value}'`);
return;
}
logTemplate = logTemplate.replace('%d°%s', `%d°${units}`);
const publish = fromCelsius(value, units);
this.onSetNumeric(charKey, mqttKeys, value, publish, logTemplate, debounce);
}).bind(this);
}
}
//# sourceMappingURL=temperatureControl.js.map