homebridge-lg-thinq-fanfix
Version:
A Homebridge plugin for controlling/monitoring LG ThinQ device via LG ThinQ platform.
102 lines • 5.61 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DishwasherStatus = void 0;
const baseDevice_1 = require("../baseDevice");
const WasherDryer_1 = require("./WasherDryer");
class Dishwasher extends baseDevice_1.baseDevice {
constructor(platform, accessory) {
super(platform, accessory);
this.platform = platform;
this.accessory = accessory;
this.isRunning = false;
const { Service: { Valve, ContactSensor, OccupancySensor, }, Characteristic, } = this.platform;
const device = accessory.context.device;
this.serviceDishwasher = accessory.getService(Valve) || accessory.addService(Valve, 'Dishwasher');
this.serviceDishwasher.setCharacteristic(Characteristic.Name, device.name);
this.serviceDishwasher.setCharacteristic(Characteristic.ValveType, Characteristic.ValveType.WATER_FAUCET);
this.serviceDishwasher.getCharacteristic(Characteristic.Active)
.onSet(this.setActive.bind(this))
.updateValue(Characteristic.Active.INACTIVE);
this.serviceDishwasher.setCharacteristic(Characteristic.InUse, Characteristic.InUse.NOT_IN_USE);
this.serviceDishwasher.getCharacteristic(Characteristic.RemainingDuration).setProps({
maxValue: 86400, // 1 day
});
// Door open state
this.serviceDoorOpened = accessory.getService(ContactSensor) || accessory.addService(ContactSensor, 'Dishwasher Door');
this.serviceEventFinished = accessory.getService(OccupancySensor);
if (this.config.dishwasher_trigger) {
this.serviceEventFinished = this.serviceEventFinished || accessory.addService(OccupancySensor, device.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);
}
}
setActive() {
throw new this.platform.api.hap.HapStatusError(-70412 /* this.platform.api.hap.HAPStatus.NOT_ALLOWED_IN_CURRENT_STATE */);
}
updateAccessoryCharacteristic(device) {
super.updateAccessoryCharacteristic(device);
const { Characteristic } = this.platform;
const prevRemainDuration = this.serviceDishwasher.getCharacteristic(Characteristic.RemainingDuration).value;
if (this.Status.remainDuration !== prevRemainDuration) {
this.serviceDishwasher.updateCharacteristic(Characteristic.RemainingDuration, this.Status.remainDuration);
}
this.serviceDishwasher.updateCharacteristic(Characteristic.Active, this.Status.isPowerOn ? 1 : 0);
this.serviceDishwasher.updateCharacteristic(Characteristic.InUse, this.Status.isRunning ? 1 : 0);
if (this.serviceDoorOpened) {
const contactSensorValue = this.Status.isDoorClosed ?
Characteristic.ContactSensorState.CONTACT_DETECTED : Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
this.serviceDoorOpened.updateCharacteristic(Characteristic.ContactSensorState, contactSensorValue);
}
}
get Status() {
var _a;
return new DishwasherStatus((_a = this.accessory.context.device.snapshot) === null || _a === void 0 ? void 0 : _a.dishwasher, this.accessory.context.device.deviceModel);
}
get config() {
return Object.assign({}, {
dishwasher_trigger: false,
}, super.config);
}
update(snapshot) {
super.update(snapshot);
const dishwasher = snapshot.dishwasher;
if (!dishwasher) {
return;
}
// when washer state is changed
if (this.config.dishwasher_trigger && this.serviceEventFinished && 'state' in dishwasher) {
const { Characteristic: { OccupancyDetected, }, } = this.platform;
// detect if washer program in done
if ((['END'].includes(dishwasher.state)) || (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 dishwasher program is start
if (this.Status.isRunning && !this.isRunning) {
this.serviceEventFinished.updateCharacteristic(OccupancyDetected, OccupancyDetected.OCCUPANCY_NOT_DETECTED);
this.isRunning = true;
}
}
}
}
exports.default = Dishwasher;
// re-use some status in washer
class DishwasherStatus extends WasherDryer_1.WasherDryerStatus {
get isRunning() {
var _a;
return this.isPowerOn && ((_a = this.data) === null || _a === void 0 ? void 0 : _a.state) === this.deviceModel.lookupMonitorName('state', '@DW_STATE_RUNNING_W');
}
get isDoorClosed() {
var _a;
return ((_a = this.data) === null || _a === void 0 ? void 0 : _a.door) === this.deviceModel.lookupMonitorName('door', '@CP_OFF_EN_W');
}
}
exports.DishwasherStatus = DishwasherStatus;
//# sourceMappingURL=Dishwasher.js.map