@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.
Files changed (241) hide show
  1. package/.claude/settings.local.json +15 -0
  2. package/CHANGELOG.md +98 -0
  3. package/LICENSE +176 -0
  4. package/README.md +114 -0
  5. package/config.schema.json +399 -0
  6. package/dist/__tests__/baseDevice.spec.d.ts +1 -0
  7. package/dist/__tests__/baseDevice.spec.js +96 -0
  8. package/dist/__tests__/baseDevice.spec.js.map +1 -0
  9. package/dist/__tests__/deviceControl.coercion.spec.d.ts +1 -0
  10. package/dist/__tests__/deviceControl.coercion.spec.js +53 -0
  11. package/dist/__tests__/deviceControl.coercion.spec.js.map +1 -0
  12. package/dist/__tests__/helper.spec.d.ts +1 -0
  13. package/dist/__tests__/helper.spec.js +74 -0
  14. package/dist/__tests__/helper.spec.js.map +1 -0
  15. package/dist/baseDevice.d.ts +40 -0
  16. package/dist/baseDevice.js +85 -0
  17. package/dist/baseDevice.js.map +1 -0
  18. package/dist/baseDevice.spec.d.ts +1 -0
  19. package/dist/baseDevice.spec.js +107 -0
  20. package/dist/baseDevice.spec.js.map +1 -0
  21. package/dist/characteristics/TotalConsumption.d.ts +2 -0
  22. package/dist/characteristics/TotalConsumption.js +17 -0
  23. package/dist/characteristics/TotalConsumption.js.map +1 -0
  24. package/dist/characteristics/index.d.ts +2 -0
  25. package/dist/characteristics/index.js +7 -0
  26. package/dist/characteristics/index.js.map +1 -0
  27. package/dist/cli.d.ts +2 -0
  28. package/dist/cli.js +89 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/devices/AeroTower.d.ts +24 -0
  31. package/dist/devices/AeroTower.js +113 -0
  32. package/dist/devices/AeroTower.js.map +1 -0
  33. package/dist/devices/AirConditioner.d.ts +425 -0
  34. package/dist/devices/AirConditioner.js +1253 -0
  35. package/dist/devices/AirConditioner.js.map +1 -0
  36. package/dist/devices/AirPurifier.d.ts +50 -0
  37. package/dist/devices/AirPurifier.js +281 -0
  38. package/dist/devices/AirPurifier.js.map +1 -0
  39. package/dist/devices/Dehumidifier.d.ts +28 -0
  40. package/dist/devices/Dehumidifier.js +175 -0
  41. package/dist/devices/Dehumidifier.js.map +1 -0
  42. package/dist/devices/Dishwasher.d.ts +64 -0
  43. package/dist/devices/Dishwasher.js +740 -0
  44. package/dist/devices/Dishwasher.js.map +1 -0
  45. package/dist/devices/Microwave.d.ts +128 -0
  46. package/dist/devices/Microwave.js +1939 -0
  47. package/dist/devices/Microwave.js.map +1 -0
  48. package/dist/devices/Oven.d.ts +148 -0
  49. package/dist/devices/Oven.js +1850 -0
  50. package/dist/devices/Oven.js.map +1 -0
  51. package/dist/devices/RangeHood.d.ts +16 -0
  52. package/dist/devices/RangeHood.js +99 -0
  53. package/dist/devices/RangeHood.js.map +1 -0
  54. package/dist/devices/Refrigerator.d.ts +50 -0
  55. package/dist/devices/Refrigerator.js +325 -0
  56. package/dist/devices/Refrigerator.js.map +1 -0
  57. package/dist/devices/Styler.d.ts +27 -0
  58. package/dist/devices/Styler.js +76 -0
  59. package/dist/devices/Styler.js.map +1 -0
  60. package/dist/devices/WasherDryer.d.ts +39 -0
  61. package/dist/devices/WasherDryer.js +170 -0
  62. package/dist/devices/WasherDryer.js.map +1 -0
  63. package/dist/devices/WasherDryer2.d.ts +9 -0
  64. package/dist/devices/WasherDryer2.js +16 -0
  65. package/dist/devices/WasherDryer2.js.map +1 -0
  66. package/dist/errors/AuthenticationError.d.ts +2 -0
  67. package/dist/errors/AuthenticationError.js +3 -0
  68. package/dist/errors/AuthenticationError.js.map +1 -0
  69. package/dist/errors/ManualProcessNeeded.d.ts +3 -0
  70. package/dist/errors/ManualProcessNeeded.js +4 -0
  71. package/dist/errors/ManualProcessNeeded.js.map +1 -0
  72. package/dist/errors/MonitorError.d.ts +2 -0
  73. package/dist/errors/MonitorError.js +3 -0
  74. package/dist/errors/MonitorError.js.map +1 -0
  75. package/dist/errors/NotConnectedError.d.ts +3 -0
  76. package/dist/errors/NotConnectedError.js +4 -0
  77. package/dist/errors/NotConnectedError.js.map +1 -0
  78. package/dist/errors/TokenError.d.ts +2 -0
  79. package/dist/errors/TokenError.js +3 -0
  80. package/dist/errors/TokenError.js.map +1 -0
  81. package/dist/errors/TokenExpiredError.d.ts +3 -0
  82. package/dist/errors/TokenExpiredError.js +4 -0
  83. package/dist/errors/TokenExpiredError.js.map +1 -0
  84. package/dist/errors/index.d.ts +6 -0
  85. package/dist/errors/index.js +7 -0
  86. package/dist/errors/index.js.map +1 -0
  87. package/dist/helper.d.ts +24 -0
  88. package/dist/helper.js +66 -0
  89. package/dist/helper.js.map +1 -0
  90. package/dist/helper.spec.d.ts +1 -0
  91. package/dist/helper.spec.js +74 -0
  92. package/dist/helper.spec.js.map +1 -0
  93. package/dist/index.d.ts +6 -0
  94. package/dist/index.js +9 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/lib/API.d.ts +141 -0
  97. package/dist/lib/API.js +362 -0
  98. package/dist/lib/API.js.map +1 -0
  99. package/dist/lib/API.spec.d.ts +1 -0
  100. package/dist/lib/API.spec.js +55 -0
  101. package/dist/lib/API.spec.js.map +1 -0
  102. package/dist/lib/Auth.d.ts +99 -0
  103. package/dist/lib/Auth.js +348 -0
  104. package/dist/lib/Auth.js.map +1 -0
  105. package/dist/lib/Auth.spec.d.ts +1 -0
  106. package/dist/lib/Auth.spec.js +111 -0
  107. package/dist/lib/Auth.spec.js.map +1 -0
  108. package/dist/lib/Device.d.ts +88 -0
  109. package/dist/lib/Device.js +95 -0
  110. package/dist/lib/Device.js.map +1 -0
  111. package/dist/lib/Device.spec.d.ts +1 -0
  112. package/dist/lib/Device.spec.js +53 -0
  113. package/dist/lib/Device.spec.js.map +1 -0
  114. package/dist/lib/DeviceModel.d.ts +164 -0
  115. package/dist/lib/DeviceModel.js +321 -0
  116. package/dist/lib/DeviceModel.js.map +1 -0
  117. package/dist/lib/DeviceModel.spec.d.ts +1 -0
  118. package/dist/lib/DeviceModel.spec.js +90 -0
  119. package/dist/lib/DeviceModel.spec.js.map +1 -0
  120. package/dist/lib/Gateway.d.ts +18 -0
  121. package/dist/lib/Gateway.js +25 -0
  122. package/dist/lib/Gateway.js.map +1 -0
  123. package/dist/lib/Gateway.spec.d.ts +1 -0
  124. package/dist/lib/Gateway.spec.js +35 -0
  125. package/dist/lib/Gateway.spec.js.map +1 -0
  126. package/dist/lib/Persist.d.ts +101 -0
  127. package/dist/lib/Persist.js +245 -0
  128. package/dist/lib/Persist.js.map +1 -0
  129. package/dist/lib/Persist.spec.d.ts +1 -0
  130. package/dist/lib/Persist.spec.js +90 -0
  131. package/dist/lib/Persist.spec.js.map +1 -0
  132. package/dist/lib/Session.d.ts +80 -0
  133. package/dist/lib/Session.js +100 -0
  134. package/dist/lib/Session.js.map +1 -0
  135. package/dist/lib/Session.spec.d.ts +1 -0
  136. package/dist/lib/Session.spec.js +43 -0
  137. package/dist/lib/Session.spec.js.map +1 -0
  138. package/dist/lib/ThinQ.d.ts +28 -0
  139. package/dist/lib/ThinQ.js +373 -0
  140. package/dist/lib/ThinQ.js.map +1 -0
  141. package/dist/lib/__tests__/API.spec.d.ts +1 -0
  142. package/dist/lib/__tests__/API.spec.js +55 -0
  143. package/dist/lib/__tests__/API.spec.js.map +1 -0
  144. package/dist/lib/__tests__/Auth.spec.d.ts +1 -0
  145. package/dist/lib/__tests__/Auth.spec.js +110 -0
  146. package/dist/lib/__tests__/Auth.spec.js.map +1 -0
  147. package/dist/lib/__tests__/Device.spec.d.ts +1 -0
  148. package/dist/lib/__tests__/Device.spec.js +53 -0
  149. package/dist/lib/__tests__/Device.spec.js.map +1 -0
  150. package/dist/lib/__tests__/DeviceModel.spec.d.ts +1 -0
  151. package/dist/lib/__tests__/DeviceModel.spec.js +90 -0
  152. package/dist/lib/__tests__/DeviceModel.spec.js.map +1 -0
  153. package/dist/lib/__tests__/Gateway.spec.d.ts +1 -0
  154. package/dist/lib/__tests__/Gateway.spec.js +35 -0
  155. package/dist/lib/__tests__/Gateway.spec.js.map +1 -0
  156. package/dist/lib/__tests__/Persist.spec.d.ts +1 -0
  157. package/dist/lib/__tests__/Persist.spec.js +90 -0
  158. package/dist/lib/__tests__/Persist.spec.js.map +1 -0
  159. package/dist/lib/__tests__/Session.spec.d.ts +1 -0
  160. package/dist/lib/__tests__/Session.spec.js +43 -0
  161. package/dist/lib/__tests__/Session.spec.js.map +1 -0
  162. package/dist/lib/constants.d.ts +95 -0
  163. package/dist/lib/constants.js +106 -0
  164. package/dist/lib/constants.js.map +1 -0
  165. package/dist/lib/request.d.ts +2 -0
  166. package/dist/lib/request.js +66 -0
  167. package/dist/lib/request.js.map +1 -0
  168. package/dist/platform.d.ts +41 -0
  169. package/dist/platform.js +229 -0
  170. package/dist/platform.js.map +1 -0
  171. package/dist/settings.d.ts +8 -0
  172. package/dist/settings.js +9 -0
  173. package/dist/settings.js.map +1 -0
  174. package/dist/status/BaseStatus.d.ts +48 -0
  175. package/dist/status/BaseStatus.js +59 -0
  176. package/dist/status/BaseStatus.js.map +1 -0
  177. package/dist/types/snapshots.d.ts +142 -0
  178. package/dist/types/snapshots.js +6 -0
  179. package/dist/types/snapshots.js.map +1 -0
  180. package/dist/utils/__tests__/normalize.spec.d.ts +1 -0
  181. package/dist/utils/__tests__/normalize.spec.js +95 -0
  182. package/dist/utils/__tests__/normalize.spec.js.map +1 -0
  183. package/dist/utils/normalize.d.ts +22 -0
  184. package/dist/utils/normalize.js +51 -0
  185. package/dist/utils/normalize.js.map +1 -0
  186. package/dist/v1/__tests__/prepareControlData.spec.d.ts +1 -0
  187. package/dist/v1/__tests__/prepareControlData.spec.js +48 -0
  188. package/dist/v1/__tests__/prepareControlData.spec.js.map +1 -0
  189. package/dist/v1/devices/AC.d.ts +13 -0
  190. package/dist/v1/devices/AC.js +112 -0
  191. package/dist/v1/devices/AC.js.map +1 -0
  192. package/dist/v1/devices/AirPurifier.d.ts +15 -0
  193. package/dist/v1/devices/AirPurifier.js +57 -0
  194. package/dist/v1/devices/AirPurifier.js.map +1 -0
  195. package/dist/v1/devices/RangeHood.d.ts +6 -0
  196. package/dist/v1/devices/RangeHood.js +12 -0
  197. package/dist/v1/devices/RangeHood.js.map +1 -0
  198. package/dist/v1/devices/Refrigerator.d.ts +17 -0
  199. package/dist/v1/devices/Refrigerator.js +69 -0
  200. package/dist/v1/devices/Refrigerator.js.map +1 -0
  201. package/dist/v1/devices/Washer.d.ts +10 -0
  202. package/dist/v1/devices/Washer.js +23 -0
  203. package/dist/v1/devices/Washer.js.map +1 -0
  204. package/dist/v1/devices/index.d.ts +6 -0
  205. package/dist/v1/devices/index.js +7 -0
  206. package/dist/v1/devices/index.js.map +1 -0
  207. package/dist/v1/helper.d.ts +14 -0
  208. package/dist/v1/helper.js +111 -0
  209. package/dist/v1/helper.js.map +1 -0
  210. package/dist/v1/transforms/AirPurifierState.d.ts +2 -0
  211. package/dist/v1/transforms/AirPurifierState.js +9 -0
  212. package/dist/v1/transforms/AirPurifierState.js.map +1 -0
  213. package/dist/v1/transforms/AirState.d.ts +9 -0
  214. package/dist/v1/transforms/AirState.js +55 -0
  215. package/dist/v1/transforms/AirState.js.map +1 -0
  216. package/dist/v1/transforms/HoodState.d.ts +17 -0
  217. package/dist/v1/transforms/HoodState.js +20 -0
  218. package/dist/v1/transforms/HoodState.js.map +1 -0
  219. package/dist/v1/transforms/RefState.d.ts +6 -0
  220. package/dist/v1/transforms/RefState.js +29 -0
  221. package/dist/v1/transforms/RefState.js.map +1 -0
  222. package/dist/v1/transforms/WasherDryer.d.ts +49 -0
  223. package/dist/v1/transforms/WasherDryer.js +56 -0
  224. package/dist/v1/transforms/WasherDryer.js.map +1 -0
  225. package/docs/authorization.md +40 -0
  226. package/docs/device-configuration.md +68 -0
  227. package/homebridge-ui/public/index.html +120 -0
  228. package/homebridge-ui/public/js/app.js +300 -0
  229. package/homebridge-ui/public/js/countries.js +233 -0
  230. package/homebridge-ui/public/styles.css +185 -0
  231. package/homebridge-ui/server.js +103 -0
  232. package/jest.config.ts +39 -0
  233. package/package.json +83 -0
  234. package/sample/README.md +10 -0
  235. package/sample/airconditioner-model.json +3080 -0
  236. package/sample/airconditioner-snapshot.json +49 -0
  237. package/sample/airconditioner.json +157 -0
  238. package/sample/dishwasher-model.json +869 -0
  239. package/sample/dishwasher.json +125 -0
  240. package/sample/washer_dryer-model.json +1294 -0
  241. 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,9 @@
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(): WasherDryerStatus;
8
+ update(snapshot: any): void;
9
+ }
@@ -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,2 @@
1
+ export declare class AuthenticationError extends Error {
2
+ }
@@ -0,0 +1,3 @@
1
+ export class AuthenticationError extends Error {
2
+ }
3
+ //# sourceMappingURL=AuthenticationError.js.map
@@ -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,3 @@
1
+ export declare const ManualProcessNeededErrorCode = "0110";
2
+ export declare class ManualProcessNeeded extends Error {
3
+ }
@@ -0,0 +1,4 @@
1
+ export const ManualProcessNeededErrorCode = '0110';
2
+ export class ManualProcessNeeded extends Error {
3
+ }
4
+ //# sourceMappingURL=ManualProcessNeeded.js.map
@@ -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,2 @@
1
+ export declare class MonitorError extends Error {
2
+ }
@@ -0,0 +1,3 @@
1
+ export class MonitorError extends Error {
2
+ }
3
+ //# sourceMappingURL=MonitorError.js.map
@@ -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,3 @@
1
+ export declare const NotConnectedErrorCodes: string[];
2
+ export declare class NotConnectedError extends Error {
3
+ }
@@ -0,0 +1,4 @@
1
+ export const NotConnectedErrorCodes = ['0106', '0111'];
2
+ export class NotConnectedError extends Error {
3
+ }
4
+ //# sourceMappingURL=NotConnectedError.js.map
@@ -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,2 @@
1
+ export declare class TokenError extends Error {
2
+ }
@@ -0,0 +1,3 @@
1
+ export class TokenError extends Error {
2
+ }
3
+ //# sourceMappingURL=TokenError.js.map
@@ -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,3 @@
1
+ export declare const TokenExpiredErrorCode = "0102";
2
+ export declare class TokenExpiredError extends Error {
3
+ }
@@ -0,0 +1,4 @@
1
+ export const TokenExpiredErrorCode = '0102';
2
+ export class TokenExpiredError extends Error {
3
+ }
4
+ //# sourceMappingURL=TokenExpiredError.js.map
@@ -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,6 @@
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';
@@ -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"}
@@ -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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"}
@@ -0,0 +1,6 @@
1
+ import { API } from 'homebridge';
2
+ /**
3
+ * This method registers the platform with Homebridge
4
+ */
5
+ declare const _default: (api: API) => void;
6
+ export default _default;
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"}