@homebridge-plugins/homebridge-smarthq 0.5.0-beta.3 → 0.5.0-beta.31

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 (145) hide show
  1. package/.github/ISSUE_TEMPLATE/config.yml +1 -1
  2. package/.github/copilot-instructions.md +90 -0
  3. package/.github/scripts/branch-helper.sh +41 -0
  4. package/.github/workflows/beta-release.yml +1 -1
  5. package/.github/workflows/release.yml +53 -17
  6. package/CHANGELOG.md +563 -18
  7. package/MATTER.md +304 -0
  8. package/README.md +15 -0
  9. package/config.schema.json +14 -5
  10. package/dist/devices/OpalIceMaker/Managers/OpalDescaleSvcManager.d.ts.map +1 -1
  11. package/dist/devices/OpalIceMaker/Managers/OpalDescaleSvcManager.js +3 -1
  12. package/dist/devices/OpalIceMaker/Managers/OpalDescaleSvcManager.js.map +1 -1
  13. package/dist/devices/OpalIceMaker/Managers/OpalFilterMaintenanceSvcManager.d.ts.map +1 -1
  14. package/dist/devices/OpalIceMaker/Managers/OpalFilterMaintenanceSvcManager.js +3 -1
  15. package/dist/devices/OpalIceMaker/Managers/OpalFilterMaintenanceSvcManager.js.map +1 -1
  16. package/dist/devices/OpalIceMaker/Managers/OpalPowerSvcManager.js +1 -1
  17. package/dist/devices/OpalIceMaker/Managers/OpalPowerSvcManager.js.map +1 -1
  18. package/dist/devices/OpalIceMaker/Managers/OpalProgressSvcManager.d.ts +1 -1
  19. package/dist/devices/OpalIceMaker/Managers/OpalProgressSvcManager.d.ts.map +1 -1
  20. package/dist/devices/OpalIceMaker/Managers/OpalProgressSvcManager.js +12 -5
  21. package/dist/devices/OpalIceMaker/Managers/OpalProgressSvcManager.js.map +1 -1
  22. package/dist/devices/OpalIceMaker/Managers/StatusManagers/OpalStatusBase.d.ts.map +1 -1
  23. package/dist/devices/OpalIceMaker/Managers/StatusManagers/OpalStatusBase.js +4 -2
  24. package/dist/devices/OpalIceMaker/Managers/StatusManagers/OpalStatusBase.js.map +1 -1
  25. package/dist/devices/OpalIceMaker/OpalDeviceBase.d.ts +3 -4
  26. package/dist/devices/OpalIceMaker/OpalDeviceBase.d.ts.map +1 -1
  27. package/dist/devices/OpalIceMaker/OpalDeviceBase.js +3 -18
  28. package/dist/devices/OpalIceMaker/OpalDeviceBase.js.map +1 -1
  29. package/dist/devices/advantium.d.ts +10 -0
  30. package/dist/devices/advantium.d.ts.map +1 -0
  31. package/dist/devices/advantium.js +75 -0
  32. package/dist/devices/advantium.js.map +1 -0
  33. package/dist/devices/airConditioner.d.ts +11 -2
  34. package/dist/devices/airConditioner.d.ts.map +1 -1
  35. package/dist/devices/airConditioner.js +108 -17
  36. package/dist/devices/airConditioner.js.map +1 -1
  37. package/dist/devices/beverageCenter.d.ts +10 -0
  38. package/dist/devices/beverageCenter.d.ts.map +1 -0
  39. package/dist/devices/beverageCenter.js +125 -0
  40. package/dist/devices/beverageCenter.js.map +1 -0
  41. package/dist/devices/clothesDryer.d.ts +21 -0
  42. package/dist/devices/clothesDryer.d.ts.map +1 -0
  43. package/dist/devices/clothesDryer.js +240 -0
  44. package/dist/devices/clothesDryer.js.map +1 -0
  45. package/dist/devices/clothesWasher.d.ts +21 -0
  46. package/dist/devices/clothesWasher.d.ts.map +1 -0
  47. package/dist/devices/clothesWasher.js +251 -0
  48. package/dist/devices/clothesWasher.js.map +1 -0
  49. package/dist/devices/coffeeMaker.d.ts +10 -0
  50. package/dist/devices/coffeeMaker.d.ts.map +1 -0
  51. package/dist/devices/coffeeMaker.js +79 -0
  52. package/dist/devices/coffeeMaker.js.map +1 -0
  53. package/dist/devices/device.d.ts +107 -13
  54. package/dist/devices/device.d.ts.map +1 -1
  55. package/dist/devices/device.js +386 -60
  56. package/dist/devices/device.js.map +1 -1
  57. package/dist/devices/dishwasher.d.ts +9 -3
  58. package/dist/devices/dishwasher.d.ts.map +1 -1
  59. package/dist/devices/dishwasher.js +142 -29
  60. package/dist/devices/dishwasher.js.map +1 -1
  61. package/dist/devices/hood.d.ts +41 -0
  62. package/dist/devices/hood.d.ts.map +1 -0
  63. package/dist/devices/hood.js +332 -0
  64. package/dist/devices/hood.js.map +1 -0
  65. package/dist/devices/microwave.d.ts +19 -0
  66. package/dist/devices/microwave.d.ts.map +1 -0
  67. package/dist/devices/microwave.js +144 -0
  68. package/dist/devices/microwave.js.map +1 -0
  69. package/dist/devices/oven.d.ts +9 -2
  70. package/dist/devices/oven.d.ts.map +1 -1
  71. package/dist/devices/oven.js +245 -43
  72. package/dist/devices/oven.js.map +1 -1
  73. package/dist/devices/refrigerator.d.ts +37 -2
  74. package/dist/devices/refrigerator.d.ts.map +1 -1
  75. package/dist/devices/refrigerator.js +548 -34
  76. package/dist/devices/refrigerator.js.map +1 -1
  77. package/dist/devices/waterFilter.d.ts +10 -0
  78. package/dist/devices/waterFilter.d.ts.map +1 -0
  79. package/dist/devices/waterFilter.js +67 -0
  80. package/dist/devices/waterFilter.js.map +1 -0
  81. package/dist/devices/waterHeater.d.ts +19 -0
  82. package/dist/devices/waterHeater.d.ts.map +1 -0
  83. package/dist/devices/waterHeater.js +158 -0
  84. package/dist/devices/waterHeater.js.map +1 -0
  85. package/dist/devices/waterSoftener.d.ts +10 -0
  86. package/dist/devices/waterSoftener.d.ts.map +1 -0
  87. package/dist/devices/waterSoftener.js +67 -0
  88. package/dist/devices/waterSoftener.js.map +1 -0
  89. package/dist/getAccessToken.d.ts.map +1 -1
  90. package/dist/getAccessToken.js +6 -0
  91. package/dist/getAccessToken.js.map +1 -1
  92. package/dist/platform.d.ts +25 -1
  93. package/dist/platform.d.ts.map +1 -1
  94. package/dist/platform.js +548 -70
  95. package/dist/platform.js.map +1 -1
  96. package/dist/platform.test.d.ts +2 -0
  97. package/dist/platform.test.d.ts.map +1 -0
  98. package/dist/platform.test.js +80 -0
  99. package/dist/platform.test.js.map +1 -0
  100. package/dist/settings.d.ts +23 -0
  101. package/dist/settings.d.ts.map +1 -1
  102. package/dist/settings.js +13 -0
  103. package/dist/settings.js.map +1 -1
  104. package/docs/assets/highlight.css +7 -0
  105. package/docs/assets/main.js +5 -5
  106. package/docs/assets/navigation.js +1 -0
  107. package/docs/assets/search.js +1 -0
  108. package/docs/assets/style.css +248 -226
  109. package/docs/classes/SmartHQPlatform.html +51 -56
  110. package/docs/hierarchy.html +1 -0
  111. package/docs/index.html +22 -12
  112. package/docs/interfaces/DeviceOptions.html +2 -3
  113. package/docs/interfaces/SmartHQPlatformConfig.html +6 -17
  114. package/docs/interfaces/SmartHqContext.html +6 -4
  115. package/docs/interfaces/SmartHqERDResponse.html +7 -8
  116. package/docs/interfaces/credentials.html +3 -4
  117. package/docs/interfaces/devicesConfig.html +8 -8
  118. package/docs/interfaces/options.html +7 -8
  119. package/docs/media/copilot-instructions.md +90 -0
  120. package/docs/modules.html +1 -2
  121. package/docs/variables/API_URL.html +1 -2
  122. package/docs/variables/ERD_CODES.html +1 -2
  123. package/docs/variables/ERD_TYPES.html +1 -2
  124. package/docs/variables/KEEPALIVE_TIMEOUT.html +1 -2
  125. package/docs/variables/LOGIN_URL.html +2 -3
  126. package/docs/variables/OAUTH2_CLIENT_ID.html +1 -2
  127. package/docs/variables/OAUTH2_CLIENT_SECRET.html +1 -2
  128. package/docs/variables/OAUTH2_REDIRECT_URI.html +1 -2
  129. package/docs/variables/PLATFORM_NAME.html +2 -3
  130. package/docs/variables/PLUGIN_NAME.html +2 -3
  131. package/docs/variables/SECURE_URL.html +2 -3
  132. package/docs/variables/default.html +1 -0
  133. package/package.json +22 -33
  134. package/typedoc.json +0 -4
  135. package/vitest.config.ts +6 -5
  136. package/.github/workflows/build.yml +0 -18
  137. package/.github/workflows/changerelease.yml +0 -11
  138. package/.github/workflows/labeler.yml +0 -9
  139. package/.github/workflows/release-drafter.yml +0 -14
  140. package/docs/assets/dmt/dmt-component-data.js +0 -1
  141. package/docs/assets/dmt/dmt-components.css +0 -20
  142. package/docs/assets/dmt/dmt-components.js +0 -67
  143. package/docs/assets/dmt/dmt-search.cmp +0 -0
  144. package/docs/assets/dmt/dmt-theme.css +0 -1
  145. package/docs/functions/default.html +0 -2
