homebridge-smarthq-client 1.1.2 → 1.2.0
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/CHANGELOG.md +6 -0
- package/Readme.md +6 -0
- package/dist/airConditioner/airConditioner.d.ts +37 -0
- package/dist/airConditioner/airConditioner.js +377 -0
- package/dist/airConditioner/airConditioner.js.map +1 -0
- package/dist/airConditionerServices.d.ts +4 -0
- package/dist/airConditionerServices.js +5 -0
- package/dist/airConditionerServices.js.map +1 -0
- package/dist/dishwasher/controlLock.js +5 -1
- package/dist/dishwasher/controlLock.js.map +1 -1
- package/dist/dishwasher/dishwasher.js +5 -2
- package/dist/dishwasher/dishwasher.js.map +1 -1
- package/dist/platform.js +7 -1
- package/dist/platform.js.map +1 -1
- package/package.json +2 -2
- package/src/airConditioner/airConditioner.ts +431 -0
- package/src/airConditionerServices.ts +8 -0
- package/src/dishwasher/controlLock.ts +6 -2
- package/src/dishwasher/dishwasher.ts +6 -2
- package/src/platform.ts +7 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [1.2.0](https://github.com/ceb400/homebridge-smarthq-client/releases/tag/v1.2.0) (2026-07-01)
|
|
6
|
+
- Added initial support for air conditioner
|
|
7
|
+
- minor bug fixes to correct invalid name error
|
|
8
|
+
|
|
9
|
+
## What's Changed
|
|
10
|
+
|
|
5
11
|
## [1.1.1](https://github.com/ceb400/homebridge-smarthq-client/releases/tag/v1.1.1) (2026-04-25)
|
|
6
12
|
|
|
7
13
|
## What's Changed
|
package/Readme.md
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
A homebridge plugin for GE appliances using the SmartHQ API s (Identity and Access Management API, Digital Twin API) from npm pkg 'ge-smarthq'. The following devices are implemented:
|
|
6
6
|
* refrigerator
|
|
7
7
|
* dishwasher
|
|
8
|
+
* air conditioner
|
|
8
9
|
* Other devices will be discovered and service information could be written to the log to assist in adding support for more devices.
|
|
9
10
|
|
|
10
11
|
The refrigerator services include controls for:
|
|
@@ -28,6 +29,11 @@ The dishwasher services include controls for:
|
|
|
28
29
|
* Wash zones
|
|
29
30
|
* Options for steam, bottlewash, silverware, sabbath mode, controls lock
|
|
30
31
|
|
|
32
|
+
The air conditioner services include controls for:
|
|
33
|
+
* AC temperature
|
|
34
|
+
* AC fan speed
|
|
35
|
+
* AC modes (Cool, ECO, Dry, Fan Only)
|
|
36
|
+
|
|
31
37
|
|
|
32
38
|
|
|
33
39
|
## Installation
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { CharacteristicValue, PlatformAccessory, Service, Characteristic } from 'homebridge';
|
|
2
|
+
import { DeviceService } from 'ge-smarthq';
|
|
3
|
+
import { SmartHqPlatform } from '../platform.js';
|
|
4
|
+
export declare class AirConditioner {
|
|
5
|
+
private readonly platform;
|
|
6
|
+
private readonly accessory;
|
|
7
|
+
readonly deviceServices: DeviceService[];
|
|
8
|
+
readonly deviceId: string;
|
|
9
|
+
private targetCelsius;
|
|
10
|
+
private targetMode;
|
|
11
|
+
private targetFanSpeed;
|
|
12
|
+
private isOn;
|
|
13
|
+
private client;
|
|
14
|
+
Service: typeof Service;
|
|
15
|
+
Characteristic: typeof Characteristic;
|
|
16
|
+
private api;
|
|
17
|
+
private readonly modeToHK;
|
|
18
|
+
private hkToMode;
|
|
19
|
+
private acThermostat;
|
|
20
|
+
private acFan;
|
|
21
|
+
private modeSwitches;
|
|
22
|
+
constructor(platform: SmartHqPlatform, accessory: PlatformAccessory, deviceServices: DeviceService[], deviceId: string);
|
|
23
|
+
private updateModeSwitches;
|
|
24
|
+
private fanSpeedToPercent;
|
|
25
|
+
private percentToFanSpeed;
|
|
26
|
+
private sendThermostatCommand;
|
|
27
|
+
private findService;
|
|
28
|
+
getCurrentHeatingCoolingState(): Promise<number>;
|
|
29
|
+
getTargetHeatingCoolingState(): number;
|
|
30
|
+
setTargetHeatingCoolingState(value: CharacteristicValue): Promise<void>;
|
|
31
|
+
getCurrentTemperature(): Promise<number>;
|
|
32
|
+
getTargetTemperature(): number;
|
|
33
|
+
setTargetTemperature(value: CharacteristicValue): Promise<void>;
|
|
34
|
+
handleTemperatureDisplayUnitsGet(): number;
|
|
35
|
+
handleTemperatureDisplayUnitsSet(value: CharacteristicValue): void;
|
|
36
|
+
setupWebSocket(): Promise<void>;
|
|
37
|
+
}
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import { SmartHQClient } from 'ge-smarthq';
|
|
2
|
+
export class AirConditioner {
|
|
3
|
+
platform;
|
|
4
|
+
accessory;
|
|
5
|
+
deviceServices;
|
|
6
|
+
deviceId;
|
|
7
|
+
targetCelsius = 22.22;
|
|
8
|
+
targetMode = 'cloud.smarthq.type.thermostatmode.cool';
|
|
9
|
+
targetFanSpeed = 'cloud.smarthq.type.fanspeed.auto';
|
|
10
|
+
isOn = false;
|
|
11
|
+
client;
|
|
12
|
+
Service;
|
|
13
|
+
Characteristic;
|
|
14
|
+
api;
|
|
15
|
+
modeToHK = {};
|
|
16
|
+
hkToMode = {};
|
|
17
|
+
// Promoted to class properties so handlers outside constructor can access them
|
|
18
|
+
acThermostat;
|
|
19
|
+
acFan;
|
|
20
|
+
// Mode switch service references for mutual exclusion updates
|
|
21
|
+
modeSwitches = {};
|
|
22
|
+
constructor(platform, accessory, deviceServices, deviceId) {
|
|
23
|
+
this.platform = platform;
|
|
24
|
+
this.accessory = accessory;
|
|
25
|
+
this.deviceServices = deviceServices;
|
|
26
|
+
this.deviceId = deviceId;
|
|
27
|
+
this.api = platform.api;
|
|
28
|
+
this.Service = this.api.hap.Service;
|
|
29
|
+
this.Characteristic = this.api.hap.Characteristic;
|
|
30
|
+
this.client = new SmartHQClient({
|
|
31
|
+
clientId: platform.config.clientId,
|
|
32
|
+
clientSecret: platform.config.clientSecret,
|
|
33
|
+
redirectUri: platform.config.redirectUri,
|
|
34
|
+
debug: platform.config.debugLogging || false,
|
|
35
|
+
});
|
|
36
|
+
const HK = this.Characteristic.TargetHeatingCoolingState;
|
|
37
|
+
this.modeToHK = {
|
|
38
|
+
'cloud.smarthq.type.thermostatmode.cool': HK.COOL,
|
|
39
|
+
'cloud.smarthq.type.thermostatmode.cool.energysaver': HK.AUTO,
|
|
40
|
+
'cloud.smarthq.type.thermostatmode.fanonly': HK.OFF,
|
|
41
|
+
'cloud.smarthq.type.thermostatmode.dry': HK.COOL,
|
|
42
|
+
};
|
|
43
|
+
this.hkToMode = {
|
|
44
|
+
[HK.OFF]: 'cloud.smarthq.type.thermostatmode.fanonly',
|
|
45
|
+
[HK.COOL]: 'cloud.smarthq.type.thermostatmode.cool',
|
|
46
|
+
[HK.HEAT]: 'cloud.smarthq.type.thermostatmode.cool',
|
|
47
|
+
[HK.AUTO]: 'cloud.smarthq.type.thermostatmode.cool.energysaver',
|
|
48
|
+
};
|
|
49
|
+
// Seed initial state from service data at startup
|
|
50
|
+
const thermoSvc = this.findService('cloud.smarthq.service.thermostat.v1', 'cloud.smarthq.domain.thermostat');
|
|
51
|
+
if (thermoSvc?.state) {
|
|
52
|
+
if (thermoSvc.state.coolCelsiusConverted != null)
|
|
53
|
+
this.targetCelsius = thermoSvc.state.coolCelsiusConverted;
|
|
54
|
+
if (thermoSvc.state.mode != null)
|
|
55
|
+
this.targetMode = thermoSvc.state.mode;
|
|
56
|
+
if (thermoSvc.state.fanSpeed != null)
|
|
57
|
+
this.targetFanSpeed = thermoSvc.state.fanSpeed;
|
|
58
|
+
if (thermoSvc.state.on != null)
|
|
59
|
+
this.isOn = thermoSvc.state.on;
|
|
60
|
+
}
|
|
61
|
+
// authenticate() before connect() so both sendCommand and WebSocket work
|
|
62
|
+
this.setupWebSocket();
|
|
63
|
+
// WebSocket push updates
|
|
64
|
+
this.client.on('service_update', (message) => {
|
|
65
|
+
if (message.domainType === 'cloud.smarthq.domain.thermostat') {
|
|
66
|
+
if (message.state?.on !== undefined) {
|
|
67
|
+
this.isOn = message.state.on;
|
|
68
|
+
this.acFan.getCharacteristic(this.Characteristic.On).updateValue(this.isOn);
|
|
69
|
+
}
|
|
70
|
+
if (message.state?.coolCelsiusConverted !== undefined) {
|
|
71
|
+
this.targetCelsius = message.state.coolCelsiusConverted;
|
|
72
|
+
this.acThermostat.getCharacteristic(this.Characteristic.TargetTemperature).updateValue(this.targetCelsius);
|
|
73
|
+
}
|
|
74
|
+
if (message.state?.mode !== undefined) {
|
|
75
|
+
this.targetMode = message.state.mode;
|
|
76
|
+
const hkMode = this.modeToHK[this.targetMode] ?? HK.COOL;
|
|
77
|
+
this.acThermostat.getCharacteristic(this.Characteristic.TargetHeatingCoolingState).updateValue(hkMode);
|
|
78
|
+
this.updateModeSwitches(this.targetMode);
|
|
79
|
+
}
|
|
80
|
+
if (message.state?.fanSpeed !== undefined) {
|
|
81
|
+
this.targetFanSpeed = message.state.fanSpeed;
|
|
82
|
+
this.acFan.getCharacteristic(this.Characteristic.RotationSpeed).updateValue(this.fanSpeedToPercent(this.targetFanSpeed));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (message.domainType === 'cloud.smarthq.domain.state.compressor') {
|
|
86
|
+
const running = message.state?.on;
|
|
87
|
+
const currentState = running
|
|
88
|
+
? this.Characteristic.CurrentHeatingCoolingState.COOL
|
|
89
|
+
: this.Characteristic.CurrentHeatingCoolingState.OFF;
|
|
90
|
+
this.acThermostat.getCharacteristic(this.Characteristic.CurrentHeatingCoolingState).updateValue(currentState);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
// ── Accessory information ────────────────────────────────────────────────
|
|
94
|
+
this.accessory.getService(this.Service.AccessoryInformation)
|
|
95
|
+
.setCharacteristic(this.Characteristic.Manufacturer, 'GE')
|
|
96
|
+
.setCharacteristic(this.Characteristic.Model, accessory.context.device.model || 'AHTT08BC')
|
|
97
|
+
.setCharacteristic(this.Characteristic.SerialNumber, accessory.context.device.serial || 'Default-Serial');
|
|
98
|
+
// ── Thermostat service ───────────────────────────────────────────────────
|
|
99
|
+
const displayName = 'Air Conditioner';
|
|
100
|
+
this.acThermostat = this.accessory.getService(displayName)
|
|
101
|
+
|| this.accessory.addService(this.Service.Thermostat, displayName, 'ac-thermo1');
|
|
102
|
+
this.acThermostat.setCharacteristic(this.Characteristic.Name, displayName);
|
|
103
|
+
this.acThermostat.addOptionalCharacteristic(this.Characteristic.ConfiguredName);
|
|
104
|
+
this.acThermostat.setCharacteristic(this.Characteristic.ConfiguredName, displayName);
|
|
105
|
+
this.acThermostat.getCharacteristic(this.Characteristic.CurrentHeatingCoolingState).setProps({
|
|
106
|
+
minValue: this.Characteristic.CurrentHeatingCoolingState.OFF,
|
|
107
|
+
maxValue: this.Characteristic.CurrentHeatingCoolingState.COOL,
|
|
108
|
+
validValues: [
|
|
109
|
+
this.Characteristic.CurrentHeatingCoolingState.OFF,
|
|
110
|
+
this.Characteristic.CurrentHeatingCoolingState.COOL,
|
|
111
|
+
],
|
|
112
|
+
});
|
|
113
|
+
this.acThermostat.getCharacteristic(this.Characteristic.TargetHeatingCoolingState).setProps({
|
|
114
|
+
minValue: this.Characteristic.TargetHeatingCoolingState.OFF,
|
|
115
|
+
maxValue: this.Characteristic.TargetHeatingCoolingState.AUTO,
|
|
116
|
+
validValues: [
|
|
117
|
+
this.Characteristic.TargetHeatingCoolingState.OFF,
|
|
118
|
+
this.Characteristic.TargetHeatingCoolingState.COOL,
|
|
119
|
+
this.Characteristic.TargetHeatingCoolingState.AUTO,
|
|
120
|
+
],
|
|
121
|
+
});
|
|
122
|
+
this.acThermostat.getCharacteristic(this.Characteristic.CurrentTemperature).setProps({
|
|
123
|
+
minValue: -20,
|
|
124
|
+
maxValue: 50,
|
|
125
|
+
minStep: 0.1,
|
|
126
|
+
});
|
|
127
|
+
this.acThermostat.getCharacteristic(this.Characteristic.TargetTemperature).setProps({
|
|
128
|
+
minValue: 17.78,
|
|
129
|
+
maxValue: 30.0,
|
|
130
|
+
minStep: 0.5,
|
|
131
|
+
});
|
|
132
|
+
this.acThermostat.getCharacteristic(this.Characteristic.CurrentHeatingCoolingState)
|
|
133
|
+
.onGet(this.getCurrentHeatingCoolingState.bind(this));
|
|
134
|
+
this.acThermostat.getCharacteristic(this.Characteristic.TargetHeatingCoolingState)
|
|
135
|
+
.onGet(this.getTargetHeatingCoolingState.bind(this))
|
|
136
|
+
.onSet(this.setTargetHeatingCoolingState.bind(this));
|
|
137
|
+
this.acThermostat.getCharacteristic(this.Characteristic.CurrentTemperature)
|
|
138
|
+
.onGet(this.getCurrentTemperature.bind(this));
|
|
139
|
+
this.acThermostat.getCharacteristic(this.Characteristic.TargetTemperature)
|
|
140
|
+
.onGet(this.getTargetTemperature.bind(this))
|
|
141
|
+
.onSet(this.setTargetTemperature.bind(this));
|
|
142
|
+
this.acThermostat.getCharacteristic(this.Characteristic.TemperatureDisplayUnits)
|
|
143
|
+
.onGet(this.handleTemperatureDisplayUnitsGet.bind(this))
|
|
144
|
+
.onSet(this.handleTemperatureDisplayUnitsSet.bind(this));
|
|
145
|
+
// ── Fan service ───────────────────────────────────────────────────────────
|
|
146
|
+
const fanDisplayName = 'AC Fan Speed';
|
|
147
|
+
this.acFan = this.accessory.getService(fanDisplayName)
|
|
148
|
+
|| this.accessory.addService(this.Service.Fan, fanDisplayName, 'ac-fan1');
|
|
149
|
+
this.acFan.setCharacteristic(this.Characteristic.Name, fanDisplayName);
|
|
150
|
+
this.acFan.addOptionalCharacteristic(this.Characteristic.ConfiguredName);
|
|
151
|
+
this.acFan.setCharacteristic(this.Characteristic.ConfiguredName, fanDisplayName);
|
|
152
|
+
this.acFan.getCharacteristic(this.Characteristic.On)
|
|
153
|
+
.onGet(() => this.isOn)
|
|
154
|
+
.onSet(async (value) => {
|
|
155
|
+
await this.setTargetHeatingCoolingState(value
|
|
156
|
+
? this.Characteristic.TargetHeatingCoolingState.COOL
|
|
157
|
+
: this.Characteristic.TargetHeatingCoolingState.OFF);
|
|
158
|
+
});
|
|
159
|
+
this.acFan.getCharacteristic(this.Characteristic.RotationSpeed)
|
|
160
|
+
.setProps({ minValue: 0, maxValue: 100, minStep: 25 })
|
|
161
|
+
.onGet(() => this.fanSpeedToPercent(this.targetFanSpeed))
|
|
162
|
+
.onSet(async (value) => {
|
|
163
|
+
this.targetFanSpeed = this.percentToFanSpeed(value);
|
|
164
|
+
await this.sendThermostatCommand(this.targetMode, this.targetCelsius, this.targetFanSpeed, this.isOn);
|
|
165
|
+
});
|
|
166
|
+
// ── Mode switches ─────────────────────────────────────────────────────────
|
|
167
|
+
const modes = [
|
|
168
|
+
{ name: 'Cool', mode: 'cloud.smarthq.type.thermostatmode.cool', subtype: 'ac-mode-cool' },
|
|
169
|
+
{ name: 'Eco', mode: 'cloud.smarthq.type.thermostatmode.cool.energysaver', subtype: 'ac-mode-eco' },
|
|
170
|
+
{ name: 'Dry', mode: 'cloud.smarthq.type.thermostatmode.dry', subtype: 'ac-mode-dry' },
|
|
171
|
+
{ name: 'Fan Only', mode: 'cloud.smarthq.type.thermostatmode.fanonly', subtype: 'ac-mode-fanonly' },
|
|
172
|
+
];
|
|
173
|
+
for (const { name, mode, subtype } of modes) {
|
|
174
|
+
const svc = this.accessory.getService(name)
|
|
175
|
+
|| this.accessory.addService(this.Service.Switch, name, subtype);
|
|
176
|
+
svc.setCharacteristic(this.Characteristic.Name, name);
|
|
177
|
+
svc.addOptionalCharacteristic(this.Characteristic.ConfiguredName);
|
|
178
|
+
svc.setCharacteristic(this.Characteristic.ConfiguredName, name);
|
|
179
|
+
svc.getCharacteristic(this.Characteristic.On)
|
|
180
|
+
.onGet(() => this.isOn && this.targetMode === mode)
|
|
181
|
+
.onSet(async (value) => {
|
|
182
|
+
if (value) {
|
|
183
|
+
// Switching to this mode turns the AC on and deactivates others
|
|
184
|
+
this.isOn = true;
|
|
185
|
+
this.targetMode = mode;
|
|
186
|
+
await this.sendThermostatCommand(mode, this.targetCelsius, this.targetFanSpeed, true);
|
|
187
|
+
this.updateModeSwitches(mode);
|
|
188
|
+
// Keep thermostat tile in sync
|
|
189
|
+
const hkMode = this.modeToHK[mode] ?? HK.COOL;
|
|
190
|
+
this.acThermostat.getCharacteristic(this.Characteristic.TargetHeatingCoolingState).updateValue(hkMode);
|
|
191
|
+
this.acFan.getCharacteristic(this.Characteristic.On).updateValue(true);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// Turning off a mode switch turns the AC off entirely
|
|
195
|
+
this.isOn = false;
|
|
196
|
+
await this.sendThermostatCommand(this.targetMode, this.targetCelsius, this.targetFanSpeed, false);
|
|
197
|
+
this.updateModeSwitches('');
|
|
198
|
+
this.acThermostat.getCharacteristic(this.Characteristic.TargetHeatingCoolingState)
|
|
199
|
+
.updateValue(this.Characteristic.TargetHeatingCoolingState.OFF);
|
|
200
|
+
this.acFan.getCharacteristic(this.Characteristic.On).updateValue(false);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
this.modeSwitches[mode] = svc;
|
|
204
|
+
}
|
|
205
|
+
// Set initial switch states
|
|
206
|
+
this.updateModeSwitches(this.isOn ? this.targetMode : '');
|
|
207
|
+
// ── Polling (every 30 s) ──────────────────────────────────────────────────
|
|
208
|
+
setInterval(() => {
|
|
209
|
+
this.getCurrentTemperature().then(temp => {
|
|
210
|
+
this.acThermostat.getCharacteristic(this.Characteristic.CurrentTemperature).updateValue(temp);
|
|
211
|
+
});
|
|
212
|
+
this.getCurrentHeatingCoolingState().then(state => {
|
|
213
|
+
const running = state === this.Characteristic.CurrentHeatingCoolingState.COOL;
|
|
214
|
+
this.acThermostat.getCharacteristic(this.Characteristic.CurrentHeatingCoolingState).updateValue(state);
|
|
215
|
+
this.acFan.getCharacteristic(this.Characteristic.On).updateValue(running);
|
|
216
|
+
// Keep TargetHeatingCoolingState in sync with actual on/off state
|
|
217
|
+
this.acThermostat.getCharacteristic(this.Characteristic.TargetHeatingCoolingState).updateValue(this.isOn
|
|
218
|
+
? (this.modeToHK[this.targetMode] ?? this.Characteristic.TargetHeatingCoolingState.COOL)
|
|
219
|
+
: this.Characteristic.TargetHeatingCoolingState.OFF);
|
|
220
|
+
});
|
|
221
|
+
}, 30000);
|
|
222
|
+
}
|
|
223
|
+
// ── Mode switch mutual exclusion ───────────────────────────────────────────
|
|
224
|
+
updateModeSwitches(activeMode) {
|
|
225
|
+
for (const [mode, svc] of Object.entries(this.modeSwitches)) {
|
|
226
|
+
svc.getCharacteristic(this.Characteristic.On).updateValue(this.isOn && mode === activeMode);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// ── Fan speed helpers ──────────────────────────────────────────────────────
|
|
230
|
+
fanSpeedToPercent(fanSpeed) {
|
|
231
|
+
switch (fanSpeed) {
|
|
232
|
+
case 'cloud.smarthq.type.fanspeed.high': return 100;
|
|
233
|
+
case 'cloud.smarthq.type.fanspeed.medium': return 50;
|
|
234
|
+
case 'cloud.smarthq.type.fanspeed.low': return 25;
|
|
235
|
+
default: return 0;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
percentToFanSpeed(percent) {
|
|
239
|
+
if (percent >= 75)
|
|
240
|
+
return 'cloud.smarthq.type.fanspeed.high';
|
|
241
|
+
if (percent >= 40)
|
|
242
|
+
return 'cloud.smarthq.type.fanspeed.medium';
|
|
243
|
+
if (percent >= 15)
|
|
244
|
+
return 'cloud.smarthq.type.fanspeed.low';
|
|
245
|
+
return 'cloud.smarthq.type.fanspeed.auto';
|
|
246
|
+
}
|
|
247
|
+
// ── Shared command helper ──────────────────────────────────────────────────
|
|
248
|
+
async sendThermostatCommand(mode, celsius, fanSpeed, on) {
|
|
249
|
+
const svc = this.findService('cloud.smarthq.service.thermostat.v1', 'cloud.smarthq.domain.thermostat');
|
|
250
|
+
if (!svc)
|
|
251
|
+
return;
|
|
252
|
+
const command = {
|
|
253
|
+
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
254
|
+
on,
|
|
255
|
+
};
|
|
256
|
+
// Only send mode and fanSpeed when turning on
|
|
257
|
+
if (on) {
|
|
258
|
+
command.mode = mode;
|
|
259
|
+
// Dry mode doesn't accept fanSpeed
|
|
260
|
+
const isDry = mode === 'cloud.smarthq.type.thermostatmode.dry';
|
|
261
|
+
if (!isDry) {
|
|
262
|
+
command.fanSpeed = fanSpeed;
|
|
263
|
+
}
|
|
264
|
+
// Only send coolFahrenheit for cool modes
|
|
265
|
+
const needsCoolTemp = mode === 'cloud.smarthq.type.thermostatmode.cool'
|
|
266
|
+
|| mode === 'cloud.smarthq.type.thermostatmode.cool.energysaver';
|
|
267
|
+
if (needsCoolTemp) {
|
|
268
|
+
command.coolFahrenheit = Math.round(celsius * 9 / 5 + 32);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const cmdBody = {
|
|
272
|
+
command,
|
|
273
|
+
kind: 'service#command',
|
|
274
|
+
deviceId: this.deviceId,
|
|
275
|
+
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
276
|
+
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
277
|
+
domainType: 'cloud.smarthq.domain.thermostat',
|
|
278
|
+
};
|
|
279
|
+
try {
|
|
280
|
+
await this.client.sendCommand(cmdBody);
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
// handleApiError in ge-smarthq is async but callers don't await it,
|
|
284
|
+
// so the thrown value is a Promise<Error> — await it to get the real message.
|
|
285
|
+
const resolved = error instanceof Promise ? await error : error;
|
|
286
|
+
const msg = resolved instanceof Error ? resolved.message : JSON.stringify(resolved);
|
|
287
|
+
this.client.debug('Error sending AC thermostat command: ' + msg);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// ── Service helpers ────────────────────────────────────────────────────────
|
|
291
|
+
findService(serviceType, domainType) {
|
|
292
|
+
return this.deviceServices.find(s => s.serviceType === serviceType && s.domainType === domainType);
|
|
293
|
+
}
|
|
294
|
+
// ── Handlers ──────────────────────────────────────────────────────────────
|
|
295
|
+
async getCurrentHeatingCoolingState() {
|
|
296
|
+
const svc = this.findService('cloud.smarthq.service.toggle', 'cloud.smarthq.domain.state.compressor');
|
|
297
|
+
if (!svc)
|
|
298
|
+
return this.Characteristic.CurrentHeatingCoolingState.OFF;
|
|
299
|
+
try {
|
|
300
|
+
const response = await this.client.getServiceDetails(this.deviceId, svc.serviceId);
|
|
301
|
+
const running = response?.state?.on ?? false;
|
|
302
|
+
this.isOn = running;
|
|
303
|
+
return running
|
|
304
|
+
? this.Characteristic.CurrentHeatingCoolingState.COOL
|
|
305
|
+
: this.Characteristic.CurrentHeatingCoolingState.OFF;
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
this.client.debug('Error getting AC compressor state: ' + error);
|
|
309
|
+
return this.Characteristic.CurrentHeatingCoolingState.OFF;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
getTargetHeatingCoolingState() {
|
|
313
|
+
if (!this.isOn)
|
|
314
|
+
return this.Characteristic.TargetHeatingCoolingState.OFF;
|
|
315
|
+
return this.modeToHK[this.targetMode] ?? this.Characteristic.TargetHeatingCoolingState.COOL;
|
|
316
|
+
}
|
|
317
|
+
async setTargetHeatingCoolingState(value) {
|
|
318
|
+
const hkValue = value;
|
|
319
|
+
const HK = this.Characteristic.TargetHeatingCoolingState;
|
|
320
|
+
if (hkValue === HK.OFF) {
|
|
321
|
+
this.isOn = false;
|
|
322
|
+
await this.sendThermostatCommand(this.targetMode, this.targetCelsius, this.targetFanSpeed, false);
|
|
323
|
+
this.updateModeSwitches('');
|
|
324
|
+
// Explicitly update thermostat tile to OFF
|
|
325
|
+
this.acThermostat.getCharacteristic(this.Characteristic.TargetHeatingCoolingState).updateValue(HK.OFF);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
this.isOn = true;
|
|
329
|
+
const newMode = this.hkToMode[hkValue] ?? 'cloud.smarthq.type.thermostatmode.cool';
|
|
330
|
+
this.targetMode = newMode;
|
|
331
|
+
await this.sendThermostatCommand(newMode, this.targetCelsius, this.targetFanSpeed, true);
|
|
332
|
+
this.updateModeSwitches(newMode);
|
|
333
|
+
}
|
|
334
|
+
async getCurrentTemperature() {
|
|
335
|
+
const svc = this.findService('cloud.smarthq.service.temperature', 'cloud.smarthq.domain.indoor.ambient');
|
|
336
|
+
if (!svc)
|
|
337
|
+
return this.targetCelsius;
|
|
338
|
+
try {
|
|
339
|
+
const response = await this.client.getServiceDetails(this.deviceId, svc.serviceId);
|
|
340
|
+
if (response?.state?.celsiusConverted == null)
|
|
341
|
+
return this.targetCelsius;
|
|
342
|
+
return Number(response.state.celsiusConverted);
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
this.client.debug('Error getting AC current temperature: ' + error);
|
|
346
|
+
return this.targetCelsius;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
getTargetTemperature() {
|
|
350
|
+
return this.targetCelsius;
|
|
351
|
+
}
|
|
352
|
+
// Only send command when AC is already on — don't turn it on just by moving the temp slider
|
|
353
|
+
async setTargetTemperature(value) {
|
|
354
|
+
this.targetCelsius = value;
|
|
355
|
+
if (this.isOn) {
|
|
356
|
+
await this.sendThermostatCommand(this.targetMode, this.targetCelsius, this.targetFanSpeed, true);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
handleTemperatureDisplayUnitsGet() {
|
|
360
|
+
return this.Characteristic.TemperatureDisplayUnits.FAHRENHEIT;
|
|
361
|
+
}
|
|
362
|
+
handleTemperatureDisplayUnitsSet(value) {
|
|
363
|
+
this.client.debug('AC Temperature Display Units set to: ' + value);
|
|
364
|
+
}
|
|
365
|
+
// authenticate() before connect() so token is valid for both
|
|
366
|
+
// sendCommand HTTP calls and the WebSocket connection
|
|
367
|
+
async setupWebSocket() {
|
|
368
|
+
try {
|
|
369
|
+
await this.client.authenticate();
|
|
370
|
+
await this.client.connect();
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
this.client.debug('Failed to connect to SmartHQ WebSocket for AC: ' + error);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=airConditioner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"airConditioner.js","sourceRoot":"","sources":["../../src/airConditioner/airConditioner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { PlatformAccessory } from 'homebridge';
|
|
2
|
+
import { SmartHqPlatform } from './platform.js';
|
|
3
|
+
import { DeviceService } from 'ge-smarthq';
|
|
4
|
+
export declare function setupAirConditionerServices(this: SmartHqPlatform, accessory: PlatformAccessory, deviceServices: DeviceService[], deviceId: string): void;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { AirConditioner } from './airConditioner/airConditioner.js';
|
|
2
|
+
export function setupAirConditionerServices(accessory, deviceServices, deviceId) {
|
|
3
|
+
new AirConditioner(this, accessory, deviceServices, deviceId);
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=airConditionerServices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"airConditionerServices.js","sourceRoot":"","sources":["../src/airConditionerServices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAKpE,MAAM,UAAU,2BAA2B,CAAwB,SAA4B,EAAE,cAA+B,EAAE,QAAgB;IAChJ,IAAI,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -112,7 +112,11 @@ export class ControlLock {
|
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
114
|
catch (error) {
|
|
115
|
-
|
|
115
|
+
// handleApiError in ge-smarthq is async but callers don't await it,
|
|
116
|
+
// so the thrown value is a Promise<Error> — await it to get the real message.
|
|
117
|
+
const resolved = error instanceof Promise ? await error : error;
|
|
118
|
+
const msg = resolved instanceof Error ? resolved.message : JSON.stringify(resolved);
|
|
119
|
+
this.client.debug("Error sending setcontrolsLock command: " + msg);
|
|
116
120
|
}
|
|
117
121
|
}
|
|
118
122
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controlLock.js","sourceRoot":"","sources":["../../src/dishwasher/controlLock.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAC;AAG1D;;;;GAIG;AACH,MAAM,OAAO,WAAW;IAOH;IACA;IACD;IACA;IATV,MAAM,CAAgB;IACd,OAAO,CAAiB;IACxB,cAAc,CAAwB;IACrC,GAAG,CAAM;IAE1B,YACmB,QAAyB,EACzB,SAA4B,EAC7B,cAA+B,EAC/B,QAAgB;QAHf,aAAQ,GAAR,QAAQ,CAAiB;QACzB,cAAS,GAAT,SAAS,CAAmB;QAC7B,mBAAc,GAAd,cAAc,CAAiB;QAC/B,aAAQ,GAAR,QAAQ,CAAQ;QAEhC,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;QAClD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC;YAC9B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ;YAClC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY;YAC1C,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW;YACxC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,IAAI,KAAK;SAC7C,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC3C,iEAAiE;YACjE,OAAO;QACT,CAAC;QAED,sFAAsF;QACtF,qEAAqE;QACrE,qEAAqE;QACrE,sFAAsF;QAEtF,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,IACE,OAAO,CAAC,iBAAiB,KAAK,gCAAgC;gBAC9D,OAAO,CAAC,WAAW,KAAK,8BAA8B;gBACtD,OAAO,CAAC,UAAU,KAAK,oCAAoC,EAC3D,CAAC;gBACD,cAAc,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,sDAAsD;gBACpD,IAAI,CAAC,SAAS,CAAC,WAAW,CAC7B,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAE5D,uFAAuF;QACvF,kDAAkD;QAClD,uFAAuF;QACvF,MAAM,WAAW,GAAG,iBAAiB,CAAC;QAEtC,MAAM,YAAY,GAChB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC;YACtC,IAAI,CAAC,SAAS,CAAC,UAAU,CACvB,IAAI,CAAC,OAAO,CAAC,MAAM,EACnB,WAAW,EACX,qBAAqB,CACtB,CAAC;QACJ,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAEtE,YAAY,CAAC,yBAAyB,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAC3E,YAAY,CAAC,iBAAiB,CAC5B,IAAI,CAAC,cAAc,CAAC,cAAc,EAClC,WAAW,CACZ,CAAC;QAEF,YAAY;aACT,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;aACzC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACtC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,uFAAuF;IACvF,KAAK,CAAC,eAAe;QACnB,IAAI,IAAI,GAAG,KAAK,CAAC;QAEjB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,IACE,OAAO,CAAC,iBAAiB,KAAK,gCAAgC;gBAC9D,OAAO,CAAC,WAAW,KAAK,8BAA8B;gBACtD,OAAO,CAAC,UAAU,KAAK,oCAAoC,EAC3D,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAClD,IAAI,CAAC,QAAQ,EACb,OAAO,CAAC,SAAS,CAClB,CAAC;oBACF,IAAI,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC;wBAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;wBAC9D,OAAO,KAAK,CAAC;oBACf,CAAC;oBACD,IAAI,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,CAAC;oBACpC,MAAM;gBACR,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,GAAG,KAAK,CAAC,CAAC;oBAChE,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uFAAuF;IACvF,KAAK,CAAC,eAAe,CAAC,KAA0B;QAC9C,MAAM,OAAO,GAAG;YACd,OAAO,EAAE;gBACP,WAAW,EAAE,kCAAkC;gBAC/C,EAAE,EAAE,KAAK;aACV;YACD,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,iBAAiB,EAAE,gCAAgC;YACnD,WAAW,EAAE,8BAA8B;YAC3C,UAAU,EAAE,oCAAoC;SACjD,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAExD,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;QACH,CAAC;QAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"controlLock.js","sourceRoot":"","sources":["../../src/dishwasher/controlLock.ts"],"names":[],"mappings":"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"}
|
|
@@ -177,9 +177,9 @@ export class Dishwasher {
|
|
|
177
177
|
//=====================================================================================
|
|
178
178
|
// create a new Lightbulb service for the Cycle % Done
|
|
179
179
|
//=====================================================================================
|
|
180
|
-
displayName = "Cycle
|
|
180
|
+
displayName = "Cycle Pct Done";
|
|
181
181
|
const cyclePct = this.accessory.getService(displayName) ||
|
|
182
|
-
this.accessory.addService(this.Service.Lightbulb, displayName, "cycle-done-
|
|
182
|
+
this.accessory.addService(this.Service.Lightbulb, displayName, "cycle-done-3");
|
|
183
183
|
cyclePct.setCharacteristic(this.Characteristic.Name, displayName);
|
|
184
184
|
cyclePct.addOptionalCharacteristic(this.Characteristic.ConfiguredName);
|
|
185
185
|
cyclePct.setCharacteristic(this.Characteristic.ConfiguredName, displayName);
|
|
@@ -742,6 +742,9 @@ export class Dishwasher {
|
|
|
742
742
|
}
|
|
743
743
|
setupGroupService(serviceType, displayName, serviceIdSuffix, accessory) {
|
|
744
744
|
let service;
|
|
745
|
+
if (displayName === "1") {
|
|
746
|
+
displayName = "1 Hour";
|
|
747
|
+
}
|
|
745
748
|
this.client.debug(chalk.blue("Setting up " + serviceType + " for " + displayName));
|
|
746
749
|
switch (serviceType) {
|
|
747
750
|
case "Outlet":
|