@elshaer/homebridge-lg-thinq
Version:
A Homebridge plugin for controlling/monitoring LG ThinQ device via LG ThinQ platform.
203 lines • 11.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.WasherDryerStatus = exports.NOT_RUNNING_STATUS = void 0;
const baseDevice_1 = require("../baseDevice");
const constants_1 = require("../lib/constants");
exports.NOT_RUNNING_STATUS = ['COOLDOWN', 'POWEROFF', 'POWERFAIL', 'INITIAL', 'PAUSE', 'AUDIBLE_DIAGNOSIS', 'FIRMWARE',
'COURSE_DOWNLOAD', 'ERROR', 'END'];
class WasherDryer extends baseDevice_1.baseDevice {
constructor(platform, accessory) {
var _a;
super(platform, accessory);
this.platform = platform;
this.accessory = accessory;
this.isRunning = false;
this.isServiceTubCleanMaintenanceTriggered = false;
const { Service: { OccupancySensor, LockMechanism, Valve, }, Characteristic, Characteristic: { LockCurrentState, }, } = this.platform;
const device = accessory.context.device;
this.serviceWasherDryer = accessory.getService(Valve);
if (!this.serviceWasherDryer) {
this.serviceWasherDryer = accessory.addService(Valve, device.name, device.name);
this.serviceWasherDryer.addOptionalCharacteristic(Characteristic.ConfiguredName);
this.serviceWasherDryer.updateCharacteristic(Characteristic.ConfiguredName, device.name);
}
this.serviceWasherDryer.getCharacteristic(Characteristic.Active)
.onSet(this.setActive.bind(this))
.updateValue(Characteristic.Active.INACTIVE);
this.serviceWasherDryer.setCharacteristic(Characteristic.Name, device.name);
this.serviceWasherDryer.setCharacteristic(Characteristic.ValveType, Characteristic.ValveType.WATER_FAUCET);
this.serviceWasherDryer.setCharacteristic(Characteristic.InUse, Characteristic.InUse.NOT_IN_USE);
this.serviceWasherDryer.getCharacteristic(Characteristic.RemainingDuration).setProps({
maxValue: 86400, // 1 day
});
// only thinq2 support door lock status
this.serviceDoorLock = accessory.getService(LockMechanism);
if (this.config.washer_door_lock && device.platform === constants_1.PlatformType.ThinQ2 && 'doorLock' in ((_a = device.snapshot) === null || _a === void 0 ? void 0 : _a.washerDryer)) {
if (!this.serviceDoorLock) {
this.serviceDoorLock = accessory.addService(LockMechanism, device.name + ' - Door');
this.serviceDoorLock.addOptionalCharacteristic(Characteristic.ConfiguredName);
this.serviceDoorLock.updateCharacteristic(Characteristic.ConfiguredName, device.name + ' - Door');
}
this.serviceDoorLock.getCharacteristic(Characteristic.LockCurrentState)
.updateValue(LockCurrentState.UNSECURED)
.onSet(this.setActive.bind(this))
.setProps({
minValue: 0,
maxValue: 3,
validValues: [LockCurrentState.UNSECURED, LockCurrentState.SECURED],
});
this.serviceDoorLock.getCharacteristic(Characteristic.LockTargetState)
.onSet(this.setActive.bind(this))
.updateValue(Characteristic.LockTargetState.UNSECURED);
}
else if (this.serviceDoorLock) {
accessory.removeService(this.serviceDoorLock);
}
this.serviceEventFinished = accessory.getService('Program Finished');
if (this.config.washer_trigger) {
if (!this.serviceEventFinished) {
this.serviceEventFinished = accessory.addService(OccupancySensor, 'Program Finished', 'Program Finished');
this.serviceEventFinished.addOptionalCharacteristic(Characteristic.ConfiguredName);
this.serviceEventFinished.updateCharacteristic(Characteristic.ConfiguredName, 'Program Finished');
}
this.serviceEventFinished.setCharacteristic(Characteristic.Name, 'Program Finished');
// eslint-disable-next-line max-len
this.serviceEventFinished.updateCharacteristic(Characteristic.OccupancyDetected, Characteristic.OccupancyDetected.OCCUPANCY_NOT_DETECTED);
}
else if (this.serviceEventFinished) {
accessory.removeService(this.serviceEventFinished);
}
// tub clean coach
this.serviceTubCleanMaintenance = accessory.getService('Tub Clean Coach');
if (this.config.washer_tub_clean) {
if (!this.serviceTubCleanMaintenance) {
this.serviceTubCleanMaintenance = accessory.addService(OccupancySensor, 'Tub Clean Coach', 'Tub Clean Coach');
this.serviceTubCleanMaintenance.addOptionalCharacteristic(Characteristic.ConfiguredName);
this.serviceTubCleanMaintenance.updateCharacteristic(Characteristic.ConfiguredName, 'Tub Clean Coach');
}
this.serviceTubCleanMaintenance.setCharacteristic(Characteristic.Name, 'Tub Clean Coach');
// eslint-disable-next-line max-len
this.serviceTubCleanMaintenance.updateCharacteristic(Characteristic.OccupancyDetected, Characteristic.OccupancyDetected.OCCUPANCY_NOT_DETECTED);
this.serviceTubCleanMaintenance.setCharacteristic(Characteristic.Name, 'Tub Clean Coach');
this.serviceTubCleanMaintenance.getCharacteristic(Characteristic.ProgrammableSwitchEvent)
.setProps({
validValues: [0], // single press
});
}
else if (this.serviceTubCleanMaintenance) {
accessory.removeService(this.serviceTubCleanMaintenance);
}
}
get Status() {
var _a;
return new WasherDryerStatus((_a = this.accessory.context.device.snapshot) === null || _a === void 0 ? void 0 : _a.washerDryer, this.accessory.context.device.deviceModel);
}
get config() {
return Object.assign({}, {
washer_trigger: false,
washer_door_lock: false,
washer_tub_clean: false,
}, super.config);
}
async setActive(value) {
// do nothing, revert back
this.updateAccessoryCharacteristic(this.accessory.context.device);
}
updateAccessoryCharacteristic(device) {
super.updateAccessoryCharacteristic(device);
const { Characteristic, } = this.platform;
this.serviceWasherDryer.updateCharacteristic(Characteristic.Active, this.Status.isPowerOn ? 1 : 0);
this.serviceWasherDryer.updateCharacteristic(Characteristic.InUse, this.Status.isRunning ? 1 : 0);
const prevRemainDuration = this.serviceWasherDryer.getCharacteristic(Characteristic.RemainingDuration).value;
if (this.Status.remainDuration !== prevRemainDuration) {
this.serviceWasherDryer.updateCharacteristic(Characteristic.RemainingDuration, this.Status.remainDuration);
}
this.serviceWasherDryer.updateCharacteristic(Characteristic.StatusFault, this.Status.isError ? Characteristic.StatusFault.GENERAL_FAULT : Characteristic.StatusFault.NO_FAULT);
if (this.config.washer_door_lock && this.serviceDoorLock) {
this.serviceDoorLock.updateCharacteristic(Characteristic.LockCurrentState, this.Status.isDoorLocked ? Characteristic.LockCurrentState.SECURED : Characteristic.LockCurrentState.UNSECURED);
this.serviceDoorLock.updateCharacteristic(Characteristic.LockTargetState, this.Status.isDoorLocked ? 1 : 0);
}
}
update(snapshot) {
super.update(snapshot);
const washerDryer = snapshot.washerDryer;
if (!washerDryer) {
return;
}
const { Characteristic: { OccupancyDetected, }, } = this.platform;
// when washer state is changed
if (this.config.washer_trigger && this.serviceEventFinished
&& ('preState' in washerDryer || 'processState' in washerDryer) && 'state' in washerDryer) {
// detect if washer program in done
if ((['END', 'COOLDOWN'].includes(washerDryer.state)
&& !exports.NOT_RUNNING_STATUS.includes(washerDryer.preState || washerDryer.processState))
|| (this.isRunning && !this.Status.isRunning)) {
this.serviceEventFinished.updateCharacteristic(OccupancyDetected, OccupancyDetected.OCCUPANCY_DETECTED);
this.isRunning = false; // marked device as not running
// turn it off after 10 minute
setTimeout(() => {
this.serviceEventFinished.updateCharacteristic(OccupancyDetected, OccupancyDetected.OCCUPANCY_NOT_DETECTED);
}, 10000 * 60);
}
// detect if washer program is start
if (this.Status.isRunning && !this.isRunning) {
this.serviceEventFinished.updateCharacteristic(OccupancyDetected, OccupancyDetected.OCCUPANCY_NOT_DETECTED);
this.isRunning = true;
}
}
if ('TCLCount' in washerDryer && this.serviceTubCleanMaintenance) {
// detect if tub clean coach counter is reached
if (this.Status.TCLCount >= 30) {
this.serviceTubCleanMaintenance.updateCharacteristic(OccupancyDetected, OccupancyDetected.OCCUPANCY_DETECTED);
}
else {
// reset tub clean coach trigger flag
this.serviceTubCleanMaintenance.updateCharacteristic(OccupancyDetected, OccupancyDetected.OCCUPANCY_NOT_DETECTED);
}
}
}
}
exports.default = WasherDryer;
class WasherDryerStatus {
constructor(data, deviceModel) {
this.data = data;
this.deviceModel = deviceModel;
}
get isPowerOn() {
var _a;
return !['POWEROFF', 'POWERFAIL'].includes((_a = this.data) === null || _a === void 0 ? void 0 : _a.state);
}
get isRunning() {
var _a;
return this.isPowerOn && !exports.NOT_RUNNING_STATUS.includes((_a = this.data) === null || _a === void 0 ? void 0 : _a.state);
}
get isError() {
var _a;
return ((_a = this.data) === null || _a === void 0 ? void 0 : _a.state) === 'ERROR';
}
get isRemoteStartEnable() {
return this.data.remoteStart === this.deviceModel.lookupMonitorName('remoteStart', '@CP_ON_EN_W');
}
get isDoorLocked() {
const current = this.deviceModel.lookupMonitorName('doorLock', '@CP_ON_EN_W');
if (current === null) {
return this.data.doorLock === 'DOORLOCK_ON';
}
return this.data.doorLock === current;
}
get remainDuration() {
var _a, _b;
const remainTimeHour = ((_a = this.data) === null || _a === void 0 ? void 0 : _a.remainTimeHour) || 0, remainTimeMinute = ((_b = this.data) === null || _b === void 0 ? void 0 : _b.remainTimeMinute) || 0;
let remainingDuration = 0;
if (this.isRunning) {
remainingDuration = remainTimeHour * 3600 + remainTimeMinute * 60;
}
return remainingDuration;
}
get TCLCount() {
var _a;
return Math.min(parseInt(((_a = this.data) === null || _a === void 0 ? void 0 : _a.TCLCount) || 0), 30);
}
}
exports.WasherDryerStatus = WasherDryerStatus;
//# sourceMappingURL=WasherDryer.js.map