@@ -0,0 +1,240 @@
1
+ import { interval, skipWhile } from 'rxjs';
2
+ import { ERD_TYPES } from '../settings.js';
3
+ import { deviceBase } from './device.js';
4
+ export class SmartHQClothesDryer extends deviceBase {
5
+ platform;
6
+ device;
7
+ // Updates
8
+ SensorUpdateInProgress;
9
+ deviceStatus;
10
+ // Matter support override flag
11
+ useMatterOverride = false;
12
+ constructor(platform, accessory, device) {
13
+ super(platform, accessory, device);
14
+ this.platform = platform;
15
+ this.device = device;
16
+ // Check if we should use Matter protocol
17
+ this.useMatterOverride = device.useMatter ?? false;
18
+ this.debugLog(`Clothes Dryer Features: ${JSON.stringify(accessory.context.device.features)}`);
19
+ this.debugLog(`Using protocol: ${this.useMatterOverride ? 'Matter' : 'HAP'}`);
20
+ // Initialize the appropriate protocol
21
+ if (this.useMatterOverride) {
22
+ this.initializeMatter();
23
+ }
24
+ else {
25
+ this.initializeHAP();
26
+ }
27
+ // Start periodic refresh
28
+ this.SensorUpdateInProgress = false;
29
+ interval(this.deviceRefreshRate * 10000)
30
+ .pipe(skipWhile(() => this.SensorUpdateInProgress))
31
+ .subscribe(async () => {
32
+ // await this.refreshStatus()
33
+ });
34
+ }
35
+ /**
36
+ * Initialize Matter protocol
37
+ */
38
+ initializeMatter() {
39
+ const { valid, api: matterAPI } = this.validateMatterAPI();
40
+ if (!valid) {
41
+ this.errorLog('Matter API not available or incomplete - falling back to HAP');
42
+ this.initializeHAP();
43
+ return;
44
+ }
45
+ const serialNumber = this.device.applianceId || 'unknown';
46
+ this.matterUuid = matterAPI.uuid.generate(serialNumber);
47
+ // Create Matter accessory configuration with dryer-specific clusters
48
+ const matterAccessory = {
49
+ UUID: this.matterUuid,
50
+ displayName: this.device.nickname || 'SmartHQ Dryer',
51
+ serialNumber,
52
+ manufacturer: this.device.brand && this.device.brand !== 'Unknown' ? this.device.brand : 'GE Appliances',
53
+ model: this.device.model || 'SmartHQ',
54
+ firmwareRevision: this.deviceFirmwareVersion,
55
+ hardwareRevision: this.deviceFirmwareVersion,
56
+ deviceType: matterAPI.deviceTypes.LaundryDryerDevice,
57
+ clusters: {
58
+ // Operational State cluster (maps to LAUNDRY_MACHINE_STATE)
59
+ operationalState: {
60
+ operationalState: 0, // 0=Stopped, 1=Running, 2=Paused
61
+ operationalError: { errorStateID: 0 },
62
+ phaseList: ['Drying', 'Cooling', 'Anti-Wrinkle'],
63
+ currentPhase: 0,
64
+ },
65
+ // LaundryDryer Mode cluster for cycle selection (maps to LAUNDRY_CYCLE)
66
+ laundryDryerMode: {
67
+ supportedModes: [
68
+ { label: 'Normal', mode: 0 },
69
+ { label: 'Delicate', mode: 1 },
70
+ { label: 'Heavy Duty', mode: 2 },
71
+ { label: 'Quick Dry', mode: 3 },
72
+ { label: 'Air Fluff', mode: 4 },
73
+ { label: 'Sanitize', mode: 5 },
74
+ ],
75
+ currentMode: 0,
76
+ },
77
+ // Temperature Control for heat settings
78
+ temperatureControl: {
79
+ supportedTemperatureLevels: ['No Heat', 'Low', 'Medium', 'High'],
80
+ selectedTemperatureLevel: 0,
81
+ },
82
+ // Temperature Measurement for dryer temperature
83
+ temperatureMeasurement: {
84
+ measuredValue: 2000, // 20°C in 0.01°C units
85
+ minMeasuredValue: 0,
86
+ maxMeasuredValue: 8000, // 80°C max
87
+ },
88
+ // Timer cluster for time remaining (maps to LAUNDRY_TIME_REMAINING)
89
+ timer: {
90
+ timerState: 0,
91
+ duration: 0,
92
+ remainingTime: 0,
93
+ },
94
+ // Alarm cluster for cycle complete (maps to LAUNDRY_END_OF_CYCLE)
95
+ alarm: {
96
+ mask: 0,
97
+ state: 0,
98
+ supported: 1, // Bit 0: Cycle complete
99
+ },
100
+ // Door Lock cluster (maps to LAUNDRY_DOOR_LOCK)
101
+ doorLock: {
102
+ lockState: 0, // 0=Unlocked, 1=Locked
103
+ lockType: 0,
104
+ actuatorEnabled: true,
105
+ },
106
+ // On/Off cluster for machine active state
107
+ onOff: {
108
+ onOff: false,
109
+ },
110
+ },
111
+ handlers: {},
112
+ };
113
+ // Register Matter accessory
114
+ matterAPI.registerAccessory(matterAccessory);
115
+ this.infoLog('Created Matter Dryer with operational state, mode selection, temperature control, timer, alarm, and door lock clusters');
116
+ }
117
+ /**
118
+ * Initialize HAP (HomeKit) protocol
119
+ */
120
+ initializeHAP() {
121
+ // Dryer Running State (Valve)
122
+ const dryerValve = this.accessory.getService('Dryer') ?? this.accessory.addService(this.platform.Service.Valve, 'Dryer', 'Dryer');
123
+ dryerValve.setCharacteristic(this.platform.Characteristic.Name, 'Dryer');
124
+ dryerValve.setCharacteristic(this.platform.Characteristic.ValveType, this.platform.Characteristic.ValveType.GENERIC_VALVE);
125
+ dryerValve
126
+ .getCharacteristic(this.platform.Characteristic.Active)
127
+ .onGet(async () => {
128
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
129
+ // Machine state: 0=idle, 1=running
130
+ return r && Number.parseInt(r) !== 0 ? this.platform.Characteristic.Active.ACTIVE : this.platform.Characteristic.Active.INACTIVE;
131
+ });
132
+ dryerValve
133
+ .getCharacteristic(this.platform.Characteristic.InUse)
134
+ .onGet(async () => {
135
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
136
+ return r && Number.parseInt(r) !== 0 ? this.platform.Characteristic.InUse.IN_USE : this.platform.Characteristic.InUse.NOT_IN_USE;
137
+ });
138
+ dryerValve
139
+ .getCharacteristic(this.platform.Characteristic.RemainingDuration)
140
+ .onGet(async () => {
141
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_TIME_REMAINING);
142
+ if (!r) {
143
+ return 0;
144
+ }
145
+ // Value is in hex, convert to decimal (appears to be in deciseconds or needs /10)
146
+ const value = Number.parseInt(r, 16);
147
+ const minutes = value / 10;
148
+ const seconds = Math.min(minutes * 60, 3600); // Cap at 3600 seconds (HomeKit max)
149
+ this.debugLog(`Time Remaining - Hex: ${r}, Decimal: ${value}, Minutes: ${minutes}, Seconds: ${seconds}`);
150
+ return seconds;
151
+ });
152
+ // Door Lock
153
+ const doorLock = this.accessory.getService('Dryer Door Lock') ?? this.accessory.addService(this.platform.Service.LockMechanism, 'Dryer Door Lock', 'DryerDoorLock');
154
+ doorLock.setCharacteristic(this.platform.Characteristic.Name, 'Dryer Door Lock');
155
+ doorLock
156
+ .getCharacteristic(this.platform.Characteristic.LockCurrentState)
157
+ .onGet(async () => {
158
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR_LOCK);
159
+ // 0=unlocked, 1=locked
160
+ return r && Number.parseInt(r) === 1
161
+ ? this.platform.Characteristic.LockCurrentState.SECURED
162
+ : this.platform.Characteristic.LockCurrentState.UNSECURED;
163
+ });
164
+ doorLock
165
+ .getCharacteristic(this.platform.Characteristic.LockTargetState)
166
+ .onGet(async () => {
167
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR_LOCK);
168
+ return r && Number.parseInt(r) === 1
169
+ ? this.platform.Characteristic.LockTargetState.SECURED
170
+ : this.platform.Characteristic.LockTargetState.UNSECURED;
171
+ });
172
+ // Door Sensor
173
+ const doorSensor = this.accessory.getService('Dryer Door') ?? this.accessory.addService(this.platform.Service.ContactSensor, 'Dryer Door', 'DryerDoor');
174
+ doorSensor.setCharacteristic(this.platform.Characteristic.Name, 'Dryer Door');
175
+ doorSensor
176
+ .getCharacteristic(this.platform.Characteristic.ContactSensorState)
177
+ .onGet(async () => {
178
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR);
179
+ // 0=closed, 1=open
180
+ return r && Number.parseInt(r) === 1
181
+ ? this.platform.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED
182
+ : this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED;
183
+ });
184
+ // Cycle Name (using a motion sensor to display cycle info)
185
+ const cycleCodeToName = (code) => {
186
+ const cycleMap = {
187
+ 0: 'Not Defined',
188
+ 128: 'Cottons',
189
+ 129: 'Easy Care',
190
+ 130: 'Active Wear',
191
+ 131: 'Timed Dry',
192
+ 132: 'Dewrinkle',
193
+ 133: 'Air Fluff',
194
+ 134: 'Steam Refresh',
195
+ 135: 'Steam Dewrinkle',
196
+ 136: 'Speed Dry',
197
+ 137: 'Mixed',
198
+ 138: 'Quick Dry',
199
+ 139: 'Casuals',
200
+ 140: 'Warm Up',
201
+ 141: 'Energy Saver',
202
+ 142: 'Antibacterial',
203
+ 143: 'Rack Dry',
204
+ 144: 'Baby Care',
205
+ 145: 'Auto Dry',
206
+ 146: 'Auto Extra',
207
+ 147: 'Perm Press',
208
+ 148: 'Washer Link',
209
+ };
210
+ return cycleMap[code] || `Cycle ${code}`;
211
+ };
212
+ const cycleSensor = this.accessory.getService('Cycle Status') ?? this.accessory.addService(this.platform.Service.MotionSensor, 'Cycle Status', 'DryerCycle');
213
+ cycleSensor.setCharacteristic(this.platform.Characteristic.Name, 'Cycle Status');
214
+ cycleSensor
215
+ .getCharacteristic(this.platform.Characteristic.MotionDetected)
216
+ .onGet(async () => {
217
+ const cycleCode = await this.readErd(ERD_TYPES.LAUNDRY_CYCLE);
218
+ const subCycleCode = await this.readErd(ERD_TYPES.LAUNDRY_SUB_CYCLE);
219
+ if (cycleCode && cycleCode !== '00') {
220
+ const code = Number.parseInt(cycleCode, 16);
221
+ const cycleName = cycleCodeToName(code);
222
+ const subCycleMap = {
223
+ 0: 'None',
224
+ 128: 'Drying',
225
+ 129: 'Mist Steam',
226
+ 130: 'Cool Down',
227
+ 131: 'Extended Tumble',
228
+ 132: 'Damp',
229
+ 133: 'Air Fluff',
230
+ };
231
+ const subCode = subCycleCode ? Number.parseInt(subCycleCode, 16) : 0;
232
+ const subCycleName = subCycleMap[subCode] || '';
233
+ this.infoLog(`Dryer Cycle: ${cycleName}${subCycleName !== 'None' ? ` - ${subCycleName}` : ''}`);
234
+ return true; // Motion detected when cycle is running
235
+ }
236
+ return false;
237
+ });
238
+ }
239
+ }
240
+ //# sourceMappingURL=clothesDryer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clothesDryer.js","sourceRoot":"","sources":["../../src/devices/clothesDryer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { PlatformAccessory } from 'homebridge';
2
+ import type { SmartHQPlatform } from '../platform.js';
3
+ import type { devicesConfig, SmartHqContext } from '../settings.js';
4
+ import { deviceBase } from './device.js';
5
+ export declare class SmartHQClothesWasher extends deviceBase {
6
+ readonly platform: SmartHQPlatform;
7
+ readonly device: SmartHqContext['device'] & devicesConfig;
8
+ SensorUpdateInProgress: boolean;
9
+ deviceStatus: any;
10
+ private useMatterOverride;
11
+ constructor(platform: SmartHQPlatform, accessory: PlatformAccessory<SmartHqContext>, device: SmartHqContext['device'] & devicesConfig);
12
+ /**
13
+ * Initialize Matter protocol
14
+ */
15
+ private initializeMatter;
16
+ /**
17
+ * Initialize HAP (HomeKit) protocol
18
+ */
19
+ private initializeHAP;
20
+ }
21
+ //# sourceMappingURL=clothesWasher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clothesWasher.d.ts","sourceRoot":"","sources":["../../src/devices/clothesWasher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAKnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,qBAAa,oBAAqB,SAAQ,UAAU;IAShD,QAAQ,CAAC,QAAQ,EAAE,eAAe;IAElC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,aAAa;IAT3D,sBAAsB,EAAG,OAAO,CAAA;IAChC,YAAY,EAAE,GAAG,CAAA;IAGjB,OAAO,CAAC,iBAAiB,CAAiB;gBAG/B,QAAQ,EAAE,eAAe,EAClC,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EACnC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,aAAa;IA0B3D;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA8ExB;;OAEG;IACH,OAAO,CAAC,aAAa;CAmJtB"}
@@ -0,0 +1,251 @@
1
+ import { interval, skipWhile } from 'rxjs';
2
+ import { ERD_TYPES } from '../settings.js';
3
+ import { deviceBase } from './device.js';
4
+ export class SmartHQClothesWasher extends deviceBase {
5
+ platform;
6
+ device;
7
+ // Updates
8
+ SensorUpdateInProgress;
9
+ deviceStatus;
10
+ // Matter support override flag
11
+ useMatterOverride = false;
12
+ constructor(platform, accessory, device) {
13
+ super(platform, accessory, device);
14
+ this.platform = platform;
15
+ this.device = device;
16
+ // Check if we should use Matter protocol
17
+ this.useMatterOverride = device.useMatter ?? false;
18
+ this.debugLog(`Clothes Washer Features: ${JSON.stringify(accessory.context.device.features)}`);
19
+ this.debugLog(`Using protocol: ${this.useMatterOverride ? 'Matter' : 'HAP'}`);
20
+ // Initialize the appropriate protocol
21
+ if (this.useMatterOverride) {
22
+ this.initializeMatter();
23
+ }
24
+ else {
25
+ this.initializeHAP();
26
+ }
27
+ // Start periodic refresh
28
+ this.SensorUpdateInProgress = false;
29
+ interval(this.deviceRefreshRate * 10000)
30
+ .pipe(skipWhile(() => this.SensorUpdateInProgress))
31
+ .subscribe(async () => {
32
+ // await this.refreshStatus()
33
+ });
34
+ }
35
+ /**
36
+ * Initialize Matter protocol
37
+ */
38
+ initializeMatter() {
39
+ const { valid, api: matterAPI } = this.validateMatterAPI();
40
+ if (!valid) {
41
+ this.errorLog('Matter API not available or incomplete - falling back to HAP');
42
+ this.initializeHAP();
43
+ return;
44
+ }
45
+ const serialNumber = this.device.applianceId || 'unknown';
46
+ this.matterUuid = matterAPI.uuid.generate(serialNumber);
47
+ // Create Matter accessory configuration with washer-specific clusters
48
+ const matterAccessory = {
49
+ UUID: this.matterUuid,
50
+ displayName: this.device.nickname || 'SmartHQ Washer',
51
+ serialNumber,
52
+ manufacturer: this.device.brand && this.device.brand !== 'Unknown' ? this.device.brand : 'GE Appliances',
53
+ model: this.device.model || 'SmartHQ',
54
+ firmwareRevision: this.deviceFirmwareVersion,
55
+ hardwareRevision: this.deviceFirmwareVersion,
56
+ deviceType: matterAPI.deviceTypes.LaundryWasherDevice,
57
+ clusters: {
58
+ // Operational State cluster (maps to LAUNDRY_MACHINE_STATE)
59
+ operationalState: {
60
+ operationalState: 0, // 0=Stopped, 1=Running, 2=Paused
61
+ operationalError: { errorStateID: 0 },
62
+ phaseList: ['Fill', 'Soak', 'Wash', 'Rinse', 'Spin', 'Drain'],
63
+ currentPhase: 0,
64
+ },
65
+ // LaundryWasher Mode cluster for cycle selection (maps to LAUNDRY_CYCLE)
66
+ laundryWasherMode: {
67
+ supportedModes: [
68
+ { label: 'Normal', mode: 0 },
69
+ { label: 'Delicate', mode: 1 },
70
+ { label: 'Heavy Duty', mode: 2 },
71
+ { label: 'Whites', mode: 3 },
72
+ { label: 'Quick Wash', mode: 4 },
73
+ { label: 'Sanitize', mode: 5 },
74
+ ],
75
+ currentMode: 0,
76
+ },
77
+ // Temperature Control for water temperature
78
+ temperatureControl: {
79
+ supportedTemperatureLevels: ['Cold', 'Warm', 'Hot'],
80
+ selectedTemperatureLevel: 0,
81
+ },
82
+ // Timer cluster for time remaining (maps to LAUNDRY_TIME_REMAINING)
83
+ timer: {
84
+ timerState: 0,
85
+ duration: 0,
86
+ remainingTime: 0,
87
+ },
88
+ // Alarm cluster for cycle complete (maps to LAUNDRY_END_OF_CYCLE)
89
+ alarm: {
90
+ mask: 0,
91
+ state: 0,
92
+ supported: 1, // Bit 0: Cycle complete
93
+ },
94
+ // Door Lock cluster (maps to LAUNDRY_DOOR_LOCK)
95
+ doorLock: {
96
+ lockState: 0, // 0=Unlocked, 1=Locked
97
+ lockType: 0,
98
+ actuatorEnabled: true,
99
+ },
100
+ // On/Off cluster for machine active state
101
+ onOff: {
102
+ onOff: false,
103
+ },
104
+ },
105
+ handlers: {},
106
+ };
107
+ // Register Matter accessory
108
+ matterAPI.registerAccessory(matterAccessory);
109
+ this.infoLog('Created Matter Washer with operational state, mode selection, temperature control, timer, alarm, and door lock clusters');
110
+ }
111
+ /**
112
+ * Initialize HAP (HomeKit) protocol
113
+ */
114
+ initializeHAP() {
115
+ // Washer Running State (Valve)
116
+ const washerValve = this.accessory.getService('Washer') ?? this.accessory.addService(this.platform.Service.Valve, 'Washer', 'Washer');
117
+ washerValve.setCharacteristic(this.platform.Characteristic.Name, 'Washer');
118
+ washerValve.setCharacteristic(this.platform.Characteristic.ValveType, this.platform.Characteristic.ValveType.GENERIC_VALVE);
119
+ washerValve
120
+ .getCharacteristic(this.platform.Characteristic.Active)
121
+ .onGet(async () => {
122
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
123
+ // Machine state: 0=idle, 1=running
124
+ return r && Number.parseInt(r) !== 0 ? this.platform.Characteristic.Active.ACTIVE : this.platform.Characteristic.Active.INACTIVE;
125
+ });
126
+ washerValve
127
+ .getCharacteristic(this.platform.Characteristic.InUse)
128
+ .onGet(async () => {
129
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
130
+ return r && Number.parseInt(r) !== 0 ? this.platform.Characteristic.InUse.IN_USE : this.platform.Characteristic.InUse.NOT_IN_USE;
131
+ });
132
+ washerValve
133
+ .getCharacteristic(this.platform.Characteristic.RemainingDuration)
134
+ .onGet(async () => {
135
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_TIME_REMAINING);
136
+ if (!r) {
137
+ return 0;
138
+ }
139
+ // Value is in hex, convert to decimal (appears to be in deciseconds or needs /10)
140
+ const value = Number.parseInt(r, 16);
141
+ const minutes = value / 10;
142
+ const seconds = Math.min(minutes * 60, 3600); // Cap at 3600 seconds (HomeKit max)
143
+ this.infoLog(`Time Remaining - Hex: ${r}, Decimal: ${value}, Minutes: ${minutes}, Seconds: ${seconds}`);
144
+ return seconds;
145
+ });
146
+ // Door Lock
147
+ const doorLock = this.accessory.getService('Washer Door Lock') ?? this.accessory.addService(this.platform.Service.LockMechanism, 'Washer Door Lock', 'WasherDoorLock');
148
+ doorLock.setCharacteristic(this.platform.Characteristic.Name, 'Washer Door Lock');
149
+ doorLock
150
+ .getCharacteristic(this.platform.Characteristic.LockCurrentState)
151
+ .onGet(async () => {
152
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR_LOCK);
153
+ // 0=unlocked, 1=locked
154
+ return r && Number.parseInt(r) === 1
155
+ ? this.platform.Characteristic.LockCurrentState.SECURED
156
+ : this.platform.Characteristic.LockCurrentState.UNSECURED;
157
+ });
158
+ doorLock
159
+ .getCharacteristic(this.platform.Characteristic.LockTargetState)
160
+ .onGet(async () => {
161
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR_LOCK);
162
+ return r && Number.parseInt(r) === 1
163
+ ? this.platform.Characteristic.LockTargetState.SECURED
164
+ : this.platform.Characteristic.LockTargetState.UNSECURED;
165
+ });
166
+ // Door Sensor
167
+ const doorSensor = this.accessory.getService('Washer Door') ?? this.accessory.addService(this.platform.Service.ContactSensor, 'Washer Door', 'WasherDoor');
168
+ doorSensor.setCharacteristic(this.platform.Characteristic.Name, 'Washer Door');
169
+ doorSensor
170
+ .getCharacteristic(this.platform.Characteristic.ContactSensorState)
171
+ .onGet(async () => {
172
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR);
173
+ // 0=closed, 1=open
174
+ return r && Number.parseInt(r) === 1
175
+ ? this.platform.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED
176
+ : this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED;
177
+ });
178
+ // Cycle Name (using a StatelessProgrammableSwitch to display cycle info)
179
+ // We'll map cycle codes to readable names
180
+ const cycleCodeToName = (code) => {
181
+ const cycleMap = {
182
+ 0: 'Not Defined',
183
+ 1: 'Basket Clean',
184
+ 2: 'Drain And Spin',
185
+ 3: 'Quick Rinse',
186
+ 4: 'Bulky Items',
187
+ 5: 'Sanitize',
188
+ 6: 'Towels/Sheets',
189
+ 7: 'Steam Refresh',
190
+ 8: 'Normal/Mixed',
191
+ 9: 'Whites',
192
+ 10: 'Dark Colors',
193
+ 11: 'Jeans',
194
+ 12: 'Hand Wash',
195
+ 13: 'Delicates',
196
+ 14: 'Speed Wash',
197
+ 15: 'Heavy Duty',
198
+ 16: 'Allergen',
199
+ 17: 'Power Clean',
200
+ 18: 'Rinse And Spin',
201
+ 19: 'Single Item',
202
+ 20: 'Colors',
203
+ 21: 'Cold Wash',
204
+ 22: 'Water Station',
205
+ 23: 'Tub Clean',
206
+ 24: 'Casuals With Steam',
207
+ 25: 'Stain Wash',
208
+ 26: 'Deep Clean',
209
+ 27: 'Bulky Bedding',
210
+ 28: 'Normal',
211
+ 29: 'Quick Wash',
212
+ 30: 'Sanitize With Oxi',
213
+ 31: 'Self Clean',
214
+ 32: 'Towels',
215
+ 33: 'Soak',
216
+ 34: 'Wool',
217
+ };
218
+ return cycleMap[code] || `Cycle ${code}`;
219
+ };
220
+ // Create a motion sensor to show cycle status
221
+ const cycleSensor = this.accessory.getService('Cycle Status') ?? this.accessory.addService(this.platform.Service.MotionSensor, 'Cycle Status', 'WasherCycle');
222
+ cycleSensor.setCharacteristic(this.platform.Characteristic.Name, 'Cycle Status');
223
+ cycleSensor
224
+ .getCharacteristic(this.platform.Characteristic.MotionDetected)
225
+ .onGet(async () => {
226
+ const cycleCode = await this.readErd(ERD_TYPES.LAUNDRY_CYCLE);
227
+ const subCycleCode = await this.readErd(ERD_TYPES.LAUNDRY_SUB_CYCLE);
228
+ if (cycleCode && cycleCode !== '00') {
229
+ const code = Number.parseInt(cycleCode, 16);
230
+ const cycleName = cycleCodeToName(code);
231
+ const subCycleMap = {
232
+ 0: 'None',
233
+ 1: 'Fill',
234
+ 2: 'Soak',
235
+ 3: 'Wash',
236
+ 4: 'Rinse',
237
+ 5: 'Spin',
238
+ 6: 'Drain',
239
+ 7: 'Extra Spin',
240
+ 8: 'Extra Rinse',
241
+ };
242
+ const subCode = subCycleCode ? Number.parseInt(subCycleCode, 16) : 0;
243
+ const subCycleName = subCycleMap[subCode] || '';
244
+ this.infoLog(`Washer Cycle: ${cycleName}${subCycleName !== 'None' ? ` - ${subCycleName}` : ''}`);
245
+ return true; // Motion detected when cycle is running
246
+ }
247
+ return false;
248
+ });
249
+ }
250
+ }
251
+ //# sourceMappingURL=clothesWasher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clothesWasher.js","sourceRoot":"","sources":["../../src/devices/clothesWasher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { PlatformAccessory } from 'homebridge';
2
+ import type { SmartHQPlatform } from '../platform.js';
3
+ import type { devicesConfig, SmartHqContext } from '../settings.js';
4
+ import { deviceBase } from './device.js';
5
+ export declare class SmartHQCoffeeMaker extends deviceBase {
6
+ readonly platform: SmartHQPlatform;
7
+ readonly device: SmartHqContext['device'] & devicesConfig;
8
+ constructor(platform: SmartHQPlatform, accessory: PlatformAccessory<SmartHqContext>, device: SmartHqContext['device'] & devicesConfig);
9
+ }
10
+ //# sourceMappingURL=coffeeMaker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coffeeMaker.d.ts","sourceRoot":"","sources":["../../src/devices/coffeeMaker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,qBAAa,kBAAmB,SAAQ,UAAU;IAE9C,QAAQ,CAAC,QAAQ,EAAE,eAAe;IAElC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,aAAa;gBAFhD,QAAQ,EAAE,eAAe,EAClC,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EACnC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,aAAa;CAuE5D"}
@@ -0,0 +1,79 @@
1
+ import { deviceBase } from './device.js';
2
+ export class SmartHQCoffeeMaker extends deviceBase {
3
+ platform;
4
+ device;
5
+ constructor(platform, accessory, device) {
6
+ super(platform, accessory, device);
7
+ this.platform = platform;
8
+ this.device = device;
9
+ this.debugLog(`Coffee Maker Features: ${JSON.stringify(accessory.context.device.features)}`);
10
+ // Coffee Maker Brewing State (Valve)
11
+ const brewValve = this.accessory.getService('Coffee Maker') ?? this.accessory.addService(this.platform.Service.Valve, 'Coffee Maker', 'CoffeeMaker');
12
+ brewValve.setCharacteristic(this.platform.Characteristic.Name, 'Coffee Maker');
13
+ brewValve.setCharacteristic(this.platform.Characteristic.ValveType, this.platform.Characteristic.ValveType.GENERIC_VALVE);
14
+ brewValve
15
+ .getCharacteristic(this.platform.Characteristic.Active)
16
+ .onGet(async () => {
17
+ try {
18
+ // TODO: Implement brewing state ERD
19
+ return this.platform.Characteristic.Active.INACTIVE;
20
+ }
21
+ catch (error) {
22
+ this.warnLog?.(`Coffee Maker Active error: ${error?.message ?? error}`);
23
+ return this.platform.Characteristic.Active.INACTIVE;
24
+ }
25
+ })
26
+ .onSet(async (value) => {
27
+ try {
28
+ // TODO: Implement brew control ERD
29
+ this.debugLog(`Coffee Maker brew set to: ${value}`);
30
+ }
31
+ catch (error) {
32
+ this.warnLog?.(`Coffee Maker brew set error: ${error?.message ?? error}`);
33
+ }
34
+ });
35
+ brewValve
36
+ .getCharacteristic(this.platform.Characteristic.InUse)
37
+ .onGet(async () => {
38
+ try {
39
+ // TODO: Implement brewing state ERD
40
+ return this.platform.Characteristic.InUse.NOT_IN_USE;
41
+ }
42
+ catch (error) {
43
+ this.warnLog?.(`Coffee Maker InUse error: ${error?.message ?? error}`);
44
+ return this.platform.Characteristic.InUse.NOT_IN_USE;
45
+ }
46
+ });
47
+ // Water Level Sensor (Humidity as proxy)
48
+ const waterLevel = this.accessory.getService('Water Level') ?? this.accessory.addService(this.platform.Service.HumiditySensor, 'Water Level', 'WaterLevel');
49
+ waterLevel.setCharacteristic(this.platform.Characteristic.Name, 'Water Level');
50
+ waterLevel
51
+ .getCharacteristic(this.platform.Characteristic.CurrentRelativeHumidity)
52
+ .onGet(async () => {
53
+ try {
54
+ // TODO: Implement water level ERD (0-100%)
55
+ return 100;
56
+ }
57
+ catch (error) {
58
+ this.warnLog?.(`Coffee Maker Water Level error: ${error?.message ?? error}`);
59
+ return 0;
60
+ }
61
+ });
62
+ // Filter/Cleaning Status
63
+ const filterService = this.accessory.getService('Coffee Filter') ?? this.accessory.addService(this.platform.Service.FilterMaintenance, 'Coffee Filter', 'CoffeeFilter');
64
+ filterService.setCharacteristic(this.platform.Characteristic.Name, 'Coffee Filter');
65
+ filterService
66
+ .getCharacteristic(this.platform.Characteristic.FilterChangeIndication)
67
+ .onGet(async () => {
68
+ try {
69
+ // TODO: Implement filter/cleaning status ERD
70
+ return this.platform.Characteristic.FilterChangeIndication.FILTER_OK;
71
+ }
72
+ catch (error) {
73
+ this.warnLog?.(`Coffee Filter Status error: ${error?.message ?? error}`);
74
+ return this.platform.Characteristic.FilterChangeIndication.FILTER_OK;
75
+ }
76
+ });
77
+ }
78
+ }
79
+ //# sourceMappingURL=coffeeMaker.js.map