UNPKG

homebridge-lg-thinq-fanfix

Version:

A Homebridge plugin for controlling/monitoring LG ThinQ device via LG ThinQ platform.

102 lines 5.61 kB
"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