UNPKG

homebridge-econet-rheem

Version:

Homebridge plugin for control of Rheem and Ruud thermostats and water heaters

94 lines 5.79 kB
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