@mp-consulting/homebridge-lg-thinq 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +15 -0
- package/CHANGELOG.md +98 -0
- package/LICENSE +176 -0
- package/README.md +114 -0
- package/config.schema.json +399 -0
- package/dist/__tests__/baseDevice.spec.d.ts +1 -0
- package/dist/__tests__/baseDevice.spec.js +96 -0
- package/dist/__tests__/baseDevice.spec.js.map +1 -0
- package/dist/__tests__/deviceControl.coercion.spec.d.ts +1 -0
- package/dist/__tests__/deviceControl.coercion.spec.js +53 -0
- package/dist/__tests__/deviceControl.coercion.spec.js.map +1 -0
- package/dist/__tests__/helper.spec.d.ts +1 -0
- package/dist/__tests__/helper.spec.js +74 -0
- package/dist/__tests__/helper.spec.js.map +1 -0
- package/dist/baseDevice.d.ts +40 -0
- package/dist/baseDevice.js +85 -0
- package/dist/baseDevice.js.map +1 -0
- package/dist/baseDevice.spec.d.ts +1 -0
- package/dist/baseDevice.spec.js +107 -0
- package/dist/baseDevice.spec.js.map +1 -0
- package/dist/characteristics/TotalConsumption.d.ts +2 -0
- package/dist/characteristics/TotalConsumption.js +17 -0
- package/dist/characteristics/TotalConsumption.js.map +1 -0
- package/dist/characteristics/index.d.ts +2 -0
- package/dist/characteristics/index.js +7 -0
- package/dist/characteristics/index.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +89 -0
- package/dist/cli.js.map +1 -0
- package/dist/devices/AeroTower.d.ts +24 -0
- package/dist/devices/AeroTower.js +113 -0
- package/dist/devices/AeroTower.js.map +1 -0
- package/dist/devices/AirConditioner.d.ts +425 -0
- package/dist/devices/AirConditioner.js +1253 -0
- package/dist/devices/AirConditioner.js.map +1 -0
- package/dist/devices/AirPurifier.d.ts +50 -0
- package/dist/devices/AirPurifier.js +281 -0
- package/dist/devices/AirPurifier.js.map +1 -0
- package/dist/devices/Dehumidifier.d.ts +28 -0
- package/dist/devices/Dehumidifier.js +175 -0
- package/dist/devices/Dehumidifier.js.map +1 -0
- package/dist/devices/Dishwasher.d.ts +64 -0
- package/dist/devices/Dishwasher.js +740 -0
- package/dist/devices/Dishwasher.js.map +1 -0
- package/dist/devices/Microwave.d.ts +128 -0
- package/dist/devices/Microwave.js +1939 -0
- package/dist/devices/Microwave.js.map +1 -0
- package/dist/devices/Oven.d.ts +148 -0
- package/dist/devices/Oven.js +1850 -0
- package/dist/devices/Oven.js.map +1 -0
- package/dist/devices/RangeHood.d.ts +16 -0
- package/dist/devices/RangeHood.js +99 -0
- package/dist/devices/RangeHood.js.map +1 -0
- package/dist/devices/Refrigerator.d.ts +50 -0
- package/dist/devices/Refrigerator.js +325 -0
- package/dist/devices/Refrigerator.js.map +1 -0
- package/dist/devices/Styler.d.ts +27 -0
- package/dist/devices/Styler.js +76 -0
- package/dist/devices/Styler.js.map +1 -0
- package/dist/devices/WasherDryer.d.ts +39 -0
- package/dist/devices/WasherDryer.js +170 -0
- package/dist/devices/WasherDryer.js.map +1 -0
- package/dist/devices/WasherDryer2.d.ts +9 -0
- package/dist/devices/WasherDryer2.js +16 -0
- package/dist/devices/WasherDryer2.js.map +1 -0
- package/dist/errors/AuthenticationError.d.ts +2 -0
- package/dist/errors/AuthenticationError.js +3 -0
- package/dist/errors/AuthenticationError.js.map +1 -0
- package/dist/errors/ManualProcessNeeded.d.ts +3 -0
- package/dist/errors/ManualProcessNeeded.js +4 -0
- package/dist/errors/ManualProcessNeeded.js.map +1 -0
- package/dist/errors/MonitorError.d.ts +2 -0
- package/dist/errors/MonitorError.js +3 -0
- package/dist/errors/MonitorError.js.map +1 -0
- package/dist/errors/NotConnectedError.d.ts +3 -0
- package/dist/errors/NotConnectedError.js +4 -0
- package/dist/errors/NotConnectedError.js.map +1 -0
- package/dist/errors/TokenError.d.ts +2 -0
- package/dist/errors/TokenError.js +3 -0
- package/dist/errors/TokenError.js.map +1 -0
- package/dist/errors/TokenExpiredError.d.ts +3 -0
- package/dist/errors/TokenExpiredError.js +4 -0
- package/dist/errors/TokenExpiredError.js.map +1 -0
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/index.js +7 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/helper.d.ts +24 -0
- package/dist/helper.js +66 -0
- package/dist/helper.js.map +1 -0
- package/dist/helper.spec.d.ts +1 -0
- package/dist/helper.spec.js +74 -0
- package/dist/helper.spec.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/API.d.ts +141 -0
- package/dist/lib/API.js +362 -0
- package/dist/lib/API.js.map +1 -0
- package/dist/lib/API.spec.d.ts +1 -0
- package/dist/lib/API.spec.js +55 -0
- package/dist/lib/API.spec.js.map +1 -0
- package/dist/lib/Auth.d.ts +99 -0
- package/dist/lib/Auth.js +348 -0
- package/dist/lib/Auth.js.map +1 -0
- package/dist/lib/Auth.spec.d.ts +1 -0
- package/dist/lib/Auth.spec.js +111 -0
- package/dist/lib/Auth.spec.js.map +1 -0
- package/dist/lib/Device.d.ts +88 -0
- package/dist/lib/Device.js +95 -0
- package/dist/lib/Device.js.map +1 -0
- package/dist/lib/Device.spec.d.ts +1 -0
- package/dist/lib/Device.spec.js +53 -0
- package/dist/lib/Device.spec.js.map +1 -0
- package/dist/lib/DeviceModel.d.ts +164 -0
- package/dist/lib/DeviceModel.js +321 -0
- package/dist/lib/DeviceModel.js.map +1 -0
- package/dist/lib/DeviceModel.spec.d.ts +1 -0
- package/dist/lib/DeviceModel.spec.js +90 -0
- package/dist/lib/DeviceModel.spec.js.map +1 -0
- package/dist/lib/Gateway.d.ts +18 -0
- package/dist/lib/Gateway.js +25 -0
- package/dist/lib/Gateway.js.map +1 -0
- package/dist/lib/Gateway.spec.d.ts +1 -0
- package/dist/lib/Gateway.spec.js +35 -0
- package/dist/lib/Gateway.spec.js.map +1 -0
- package/dist/lib/Persist.d.ts +101 -0
- package/dist/lib/Persist.js +245 -0
- package/dist/lib/Persist.js.map +1 -0
- package/dist/lib/Persist.spec.d.ts +1 -0
- package/dist/lib/Persist.spec.js +90 -0
- package/dist/lib/Persist.spec.js.map +1 -0
- package/dist/lib/Session.d.ts +80 -0
- package/dist/lib/Session.js +100 -0
- package/dist/lib/Session.js.map +1 -0
- package/dist/lib/Session.spec.d.ts +1 -0
- package/dist/lib/Session.spec.js +43 -0
- package/dist/lib/Session.spec.js.map +1 -0
- package/dist/lib/ThinQ.d.ts +28 -0
- package/dist/lib/ThinQ.js +373 -0
- package/dist/lib/ThinQ.js.map +1 -0
- package/dist/lib/__tests__/API.spec.d.ts +1 -0
- package/dist/lib/__tests__/API.spec.js +55 -0
- package/dist/lib/__tests__/API.spec.js.map +1 -0
- package/dist/lib/__tests__/Auth.spec.d.ts +1 -0
- package/dist/lib/__tests__/Auth.spec.js +110 -0
- package/dist/lib/__tests__/Auth.spec.js.map +1 -0
- package/dist/lib/__tests__/Device.spec.d.ts +1 -0
- package/dist/lib/__tests__/Device.spec.js +53 -0
- package/dist/lib/__tests__/Device.spec.js.map +1 -0
- package/dist/lib/__tests__/DeviceModel.spec.d.ts +1 -0
- package/dist/lib/__tests__/DeviceModel.spec.js +90 -0
- package/dist/lib/__tests__/DeviceModel.spec.js.map +1 -0
- package/dist/lib/__tests__/Gateway.spec.d.ts +1 -0
- package/dist/lib/__tests__/Gateway.spec.js +35 -0
- package/dist/lib/__tests__/Gateway.spec.js.map +1 -0
- package/dist/lib/__tests__/Persist.spec.d.ts +1 -0
- package/dist/lib/__tests__/Persist.spec.js +90 -0
- package/dist/lib/__tests__/Persist.spec.js.map +1 -0
- package/dist/lib/__tests__/Session.spec.d.ts +1 -0
- package/dist/lib/__tests__/Session.spec.js +43 -0
- package/dist/lib/__tests__/Session.spec.js.map +1 -0
- package/dist/lib/constants.d.ts +95 -0
- package/dist/lib/constants.js +106 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/request.d.ts +2 -0
- package/dist/lib/request.js +66 -0
- package/dist/lib/request.js.map +1 -0
- package/dist/platform.d.ts +41 -0
- package/dist/platform.js +229 -0
- package/dist/platform.js.map +1 -0
- package/dist/settings.d.ts +8 -0
- package/dist/settings.js +9 -0
- package/dist/settings.js.map +1 -0
- package/dist/status/BaseStatus.d.ts +48 -0
- package/dist/status/BaseStatus.js +59 -0
- package/dist/status/BaseStatus.js.map +1 -0
- package/dist/types/snapshots.d.ts +142 -0
- package/dist/types/snapshots.js +6 -0
- package/dist/types/snapshots.js.map +1 -0
- package/dist/utils/__tests__/normalize.spec.d.ts +1 -0
- package/dist/utils/__tests__/normalize.spec.js +95 -0
- package/dist/utils/__tests__/normalize.spec.js.map +1 -0
- package/dist/utils/normalize.d.ts +22 -0
- package/dist/utils/normalize.js +51 -0
- package/dist/utils/normalize.js.map +1 -0
- package/dist/v1/__tests__/prepareControlData.spec.d.ts +1 -0
- package/dist/v1/__tests__/prepareControlData.spec.js +48 -0
- package/dist/v1/__tests__/prepareControlData.spec.js.map +1 -0
- package/dist/v1/devices/AC.d.ts +13 -0
- package/dist/v1/devices/AC.js +112 -0
- package/dist/v1/devices/AC.js.map +1 -0
- package/dist/v1/devices/AirPurifier.d.ts +15 -0
- package/dist/v1/devices/AirPurifier.js +57 -0
- package/dist/v1/devices/AirPurifier.js.map +1 -0
- package/dist/v1/devices/RangeHood.d.ts +6 -0
- package/dist/v1/devices/RangeHood.js +12 -0
- package/dist/v1/devices/RangeHood.js.map +1 -0
- package/dist/v1/devices/Refrigerator.d.ts +17 -0
- package/dist/v1/devices/Refrigerator.js +69 -0
- package/dist/v1/devices/Refrigerator.js.map +1 -0
- package/dist/v1/devices/Washer.d.ts +10 -0
- package/dist/v1/devices/Washer.js +23 -0
- package/dist/v1/devices/Washer.js.map +1 -0
- package/dist/v1/devices/index.d.ts +6 -0
- package/dist/v1/devices/index.js +7 -0
- package/dist/v1/devices/index.js.map +1 -0
- package/dist/v1/helper.d.ts +14 -0
- package/dist/v1/helper.js +111 -0
- package/dist/v1/helper.js.map +1 -0
- package/dist/v1/transforms/AirPurifierState.d.ts +2 -0
- package/dist/v1/transforms/AirPurifierState.js +9 -0
- package/dist/v1/transforms/AirPurifierState.js.map +1 -0
- package/dist/v1/transforms/AirState.d.ts +9 -0
- package/dist/v1/transforms/AirState.js +55 -0
- package/dist/v1/transforms/AirState.js.map +1 -0
- package/dist/v1/transforms/HoodState.d.ts +17 -0
- package/dist/v1/transforms/HoodState.js +20 -0
- package/dist/v1/transforms/HoodState.js.map +1 -0
- package/dist/v1/transforms/RefState.d.ts +6 -0
- package/dist/v1/transforms/RefState.js +29 -0
- package/dist/v1/transforms/RefState.js.map +1 -0
- package/dist/v1/transforms/WasherDryer.d.ts +49 -0
- package/dist/v1/transforms/WasherDryer.js +56 -0
- package/dist/v1/transforms/WasherDryer.js.map +1 -0
- package/docs/authorization.md +40 -0
- package/docs/device-configuration.md +68 -0
- package/homebridge-ui/public/index.html +120 -0
- package/homebridge-ui/public/js/app.js +300 -0
- package/homebridge-ui/public/js/countries.js +233 -0
- package/homebridge-ui/public/styles.css +185 -0
- package/homebridge-ui/server.js +103 -0
- package/jest.config.ts +39 -0
- package/package.json +83 -0
- package/sample/README.md +10 -0
- package/sample/airconditioner-model.json +3080 -0
- package/sample/airconditioner-snapshot.json +49 -0
- package/sample/airconditioner.json +157 -0
- package/sample/dishwasher-model.json +869 -0
- package/sample/dishwasher.json +125 -0
- package/sample/washer_dryer-model.json +1294 -0
- package/sample/washer_dryer.json +126 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { BaseDevice } from '../baseDevice.js';
|
|
2
|
+
import { PlatformType, WASHER_NOT_RUNNING_STATUS, ONE_DAY_IN_SECONDS, TEN_MINUTES_MS } from '../lib/constants.js';
|
|
3
|
+
import { safeParseInt } from '../utils/normalize.js';
|
|
4
|
+
import { toSeconds } from '../utils/normalize.js';
|
|
5
|
+
/** @deprecated Use WASHER_NOT_RUNNING_STATUS from lib/constants.js instead */
|
|
6
|
+
export const NOT_RUNNING_STATUS = WASHER_NOT_RUNNING_STATUS;
|
|
7
|
+
export default class WasherDryer extends BaseDevice {
|
|
8
|
+
platform;
|
|
9
|
+
accessory;
|
|
10
|
+
isRunning = false;
|
|
11
|
+
isServiceTubCleanMaintenanceTriggered = false;
|
|
12
|
+
serviceWasherDryer;
|
|
13
|
+
serviceEventFinished;
|
|
14
|
+
serviceDoorLock;
|
|
15
|
+
serviceTubCleanMaintenance;
|
|
16
|
+
constructor(platform, accessory, logger) {
|
|
17
|
+
super(platform, accessory, logger);
|
|
18
|
+
this.platform = platform;
|
|
19
|
+
this.accessory = accessory;
|
|
20
|
+
const { Service: { OccupancySensor, LockMechanism, Valve, }, Characteristic, Characteristic: { LockCurrentState, }, } = this.platform;
|
|
21
|
+
const device = accessory.context.device;
|
|
22
|
+
this.serviceWasherDryer = this.getOrCreateService(Valve, device.name, device.name);
|
|
23
|
+
this.serviceWasherDryer.getCharacteristic(Characteristic.Active)
|
|
24
|
+
.onSet(this.setActive.bind(this))
|
|
25
|
+
.updateValue(Characteristic.Active.INACTIVE);
|
|
26
|
+
this.serviceWasherDryer.setCharacteristic(Characteristic.Name, device.name);
|
|
27
|
+
this.serviceWasherDryer.setCharacteristic(Characteristic.ValveType, Characteristic.ValveType.WATER_FAUCET);
|
|
28
|
+
this.serviceWasherDryer.setCharacteristic(Characteristic.InUse, Characteristic.InUse.NOT_IN_USE);
|
|
29
|
+
this.serviceWasherDryer.getCharacteristic(Characteristic.RemainingDuration).setProps({
|
|
30
|
+
maxValue: ONE_DAY_IN_SECONDS,
|
|
31
|
+
});
|
|
32
|
+
// only thinq2 support door lock status
|
|
33
|
+
const hasDoorLock = this.config.washer_door_lock && device.platform === PlatformType.ThinQ2
|
|
34
|
+
&& device.snapshot && device.snapshot.washerDryer && ('doorLock' in device.snapshot.washerDryer);
|
|
35
|
+
this.serviceDoorLock = this.ensureService(LockMechanism, device.name + ' - Door', hasDoorLock, 'Door');
|
|
36
|
+
if (this.serviceDoorLock) {
|
|
37
|
+
this.serviceDoorLock.getCharacteristic(Characteristic.LockCurrentState)
|
|
38
|
+
.updateValue(LockCurrentState.UNSECURED)
|
|
39
|
+
.onSet(this.setActive.bind(this))
|
|
40
|
+
.setProps({
|
|
41
|
+
minValue: 0,
|
|
42
|
+
maxValue: 3,
|
|
43
|
+
validValues: [LockCurrentState.UNSECURED, LockCurrentState.SECURED],
|
|
44
|
+
});
|
|
45
|
+
this.serviceDoorLock.getCharacteristic(Characteristic.LockTargetState)
|
|
46
|
+
.onSet(this.setActive.bind(this))
|
|
47
|
+
.updateValue(Characteristic.LockTargetState.UNSECURED);
|
|
48
|
+
}
|
|
49
|
+
this.serviceEventFinished = this.ensureService(OccupancySensor, 'Program Finished', this.config.washer_trigger, 'Program Finished');
|
|
50
|
+
if (this.serviceEventFinished) {
|
|
51
|
+
this.serviceEventFinished.updateCharacteristic(Characteristic.OccupancyDetected, Characteristic.OccupancyDetected.OCCUPANCY_NOT_DETECTED);
|
|
52
|
+
}
|
|
53
|
+
// tub clean coach
|
|
54
|
+
this.serviceTubCleanMaintenance = this.ensureService(OccupancySensor, 'Tub Clean Coach', this.config.washer_tub_clean, 'Tub Clean Coach');
|
|
55
|
+
if (this.serviceTubCleanMaintenance) {
|
|
56
|
+
this.serviceTubCleanMaintenance.updateCharacteristic(Characteristic.OccupancyDetected, Characteristic.OccupancyDetected.OCCUPANCY_NOT_DETECTED);
|
|
57
|
+
this.serviceTubCleanMaintenance.getCharacteristic(Characteristic.ProgrammableSwitchEvent)
|
|
58
|
+
.setProps({
|
|
59
|
+
validValues: [0], // single press
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
get Status() {
|
|
64
|
+
return new WasherDryerStatus(this.accessory.context.device.snapshot?.washerDryer, this.accessory.context.device.deviceModel);
|
|
65
|
+
}
|
|
66
|
+
get config() {
|
|
67
|
+
return Object.assign({}, {
|
|
68
|
+
washer_trigger: false,
|
|
69
|
+
washer_door_lock: false,
|
|
70
|
+
washer_tub_clean: false,
|
|
71
|
+
}, super.config);
|
|
72
|
+
}
|
|
73
|
+
async setActive(value) {
|
|
74
|
+
void value;
|
|
75
|
+
// do nothing, revert back
|
|
76
|
+
this.updateAccessoryCharacteristic(this.accessory.context.device);
|
|
77
|
+
}
|
|
78
|
+
updateAccessoryCharacteristic(device) {
|
|
79
|
+
super.updateAccessoryCharacteristic(device);
|
|
80
|
+
const { Characteristic, } = this.platform;
|
|
81
|
+
this.serviceWasherDryer?.updateCharacteristic(Characteristic.Active, this.Status.isPowerOn ? 1 : 0);
|
|
82
|
+
this.serviceWasherDryer?.updateCharacteristic(Characteristic.InUse, this.Status.isRunning ? 1 : 0);
|
|
83
|
+
const prevRemainDuration = this.serviceWasherDryer?.getCharacteristic(Characteristic.RemainingDuration)?.value;
|
|
84
|
+
if (this.Status.remainDuration !== prevRemainDuration) {
|
|
85
|
+
this.serviceWasherDryer?.updateCharacteristic(Characteristic.RemainingDuration, this.Status.remainDuration);
|
|
86
|
+
}
|
|
87
|
+
this.serviceWasherDryer?.updateCharacteristic(Characteristic.StatusFault, this.Status.isError ? Characteristic.StatusFault.GENERAL_FAULT : Characteristic.StatusFault.NO_FAULT);
|
|
88
|
+
if (this.config.washer_door_lock && this.serviceDoorLock) {
|
|
89
|
+
this.serviceDoorLock.updateCharacteristic(Characteristic.LockCurrentState, this.Status.isDoorLocked ? Characteristic.LockCurrentState.SECURED : Characteristic.LockCurrentState.UNSECURED);
|
|
90
|
+
this.serviceDoorLock.updateCharacteristic(Characteristic.LockTargetState, this.Status.isDoorLocked ? 1 : 0);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
update(snapshot) {
|
|
94
|
+
super.update(snapshot);
|
|
95
|
+
const washerDryer = snapshot.washerDryer;
|
|
96
|
+
if (!washerDryer) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const { Characteristic: { OccupancyDetected, }, } = this.platform;
|
|
100
|
+
// when washer state is changed
|
|
101
|
+
if (this.config.washer_trigger && this.serviceEventFinished
|
|
102
|
+
&& ('preState' in washerDryer || 'processState' in washerDryer) && 'state' in washerDryer) {
|
|
103
|
+
// detect if washer program in done
|
|
104
|
+
if ((['END', 'COOLDOWN'].includes(washerDryer.state)
|
|
105
|
+
&& !NOT_RUNNING_STATUS.includes(washerDryer.preState || washerDryer.processState))
|
|
106
|
+
|| (this.isRunning && !this.Status.isRunning)) {
|
|
107
|
+
this.serviceEventFinished.updateCharacteristic(OccupancyDetected, OccupancyDetected.OCCUPANCY_DETECTED);
|
|
108
|
+
this.isRunning = false; // marked device as not running
|
|
109
|
+
// turn it off after 10 minute
|
|
110
|
+
setTimeout(() => {
|
|
111
|
+
this.serviceEventFinished?.updateCharacteristic(OccupancyDetected, OccupancyDetected.OCCUPANCY_NOT_DETECTED);
|
|
112
|
+
}, TEN_MINUTES_MS);
|
|
113
|
+
}
|
|
114
|
+
// detect if washer program is start
|
|
115
|
+
if (this.Status.isRunning && !this.isRunning) {
|
|
116
|
+
this.serviceEventFinished?.updateCharacteristic(OccupancyDetected, OccupancyDetected.OCCUPANCY_NOT_DETECTED);
|
|
117
|
+
this.isRunning = true;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if ('TCLCount' in washerDryer && this.serviceTubCleanMaintenance) {
|
|
121
|
+
// detect if tub clean coach counter is reached
|
|
122
|
+
if (this.Status.TCLCount >= 30) {
|
|
123
|
+
this.serviceTubCleanMaintenance.updateCharacteristic(OccupancyDetected, OccupancyDetected.OCCUPANCY_DETECTED);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// reset tub clean coach trigger flag
|
|
127
|
+
this.serviceTubCleanMaintenance.updateCharacteristic(OccupancyDetected, OccupancyDetected.OCCUPANCY_NOT_DETECTED);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
export class WasherDryerStatus {
|
|
133
|
+
data;
|
|
134
|
+
deviceModel;
|
|
135
|
+
constructor(data, deviceModel) {
|
|
136
|
+
this.data = data;
|
|
137
|
+
this.deviceModel = deviceModel;
|
|
138
|
+
}
|
|
139
|
+
get isPowerOn() {
|
|
140
|
+
return !['POWEROFF', 'POWERFAIL'].includes(this.data?.state);
|
|
141
|
+
}
|
|
142
|
+
get isRunning() {
|
|
143
|
+
return this.isPowerOn && !NOT_RUNNING_STATUS.includes(this.data?.state);
|
|
144
|
+
}
|
|
145
|
+
get isError() {
|
|
146
|
+
return this.data?.state === 'ERROR';
|
|
147
|
+
}
|
|
148
|
+
get isRemoteStartEnable() {
|
|
149
|
+
return this.data.remoteStart === this.deviceModel.lookupMonitorName('remoteStart', '@CP_ON_EN_W');
|
|
150
|
+
}
|
|
151
|
+
get isDoorLocked() {
|
|
152
|
+
const current = this.deviceModel.lookupMonitorName('doorLock', '@CP_ON_EN_W');
|
|
153
|
+
if (current === null) {
|
|
154
|
+
return this.data.doorLock === 'DOORLOCK_ON';
|
|
155
|
+
}
|
|
156
|
+
return this.data.doorLock === current;
|
|
157
|
+
}
|
|
158
|
+
get remainDuration() {
|
|
159
|
+
const remainTimeHour = this.data?.remainTimeHour || 0, remainTimeMinute = this.data?.remainTimeMinute || 0;
|
|
160
|
+
let remainingDuration = 0;
|
|
161
|
+
if (this.isRunning) {
|
|
162
|
+
remainingDuration = toSeconds(remainTimeHour, remainTimeMinute);
|
|
163
|
+
}
|
|
164
|
+
return remainingDuration;
|
|
165
|
+
}
|
|
166
|
+
get TCLCount() {
|
|
167
|
+
return Math.min(safeParseInt(this.data?.TCLCount), 30);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=WasherDryer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WasherDryer.js","sourceRoot":"","sources":["../../src/devices/WasherDryer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import WasherDryer, { WasherDryerStatus } from './WasherDryer.js';
|
|
2
|
+
/**
|
|
3
|
+
* new kind of wash tower
|
|
4
|
+
* device type: 223
|
|
5
|
+
*/
|
|
6
|
+
export default class WasherDryer2 extends WasherDryer {
|
|
7
|
+
get Status() {
|
|
8
|
+
return new WasherDryerStatus(this.accessory.context.device.snapshot?.washer, this.accessory.context.device.deviceModel);
|
|
9
|
+
}
|
|
10
|
+
update(snapshot) {
|
|
11
|
+
// override washer to washerDryer
|
|
12
|
+
snapshot.washerDryer = snapshot.washer;
|
|
13
|
+
super.update(snapshot);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=WasherDryer2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WasherDryer2.js","sourceRoot":"","sources":["../../src/devices/WasherDryer2.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,EAAE,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAElE;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,WAAW;IACnD,IAAW,MAAM;QACf,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC1H,CAAC;IAEM,MAAM,CAAC,QAAa;QACzB,iCAAiC;QACjC,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC;QAEvC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthenticationError.js","sourceRoot":"","sources":["../../src/errors/AuthenticationError.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ManualProcessNeeded.js","sourceRoot":"","sources":["../../src/errors/ManualProcessNeeded.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAEnD,MAAM,OAAO,mBAAoB,SAAQ,KAAK;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MonitorError.js","sourceRoot":"","sources":["../../src/errors/MonitorError.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAa,SAAQ,KAAK;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotConnectedError.js","sourceRoot":"","sources":["../../src/errors/NotConnectedError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEvD,MAAM,OAAO,iBAAkB,SAAQ,KAAK;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenError.js","sourceRoot":"","sources":["../../src/errors/TokenError.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenExpiredError.js","sourceRoot":"","sources":["../../src/errors/TokenExpiredError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,MAAM,OAAO,iBAAkB,SAAQ,KAAK;CAAG"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './NotConnectedError.js';
|
|
2
|
+
export * from './ManualProcessNeeded.js';
|
|
3
|
+
export * from './MonitorError.js';
|
|
4
|
+
export * from './TokenError.js';
|
|
5
|
+
export * from './AuthenticationError.js';
|
|
6
|
+
export * from './TokenExpiredError.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC"}
|
package/dist/helper.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Categories } from 'homebridge';
|
|
2
|
+
import { Device } from './lib/Device.js';
|
|
3
|
+
import AirPurifier from './devices/AirPurifier.js';
|
|
4
|
+
import Refrigerator from './devices/Refrigerator.js';
|
|
5
|
+
import WasherDryer from './devices/WasherDryer.js';
|
|
6
|
+
import Dishwasher from './devices/Dishwasher.js';
|
|
7
|
+
import Dehumidifier from './devices/Dehumidifier.js';
|
|
8
|
+
import AirConditioner from './devices/AirConditioner.js';
|
|
9
|
+
import Styler from './devices/Styler.js';
|
|
10
|
+
import RangeHood from './devices/RangeHood.js';
|
|
11
|
+
import Oven from './devices/Oven.js';
|
|
12
|
+
import Microwave from './devices/Microwave.js';
|
|
13
|
+
/**
|
|
14
|
+
* Platform Accessory
|
|
15
|
+
* An instance of this class is created for each accessory your platform registers
|
|
16
|
+
* Each accessory may expose multiple services of different service types.
|
|
17
|
+
*/
|
|
18
|
+
export declare class Helper {
|
|
19
|
+
static make(device: Device): typeof AirPurifier | typeof Refrigerator | typeof WasherDryer | typeof Dishwasher | typeof Dehumidifier | typeof AirConditioner | typeof RangeHood | typeof Styler | typeof Oven | typeof Microwave | null;
|
|
20
|
+
static category(device: Device): 1 | 9 | Categories.OTHER | Categories.AIR_PURIFIER | Categories.AIR_CONDITIONER | Categories.AIR_DEHUMIDIFIER;
|
|
21
|
+
}
|
|
22
|
+
export declare function fToC(fahrenheit: number): number;
|
|
23
|
+
export declare function cToF(celsius: number): number;
|
|
24
|
+
export { normalizeBoolean, normalizeNumber, safeParseInt, safeParseFloat, toSeconds } from './utils/normalize.js';
|
package/dist/helper.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import AirPurifier from './devices/AirPurifier.js';
|
|
2
|
+
import Refrigerator from './devices/Refrigerator.js';
|
|
3
|
+
import WasherDryer from './devices/WasherDryer.js';
|
|
4
|
+
import Dishwasher from './devices/Dishwasher.js';
|
|
5
|
+
import Dehumidifier from './devices/Dehumidifier.js';
|
|
6
|
+
import { default as V1helper } from './v1/helper.js';
|
|
7
|
+
import { PlatformType } from './lib/constants.js';
|
|
8
|
+
import AirConditioner from './devices/AirConditioner.js';
|
|
9
|
+
import AeroTower from './devices/AeroTower.js';
|
|
10
|
+
import Styler from './devices/Styler.js';
|
|
11
|
+
import RangeHood from './devices/RangeHood.js';
|
|
12
|
+
import Oven from './devices/Oven.js';
|
|
13
|
+
import Microwave from './devices/Microwave.js';
|
|
14
|
+
import WasherDryer2 from './devices/WasherDryer2.js';
|
|
15
|
+
/**
|
|
16
|
+
* Platform Accessory
|
|
17
|
+
* An instance of this class is created for each accessory your platform registers
|
|
18
|
+
* Each accessory may expose multiple services of different service types.
|
|
19
|
+
*/
|
|
20
|
+
export class Helper {
|
|
21
|
+
static make(device) {
|
|
22
|
+
if (device.platform === PlatformType.ThinQ1) {
|
|
23
|
+
// check if thinq1 available
|
|
24
|
+
return V1helper.make(device);
|
|
25
|
+
}
|
|
26
|
+
// thinq2
|
|
27
|
+
switch (device.type) {
|
|
28
|
+
case 'AERO_TOWER': return AeroTower;
|
|
29
|
+
case 'AIR_PURIFIER': return AirPurifier;
|
|
30
|
+
case 'REFRIGERATOR': return Refrigerator;
|
|
31
|
+
case 'WASHER':
|
|
32
|
+
case 'WASHER_NEW':
|
|
33
|
+
case 'WASH_TOWER':
|
|
34
|
+
case 'DRYER':
|
|
35
|
+
return WasherDryer;
|
|
36
|
+
case 'WASH_TOWER_2': return WasherDryer2; // new kind of washer
|
|
37
|
+
case 'DISHWASHER': return Dishwasher;
|
|
38
|
+
case 'DEHUMIDIFIER': return Dehumidifier;
|
|
39
|
+
case 'AC': return AirConditioner;
|
|
40
|
+
case 'STYLER': return Styler;
|
|
41
|
+
case 'HOOD': return RangeHood;
|
|
42
|
+
case 'MICROWAVE': return Microwave;
|
|
43
|
+
case 'OVEN': return Oven;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
static category(device) {
|
|
48
|
+
switch (device.type) {
|
|
49
|
+
case 'AIR_PURIFIER': return 19 /* Categories.AIR_PURIFIER */;
|
|
50
|
+
case 'DEHUMIDIFIER': return 23 /* Categories.AIR_DEHUMIDIFIER */;
|
|
51
|
+
case 'AC': return 21 /* Categories.AIR_CONDITIONER */;
|
|
52
|
+
case 'DISHWASHER': return 1 /*Sprinkler*/;
|
|
53
|
+
case 'OVEN': return 9 /*Thermostat*/;
|
|
54
|
+
case 'MICROWAVE': return 9 /*air heater*/;
|
|
55
|
+
default: return 1 /* Categories.OTHER */;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function fToC(fahrenheit) {
|
|
60
|
+
return parseFloat(((fahrenheit - 32) * 5 / 9).toFixed(1));
|
|
61
|
+
}
|
|
62
|
+
export function cToF(celsius) {
|
|
63
|
+
return Math.round(celsius * 9 / 5 + 32);
|
|
64
|
+
}
|
|
65
|
+
export { normalizeBoolean, normalizeNumber, safeParseInt, safeParseFloat, toSeconds } from './utils/normalize.js';
|
|
66
|
+
//# sourceMappingURL=helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Helper, fToC, cToF } from './helper.js';
|
|
2
|
+
import { PlatformType } from './lib/constants.js';
|
|
3
|
+
import { describe, expect, it, jest } from '@jest/globals';
|
|
4
|
+
// Mock dependencies
|
|
5
|
+
jest.mock('./lib/Device');
|
|
6
|
+
jest.mock('./lib/constants', () => ({
|
|
7
|
+
PlatformType: {
|
|
8
|
+
ThinQ1: 'ThinQ1',
|
|
9
|
+
ThinQ2: 'ThinQ2',
|
|
10
|
+
},
|
|
11
|
+
}));
|
|
12
|
+
// Test suite for Helper class and utility functions
|
|
13
|
+
describe('Helper', () => {
|
|
14
|
+
describe('make', () => {
|
|
15
|
+
it('should return V1helper.make for ThinQ1 platform', () => {
|
|
16
|
+
const mockDevice = { platform: PlatformType.ThinQ1 };
|
|
17
|
+
const result = Helper.make(mockDevice);
|
|
18
|
+
expect(result).toBeDefined();
|
|
19
|
+
});
|
|
20
|
+
it('should return the correct class for ThinQ2 devices', () => {
|
|
21
|
+
const mockDevice = { platform: PlatformType.ThinQ2, type: 'AC' };
|
|
22
|
+
const result = Helper.make(mockDevice);
|
|
23
|
+
expect(result).toBeDefined();
|
|
24
|
+
});
|
|
25
|
+
it('should return null for unknown device types', () => {
|
|
26
|
+
const mockDevice = { platform: PlatformType.ThinQ2, type: 'UNKNOWN' };
|
|
27
|
+
const result = Helper.make(mockDevice);
|
|
28
|
+
expect(result).toBeNull();
|
|
29
|
+
});
|
|
30
|
+
it('should return null for unsupported platform types', () => {
|
|
31
|
+
const mockDevice = { platform: 'UnsupportedPlatform' };
|
|
32
|
+
const result = Helper.make(mockDevice);
|
|
33
|
+
expect(result).toBeNull();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('category', () => {
|
|
37
|
+
it('should return the correct category for known device types', () => {
|
|
38
|
+
const mockDevice = { type: 'AIR_PURIFIER' };
|
|
39
|
+
const result = Helper.category(mockDevice);
|
|
40
|
+
expect(result).toBe(19 /* Categories.AIR_PURIFIER */);
|
|
41
|
+
});
|
|
42
|
+
it('should return Categories.OTHER for unknown device types', () => {
|
|
43
|
+
const mockDevice = { type: 'UNKNOWN' };
|
|
44
|
+
const result = Helper.category(mockDevice);
|
|
45
|
+
expect(result).toBe(1 /* Categories.OTHER */);
|
|
46
|
+
});
|
|
47
|
+
it('should return Categories.AIR_CONDITIONER for AC device type', () => {
|
|
48
|
+
const mockDevice = { type: 'AC' };
|
|
49
|
+
const result = Helper.category(mockDevice);
|
|
50
|
+
expect(result).toBe(21 /* Categories.AIR_CONDITIONER */);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe('Utility functions', () => {
|
|
55
|
+
describe('fToC', () => {
|
|
56
|
+
it('should convert Fahrenheit to Celsius', () => {
|
|
57
|
+
expect(fToC(32)).toBe(0);
|
|
58
|
+
expect(fToC(212)).toBe(100);
|
|
59
|
+
});
|
|
60
|
+
it('should handle negative Fahrenheit values', () => {
|
|
61
|
+
expect(fToC(-40)).toBe(-40);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe('cToF', () => {
|
|
65
|
+
it('should convert Celsius to Fahrenheit', () => {
|
|
66
|
+
expect(cToF(0)).toBe(32);
|
|
67
|
+
expect(cToF(100)).toBe(212);
|
|
68
|
+
});
|
|
69
|
+
it('should handle negative Celsius values', () => {
|
|
70
|
+
expect(cToF(-40)).toBe(-40);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=helper.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper.spec.js","sourceRoot":"","sources":["../src/helper.spec.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { PLATFORM_NAME } from './settings.js';
|
|
2
|
+
import { LGThinQHomebridgePlatform } from './platform.js';
|
|
3
|
+
/**
|
|
4
|
+
* This method registers the platform with Homebridge
|
|
5
|
+
*/
|
|
6
|
+
export default (api) => {
|
|
7
|
+
api.registerPlatform(PLATFORM_NAME, LGThinQHomebridgePlatform);
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D;;GAEG;AACH,eAAe,CAAC,GAAQ,EAAE,EAAE;IAC1B,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAAC;AACjE,CAAC,CAAC"}
|