@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.
Files changed (143) hide show
  1. package/.github/ISSUE_TEMPLATE/config.yml +1 -1
  2. package/.github/copilot-instructions.md +90 -0
  3. package/.github/scripts/branch-helper.sh +41 -0
  4. package/.github/workflows/beta-release.yml +1 -1
  5. package/.github/workflows/release.yml +53 -17
  6. package/CHANGELOG.md +563 -18
  7. package/README.md +15 -0
  8. package/config.schema.json +4 -5
  9. package/dist/devices/OpalIceMaker/Managers/OpalDescaleSvcManager.d.ts.map +1 -1
  10. package/dist/devices/OpalIceMaker/Managers/OpalDescaleSvcManager.js +3 -1
  11. package/dist/devices/OpalIceMaker/Managers/OpalDescaleSvcManager.js.map +1 -1
  12. package/dist/devices/OpalIceMaker/Managers/OpalFilterMaintenanceSvcManager.d.ts.map +1 -1
  13. package/dist/devices/OpalIceMaker/Managers/OpalFilterMaintenanceSvcManager.js +3 -1
  14. package/dist/devices/OpalIceMaker/Managers/OpalFilterMaintenanceSvcManager.js.map +1 -1
  15. package/dist/devices/OpalIceMaker/Managers/OpalPowerSvcManager.js +1 -1
  16. package/dist/devices/OpalIceMaker/Managers/OpalPowerSvcManager.js.map +1 -1
  17. package/dist/devices/OpalIceMaker/Managers/OpalProgressSvcManager.d.ts +1 -1
  18. package/dist/devices/OpalIceMaker/Managers/OpalProgressSvcManager.d.ts.map +1 -1
  19. package/dist/devices/OpalIceMaker/Managers/OpalProgressSvcManager.js +12 -5
  20. package/dist/devices/OpalIceMaker/Managers/OpalProgressSvcManager.js.map +1 -1
  21. package/dist/devices/OpalIceMaker/Managers/StatusManagers/OpalStatusBase.d.ts.map +1 -1
  22. package/dist/devices/OpalIceMaker/Managers/StatusManagers/OpalStatusBase.js +4 -2
  23. package/dist/devices/OpalIceMaker/Managers/StatusManagers/OpalStatusBase.js.map +1 -1
  24. package/dist/devices/OpalIceMaker/OpalDeviceBase.d.ts +3 -4
  25. package/dist/devices/OpalIceMaker/OpalDeviceBase.d.ts.map +1 -1
  26. package/dist/devices/OpalIceMaker/OpalDeviceBase.js +3 -18
  27. package/dist/devices/OpalIceMaker/OpalDeviceBase.js.map +1 -1
  28. package/dist/devices/advantium.d.ts +10 -0
  29. package/dist/devices/advantium.d.ts.map +1 -0
  30. package/dist/devices/advantium.js +75 -0
  31. package/dist/devices/advantium.js.map +1 -0
  32. package/dist/devices/airConditioner.d.ts.map +1 -1
  33. package/dist/devices/airConditioner.js +14 -11
  34. package/dist/devices/airConditioner.js.map +1 -1
  35. package/dist/devices/beverageCenter.d.ts +10 -0
  36. package/dist/devices/beverageCenter.d.ts.map +1 -0
  37. package/dist/devices/beverageCenter.js +125 -0
  38. package/dist/devices/beverageCenter.js.map +1 -0
  39. package/dist/devices/clothesDryer.d.ts +12 -0
  40. package/dist/devices/clothesDryer.d.ts.map +1 -0
  41. package/dist/devices/clothesDryer.js +142 -0
  42. package/dist/devices/clothesDryer.js.map +1 -0
  43. package/dist/devices/clothesWasher.d.ts +12 -0
  44. package/dist/devices/clothesWasher.d.ts.map +1 -0
  45. package/dist/devices/clothesWasher.js +159 -0
  46. package/dist/devices/clothesWasher.js.map +1 -0
  47. package/dist/devices/coffeeMaker.d.ts +10 -0
  48. package/dist/devices/coffeeMaker.d.ts.map +1 -0
  49. package/dist/devices/coffeeMaker.js +79 -0
  50. package/dist/devices/coffeeMaker.js.map +1 -0
  51. package/dist/devices/device.d.ts +25 -0
  52. package/dist/devices/device.d.ts.map +1 -1
  53. package/dist/devices/device.js +105 -1
  54. package/dist/devices/device.js.map +1 -1
  55. package/dist/devices/dishwasher.d.ts +0 -3
  56. package/dist/devices/dishwasher.d.ts.map +1 -1
  57. package/dist/devices/dishwasher.js +46 -29
  58. package/dist/devices/dishwasher.js.map +1 -1
  59. package/dist/devices/hood.d.ts +32 -0
  60. package/dist/devices/hood.d.ts.map +1 -0
  61. package/dist/devices/hood.js +269 -0
  62. package/dist/devices/hood.js.map +1 -0
  63. package/dist/devices/microwave.d.ts +10 -0
  64. package/dist/devices/microwave.d.ts.map +1 -0
  65. package/dist/devices/microwave.js +84 -0
  66. package/dist/devices/microwave.js.map +1 -0
  67. package/dist/devices/oven.d.ts +0 -2
  68. package/dist/devices/oven.d.ts.map +1 -1
  69. package/dist/devices/oven.js +141 -43
  70. package/dist/devices/oven.js.map +1 -1
  71. package/dist/devices/refrigerator.d.ts +0 -2
  72. package/dist/devices/refrigerator.d.ts.map +1 -1
  73. package/dist/devices/refrigerator.js +314 -29
  74. package/dist/devices/refrigerator.js.map +1 -1
  75. package/dist/devices/waterFilter.d.ts +10 -0
  76. package/dist/devices/waterFilter.d.ts.map +1 -0
  77. package/dist/devices/waterFilter.js +67 -0
  78. package/dist/devices/waterFilter.js.map +1 -0
  79. package/dist/devices/waterHeater.d.ts +10 -0
  80. package/dist/devices/waterHeater.d.ts.map +1 -0
  81. package/dist/devices/waterHeater.js +95 -0
  82. package/dist/devices/waterHeater.js.map +1 -0
  83. package/dist/devices/waterSoftener.d.ts +10 -0
  84. package/dist/devices/waterSoftener.d.ts.map +1 -0
  85. package/dist/devices/waterSoftener.js +67 -0
  86. package/dist/devices/waterSoftener.js.map +1 -0
  87. package/dist/getAccessToken.d.ts.map +1 -1
  88. package/dist/getAccessToken.js +6 -0
  89. package/dist/getAccessToken.js.map +1 -1
  90. package/dist/platform.d.ts +10 -0
  91. package/dist/platform.d.ts.map +1 -1
  92. package/dist/platform.js +393 -0
  93. package/dist/platform.js.map +1 -1
  94. package/dist/platform.test.d.ts +2 -0
  95. package/dist/platform.test.d.ts.map +1 -0
  96. package/dist/platform.test.js +80 -0
  97. package/dist/platform.test.js.map +1 -0
  98. package/dist/settings.d.ts +22 -0
  99. package/dist/settings.d.ts.map +1 -1
  100. package/dist/settings.js +13 -0
  101. package/dist/settings.js.map +1 -1
  102. package/docs/assets/highlight.css +7 -0
  103. package/docs/assets/main.js +5 -5
  104. package/docs/assets/navigation.js +1 -0
  105. package/docs/assets/search.js +1 -0
  106. package/docs/assets/style.css +248 -226
  107. package/docs/classes/SmartHQPlatform.html +45 -56
  108. package/docs/hierarchy.html +1 -0
  109. package/docs/index.html +22 -12
  110. package/docs/interfaces/DeviceOptions.html +2 -3
  111. package/docs/interfaces/SmartHQPlatformConfig.html +6 -17
  112. package/docs/interfaces/SmartHqContext.html +6 -4
  113. package/docs/interfaces/SmartHqERDResponse.html +7 -8
  114. package/docs/interfaces/credentials.html +3 -4
  115. package/docs/interfaces/devicesConfig.html +7 -8
  116. package/docs/interfaces/options.html +7 -8
  117. package/docs/media/copilot-instructions.md +90 -0
  118. package/docs/modules.html +1 -2
  119. package/docs/variables/API_URL.html +1 -2
  120. package/docs/variables/ERD_CODES.html +1 -2
  121. package/docs/variables/ERD_TYPES.html +1 -2
  122. package/docs/variables/KEEPALIVE_TIMEOUT.html +1 -2
  123. package/docs/variables/LOGIN_URL.html +2 -3
  124. package/docs/variables/OAUTH2_CLIENT_ID.html +1 -2
  125. package/docs/variables/OAUTH2_CLIENT_SECRET.html +1 -2
  126. package/docs/variables/OAUTH2_REDIRECT_URI.html +1 -2
  127. package/docs/variables/PLATFORM_NAME.html +2 -3
  128. package/docs/variables/PLUGIN_NAME.html +2 -3
  129. package/docs/variables/SECURE_URL.html +2 -3
  130. package/docs/variables/default.html +1 -0
  131. package/package.json +21 -32
  132. package/typedoc.json +0 -4
  133. package/vitest.config.ts +6 -5
  134. package/.github/workflows/build.yml +0 -18
  135. package/.github/workflows/changerelease.yml +0 -11
  136. package/.github/workflows/labeler.yml +0 -9
  137. package/.github/workflows/release-drafter.yml +0 -14
  138. package/docs/assets/dmt/dmt-component-data.js +0 -1
  139. package/docs/assets/dmt/dmt-components.css +0 -20
  140. package/docs/assets/dmt/dmt-components.js +0 -67
  141. package/docs/assets/dmt/dmt-search.cmp +0 -0
  142. package/docs/assets/dmt/dmt-theme.css +0 -1
  143. 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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"}
@@ -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