@homebridge-plugins/homebridge-smarthq 0.5.0-beta.2 → 0.5.0-beta.21
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/README.md +15 -0
- package/config.schema.json +4 -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.map +1 -1
- package/dist/devices/airConditioner.js +14 -11
- 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 +12 -0
- package/dist/devices/clothesDryer.d.ts.map +1 -0
- package/dist/devices/clothesDryer.js +142 -0
- package/dist/devices/clothesDryer.js.map +1 -0
- package/dist/devices/clothesWasher.d.ts +12 -0
- package/dist/devices/clothesWasher.d.ts.map +1 -0
- package/dist/devices/clothesWasher.js +159 -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 +25 -0
- package/dist/devices/device.d.ts.map +1 -1
- package/dist/devices/device.js +105 -1
- package/dist/devices/device.js.map +1 -1
- package/dist/devices/dishwasher.d.ts +0 -3
- package/dist/devices/dishwasher.d.ts.map +1 -1
- package/dist/devices/dishwasher.js +46 -29
- package/dist/devices/dishwasher.js.map +1 -1
- package/dist/devices/hood.d.ts +32 -0
- package/dist/devices/hood.d.ts.map +1 -0
- package/dist/devices/hood.js +269 -0
- package/dist/devices/hood.js.map +1 -0
- package/dist/devices/microwave.d.ts +10 -0
- package/dist/devices/microwave.d.ts.map +1 -0
- package/dist/devices/microwave.js +84 -0
- package/dist/devices/microwave.js.map +1 -0
- package/dist/devices/oven.d.ts +0 -2
- package/dist/devices/oven.d.ts.map +1 -1
- package/dist/devices/oven.js +141 -43
- package/dist/devices/oven.js.map +1 -1
- package/dist/devices/refrigerator.d.ts +0 -2
- package/dist/devices/refrigerator.d.ts.map +1 -1
- package/dist/devices/refrigerator.js +314 -29
- 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 +10 -0
- package/dist/devices/waterHeater.d.ts.map +1 -0
- package/dist/devices/waterHeater.js +95 -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 +10 -0
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +393 -0
- 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 +22 -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 +45 -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 +7 -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 +21 -32
- 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,125 @@
|
|
|
1
|
+
import { deviceBase } from './device.js';
|
|
2
|
+
export class SmartHQBeverageCenter 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(`Beverage Center Features: ${JSON.stringify(accessory.context.device.features)}`);
|
|
10
|
+
// Beverage Center Temperature Sensor
|
|
11
|
+
const tempSensor = this.accessory.getService('Beverage Temperature') ?? this.accessory.addService(this.platform.Service.TemperatureSensor, 'Beverage Temperature', 'BeverageTemp');
|
|
12
|
+
tempSensor.setCharacteristic(this.platform.Characteristic.Name, 'Beverage Temperature');
|
|
13
|
+
tempSensor
|
|
14
|
+
.getCharacteristic(this.platform.Characteristic.CurrentTemperature)
|
|
15
|
+
.onGet(async () => {
|
|
16
|
+
try {
|
|
17
|
+
// TODO: Implement current temperature ERD
|
|
18
|
+
return 4;
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
this.warnLog?.(`Beverage Center Temperature error: ${error?.message ?? error}`);
|
|
22
|
+
return 4;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
// Beverage Center Door Sensor
|
|
26
|
+
const doorSensor = this.accessory.getService('Beverage Door') ?? this.accessory.addService(this.platform.Service.ContactSensor, 'Beverage Door', 'BeverageDoor');
|
|
27
|
+
doorSensor.setCharacteristic(this.platform.Characteristic.Name, 'Beverage Door');
|
|
28
|
+
doorSensor
|
|
29
|
+
.getCharacteristic(this.platform.Characteristic.ContactSensorState)
|
|
30
|
+
.onGet(async () => {
|
|
31
|
+
try {
|
|
32
|
+
// TODO: Implement door status ERD
|
|
33
|
+
return this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
this.warnLog?.(`Beverage Center Door error: ${error?.message ?? error}`);
|
|
37
|
+
return this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
// Beverage Center Thermostat Control
|
|
41
|
+
const thermostat = this.accessory.getService('Beverage Thermostat') ?? this.accessory.addService(this.platform.Service.Thermostat, 'Beverage Thermostat', 'BeverageThermostat');
|
|
42
|
+
thermostat.setCharacteristic(this.platform.Characteristic.Name, 'Beverage Thermostat');
|
|
43
|
+
thermostat
|
|
44
|
+
.getCharacteristic(this.platform.Characteristic.CurrentHeatingCoolingState)
|
|
45
|
+
.onGet(async () => {
|
|
46
|
+
try {
|
|
47
|
+
// TODO: Implement cooling state ERD
|
|
48
|
+
return this.platform.Characteristic.CurrentHeatingCoolingState.COOL;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
this.warnLog?.(`Beverage Center State error: ${error?.message ?? error}`);
|
|
52
|
+
return this.platform.Characteristic.CurrentHeatingCoolingState.OFF;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
thermostat
|
|
56
|
+
.getCharacteristic(this.platform.Characteristic.TargetHeatingCoolingState)
|
|
57
|
+
.setProps({
|
|
58
|
+
validValues: [this.platform.Characteristic.TargetHeatingCoolingState.OFF, this.platform.Characteristic.TargetHeatingCoolingState.COOL],
|
|
59
|
+
})
|
|
60
|
+
.onGet(async () => {
|
|
61
|
+
try {
|
|
62
|
+
// TODO: Implement target state ERD
|
|
63
|
+
return this.platform.Characteristic.TargetHeatingCoolingState.COOL;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
this.warnLog?.(`Beverage Center Target State error: ${error?.message ?? error}`);
|
|
67
|
+
return this.platform.Characteristic.TargetHeatingCoolingState.OFF;
|
|
68
|
+
}
|
|
69
|
+
})
|
|
70
|
+
.onSet(async (value) => {
|
|
71
|
+
try {
|
|
72
|
+
// TODO: Implement target state control ERD
|
|
73
|
+
this.debugLog(`Beverage Center set to: ${value}`);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
this.warnLog?.(`Beverage Center Target State set error: ${error?.message ?? error}`);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
thermostat
|
|
80
|
+
.getCharacteristic(this.platform.Characteristic.CurrentTemperature)
|
|
81
|
+
.onGet(async () => {
|
|
82
|
+
try {
|
|
83
|
+
// TODO: Implement current temperature ERD
|
|
84
|
+
return 4;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
this.warnLog?.(`Beverage Center Current Temp error: ${error?.message ?? error}`);
|
|
88
|
+
return 4;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
thermostat
|
|
92
|
+
.getCharacteristic(this.platform.Characteristic.TargetTemperature)
|
|
93
|
+
.setProps({
|
|
94
|
+
minValue: 2,
|
|
95
|
+
maxValue: 8,
|
|
96
|
+
minStep: 1,
|
|
97
|
+
})
|
|
98
|
+
.onGet(async () => {
|
|
99
|
+
try {
|
|
100
|
+
// TODO: Implement target temperature ERD
|
|
101
|
+
return 4;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
this.warnLog?.(`Beverage Center Target Temp error: ${error?.message ?? error}`);
|
|
105
|
+
return 4;
|
|
106
|
+
}
|
|
107
|
+
})
|
|
108
|
+
.onSet(async (value) => {
|
|
109
|
+
try {
|
|
110
|
+
// TODO: Implement target temperature control ERD
|
|
111
|
+
this.debugLog(`Beverage Center temperature set to: ${value}°C`);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
this.warnLog?.(`Beverage Center Target Temp set error: ${error?.message ?? error}`);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
thermostat
|
|
118
|
+
.getCharacteristic(this.platform.Characteristic.TemperatureDisplayUnits)
|
|
119
|
+
.onGet(async () => this.platform.Characteristic.TemperatureDisplayUnits.CELSIUS)
|
|
120
|
+
.onSet(async (value) => {
|
|
121
|
+
this.debugLog(`Beverage Center display units set to: ${value}`);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=beverageCenter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beverageCenter.js","sourceRoot":"","sources":["../../src/devices/beverageCenter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
constructor(platform: SmartHQPlatform, accessory: PlatformAccessory<SmartHqContext>, device: SmartHqContext['device'] & devicesConfig);
|
|
11
|
+
}
|
|
12
|
+
//# 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;IAM/C,QAAQ,CAAC,QAAQ,EAAE,eAAe;IAElC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,aAAa;IAN3D,sBAAsB,EAAG,OAAO,CAAA;IAChC,YAAY,EAAE,GAAG,CAAA;gBAGN,QAAQ,EAAE,eAAe,EAClC,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EACnC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,aAAa;CAgJ5D"}
|
|
@@ -0,0 +1,142 @@
|
|
|
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
|
+
constructor(platform, accessory, device) {
|
|
11
|
+
super(platform, accessory, device);
|
|
12
|
+
this.platform = platform;
|
|
13
|
+
this.device = device;
|
|
14
|
+
this.debugLog(`Clothes Dryer Features: ${JSON.stringify(accessory.context.device.features)}`);
|
|
15
|
+
// Dryer Running State (Valve)
|
|
16
|
+
const dryerValve = this.accessory.getService('Dryer') ?? this.accessory.addService(this.platform.Service.Valve, 'Dryer', 'Dryer');
|
|
17
|
+
dryerValve.setCharacteristic(this.platform.Characteristic.Name, 'Dryer');
|
|
18
|
+
dryerValve.setCharacteristic(this.platform.Characteristic.ValveType, this.platform.Characteristic.ValveType.GENERIC_VALVE);
|
|
19
|
+
dryerValve
|
|
20
|
+
.getCharacteristic(this.platform.Characteristic.Active)
|
|
21
|
+
.onGet(async () => {
|
|
22
|
+
const r = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
|
|
23
|
+
// Machine state: 0=idle, 1=running
|
|
24
|
+
return r && Number.parseInt(r) !== 0 ? this.platform.Characteristic.Active.ACTIVE : this.platform.Characteristic.Active.INACTIVE;
|
|
25
|
+
});
|
|
26
|
+
dryerValve
|
|
27
|
+
.getCharacteristic(this.platform.Characteristic.InUse)
|
|
28
|
+
.onGet(async () => {
|
|
29
|
+
const r = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
|
|
30
|
+
return r && Number.parseInt(r) !== 0 ? this.platform.Characteristic.InUse.IN_USE : this.platform.Characteristic.InUse.NOT_IN_USE;
|
|
31
|
+
});
|
|
32
|
+
dryerValve
|
|
33
|
+
.getCharacteristic(this.platform.Characteristic.RemainingDuration)
|
|
34
|
+
.onGet(async () => {
|
|
35
|
+
const r = await this.readErd(ERD_TYPES.LAUNDRY_TIME_REMAINING);
|
|
36
|
+
if (!r) {
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
// Value is in hex, convert to decimal (appears to be in deciseconds or needs /10)
|
|
40
|
+
const value = Number.parseInt(r, 16);
|
|
41
|
+
const minutes = value / 10;
|
|
42
|
+
const seconds = Math.min(minutes * 60, 3600); // Cap at 3600 seconds (HomeKit max)
|
|
43
|
+
this.debugLog(`Time Remaining - Hex: ${r}, Decimal: ${value}, Minutes: ${minutes}, Seconds: ${seconds}`);
|
|
44
|
+
return seconds;
|
|
45
|
+
});
|
|
46
|
+
// Door Lock
|
|
47
|
+
const doorLock = this.accessory.getService('Dryer Door Lock') ?? this.accessory.addService(this.platform.Service.LockMechanism, 'Dryer Door Lock', 'DryerDoorLock');
|
|
48
|
+
doorLock.setCharacteristic(this.platform.Characteristic.Name, 'Dryer Door Lock');
|
|
49
|
+
doorLock
|
|
50
|
+
.getCharacteristic(this.platform.Characteristic.LockCurrentState)
|
|
51
|
+
.onGet(async () => {
|
|
52
|
+
const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR_LOCK);
|
|
53
|
+
// 0=unlocked, 1=locked
|
|
54
|
+
return r && Number.parseInt(r) === 1
|
|
55
|
+
? this.platform.Characteristic.LockCurrentState.SECURED
|
|
56
|
+
: this.platform.Characteristic.LockCurrentState.UNSECURED;
|
|
57
|
+
});
|
|
58
|
+
doorLock
|
|
59
|
+
.getCharacteristic(this.platform.Characteristic.LockTargetState)
|
|
60
|
+
.onGet(async () => {
|
|
61
|
+
const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR_LOCK);
|
|
62
|
+
return r && Number.parseInt(r) === 1
|
|
63
|
+
? this.platform.Characteristic.LockTargetState.SECURED
|
|
64
|
+
: this.platform.Characteristic.LockTargetState.UNSECURED;
|
|
65
|
+
});
|
|
66
|
+
// Door Sensor
|
|
67
|
+
const doorSensor = this.accessory.getService('Dryer Door') ?? this.accessory.addService(this.platform.Service.ContactSensor, 'Dryer Door', 'DryerDoor');
|
|
68
|
+
doorSensor.setCharacteristic(this.platform.Characteristic.Name, 'Dryer Door');
|
|
69
|
+
doorSensor
|
|
70
|
+
.getCharacteristic(this.platform.Characteristic.ContactSensorState)
|
|
71
|
+
.onGet(async () => {
|
|
72
|
+
const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR);
|
|
73
|
+
// 0=closed, 1=open
|
|
74
|
+
return r && Number.parseInt(r) === 1
|
|
75
|
+
? this.platform.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED
|
|
76
|
+
: this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
77
|
+
});
|
|
78
|
+
// Cycle Name (using a motion sensor to display cycle info)
|
|
79
|
+
const cycleCodeToName = (code) => {
|
|
80
|
+
const cycleMap = {
|
|
81
|
+
0: 'Not Defined',
|
|
82
|
+
128: 'Cottons',
|
|
83
|
+
129: 'Easy Care',
|
|
84
|
+
130: 'Active Wear',
|
|
85
|
+
131: 'Timed Dry',
|
|
86
|
+
132: 'Dewrinkle',
|
|
87
|
+
133: 'Air Fluff',
|
|
88
|
+
134: 'Steam Refresh',
|
|
89
|
+
135: 'Steam Dewrinkle',
|
|
90
|
+
136: 'Speed Dry',
|
|
91
|
+
137: 'Mixed',
|
|
92
|
+
138: 'Quick Dry',
|
|
93
|
+
139: 'Casuals',
|
|
94
|
+
140: 'Warm Up',
|
|
95
|
+
141: 'Energy Saver',
|
|
96
|
+
142: 'Antibacterial',
|
|
97
|
+
143: 'Rack Dry',
|
|
98
|
+
144: 'Baby Care',
|
|
99
|
+
145: 'Auto Dry',
|
|
100
|
+
146: 'Auto Extra',
|
|
101
|
+
147: 'Perm Press',
|
|
102
|
+
148: 'Washer Link',
|
|
103
|
+
};
|
|
104
|
+
return cycleMap[code] || `Cycle ${code}`;
|
|
105
|
+
};
|
|
106
|
+
const cycleSensor = this.accessory.getService('Cycle Status') ?? this.accessory.addService(this.platform.Service.MotionSensor, 'Cycle Status', 'DryerCycle');
|
|
107
|
+
cycleSensor.setCharacteristic(this.platform.Characteristic.Name, 'Cycle Status');
|
|
108
|
+
cycleSensor
|
|
109
|
+
.getCharacteristic(this.platform.Characteristic.MotionDetected)
|
|
110
|
+
.onGet(async () => {
|
|
111
|
+
const cycleCode = await this.readErd(ERD_TYPES.LAUNDRY_CYCLE);
|
|
112
|
+
const subCycleCode = await this.readErd(ERD_TYPES.LAUNDRY_SUB_CYCLE);
|
|
113
|
+
if (cycleCode && cycleCode !== '00') {
|
|
114
|
+
const code = Number.parseInt(cycleCode, 16);
|
|
115
|
+
const cycleName = cycleCodeToName(code);
|
|
116
|
+
const subCycleMap = {
|
|
117
|
+
0: 'None',
|
|
118
|
+
128: 'Drying',
|
|
119
|
+
129: 'Mist Steam',
|
|
120
|
+
130: 'Cool Down',
|
|
121
|
+
131: 'Extended Tumble',
|
|
122
|
+
132: 'Damp',
|
|
123
|
+
133: 'Air Fluff',
|
|
124
|
+
};
|
|
125
|
+
const subCode = subCycleCode ? Number.parseInt(subCycleCode, 16) : 0;
|
|
126
|
+
const subCycleName = subCycleMap[subCode] || '';
|
|
127
|
+
this.infoLog(`Dryer Cycle: ${cycleName}${subCycleName !== 'None' ? ` - ${subCycleName}` : ''}`);
|
|
128
|
+
return true; // Motion detected when cycle is running
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
});
|
|
132
|
+
// this is subject we use to track when we need to POST changes to the SmartHQ API
|
|
133
|
+
this.SensorUpdateInProgress = false;
|
|
134
|
+
// Start an update interval
|
|
135
|
+
interval(this.deviceRefreshRate * 10000)
|
|
136
|
+
.pipe(skipWhile(() => this.SensorUpdateInProgress))
|
|
137
|
+
.subscribe(async () => {
|
|
138
|
+
// await this.refreshStatus()
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=clothesDryer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clothesDryer.js","sourceRoot":"","sources":["../../src/devices/clothesDryer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
constructor(platform: SmartHQPlatform, accessory: PlatformAccessory<SmartHqContext>, device: SmartHqContext['device'] & devicesConfig);
|
|
11
|
+
}
|
|
12
|
+
//# 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;IAMhD,QAAQ,CAAC,QAAQ,EAAE,eAAe;IAElC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,aAAa;IAN3D,sBAAsB,EAAG,OAAO,CAAA;IAChC,YAAY,EAAE,GAAG,CAAA;gBAGN,QAAQ,EAAE,eAAe,EAClC,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EACnC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,aAAa;CAiK5D"}
|
|
@@ -0,0 +1,159 @@
|
|
|
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
|
+
constructor(platform, accessory, device) {
|
|
11
|
+
super(platform, accessory, device);
|
|
12
|
+
this.platform = platform;
|
|
13
|
+
this.device = device;
|
|
14
|
+
this.debugLog(`Clothes Washer Features: ${JSON.stringify(accessory.context.device.features)}`);
|
|
15
|
+
// Washer Running State (Valve)
|
|
16
|
+
const washerValve = this.accessory.getService('Washer') ?? this.accessory.addService(this.platform.Service.Valve, 'Washer', 'Washer');
|
|
17
|
+
washerValve.setCharacteristic(this.platform.Characteristic.Name, 'Washer');
|
|
18
|
+
washerValve.setCharacteristic(this.platform.Characteristic.ValveType, this.platform.Characteristic.ValveType.GENERIC_VALVE);
|
|
19
|
+
washerValve
|
|
20
|
+
.getCharacteristic(this.platform.Characteristic.Active)
|
|
21
|
+
.onGet(async () => {
|
|
22
|
+
const r = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
|
|
23
|
+
// Machine state: 0=idle, 1=running
|
|
24
|
+
return r && Number.parseInt(r) !== 0 ? this.platform.Characteristic.Active.ACTIVE : this.platform.Characteristic.Active.INACTIVE;
|
|
25
|
+
});
|
|
26
|
+
washerValve
|
|
27
|
+
.getCharacteristic(this.platform.Characteristic.InUse)
|
|
28
|
+
.onGet(async () => {
|
|
29
|
+
const r = await this.readErd(ERD_TYPES.LAUNDRY_MACHINE_STATE);
|
|
30
|
+
return r && Number.parseInt(r) !== 0 ? this.platform.Characteristic.InUse.IN_USE : this.platform.Characteristic.InUse.NOT_IN_USE;
|
|
31
|
+
});
|
|
32
|
+
washerValve
|
|
33
|
+
.getCharacteristic(this.platform.Characteristic.RemainingDuration)
|
|
34
|
+
.onGet(async () => {
|
|
35
|
+
const r = await this.readErd(ERD_TYPES.LAUNDRY_TIME_REMAINING);
|
|
36
|
+
if (!r) {
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
// Value is in hex, convert to decimal (appears to be in deciseconds or needs /10)
|
|
40
|
+
const value = Number.parseInt(r, 16);
|
|
41
|
+
const minutes = value / 10;
|
|
42
|
+
const seconds = Math.min(minutes * 60, 3600); // Cap at 3600 seconds (HomeKit max)
|
|
43
|
+
this.infoLog(`Time Remaining - Hex: ${r}, Decimal: ${value}, Minutes: ${minutes}, Seconds: ${seconds}`);
|
|
44
|
+
return seconds;
|
|
45
|
+
});
|
|
46
|
+
// Door Lock
|
|
47
|
+
const doorLock = this.accessory.getService('Washer Door Lock') ?? this.accessory.addService(this.platform.Service.LockMechanism, 'Washer Door Lock', 'WasherDoorLock');
|
|
48
|
+
doorLock.setCharacteristic(this.platform.Characteristic.Name, 'Washer Door Lock');
|
|
49
|
+
doorLock
|
|
50
|
+
.getCharacteristic(this.platform.Characteristic.LockCurrentState)
|
|
51
|
+
.onGet(async () => {
|
|
52
|
+
const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR_LOCK);
|
|
53
|
+
// 0=unlocked, 1=locked
|
|
54
|
+
return r && Number.parseInt(r) === 1
|
|
55
|
+
? this.platform.Characteristic.LockCurrentState.SECURED
|
|
56
|
+
: this.platform.Characteristic.LockCurrentState.UNSECURED;
|
|
57
|
+
});
|
|
58
|
+
doorLock
|
|
59
|
+
.getCharacteristic(this.platform.Characteristic.LockTargetState)
|
|
60
|
+
.onGet(async () => {
|
|
61
|
+
const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR_LOCK);
|
|
62
|
+
return r && Number.parseInt(r) === 1
|
|
63
|
+
? this.platform.Characteristic.LockTargetState.SECURED
|
|
64
|
+
: this.platform.Characteristic.LockTargetState.UNSECURED;
|
|
65
|
+
});
|
|
66
|
+
// Door Sensor
|
|
67
|
+
const doorSensor = this.accessory.getService('Washer Door') ?? this.accessory.addService(this.platform.Service.ContactSensor, 'Washer Door', 'WasherDoor');
|
|
68
|
+
doorSensor.setCharacteristic(this.platform.Characteristic.Name, 'Washer Door');
|
|
69
|
+
doorSensor
|
|
70
|
+
.getCharacteristic(this.platform.Characteristic.ContactSensorState)
|
|
71
|
+
.onGet(async () => {
|
|
72
|
+
const r = await this.readErd(ERD_TYPES.LAUNDRY_DOOR);
|
|
73
|
+
// 0=closed, 1=open
|
|
74
|
+
return r && Number.parseInt(r) === 1
|
|
75
|
+
? this.platform.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED
|
|
76
|
+
: this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
77
|
+
});
|
|
78
|
+
// Cycle Name (using a StatelessProgrammableSwitch to display cycle info)
|
|
79
|
+
// We'll map cycle codes to readable names
|
|
80
|
+
const cycleCodeToName = (code) => {
|
|
81
|
+
const cycleMap = {
|
|
82
|
+
0: 'Not Defined',
|
|
83
|
+
1: 'Basket Clean',
|
|
84
|
+
2: 'Drain And Spin',
|
|
85
|
+
3: 'Quick Rinse',
|
|
86
|
+
4: 'Bulky Items',
|
|
87
|
+
5: 'Sanitize',
|
|
88
|
+
6: 'Towels/Sheets',
|
|
89
|
+
7: 'Steam Refresh',
|
|
90
|
+
8: 'Normal/Mixed',
|
|
91
|
+
9: 'Whites',
|
|
92
|
+
10: 'Dark Colors',
|
|
93
|
+
11: 'Jeans',
|
|
94
|
+
12: 'Hand Wash',
|
|
95
|
+
13: 'Delicates',
|
|
96
|
+
14: 'Speed Wash',
|
|
97
|
+
15: 'Heavy Duty',
|
|
98
|
+
16: 'Allergen',
|
|
99
|
+
17: 'Power Clean',
|
|
100
|
+
18: 'Rinse And Spin',
|
|
101
|
+
19: 'Single Item',
|
|
102
|
+
20: 'Colors',
|
|
103
|
+
21: 'Cold Wash',
|
|
104
|
+
22: 'Water Station',
|
|
105
|
+
23: 'Tub Clean',
|
|
106
|
+
24: 'Casuals With Steam',
|
|
107
|
+
25: 'Stain Wash',
|
|
108
|
+
26: 'Deep Clean',
|
|
109
|
+
27: 'Bulky Bedding',
|
|
110
|
+
28: 'Normal',
|
|
111
|
+
29: 'Quick Wash',
|
|
112
|
+
30: 'Sanitize With Oxi',
|
|
113
|
+
31: 'Self Clean',
|
|
114
|
+
32: 'Towels',
|
|
115
|
+
33: 'Soak',
|
|
116
|
+
34: 'Wool',
|
|
117
|
+
};
|
|
118
|
+
return cycleMap[code] || `Cycle ${code}`;
|
|
119
|
+
};
|
|
120
|
+
// Create a motion sensor to show cycle status
|
|
121
|
+
const cycleSensor = this.accessory.getService('Cycle Status') ?? this.accessory.addService(this.platform.Service.MotionSensor, 'Cycle Status', 'WasherCycle');
|
|
122
|
+
cycleSensor.setCharacteristic(this.platform.Characteristic.Name, 'Cycle Status');
|
|
123
|
+
cycleSensor
|
|
124
|
+
.getCharacteristic(this.platform.Characteristic.MotionDetected)
|
|
125
|
+
.onGet(async () => {
|
|
126
|
+
const cycleCode = await this.readErd(ERD_TYPES.LAUNDRY_CYCLE);
|
|
127
|
+
const subCycleCode = await this.readErd(ERD_TYPES.LAUNDRY_SUB_CYCLE);
|
|
128
|
+
if (cycleCode && cycleCode !== '00') {
|
|
129
|
+
const code = Number.parseInt(cycleCode, 16);
|
|
130
|
+
const cycleName = cycleCodeToName(code);
|
|
131
|
+
const subCycleMap = {
|
|
132
|
+
0: 'None',
|
|
133
|
+
1: 'Fill',
|
|
134
|
+
2: 'Soak',
|
|
135
|
+
3: 'Wash',
|
|
136
|
+
4: 'Rinse',
|
|
137
|
+
5: 'Spin',
|
|
138
|
+
6: 'Drain',
|
|
139
|
+
7: 'Extra Spin',
|
|
140
|
+
8: 'Extra Rinse',
|
|
141
|
+
};
|
|
142
|
+
const subCode = subCycleCode ? Number.parseInt(subCycleCode, 16) : 0;
|
|
143
|
+
const subCycleName = subCycleMap[subCode] || '';
|
|
144
|
+
this.infoLog(`Washer Cycle: ${cycleName}${subCycleName !== 'None' ? ` - ${subCycleName}` : ''}`);
|
|
145
|
+
return true; // Motion detected when cycle is running
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
});
|
|
149
|
+
// this is subject we use to track when we need to POST changes to the SmartHQ API
|
|
150
|
+
this.SensorUpdateInProgress = false;
|
|
151
|
+
// Start an update interval
|
|
152
|
+
interval(this.deviceRefreshRate * 10000)
|
|
153
|
+
.pipe(skipWhile(() => this.SensorUpdateInProgress))
|
|
154
|
+
.subscribe(async () => {
|
|
155
|
+
// await this.refreshStatus()
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# 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;IAMvC;IAEA;IAPX,UAAU;IACV,sBAAsB,CAAU;IAChC,YAAY,CAAK;IAEjB,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;QAGzD,IAAI,CAAC,QAAQ,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAE9F,+BAA+B;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;QACrI,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,SAAS,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAA;QACtK,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,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,EAAE,YAAY,CAAC,CAAA;QAC1J,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,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,cAAc,EAAE,aAAa,CAAC,CAAA;QAC7J,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;QAEJ,kFAAkF;QAClF,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAA;QAEnC,2BAA2B;QAC3B,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;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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coffeeMaker.js","sourceRoot":"","sources":["../../src/devices/coffeeMaker.ts"],"names":[],"mappings":"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"}
|
package/dist/devices/device.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export declare abstract class deviceBase {
|
|
|
14
14
|
protected deviceUpdateRate: number;
|
|
15
15
|
protected devicePushRate: number;
|
|
16
16
|
protected deviceFirmwareVersion: string;
|
|
17
|
+
private unsupportedErds;
|
|
17
18
|
constructor(platform: SmartHQPlatform, accessory: PlatformAccessory<SmartHqContext>, device: devicesConfig);
|
|
18
19
|
getDeviceLogSettings(device: devicesConfig): Promise<void>;
|
|
19
20
|
getDeviceRateSettings(device: devicesConfig): Promise<void>;
|
|
@@ -43,5 +44,29 @@ export declare abstract class deviceBase {
|
|
|
43
44
|
debugLog(...log: any[]): Promise<void>;
|
|
44
45
|
loggingIsDebug(): Promise<boolean>;
|
|
45
46
|
enablingDeviceLogging(): Promise<boolean>;
|
|
47
|
+
/**
|
|
48
|
+
* Check if an ERD code is supported by this appliance
|
|
49
|
+
* @param erd - The ERD code to check
|
|
50
|
+
* @returns true if the ERD is available, false otherwise
|
|
51
|
+
*/
|
|
52
|
+
has_erd_code(erd: string): Promise<boolean>;
|
|
53
|
+
/**
|
|
54
|
+
* Try to get an ERD value without throwing errors
|
|
55
|
+
* @param erd - The ERD code to read
|
|
56
|
+
* @returns The ERD value or undefined if not available
|
|
57
|
+
*/
|
|
58
|
+
try_get_erd_value(erd: string): Promise<string | undefined>;
|
|
59
|
+
/**
|
|
60
|
+
* Read an ERD (Electronic Refrigerator Descriptor) value from the SmartHQ API
|
|
61
|
+
* @param erd - The ERD code to read
|
|
62
|
+
* @returns The ERD value as a string (JSON stringified if object), or undefined if not supported/error
|
|
63
|
+
*/
|
|
64
|
+
readErd(erd: string): Promise<string | undefined>;
|
|
65
|
+
/**
|
|
66
|
+
* Write an ERD (Electronic Refrigerator Descriptor) value to the SmartHQ API
|
|
67
|
+
* @param erd - The ERD code to write
|
|
68
|
+
* @param value - The value to write (boolean or string)
|
|
69
|
+
*/
|
|
70
|
+
writeErd(erd: string, value: string | boolean): Promise<void>;
|
|
46
71
|
}
|
|
47
72
|
//# sourceMappingURL=device.d.ts.map
|