@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.
- package/.github/ISSUE_TEMPLATE/config.yml +1 -1
- package/.github/copilot-instructions.md +361 -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 +24 -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 +111 -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 +273 -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 +284 -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 +108 -13
- package/dist/devices/device.d.ts.map +1 -1
- package/dist/devices/device.js +381 -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 +164 -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 +336 -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 +147 -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 +267 -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 +583 -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 +161 -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 +190 -2
- package/dist/getAccessToken.js.map +1 -1
- package/dist/platform.d.ts +32 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +853 -151
- 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 +24 -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 +54 -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 +9 -8
- package/docs/interfaces/options.html +7 -8
- package/docs/media/copilot-instructions.md +361 -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,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":"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,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACtC,IAAI,CAAC,QAAQ,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAA;YACxD,CAAC,CAAC,CAAA;QACJ,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,KAAK,CAAC,gBAAgB;QAC5B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAE1D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC3B,IAAI,CAAC,QAAQ,CAAC,oGAAoG,CAAC,CAAA;gBACnH,IAAI,CAAC,QAAQ,CAAC,sCAAsC,CAAC,CAAA;gBACrD,OAAM;YACR,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,8DAA8D,CAAC,CAAA;YAC7E,IAAI,CAAC,aAAa,EAAE,CAAA;YACpB,OAAM;QACR,CAAC;QAED,uDAAuD;QACvD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC3B,IAAI,CAAC,QAAQ,CAAC,iHAAiH,CAAC,CAAA;gBAChI,IAAI,CAAC,QAAQ,CAAC,sGAAsG,CAAC,CAAA;gBACrH,IAAI,CAAC,QAAQ,CAAC,kCAAkC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAChG,OAAM;YACR,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,sGAAsG,CAAC,CAAA;YACpH,IAAI,CAAC,OAAO,CAAC,kCAAkC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC/F,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;YAC9B,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,+CAA+C;QAC/C,MAAM,SAAS,CAAC,2BAA2B,CACzC,wCAAwC,EACxC,SAAS,EACT,CAAC,eAAe,CAAC,CAClB,CAAA;QACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA;QAC5B,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;QAE1H,yEAAyE;QACzE,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC;YAC9E,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,EAAE;SACZ,CAAC,CAAA;QAEF,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,oCAAoC;YACpC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;YACxE,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,CAAA,CAAC,qCAAqC;YAChD,CAAC;YAED,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,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA,CAAC,qCAAqC;YAC9E,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,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;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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"}
|