@homebridge-plugins/homebridge-smarthq 0.5.0-beta.4 → 0.5.0-beta.41

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 +361 -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 +24 -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 +111 -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 +273 -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 +284 -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 +108 -13
  54. package/dist/devices/device.d.ts.map +1 -1
  55. package/dist/devices/device.js +381 -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 +164 -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 +336 -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 +147 -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 +267 -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 +583 -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 +161 -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 +190 -2
  91. package/dist/getAccessToken.js.map +1 -1
  92. package/dist/platform.d.ts +32 -1
  93. package/dist/platform.d.ts.map +1 -1
  94. package/dist/platform.js +853 -151
  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 +24 -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 +54 -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 +9 -8
  118. package/docs/interfaces/options.html +7 -8
  119. package/docs/media/copilot-instructions.md +361 -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,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 SmartHQClothesDryer 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=clothesDryer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clothesDryer.d.ts","sourceRoot":"","sources":["../../src/devices/clothesDryer.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,mBAAoB,SAAQ,UAAU;IAS/C,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;IA4B3D;;OAEG;YACW,gBAAgB;IA6G9B;;OAEG;IACH,OAAO,CAAC,aAAa;CAgJtB"}
@@ -0,0 +1,273 @@
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().catch((error) => {
23
+ this.errorLog(`Failed to initialize Matter: ${error}`);
24
+ });
25
+ }
26
+ else {
27
+ this.initializeHAP();
28
+ }
29
+ // Start periodic refresh
30
+ this.SensorUpdateInProgress = false;
31
+ interval(this.deviceRefreshRate * 10000)
32
+ .pipe(skipWhile(() => this.SensorUpdateInProgress))
33
+ .subscribe(async () => {
34
+ // await this.refreshStatus()
35
+ });
36
+ }
37
+ /**
38
+ * Initialize Matter protocol
39
+ */
40
+ async initializeMatter() {
41
+ const { valid, api: matterAPI } = this.validateMatterAPI();
42
+ if (!valid) {
43
+ if (this.device.matterOnly) {
44
+ this.errorLog('Matter API not available or incomplete - accessory will NOT be published (matterOnly mode enabled)');
45
+ this.errorLog('Reason: Matter API validation failed');
46
+ return;
47
+ }
48
+ this.errorLog('Matter API not available or incomplete - falling back to HAP');
49
+ this.initializeHAP();
50
+ return;
51
+ }
52
+ // Check if LaundryDryerDevice device type is available
53
+ if (!matterAPI.deviceTypes.LaundryDryerDevice) {
54
+ if (this.device.matterOnly) {
55
+ this.errorLog('Matter LaundryDryerDevice device type not available - accessory will NOT be published (matterOnly mode enabled)');
56
+ this.errorLog('Reason: Required Matter device type "LaundryDryerDevice" is not available in this Homebridge version');
57
+ this.errorLog(`Available Matter device types: ${Object.keys(matterAPI.deviceTypes).join(', ')}`);
58
+ return;
59
+ }
60
+ this.warnLog('Matter LaundryDryerDevice device type not available in this Homebridge version - falling back to HAP');
61
+ this.warnLog(`Available Matter device types: ${Object.keys(matterAPI.deviceTypes).join(', ')}`);
62
+ this.useMatterOverride = false;
63
+ this.initializeHAP();
64
+ return;
65
+ }
66
+ const serialNumber = this.device.applianceId || 'unknown';
67
+ this.matterUuid = matterAPI.uuid.generate(serialNumber);
68
+ // Create Matter accessory configuration with dryer-specific clusters
69
+ const matterAccessory = {
70
+ UUID: this.matterUuid,
71
+ displayName: this.device.nickname || 'SmartHQ Dryer',
72
+ serialNumber,
73
+ manufacturer: this.device.brand && this.device.brand !== 'Unknown' ? this.device.brand : 'GE Appliances',
74
+ model: this.device.model || 'SmartHQ',
75
+ firmwareRevision: this.deviceFirmwareVersion,
76
+ hardwareRevision: this.deviceFirmwareVersion,
77
+ deviceType: matterAPI.deviceTypes.LaundryDryerDevice,
78
+ clusters: {
79
+ // Operational State cluster (maps to LAUNDRY_MACHINE_STATE)
80
+ operationalState: {
81
+ operationalState: 0, // 0=Stopped, 1=Running, 2=Paused
82
+ operationalError: { errorStateID: 0 },
83
+ phaseList: ['Drying', 'Cooling', 'Anti-Wrinkle'],
84
+ currentPhase: 0,
85
+ },
86
+ // LaundryDryer Mode cluster for cycle selection (maps to LAUNDRY_CYCLE)
87
+ laundryDryerMode: {
88
+ supportedModes: [
89
+ { label: 'Normal', mode: 0 },
90
+ { label: 'Delicate', mode: 1 },
91
+ { label: 'Heavy Duty', mode: 2 },
92
+ { label: 'Quick Dry', mode: 3 },
93
+ { label: 'Air Fluff', mode: 4 },
94
+ { label: 'Sanitize', mode: 5 },
95
+ ],
96
+ currentMode: 0,
97
+ },
98
+ // Temperature Control for heat settings
99
+ temperatureControl: {
100
+ supportedTemperatureLevels: ['No Heat', 'Low', 'Medium', 'High'],
101
+ selectedTemperatureLevel: 0,
102
+ },
103
+ // Temperature Measurement for dryer temperature
104
+ temperatureMeasurement: {
105
+ measuredValue: 2000, // 20°C in 0.01°C units
106
+ minMeasuredValue: 0,
107
+ maxMeasuredValue: 8000, // 80°C max
108
+ },
109
+ // Timer cluster for time remaining (maps to LAUNDRY_TIME_REMAINING)
110
+ timer: {
111
+ timerState: 0,
112
+ duration: 0,
113
+ remainingTime: 0,
114
+ },
115
+ // Alarm cluster for cycle complete (maps to LAUNDRY_END_OF_CYCLE)
116
+ alarm: {
117
+ mask: 0,
118
+ state: 0,
119
+ supported: 1, // Bit 0: Cycle complete
120
+ },
121
+ // Door Lock cluster (maps to LAUNDRY_DOOR_LOCK)
122
+ doorLock: {
123
+ lockState: 0, // 0=Unlocked, 1=Locked
124
+ lockType: 0,
125
+ actuatorEnabled: true,
126
+ },
127
+ // On/Off cluster for machine active state
128
+ onOff: {
129
+ onOff: false,
130
+ },
131
+ },
132
+ handlers: {},
133
+ };
134
+ // Register Matter accessory as external device
135
+ await matterAPI.registerPlatformAccessories('@homebridge-plugins/homebridge-smarthq', 'SmartHQ', [matterAccessory]);
136
+ this.matterRegistered = true;
137
+ this.infoLog('Created Matter Dryer with operational state, mode selection, temperature control, timer, alarm, and door lock clusters');
138
+ }
139
+ /**
140
+ * Initialize HAP (HomeKit) protocol
141
+ */
142
+ initializeHAP() {
143
+ // Dryer Running State (Valve)
144
+ const dryerValve = this.accessory.getService('Dryer') ?? this.accessory.addService(this.platform.Service.Valve, 'Dryer', 'Dryer');
145
+ dryerValve.setCharacteristic(this.platform.Characteristic.Name, 'Dryer');
146
+ dryerValve.setCharacteristic(this.platform.Characteristic.ValveType, this.platform.Characteristic.ValveType.GENERIC_VALVE);
147
+ // Set maximum duration to a large value (e.g., 12 hours = 43200 seconds)
148
+ dryerValve.getCharacteristic(this.platform.Characteristic.SetDuration).setProps({
149
+ maxValue: 43200,
150
+ minValue: 0,
151
+ minStep: 60,
152
+ });
153
+ dryerValve
154
+ .getCharacteristic(this.platform.Characteristic.Active)
155
+ .onGet(async () => {
156
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
157
+ // Machine state: 0=idle, 1=running
158
+ return r && Number.parseInt(r) !== 0 ? this.platform.Characteristic.Active.ACTIVE : this.platform.Characteristic.Active.INACTIVE;
159
+ });
160
+ dryerValve
161
+ .getCharacteristic(this.platform.Characteristic.InUse)
162
+ .onGet(async () => {
163
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
164
+ return r && Number.parseInt(r) !== 0 ? this.platform.Characteristic.InUse.IN_USE : this.platform.Characteristic.InUse.NOT_IN_USE;
165
+ });
166
+ dryerValve
167
+ .getCharacteristic(this.platform.Characteristic.RemainingDuration)
168
+ .onGet(async () => {
169
+ // Check if machine is running first
170
+ const machineState = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
171
+ if (!machineState || Number.parseInt(machineState) === 0) {
172
+ return 0; // Machine is idle, no time remaining
173
+ }
174
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_TIME_REMAINING);
175
+ if (!r) {
176
+ return 0;
177
+ }
178
+ // Value is in hex, convert to decimal (appears to be in deciseconds or needs /10)
179
+ const value = Number.parseInt(r, 16);
180
+ const minutes = value / 10;
181
+ const seconds = Math.round(minutes * 60); // Don't cap, let it show actual time
182
+ this.infoLog(`Time Remaining - Hex: ${r}, Decimal: ${value}, Minutes: ${minutes}, Seconds: ${seconds}`);
183
+ return seconds;
184
+ });
185
+ // Door Lock
186
+ const doorLock = this.accessory.getService('Dryer Door Lock') ?? this.accessory.addService(this.platform.Service.LockMechanism, 'Dryer Door Lock', 'DryerDoorLock');
187
+ doorLock.setCharacteristic(this.platform.Characteristic.Name, 'Dryer Door Lock');
188
+ doorLock
189
+ .getCharacteristic(this.platform.Characteristic.LockCurrentState)
190
+ .onGet(async () => {
191
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR_LOCK);
192
+ // 0=unlocked, 1=locked
193
+ return r && Number.parseInt(r) === 1
194
+ ? this.platform.Characteristic.LockCurrentState.SECURED
195
+ : this.platform.Characteristic.LockCurrentState.UNSECURED;
196
+ });
197
+ doorLock
198
+ .getCharacteristic(this.platform.Characteristic.LockTargetState)
199
+ .onGet(async () => {
200
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR_LOCK);
201
+ return r && Number.parseInt(r) === 1
202
+ ? this.platform.Characteristic.LockTargetState.SECURED
203
+ : this.platform.Characteristic.LockTargetState.UNSECURED;
204
+ });
205
+ // Door Sensor
206
+ const doorSensor = this.accessory.getService('Dryer Door') ?? this.accessory.addService(this.platform.Service.ContactSensor, 'Dryer Door', 'DryerDoor');
207
+ doorSensor.setCharacteristic(this.platform.Characteristic.Name, 'Dryer Door');
208
+ doorSensor
209
+ .getCharacteristic(this.platform.Characteristic.ContactSensorState)
210
+ .onGet(async () => {
211
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR);
212
+ // 0=closed, 1=open
213
+ return r && Number.parseInt(r) === 1
214
+ ? this.platform.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED
215
+ : this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED;
216
+ });
217
+ // Cycle Name (using a motion sensor to display cycle info)
218
+ const cycleCodeToName = (code) => {
219
+ const cycleMap = {
220
+ 0: 'Not Defined',
221
+ 128: 'Cottons',
222
+ 129: 'Easy Care',
223
+ 130: 'Active Wear',
224
+ 131: 'Timed Dry',
225
+ 132: 'Dewrinkle',
226
+ 133: 'Air Fluff',
227
+ 134: 'Steam Refresh',
228
+ 135: 'Steam Dewrinkle',
229
+ 136: 'Speed Dry',
230
+ 137: 'Mixed',
231
+ 138: 'Quick Dry',
232
+ 139: 'Casuals',
233
+ 140: 'Warm Up',
234
+ 141: 'Energy Saver',
235
+ 142: 'Antibacterial',
236
+ 143: 'Rack Dry',
237
+ 144: 'Baby Care',
238
+ 145: 'Auto Dry',
239
+ 146: 'Auto Extra',
240
+ 147: 'Perm Press',
241
+ 148: 'Washer Link',
242
+ };
243
+ return cycleMap[code] || `Cycle ${code}`;
244
+ };
245
+ const cycleSensor = this.accessory.getService('Cycle Status') ?? this.accessory.addService(this.platform.Service.MotionSensor, 'Cycle Status', 'DryerCycle');
246
+ cycleSensor.setCharacteristic(this.platform.Characteristic.Name, 'Cycle Status');
247
+ cycleSensor
248
+ .getCharacteristic(this.platform.Characteristic.MotionDetected)
249
+ .onGet(async () => {
250
+ const cycleCode = await this.readErd(ERD_TYPES.LAUNDRY_CYCLE);
251
+ const subCycleCode = await this.readErd(ERD_TYPES.LAUNDRY_SUB_CYCLE);
252
+ if (cycleCode && cycleCode !== '00') {
253
+ const code = Number.parseInt(cycleCode, 16);
254
+ const cycleName = cycleCodeToName(code);
255
+ const subCycleMap = {
256
+ 0: 'None',
257
+ 128: 'Drying',
258
+ 129: 'Mist Steam',
259
+ 130: 'Cool Down',
260
+ 131: 'Extended Tumble',
261
+ 132: 'Damp',
262
+ 133: 'Air Fluff',
263
+ };
264
+ const subCode = subCycleCode ? Number.parseInt(subCycleCode, 16) : 0;
265
+ const subCycleName = subCycleMap[subCode] || '';
266
+ this.infoLog(`Dryer Cycle: ${cycleName}${subCycleName !== 'None' ? ` - ${subCycleName}` : ''}`);
267
+ return true; // Motion detected when cycle is running
268
+ }
269
+ return false;
270
+ });
271
+ }
272
+ }
273
+ //# 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;IA4B3D;;OAEG;YACW,gBAAgB;IAuG9B;;OAEG;IACH,OAAO,CAAC,aAAa;CAiKtB"}
@@ -0,0 +1,284 @@
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().catch((error) => {
23
+ this.errorLog(`Failed to initialize Matter: ${error}`);
24
+ });
25
+ }
26
+ else {
27
+ this.initializeHAP();
28
+ }
29
+ // Start periodic refresh
30
+ this.SensorUpdateInProgress = false;
31
+ interval(this.deviceRefreshRate * 10000)
32
+ .pipe(skipWhile(() => this.SensorUpdateInProgress))
33
+ .subscribe(async () => {
34
+ // await this.refreshStatus()
35
+ });
36
+ }
37
+ /**
38
+ * Initialize Matter protocol
39
+ */
40
+ async initializeMatter() {
41
+ const { valid, api: matterAPI } = this.validateMatterAPI();
42
+ if (!valid) {
43
+ if (this.device.matterOnly) {
44
+ this.errorLog('Matter API not available or incomplete - accessory will NOT be published (matterOnly mode enabled)');
45
+ this.errorLog('Reason: Matter API validation failed');
46
+ return;
47
+ }
48
+ this.errorLog('Matter API not available or incomplete - falling back to HAP');
49
+ this.initializeHAP();
50
+ return;
51
+ }
52
+ // Check if LaundryWasherDevice device type is available
53
+ if (!matterAPI.deviceTypes.LaundryWasherDevice) {
54
+ if (this.device.matterOnly) {
55
+ this.errorLog('Matter LaundryWasherDevice device type not available - accessory will NOT be published (matterOnly mode enabled)');
56
+ this.errorLog('Reason: Required Matter device type "LaundryWasherDevice" is not available in this Homebridge version');
57
+ this.errorLog(`Available Matter device types: ${Object.keys(matterAPI.deviceTypes).join(', ')}`);
58
+ return;
59
+ }
60
+ this.warnLog('Matter LaundryWasherDevice device type not available in this Homebridge version - falling back to HAP');
61
+ this.warnLog(`Available Matter device types: ${Object.keys(matterAPI.deviceTypes).join(', ')}`);
62
+ this.useMatterOverride = false;
63
+ this.initializeHAP();
64
+ return;
65
+ }
66
+ const serialNumber = this.device.applianceId || 'unknown';
67
+ this.matterUuid = matterAPI.uuid.generate(serialNumber);
68
+ // Create Matter accessory configuration with washer-specific clusters
69
+ const matterAccessory = {
70
+ UUID: this.matterUuid,
71
+ displayName: this.device.nickname || 'SmartHQ Washer',
72
+ serialNumber,
73
+ manufacturer: this.device.brand && this.device.brand !== 'Unknown' ? this.device.brand : 'GE Appliances',
74
+ model: this.device.model || 'SmartHQ',
75
+ firmwareRevision: this.deviceFirmwareVersion,
76
+ hardwareRevision: this.deviceFirmwareVersion,
77
+ deviceType: matterAPI.deviceTypes.LaundryWasherDevice,
78
+ clusters: {
79
+ // Operational State cluster (maps to LAUNDRY_MACHINE_STATE)
80
+ operationalState: {
81
+ operationalState: 0, // 0=Stopped, 1=Running, 2=Paused
82
+ operationalError: { errorStateID: 0 },
83
+ phaseList: ['Fill', 'Soak', 'Wash', 'Rinse', 'Spin', 'Drain'],
84
+ currentPhase: 0,
85
+ },
86
+ // LaundryWasher Mode cluster for cycle selection (maps to LAUNDRY_CYCLE)
87
+ laundryWasherMode: {
88
+ supportedModes: [
89
+ { label: 'Normal', mode: 0 },
90
+ { label: 'Delicate', mode: 1 },
91
+ { label: 'Heavy Duty', mode: 2 },
92
+ { label: 'Whites', mode: 3 },
93
+ { label: 'Quick Wash', mode: 4 },
94
+ { label: 'Sanitize', mode: 5 },
95
+ ],
96
+ currentMode: 0,
97
+ },
98
+ // Temperature Control for water temperature
99
+ temperatureControl: {
100
+ supportedTemperatureLevels: ['Cold', 'Warm', 'Hot'],
101
+ selectedTemperatureLevel: 0,
102
+ },
103
+ // Timer cluster for time remaining (maps to LAUNDRY_TIME_REMAINING)
104
+ timer: {
105
+ timerState: 0,
106
+ duration: 0,
107
+ remainingTime: 0,
108
+ },
109
+ // Alarm cluster for cycle complete (maps to LAUNDRY_END_OF_CYCLE)
110
+ alarm: {
111
+ mask: 0,
112
+ state: 0,
113
+ supported: 1, // Bit 0: Cycle complete
114
+ },
115
+ // Door Lock cluster (maps to LAUNDRY_DOOR_LOCK)
116
+ doorLock: {
117
+ lockState: 0, // 0=Unlocked, 1=Locked
118
+ lockType: 0,
119
+ actuatorEnabled: true,
120
+ },
121
+ // On/Off cluster for machine active state
122
+ onOff: {
123
+ onOff: false,
124
+ },
125
+ },
126
+ handlers: {},
127
+ };
128
+ // Register Matter accessory as external device
129
+ await matterAPI.registerPlatformAccessories('@homebridge-plugins/homebridge-smarthq', 'SmartHQ', [matterAccessory]);
130
+ this.matterRegistered = true;
131
+ this.infoLog('Created Matter Washer with operational state, mode selection, temperature control, timer, alarm, and door lock clusters');
132
+ }
133
+ /**
134
+ * Initialize HAP (HomeKit) protocol
135
+ */
136
+ initializeHAP() {
137
+ // Washer Running State (Valve)
138
+ const washerValve = this.accessory.getService('Washer') ?? this.accessory.addService(this.platform.Service.Valve, 'Washer', 'Washer');
139
+ washerValve.setCharacteristic(this.platform.Characteristic.Name, 'Washer');
140
+ washerValve.setCharacteristic(this.platform.Characteristic.ValveType, this.platform.Characteristic.ValveType.GENERIC_VALVE);
141
+ // Set maximum duration to a large value (e.g., 12 hours = 43200 seconds)
142
+ washerValve.getCharacteristic(this.platform.Characteristic.SetDuration).setProps({
143
+ maxValue: 43200,
144
+ minValue: 0,
145
+ minStep: 60,
146
+ });
147
+ washerValve
148
+ .getCharacteristic(this.platform.Characteristic.Active)
149
+ .onGet(async () => {
150
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
151
+ // Machine state: 0=idle, 1=running
152
+ return r && Number.parseInt(r) !== 0 ? this.platform.Characteristic.Active.ACTIVE : this.platform.Characteristic.Active.INACTIVE;
153
+ });
154
+ washerValve
155
+ .getCharacteristic(this.platform.Characteristic.InUse)
156
+ .onGet(async () => {
157
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
158
+ return r && Number.parseInt(r) !== 0 ? this.platform.Characteristic.InUse.IN_USE : this.platform.Characteristic.InUse.NOT_IN_USE;
159
+ });
160
+ washerValve
161
+ .getCharacteristic(this.platform.Characteristic.RemainingDuration)
162
+ .onGet(async () => {
163
+ // Check if machine is running first
164
+ const machineState = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
165
+ if (!machineState || Number.parseInt(machineState) === 0) {
166
+ return 0; // Machine is idle, no time remaining
167
+ }
168
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_TIME_REMAINING);
169
+ if (!r) {
170
+ return 0;
171
+ }
172
+ // Value is in hex, convert to decimal (appears to be in deciseconds or needs /10)
173
+ const value = Number.parseInt(r, 16);
174
+ const minutes = value / 10;
175
+ const seconds = Math.round(minutes * 60); // Don't cap, let it show actual time
176
+ this.infoLog(`Time Remaining - Hex: ${r}, Decimal: ${value}, Minutes: ${minutes}, Seconds: ${seconds}`);
177
+ return seconds;
178
+ });
179
+ // Door Lock
180
+ const doorLock = this.accessory.getService('Washer Door Lock') ?? this.accessory.addService(this.platform.Service.LockMechanism, 'Washer Door Lock', 'WasherDoorLock');
181
+ doorLock.setCharacteristic(this.platform.Characteristic.Name, 'Washer Door Lock');
182
+ doorLock
183
+ .getCharacteristic(this.platform.Characteristic.LockCurrentState)
184
+ .onGet(async () => {
185
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR_LOCK);
186
+ // 0=unlocked, 1=locked
187
+ return r && Number.parseInt(r) === 1
188
+ ? this.platform.Characteristic.LockCurrentState.SECURED
189
+ : this.platform.Characteristic.LockCurrentState.UNSECURED;
190
+ });
191
+ doorLock
192
+ .getCharacteristic(this.platform.Characteristic.LockTargetState)
193
+ .onGet(async () => {
194
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR_LOCK);
195
+ return r && Number.parseInt(r) === 1
196
+ ? this.platform.Characteristic.LockTargetState.SECURED
197
+ : this.platform.Characteristic.LockTargetState.UNSECURED;
198
+ });
199
+ // Door Sensor
200
+ const doorSensor = this.accessory.getService('Washer Door') ?? this.accessory.addService(this.platform.Service.ContactSensor, 'Washer Door', 'WasherDoor');
201
+ doorSensor.setCharacteristic(this.platform.Characteristic.Name, 'Washer Door');
202
+ doorSensor
203
+ .getCharacteristic(this.platform.Characteristic.ContactSensorState)
204
+ .onGet(async () => {
205
+ const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR);
206
+ // 0=closed, 1=open
207
+ return r && Number.parseInt(r) === 1
208
+ ? this.platform.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED
209
+ : this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED;
210
+ });
211
+ // Cycle Name (using a StatelessProgrammableSwitch to display cycle info)
212
+ // We'll map cycle codes to readable names
213
+ const cycleCodeToName = (code) => {
214
+ const cycleMap = {
215
+ 0: 'Not Defined',
216
+ 1: 'Basket Clean',
217
+ 2: 'Drain And Spin',
218
+ 3: 'Quick Rinse',
219
+ 4: 'Bulky Items',
220
+ 5: 'Sanitize',
221
+ 6: 'Towels/Sheets',
222
+ 7: 'Steam Refresh',
223
+ 8: 'Normal/Mixed',
224
+ 9: 'Whites',
225
+ 10: 'Dark Colors',
226
+ 11: 'Jeans',
227
+ 12: 'Hand Wash',
228
+ 13: 'Delicates',
229
+ 14: 'Speed Wash',
230
+ 15: 'Heavy Duty',
231
+ 16: 'Allergen',
232
+ 17: 'Power Clean',
233
+ 18: 'Rinse And Spin',
234
+ 19: 'Single Item',
235
+ 20: 'Colors',
236
+ 21: 'Cold Wash',
237
+ 22: 'Water Station',
238
+ 23: 'Tub Clean',
239
+ 24: 'Casuals With Steam',
240
+ 25: 'Stain Wash',
241
+ 26: 'Deep Clean',
242
+ 27: 'Bulky Bedding',
243
+ 28: 'Normal',
244
+ 29: 'Quick Wash',
245
+ 30: 'Sanitize With Oxi',
246
+ 31: 'Self Clean',
247
+ 32: 'Towels',
248
+ 33: 'Soak',
249
+ 34: 'Wool',
250
+ };
251
+ return cycleMap[code] || `Cycle ${code}`;
252
+ };
253
+ // Create a motion sensor to show cycle status
254
+ const cycleSensor = this.accessory.getService('Cycle Status') ?? this.accessory.addService(this.platform.Service.MotionSensor, 'Cycle Status', 'WasherCycle');
255
+ cycleSensor.setCharacteristic(this.platform.Characteristic.Name, 'Cycle Status');
256
+ cycleSensor
257
+ .getCharacteristic(this.platform.Characteristic.MotionDetected)
258
+ .onGet(async () => {
259
+ const cycleCode = await this.readErd(ERD_TYPES.LAUNDRY_CYCLE);
260
+ const subCycleCode = await this.readErd(ERD_TYPES.LAUNDRY_SUB_CYCLE);
261
+ if (cycleCode && cycleCode !== '00') {
262
+ const code = Number.parseInt(cycleCode, 16);
263
+ const cycleName = cycleCodeToName(code);
264
+ const subCycleMap = {
265
+ 0: 'None',
266
+ 1: 'Fill',
267
+ 2: 'Soak',
268
+ 3: 'Wash',
269
+ 4: 'Rinse',
270
+ 5: 'Spin',
271
+ 6: 'Drain',
272
+ 7: 'Extra Spin',
273
+ 8: 'Extra Rinse',
274
+ };
275
+ const subCode = subCycleCode ? Number.parseInt(subCycleCode, 16) : 0;
276
+ const subCycleName = subCycleMap[subCode] || '';
277
+ this.infoLog(`Washer Cycle: ${cycleName}${subCycleName !== 'None' ? ` - ${subCycleName}` : ''}`);
278
+ return true; // Motion detected when cycle is running
279
+ }
280
+ return false;
281
+ });
282
+ }
283
+ }
284
+ //# 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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"}