@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.
- package/.github/ISSUE_TEMPLATE/config.yml +1 -1
- package/.github/copilot-instructions.md +90 -0
- package/.github/scripts/branch-helper.sh +41 -0
- package/.github/workflows/beta-release.yml +1 -1
- package/.github/workflows/release.yml +53 -17
- package/CHANGELOG.md +563 -18
- package/MATTER.md +304 -0
- package/README.md +15 -0
- package/config.schema.json +14 -5
- package/dist/devices/OpalIceMaker/Managers/OpalDescaleSvcManager.d.ts.map +1 -1
- package/dist/devices/OpalIceMaker/Managers/OpalDescaleSvcManager.js +3 -1
- package/dist/devices/OpalIceMaker/Managers/OpalDescaleSvcManager.js.map +1 -1
- package/dist/devices/OpalIceMaker/Managers/OpalFilterMaintenanceSvcManager.d.ts.map +1 -1
- package/dist/devices/OpalIceMaker/Managers/OpalFilterMaintenanceSvcManager.js +3 -1
- package/dist/devices/OpalIceMaker/Managers/OpalFilterMaintenanceSvcManager.js.map +1 -1
- package/dist/devices/OpalIceMaker/Managers/OpalPowerSvcManager.js +1 -1
- package/dist/devices/OpalIceMaker/Managers/OpalPowerSvcManager.js.map +1 -1
- package/dist/devices/OpalIceMaker/Managers/OpalProgressSvcManager.d.ts +1 -1
- package/dist/devices/OpalIceMaker/Managers/OpalProgressSvcManager.d.ts.map +1 -1
- package/dist/devices/OpalIceMaker/Managers/OpalProgressSvcManager.js +12 -5
- package/dist/devices/OpalIceMaker/Managers/OpalProgressSvcManager.js.map +1 -1
- package/dist/devices/OpalIceMaker/Managers/StatusManagers/OpalStatusBase.d.ts.map +1 -1
- package/dist/devices/OpalIceMaker/Managers/StatusManagers/OpalStatusBase.js +4 -2
- package/dist/devices/OpalIceMaker/Managers/StatusManagers/OpalStatusBase.js.map +1 -1
- package/dist/devices/OpalIceMaker/OpalDeviceBase.d.ts +3 -4
- package/dist/devices/OpalIceMaker/OpalDeviceBase.d.ts.map +1 -1
- package/dist/devices/OpalIceMaker/OpalDeviceBase.js +3 -18
- package/dist/devices/OpalIceMaker/OpalDeviceBase.js.map +1 -1
- package/dist/devices/advantium.d.ts +10 -0
- package/dist/devices/advantium.d.ts.map +1 -0
- package/dist/devices/advantium.js +75 -0
- package/dist/devices/advantium.js.map +1 -0
- package/dist/devices/airConditioner.d.ts +11 -2
- package/dist/devices/airConditioner.d.ts.map +1 -1
- package/dist/devices/airConditioner.js +108 -17
- package/dist/devices/airConditioner.js.map +1 -1
- package/dist/devices/beverageCenter.d.ts +10 -0
- package/dist/devices/beverageCenter.d.ts.map +1 -0
- package/dist/devices/beverageCenter.js +125 -0
- package/dist/devices/beverageCenter.js.map +1 -0
- package/dist/devices/clothesDryer.d.ts +21 -0
- package/dist/devices/clothesDryer.d.ts.map +1 -0
- package/dist/devices/clothesDryer.js +240 -0
- package/dist/devices/clothesDryer.js.map +1 -0
- package/dist/devices/clothesWasher.d.ts +21 -0
- package/dist/devices/clothesWasher.d.ts.map +1 -0
- package/dist/devices/clothesWasher.js +251 -0
- package/dist/devices/clothesWasher.js.map +1 -0
- package/dist/devices/coffeeMaker.d.ts +10 -0
- package/dist/devices/coffeeMaker.d.ts.map +1 -0
- package/dist/devices/coffeeMaker.js +79 -0
- package/dist/devices/coffeeMaker.js.map +1 -0
- package/dist/devices/device.d.ts +107 -13
- package/dist/devices/device.d.ts.map +1 -1
- package/dist/devices/device.js +386 -60
- package/dist/devices/device.js.map +1 -1
- package/dist/devices/dishwasher.d.ts +9 -3
- package/dist/devices/dishwasher.d.ts.map +1 -1
- package/dist/devices/dishwasher.js +142 -29
- package/dist/devices/dishwasher.js.map +1 -1
- package/dist/devices/hood.d.ts +41 -0
- package/dist/devices/hood.d.ts.map +1 -0
- package/dist/devices/hood.js +332 -0
- package/dist/devices/hood.js.map +1 -0
- package/dist/devices/microwave.d.ts +19 -0
- package/dist/devices/microwave.d.ts.map +1 -0
- package/dist/devices/microwave.js +144 -0
- package/dist/devices/microwave.js.map +1 -0
- package/dist/devices/oven.d.ts +9 -2
- package/dist/devices/oven.d.ts.map +1 -1
- package/dist/devices/oven.js +245 -43
- package/dist/devices/oven.js.map +1 -1
- package/dist/devices/refrigerator.d.ts +37 -2
- package/dist/devices/refrigerator.d.ts.map +1 -1
- package/dist/devices/refrigerator.js +548 -34
- package/dist/devices/refrigerator.js.map +1 -1
- package/dist/devices/waterFilter.d.ts +10 -0
- package/dist/devices/waterFilter.d.ts.map +1 -0
- package/dist/devices/waterFilter.js +67 -0
- package/dist/devices/waterFilter.js.map +1 -0
- package/dist/devices/waterHeater.d.ts +19 -0
- package/dist/devices/waterHeater.d.ts.map +1 -0
- package/dist/devices/waterHeater.js +158 -0
- package/dist/devices/waterHeater.js.map +1 -0
- package/dist/devices/waterSoftener.d.ts +10 -0
- package/dist/devices/waterSoftener.d.ts.map +1 -0
- package/dist/devices/waterSoftener.js +67 -0
- package/dist/devices/waterSoftener.js.map +1 -0
- package/dist/getAccessToken.d.ts.map +1 -1
- package/dist/getAccessToken.js +6 -0
- package/dist/getAccessToken.js.map +1 -1
- package/dist/platform.d.ts +25 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +548 -70
- package/dist/platform.js.map +1 -1
- package/dist/platform.test.d.ts +2 -0
- package/dist/platform.test.d.ts.map +1 -0
- package/dist/platform.test.js +80 -0
- package/dist/platform.test.js.map +1 -0
- package/dist/settings.d.ts +23 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +13 -0
- package/dist/settings.js.map +1 -1
- package/docs/assets/highlight.css +7 -0
- package/docs/assets/main.js +5 -5
- package/docs/assets/navigation.js +1 -0
- package/docs/assets/search.js +1 -0
- package/docs/assets/style.css +248 -226
- package/docs/classes/SmartHQPlatform.html +51 -56
- package/docs/hierarchy.html +1 -0
- package/docs/index.html +22 -12
- package/docs/interfaces/DeviceOptions.html +2 -3
- package/docs/interfaces/SmartHQPlatformConfig.html +6 -17
- package/docs/interfaces/SmartHqContext.html +6 -4
- package/docs/interfaces/SmartHqERDResponse.html +7 -8
- package/docs/interfaces/credentials.html +3 -4
- package/docs/interfaces/devicesConfig.html +8 -8
- package/docs/interfaces/options.html +7 -8
- package/docs/media/copilot-instructions.md +90 -0
- package/docs/modules.html +1 -2
- package/docs/variables/API_URL.html +1 -2
- package/docs/variables/ERD_CODES.html +1 -2
- package/docs/variables/ERD_TYPES.html +1 -2
- package/docs/variables/KEEPALIVE_TIMEOUT.html +1 -2
- package/docs/variables/LOGIN_URL.html +2 -3
- package/docs/variables/OAUTH2_CLIENT_ID.html +1 -2
- package/docs/variables/OAUTH2_CLIENT_SECRET.html +1 -2
- package/docs/variables/OAUTH2_REDIRECT_URI.html +1 -2
- package/docs/variables/PLATFORM_NAME.html +2 -3
- package/docs/variables/PLUGIN_NAME.html +2 -3
- package/docs/variables/SECURE_URL.html +2 -3
- package/docs/variables/default.html +1 -0
- package/package.json +22 -33
- package/typedoc.json +0 -4
- package/vitest.config.ts +6 -5
- package/.github/workflows/build.yml +0 -18
- package/.github/workflows/changerelease.yml +0 -11
- package/.github/workflows/labeler.yml +0 -9
- package/.github/workflows/release-drafter.yml +0 -14
- package/docs/assets/dmt/dmt-component-data.js +0 -1
- package/docs/assets/dmt/dmt-components.css +0 -20
- package/docs/assets/dmt/dmt-components.js +0 -67
- package/docs/assets/dmt/dmt-search.cmp +0 -0
- package/docs/assets/dmt/dmt-theme.css +0 -1
- 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":"AAKA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,OAAO,mBAAoB,SAAQ,UAAU;IAStC;IAEA;IAVX,UAAU;IACV,sBAAsB,CAAU;IAChC,YAAY,CAAK;IAEjB,+BAA+B;IACvB,iBAAiB,GAAY,KAAK,CAAA;IAE1C,YACW,QAAyB,EAClC,SAA4C,EACnC,MAAgD;QAEzD,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;QAJzB,aAAQ,GAAR,QAAQ,CAAiB;QAEzB,WAAM,GAAN,MAAM,CAA0C;QAIzD,yCAAyC;QACzC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAA;QAElD,IAAI,CAAC,QAAQ,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC7F,IAAI,CAAC,QAAQ,CAAC,mBAAmB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QAE7E,sCAAsC;QACtC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,EAAE,CAAA;QACtB,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAA;QACnC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;aACrC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;aAClD,SAAS,CAAC,KAAK,IAAI,EAAE;YACpB,6BAA6B;QAC/B,CAAC,CAAC,CAAA;IACN,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAE1D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,8DAA8D,CAAC,CAAA;YAC7E,IAAI,CAAC,aAAa,EAAE,CAAA;YACpB,OAAM;QACR,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,SAAS,CAAA;QACzD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAEvD,qEAAqE;QACrE,MAAM,eAAe,GAAG;YACtB,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,eAAe;YACpD,YAAY;YACZ,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe;YACxG,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS;YACrC,gBAAgB,EAAE,IAAI,CAAC,qBAAqB;YAC5C,gBAAgB,EAAE,IAAI,CAAC,qBAAqB;YAC5C,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC,kBAAkB;YACpD,QAAQ,EAAE;gBACR,4DAA4D;gBAC5D,gBAAgB,EAAE;oBAChB,gBAAgB,EAAE,CAAC,EAAE,iCAAiC;oBACtD,gBAAgB,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;oBACrC,SAAS,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC;oBAChD,YAAY,EAAE,CAAC;iBAChB;gBACD,wEAAwE;gBACxE,gBAAgB,EAAE;oBAChB,cAAc,EAAE;wBACd,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;wBAC5B,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE;wBAC9B,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE;wBAChC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE;wBAC/B,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE;wBAC/B,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE;qBAC/B;oBACD,WAAW,EAAE,CAAC;iBACf;gBACD,wCAAwC;gBACxC,kBAAkB,EAAE;oBAClB,0BAA0B,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC;oBAChE,wBAAwB,EAAE,CAAC;iBAC5B;gBACD,gDAAgD;gBAChD,sBAAsB,EAAE;oBACtB,aAAa,EAAE,IAAI,EAAE,uBAAuB;oBAC5C,gBAAgB,EAAE,CAAC;oBACnB,gBAAgB,EAAE,IAAI,EAAE,WAAW;iBACpC;gBACD,oEAAoE;gBACpE,KAAK,EAAE;oBACL,UAAU,EAAE,CAAC;oBACb,QAAQ,EAAE,CAAC;oBACX,aAAa,EAAE,CAAC;iBACjB;gBACD,kEAAkE;gBAClE,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC;oBACP,KAAK,EAAE,CAAC;oBACR,SAAS,EAAE,CAAC,EAAE,wBAAwB;iBACvC;gBACD,gDAAgD;gBAChD,QAAQ,EAAE;oBACR,SAAS,EAAE,CAAC,EAAE,uBAAuB;oBACrC,QAAQ,EAAE,CAAC;oBACX,eAAe,EAAE,IAAI;iBACtB;gBACD,0CAA0C;gBAC1C,KAAK,EAAE;oBACL,KAAK,EAAE,KAAK;iBACb;aACF;YACD,QAAQ,EAAE,EAAE;SACb,CAAA;QAED,4BAA4B;QAC5B,SAAS,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO,CAAC,wHAAwH,CAAC,CAAA;IACxI,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,8BAA8B;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QACnI,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACxE,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QAC1H,UAAU;aACP,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC;aACtD,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;YAC7D,mCAAmC;YACnC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAA;QAClI,CAAC,CAAC,CAAA;QAEJ,UAAU;aACP,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC;aACrD,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;YAC7D,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAA;QAClI,CAAC,CAAC,CAAA;QAEJ,UAAU;aACP,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC;aACjE,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAA;YAC9D,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,OAAO,CAAC,CAAA;YACV,CAAC;YACD,kFAAkF;YAClF,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACpC,MAAM,OAAO,GAAG,KAAK,GAAG,EAAE,CAAA;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,EAAE,IAAI,CAAC,CAAA,CAAC,oCAAoC;YACjF,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,cAAc,KAAK,cAAc,OAAO,cAAc,OAAO,EAAE,CAAC,CAAA;YACxG,OAAO,OAAO,CAAA;QAChB,CAAC,CAAC,CAAA;QAEJ,YAAY;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAA;QACrK,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;QAChF,QAAQ;aACL,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC;aAChE,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;YACzD,uBAAuB;YACvB,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO;gBACvD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAA;QAC7D,CAAC,CAAC,CAAA;QAEJ,QAAQ;aACL,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC;aAC/D,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,OAAO;gBACtD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,SAAS,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEJ,cAAc;QACd,MAAM,UAAU,GAAG,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,EAAE,WAAW,CAAC,CAAA;QACzJ,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;QAC7E,UAAU;aACP,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC;aAClE,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;YACpD,mBAAmB;YACnB,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,oBAAoB;gBACtE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,gBAAgB,CAAA;QACtE,CAAC,CAAC,CAAA;QAEJ,2DAA2D;QAC3D,MAAM,eAAe,GAAG,CAAC,IAAY,EAAU,EAAE;YAC/C,MAAM,QAAQ,GAA8B;gBAC1C,CAAC,EAAE,aAAa;gBAChB,GAAG,EAAE,SAAS;gBACd,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,aAAa;gBAClB,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,eAAe;gBACpB,GAAG,EAAE,iBAAiB;gBACtB,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,OAAO;gBACZ,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,SAAS;gBACd,GAAG,EAAE,SAAS;gBACd,GAAG,EAAE,cAAc;gBACnB,GAAG,EAAE,eAAe;gBACpB,GAAG,EAAE,UAAU;gBACf,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,UAAU;gBACf,GAAG,EAAE,YAAY;gBACjB,GAAG,EAAE,YAAY;gBACjB,GAAG,EAAE,aAAa;aACnB,CAAA;YACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,IAAI,EAAE,CAAA;QAC1C,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,cAAc,EAAE,YAAY,CAAC,CAAA;QAC9J,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;QAChF,WAAW;aACR,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC;aAC9D,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;YAC7D,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;YAEpE,IAAI,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;gBAC3C,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;gBAEvC,MAAM,WAAW,GAA8B;oBAC7C,CAAC,EAAE,MAAM;oBACT,GAAG,EAAE,QAAQ;oBACb,GAAG,EAAE,YAAY;oBACjB,GAAG,EAAE,WAAW;oBAChB,GAAG,EAAE,iBAAiB;oBACtB,GAAG,EAAE,MAAM;oBACX,GAAG,EAAE,WAAW;iBACjB,CAAA;gBAED,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACpE,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;gBAE/C,IAAI,CAAC,OAAO,CAAC,gBAAgB,SAAS,GAAG,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;gBAC/F,OAAO,IAAI,CAAA,CAAC,wCAAwC;YACtD,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;IACN,CAAC;CACF"}
|
|
@@ -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":"AAKA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IASvC;IAEA;IAVX,UAAU;IACV,sBAAsB,CAAU;IAChC,YAAY,CAAK;IAEjB,+BAA+B;IACvB,iBAAiB,GAAY,KAAK,CAAA;IAE1C,YACW,QAAyB,EAClC,SAA4C,EACnC,MAAgD;QAEzD,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;QAJzB,aAAQ,GAAR,QAAQ,CAAiB;QAEzB,WAAM,GAAN,MAAM,CAA0C;QAIzD,yCAAyC;QACzC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAA;QAElD,IAAI,CAAC,QAAQ,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC9F,IAAI,CAAC,QAAQ,CAAC,mBAAmB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QAE7E,sCAAsC;QACtC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,EAAE,CAAA;QACtB,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAA;QACnC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;aACrC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;aAClD,SAAS,CAAC,KAAK,IAAI,EAAE;YACpB,6BAA6B;QAC/B,CAAC,CAAC,CAAA;IACN,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAE1D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,8DAA8D,CAAC,CAAA;YAC7E,IAAI,CAAC,aAAa,EAAE,CAAA;YACpB,OAAM;QACR,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,SAAS,CAAA;QACzD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAEvD,sEAAsE;QACtE,MAAM,eAAe,GAAG;YACtB,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,gBAAgB;YACrD,YAAY;YACZ,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe;YACxG,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS;YACrC,gBAAgB,EAAE,IAAI,CAAC,qBAAqB;YAC5C,gBAAgB,EAAE,IAAI,CAAC,qBAAqB;YAC5C,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC,mBAAmB;YACrD,QAAQ,EAAE;gBACR,4DAA4D;gBAC5D,gBAAgB,EAAE;oBAChB,gBAAgB,EAAE,CAAC,EAAE,iCAAiC;oBACtD,gBAAgB,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;oBACrC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;oBAC7D,YAAY,EAAE,CAAC;iBAChB;gBACD,yEAAyE;gBACzE,iBAAiB,EAAE;oBACjB,cAAc,EAAE;wBACd,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;wBAC5B,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE;wBAC9B,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE;wBAChC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;wBAC5B,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE;wBAChC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE;qBAC/B;oBACD,WAAW,EAAE,CAAC;iBACf;gBACD,4CAA4C;gBAC5C,kBAAkB,EAAE;oBAClB,0BAA0B,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;oBACnD,wBAAwB,EAAE,CAAC;iBAC5B;gBACD,oEAAoE;gBACpE,KAAK,EAAE;oBACL,UAAU,EAAE,CAAC;oBACb,QAAQ,EAAE,CAAC;oBACX,aAAa,EAAE,CAAC;iBACjB;gBACD,kEAAkE;gBAClE,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC;oBACP,KAAK,EAAE,CAAC;oBACR,SAAS,EAAE,CAAC,EAAE,wBAAwB;iBACvC;gBACD,gDAAgD;gBAChD,QAAQ,EAAE;oBACR,SAAS,EAAE,CAAC,EAAE,uBAAuB;oBACrC,QAAQ,EAAE,CAAC;oBACX,eAAe,EAAE,IAAI;iBACtB;gBACD,0CAA0C;gBAC1C,KAAK,EAAE;oBACL,KAAK,EAAE,KAAK;iBACb;aACF;YACD,QAAQ,EAAE,EAAE;SACb,CAAA;QAED,4BAA4B;QAC5B,SAAS,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO,CAAC,yHAAyH,CAAC,CAAA;IACzI,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,+BAA+B;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;QACvI,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC1E,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QAC3H,WAAW;aACR,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC;aACtD,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;YAC7D,mCAAmC;YACnC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAA;QAClI,CAAC,CAAC,CAAA;QAEJ,WAAW;aACR,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC;aACrD,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;YAC7D,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAA;QAClI,CAAC,CAAC,CAAA;QAEJ,WAAW;aACR,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC;aACjE,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAA;YAC9D,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,OAAO,CAAC,CAAA;YACV,CAAC;YACD,kFAAkF;YAClF,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACpC,MAAM,OAAO,GAAG,KAAK,GAAG,EAAE,CAAA;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,EAAE,IAAI,CAAC,CAAA,CAAC,oCAAoC;YACjF,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,cAAc,KAAK,cAAc,OAAO,cAAc,OAAO,EAAE,CAAC,CAAA;YACvG,OAAO,OAAO,CAAA;QAChB,CAAC,CAAC,CAAA;QAEJ,YAAY;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAA;QACxK,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA;QACjF,QAAQ;aACL,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC;aAChE,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;YACzD,uBAAuB;YACvB,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO;gBACvD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAA;QAC7D,CAAC,CAAC,CAAA;QAEJ,QAAQ;aACL,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC;aAC/D,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,OAAO;gBACtD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,SAAS,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEJ,cAAc;QACd,MAAM,UAAU,GAAG,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,EAAE,YAAY,CAAC,CAAA;QAC5J,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;QAC9E,UAAU;aACP,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC;aAClE,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;YACpD,mBAAmB;YACnB,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,oBAAoB;gBACtE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,gBAAgB,CAAA;QACtE,CAAC,CAAC,CAAA;QAEJ,yEAAyE;QACzE,0CAA0C;QAC1C,MAAM,eAAe,GAAG,CAAC,IAAY,EAAU,EAAE;YAC/C,MAAM,QAAQ,GAA8B;gBAC1C,CAAC,EAAE,aAAa;gBAChB,CAAC,EAAE,cAAc;gBACjB,CAAC,EAAE,gBAAgB;gBACnB,CAAC,EAAE,aAAa;gBAChB,CAAC,EAAE,aAAa;gBAChB,CAAC,EAAE,UAAU;gBACb,CAAC,EAAE,eAAe;gBAClB,CAAC,EAAE,eAAe;gBAClB,CAAC,EAAE,cAAc;gBACjB,CAAC,EAAE,QAAQ;gBACX,EAAE,EAAE,aAAa;gBACjB,EAAE,EAAE,OAAO;gBACX,EAAE,EAAE,WAAW;gBACf,EAAE,EAAE,WAAW;gBACf,EAAE,EAAE,YAAY;gBAChB,EAAE,EAAE,YAAY;gBAChB,EAAE,EAAE,UAAU;gBACd,EAAE,EAAE,aAAa;gBACjB,EAAE,EAAE,gBAAgB;gBACpB,EAAE,EAAE,aAAa;gBACjB,EAAE,EAAE,QAAQ;gBACZ,EAAE,EAAE,WAAW;gBACf,EAAE,EAAE,eAAe;gBACnB,EAAE,EAAE,WAAW;gBACf,EAAE,EAAE,oBAAoB;gBACxB,EAAE,EAAE,YAAY;gBAChB,EAAE,EAAE,YAAY;gBAChB,EAAE,EAAE,eAAe;gBACnB,EAAE,EAAE,QAAQ;gBACZ,EAAE,EAAE,YAAY;gBAChB,EAAE,EAAE,mBAAmB;gBACvB,EAAE,EAAE,YAAY;gBAChB,EAAE,EAAE,QAAQ;gBACZ,EAAE,EAAE,MAAM;gBACV,EAAE,EAAE,MAAM;aACX,CAAA;YACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,IAAI,EAAE,CAAA;QAC1C,CAAC,CAAA;QAED,8CAA8C;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,SAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,cAAc,EAAE,aAAa,CAAC,CAAA;QAC/J,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;QAChF,WAAW;aACR,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC;aAC9D,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;YAC7D,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;YAEpE,IAAI,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;gBAC3C,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;gBAEvC,MAAM,WAAW,GAA8B;oBAC7C,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,OAAO;oBACV,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,OAAO;oBACV,CAAC,EAAE,YAAY;oBACf,CAAC,EAAE,aAAa;iBACjB,CAAA;gBAED,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACpE,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;gBAE/C,IAAI,CAAC,OAAO,CAAC,iBAAiB,SAAS,GAAG,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;gBAChG,OAAO,IAAI,CAAA,CAAC,wCAAwC;YACtD,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;IACN,CAAC;CACF"}
|
|
@@ -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
|