Skip to content

Commit 5f70bb5

Browse files
committed
feat(accessories): reachability state
- implement reachability across all accessories - cover HomeKit get/set calls
1 parent d0ddb5f commit 5f70bb5

File tree

6 files changed

+46
-56
lines changed

6 files changed

+46
-56
lines changed

src/dingzAccessory.ts

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,9 @@ export class DingzAccessory extends DingzDaBaseAccessory {
269269
this.getDeviceState()
270270
.then((state) => {
271271
if (typeof state !== 'undefined') {
272-
if (!this.isReachable) {
272+
if (this.reachabilityState !== null) {
273273
// Update reachability -- obviously, we're online again
274-
this.isReachable = true;
274+
this.reachabilityState = null;
275275
this.log.warn(
276276
`Device --> ${this.accessory.displayName} (${this.device.address}) --> recovered from unreachable state`,
277277
);
@@ -293,7 +293,7 @@ export class DingzAccessory extends DingzDaBaseAccessory {
293293
})
294294
.catch((e) => {
295295
if (e instanceof DeviceNotReachableError) {
296-
this.isReachable = false;
296+
this.reachabilityState = new Error();
297297
this.log.error('ERROR: Failure to retrieve state', e.message);
298298
} else {
299299
throw e;
@@ -337,7 +337,7 @@ export class DingzAccessory extends DingzDaBaseAccessory {
337337
private getTemperature(callback: CharacteristicSetCallback) {
338338
// set this to a valid value for CurrentTemperature
339339
const currentTemperature: number = this.dingzStates.Temperature;
340-
callback(null, currentTemperature);
340+
callback(this.reachabilityState, currentTemperature);
341341
}
342342

343343
private addLightSensorService() {
@@ -651,7 +651,7 @@ export class DingzAccessory extends DingzDaBaseAccessory {
651651
callback: CharacteristicGetCallback,
652652
) {
653653
const currentState = this.dingzStates.Buttons[button].event;
654-
callback(null, currentState);
654+
callback(this.reachabilityState, currentState);
655655
}
656656

657657
private getSwitchButtonState(
@@ -660,7 +660,7 @@ export class DingzAccessory extends DingzDaBaseAccessory {
660660
) {
661661
const currentState = this.dingzStates.Buttons[button].state;
662662
this.log.info('Get Switch State of ->', button, '-> state:', currentState);
663-
callback(null, currentState);
663+
callback(this.reachabilityState, currentState);
664664
}
665665

666666
private setSwitchButtonState(
@@ -670,7 +670,7 @@ export class DingzAccessory extends DingzDaBaseAccessory {
670670
) {
671671
this.dingzStates.Buttons[button].state = value as ButtonState;
672672
this.log.info('Set Switch State of ->', button, '-> state:', value);
673-
callback(null);
673+
callback(this.reachabilityState);
674674
}
675675

676676
private addDimmerService({
@@ -765,15 +765,15 @@ export class DingzAccessory extends DingzDaBaseAccessory {
765765
e.toString(),
766766
);
767767
}
768-
callback(null);
768+
callback(this.reachabilityState);
769769
}
770770

771771
/**
772772
* Handle the "GET" requests from HomeKit
773773
*/
774774
private getOn(index: DimmerId, callback: CharacteristicGetCallback) {
775775
const isOn: boolean = this.dingzStates.Dimmers[index]?.on ?? false;
776-
callback(null, isOn);
776+
callback(this.reachabilityState, isOn);
777777
}
778778

779779
private async setBrightness(
@@ -786,7 +786,7 @@ export class DingzAccessory extends DingzDaBaseAccessory {
786786
this.dingzStates.Dimmers[index].on = isOn;
787787

788788
await this.setDeviceDimmer(index, isOn, value as number);
789-
callback(null);
789+
callback(this.reachabilityState);
790790
}
791791

792792
// Add WindowCovering (Blinds)
@@ -931,9 +931,9 @@ export class DingzAccessory extends DingzDaBaseAccessory {
931931
id,
932932
blind: position as number,
933933
lamella: windowCovering.lamella,
934+
callback: callback,
934935
});
935936
}
936-
callback(null);
937937
}
938938

939939
private getPosition(
@@ -953,7 +953,7 @@ export class DingzAccessory extends DingzDaBaseAccessory {
953953
blind,
954954
);
955955

956-
callback(null, blind);
956+
callback(this.reachabilityState, blind);
957957
}
958958

959959
private async setTiltAngle(
@@ -972,9 +972,9 @@ export class DingzAccessory extends DingzDaBaseAccessory {
972972
id,
973973
blind: this.dingzStates.WindowCovers[id].lamella,
974974
lamella: angle as number,
975+
callback: callback,
975976
});
976977
}
977-
callback(null);
978978
}
979979

980980
/**
@@ -997,7 +997,7 @@ export class DingzAccessory extends DingzDaBaseAccessory {
997997
tiltAngle,
998998
);
999999

1000-
callback(null, tiltAngle);
1000+
callback(this.reachabilityState, tiltAngle);
10011001
}
10021002

10031003
private getPositionState(
@@ -1030,7 +1030,7 @@ export class DingzAccessory extends DingzDaBaseAccessory {
10301030
positionState,
10311031
);
10321032
}
1033-
callback(null, positionState);
1033+
callback(this.reachabilityState, positionState);
10341034
}
10351035

10361036
/**
@@ -1112,9 +1112,9 @@ export class DingzAccessory extends DingzDaBaseAccessory {
11121112
token: this.device.token,
11131113
})
11141114
.then(({ dingzDevices, inputConfig, dimmerConfig }) => {
1115-
if (!this.isReachable) {
1115+
if (this.reachabilityState !== null) {
11161116
this.log.warn('Device recovered from unreachable state');
1117-
this.isReachable = true;
1117+
this.reachabilityState = null;
11181118
}
11191119

11201120
if (inputConfig?.inputs[0]) {
@@ -1349,7 +1349,7 @@ export class DingzAccessory extends DingzDaBaseAccessory {
13491349

13501350
private getLEDOn(callback: CharacteristicGetCallback) {
13511351
const isOn = this.dingzStates.LED.on;
1352-
callback(this.isReachable ? null : new Error(), isOn);
1352+
callback(this.reachabilityState, isOn);
13531353
}
13541354

13551355
private setLEDHue(
@@ -1463,10 +1463,12 @@ export class DingzAccessory extends DingzDaBaseAccessory {
14631463
id,
14641464
blind,
14651465
lamella,
1466+
callback,
14661467
}: {
14671468
id: WindowCoveringId;
14681469
blind: number;
14691470
lamella: number;
1471+
callback: CharacteristicSetCallback;
14701472
}) {
14711473
// The API says the parameters can be omitted. This is not true
14721474
// {{ip}}/api/v1/shade/0?blind=<value>&lamella=<value>
@@ -1482,7 +1484,10 @@ export class DingzAccessory extends DingzDaBaseAccessory {
14821484
{ encode: false },
14831485
),
14841486
)
1485-
.catch(this.handleRequestErrors.bind(this));
1487+
.catch(this.handleRequestErrors.bind(this))
1488+
.finally(() => {
1489+
callback(this.reachabilityState);
1490+
});
14861491
}
14871492

14881493
// We need Target vs Current to accurately update WindowCoverings
@@ -1522,12 +1527,7 @@ export class DingzAccessory extends DingzDaBaseAccessory {
15221527
)
15231528
.catch(this.handleRequestErrors.bind(this))
15241529
.finally(() => {
1525-
// make sure we callback
1526-
if (!this.isReachable) {
1527-
callback(new Error());
1528-
} else {
1529-
callback(null);
1530-
}
1530+
callback(this.reachabilityState);
15311531
});
15321532
}
15331533

src/lib/dingzDaBaseAccessory.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export class DingzDaBaseAccessory {
2727
protected readonly debugHelper: AxiosDebugHelper;
2828

2929
protected baseUrl: string;
30-
protected isReachable = true;
30+
protected reachabilityState: null | Error = null;
3131

3232
constructor(
3333
protected readonly platform: DingzDaHomebridgePlatform,
@@ -106,7 +106,7 @@ export class DingzDaBaseAccessory {
106106

107107
// Set accessory to reachable and
108108
// updateAccessory()
109-
this.isReachable = true;
109+
this.reachabilityState = null;
110110
this.updateAccessory();
111111
}
112112
},
@@ -146,11 +146,11 @@ export class DingzDaBaseAccessory {
146146
this.log.error(
147147
'HTTP ECONNABORTED Connection aborted --> ' + this.device.address,
148148
);
149-
this.isReachable = false;
149+
this.reachabilityState = new Error();
150150
break;
151151
case 'EHOSTDOWN':
152152
this.log.error('HTTP EHOSTDOWN Host down --> ' + this.device.address);
153-
this.isReachable = false;
153+
this.reachabilityState = new Error();
154154
break;
155155
default:
156156
this.log.error(
@@ -163,7 +163,7 @@ export class DingzDaBaseAccessory {
163163
this.log.error(
164164
`handleRequestErrors() --> ${this.accessory.displayName} (${this.device.address})`,
165165
);
166-
this.isReachable = false;
166+
this.reachabilityState = new Error();
167167
} else {
168168
this.log.error(e.message + '\n' + e.stack);
169169
throw new Error('Device request failed -> escalating error');

src/myStromButtonAccessory.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,18 +200,18 @@ export class MyStromButtonAccessory extends DingzDaBaseAccessory {
200200

201201
private getButtonState(callback: CharacteristicGetCallback) {
202202
const currentState = this.buttonState;
203-
callback(null, currentState);
203+
callback(this.reachabilityState, currentState);
204204
}
205205

206206
private getSwitchButtonState(callback: CharacteristicGetCallback) {
207207
const currentState = this.switchButtonState;
208208
this.log.info('Get Switch State ->', currentState);
209-
callback(null, currentState);
209+
callback(this.reachabilityState, currentState);
210210
}
211211

212212
private getBatteryLevel(callback: CharacteristicGetCallback) {
213213
const currentLevel = this.batteryLevel;
214-
callback(null, currentLevel);
214+
callback(this.reachabilityState, currentLevel);
215215
}
216216

217217
private getStatusBatteryLow(callback: CharacteristicGetCallback) {
@@ -226,6 +226,6 @@ export class MyStromButtonAccessory extends DingzDaBaseAccessory {
226226

227227
private getChargingState(callback: CharacteristicGetCallback) {
228228
const currentState = this.chargingState;
229-
callback(null, currentState);
229+
callback(this.reachabilityState, currentState);
230230
}
231231
}

src/myStromLightbulbAccessory.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ export class MyStromLightbulbAccessory extends DingzDaBaseAccessory {
164164
const isOn = this.lightbulbState.on;
165165
this.platform.log.debug('Get Characteristic On ->', isOn);
166166

167-
callback(this.isReachable ? null : new Error(), isOn);
167+
callback(this.reachabilityState, isOn);
168168
}
169169

170170
private async setHue(
@@ -177,7 +177,7 @@ export class MyStromLightbulbAccessory extends DingzDaBaseAccessory {
177177

178178
private getHue(callback: CharacteristicGetCallback) {
179179
const hue: number = this.lightbulbState.hue;
180-
callback(this.isReachable ? null : new Error(), hue);
180+
callback(this.reachabilityState, hue);
181181
}
182182

183183
private async setSaturation(
@@ -190,7 +190,7 @@ export class MyStromLightbulbAccessory extends DingzDaBaseAccessory {
190190

191191
private getSaturation(callback: CharacteristicGetCallback) {
192192
const saturation: number = this.lightbulbState.saturation;
193-
callback(this.isReachable ? null : new Error(), saturation);
193+
callback(this.reachabilityState, saturation);
194194
}
195195

196196
private async setBrightness(
@@ -203,7 +203,7 @@ export class MyStromLightbulbAccessory extends DingzDaBaseAccessory {
203203

204204
private getBrightness(callback: CharacteristicGetCallback) {
205205
const brightness = this.lightbulbState.value;
206-
callback(this.isReachable ? null : new Error(), brightness);
206+
callback(this.reachabilityState, brightness);
207207
}
208208

209209
// Set individual dimmer
@@ -224,12 +224,7 @@ export class MyStromLightbulbAccessory extends DingzDaBaseAccessory {
224224
.post(setDimmerUrl, data)
225225
.catch(this.handleRequestErrors.bind(this))
226226
.finally(() => {
227-
// make sure we callback
228-
if (!this.isReachable) {
229-
callback(new Error());
230-
} else {
231-
callback(null);
232-
}
227+
callback(this.reachabilityState);
233228
});
234229
}
235230

src/myStromPIRAccessory.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ export class MyStromPIRAccessory extends DingzDaBaseAccessory {
218218
const light: number = this.pirState?.light ?? 42;
219219
this.log.debug('Get Characteristic Ambient Light Level ->', light, ' lux');
220220

221-
callback(this.isReachable ? null : new Error(), light);
221+
callback(this.reachabilityState, light);
222222
}
223223

224224
/**
@@ -229,7 +229,7 @@ export class MyStromPIRAccessory extends DingzDaBaseAccessory {
229229
const temperature: number = this.pirState?.temperature;
230230
this.log.debug('Get Characteristic Temperature ->', temperature, '° C');
231231

232-
callback(this.isReachable ? null : new Error(), temperature);
232+
callback(this.reachabilityState, temperature);
233233
}
234234

235235
/**
@@ -239,7 +239,7 @@ export class MyStromPIRAccessory extends DingzDaBaseAccessory {
239239
private getMotionDetected(callback: CharacteristicGetCallback) {
240240
// set this to a valid value for MotionDetected
241241
const isMotion = this.pirState.motion;
242-
callback(this.isReachable ? null : new Error(), isMotion);
242+
callback(this.reachabilityState, isMotion);
243243
}
244244

245245
private async getDeviceReport(): Promise<MyStromPIRReport> {

src/myStromSwitchAccessory.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -149,19 +149,19 @@ export class MyStromSwitchAccessory extends DingzDaBaseAccessory {
149149
const isOn = this.outletState?.relay;
150150
this.log.debug('Get Characteristic On ->', isOn);
151151

152-
callback(this.isReachable ? null : new Error(), isOn);
152+
callback(this.reachabilityState, isOn);
153153
}
154154

155155
private getTemperature(callback: CharacteristicGetCallback) {
156156
const temperature: number = this.outletState?.temperature;
157157
this.log.debug('Get Characteristic Temperature ->', temperature, '° C');
158-
callback(this.isReachable ? null : new Error(), temperature);
158+
callback(this.reachabilityState, temperature);
159159
}
160160

161161
private getOutletInUse(callback: CharacteristicGetCallback) {
162162
const inUse: boolean = this.outletState?.power > 0;
163163
this.log.debug('Get Characteristic OutletInUse ->', inUse);
164-
callback(this.isReachable ? null : new Error(), inUse);
164+
callback(this.reachabilityState, inUse);
165165
}
166166

167167
private setDeviceState(callback: CharacteristicSetCallback) {
@@ -172,12 +172,7 @@ export class MyStromSwitchAccessory extends DingzDaBaseAccessory {
172172
.get(relayUrl)
173173
.catch(this.handleRequestErrors.bind(this))
174174
.finally(() => {
175-
// make sure we callback
176-
if (!this.isReachable) {
177-
callback(new Error());
178-
} else {
179-
callback(null);
180-
}
175+
callback(this.reachabilityState);
181176
});
182177
}
183178

0 commit comments

Comments
 (0)