homebridge-netatmo-security-mk 1.0.2 → 1.0.4
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/dist/accessory/indoorSirenAccessory.d.ts +4 -2
- package/dist/accessory/indoorSirenAccessory.d.ts.map +1 -1
- package/dist/accessory/indoorSirenAccessory.js +19 -42
- package/dist/accessory/indoorSirenAccessory.js.map +1 -1
- package/dist/accessory/tagSensorAccessory.d.ts +13 -5
- package/dist/accessory/tagSensorAccessory.d.ts.map +1 -1
- package/dist/accessory/tagSensorAccessory.js +74 -47
- package/dist/accessory/tagSensorAccessory.js.map +1 -1
- package/dist/platform.d.ts +7 -2
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +80 -58
- package/dist/platform.js.map +1 -1
- package/dist/util/NetatmoAPI.d.ts +2 -1
- package/dist/util/NetatmoAPI.d.ts.map +1 -1
- package/dist/util/NetatmoAPI.js +21 -6
- package/dist/util/NetatmoAPI.js.map +1 -1
- package/package.json +1 -5
- package/dist/util/LegacyAPI.d.ts +0 -2
- package/dist/util/LegacyAPI.d.ts.map +0 -1
- package/dist/util/LegacyAPI.js +0 -28
- package/dist/util/LegacyAPI.js.map +0 -1
- package/dist/util/Webhook.d.ts +0 -1
- package/dist/util/Webhook.d.ts.map +0 -1
- package/dist/util/Webhook.js +0 -25
- package/dist/util/Webhook.js.map +0 -1
- package/dist/util/axios.d.ts +0 -3
- package/dist/util/axios.d.ts.map +0 -1
- package/dist/util/axios.js +0 -10
- package/dist/util/axios.js.map +0 -1
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { PlatformAccessory, CharacteristicValue } from 'homebridge';
|
|
2
|
-
import { NetatmoSecurityPlatform } from '../platform';
|
|
3
|
-
export declare class IndoorSirenAccessory {
|
|
2
|
+
import { NetatmoSecurityPlatform, NetatmoAccessory } from '../platform';
|
|
3
|
+
export declare class IndoorSirenAccessory implements NetatmoAccessory {
|
|
4
4
|
private readonly platform;
|
|
5
5
|
private readonly accessory;
|
|
6
6
|
private service;
|
|
7
|
+
private device;
|
|
7
8
|
private state;
|
|
8
9
|
constructor(platform: NetatmoSecurityPlatform, accessory: PlatformAccessory);
|
|
10
|
+
update(device: any): void;
|
|
9
11
|
isMuted(): Promise<CharacteristicValue>;
|
|
10
12
|
}
|
|
11
13
|
//# sourceMappingURL=indoorSirenAccessory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indoorSirenAccessory.d.ts","sourceRoot":"","sources":["../../src/accessory/indoorSirenAccessory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"indoorSirenAccessory.d.ts","sourceRoot":"","sources":["../../src/accessory/indoorSirenAccessory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAExE,qBAAa,oBAAqB,YAAW,gBAAgB;IAQzD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAR5B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,KAAK,CAEX;gBAGiB,QAAQ,EAAE,uBAAuB,EACjC,SAAS,EAAE,iBAAiB;IAmB/C,MAAM,CAAC,MAAM,EAAE,GAAG;IAcZ,OAAO,IAAI,OAAO,CAAC,mBAAmB,CAAC;CAI9C"}
|
|
@@ -2,64 +2,41 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.IndoorSirenAccessory = void 0;
|
|
4
4
|
class IndoorSirenAccessory {
|
|
5
|
-
// Load device
|
|
6
5
|
constructor(platform, accessory) {
|
|
7
6
|
this.platform = platform;
|
|
8
7
|
this.accessory = accessory;
|
|
9
8
|
this.state = {
|
|
10
9
|
SoundStatus: 'no_sound',
|
|
11
|
-
TamperStatus: 0,
|
|
12
10
|
};
|
|
11
|
+
this.device = accessory.context.device;
|
|
13
12
|
this.accessory.getService(this.platform.Service.AccessoryInformation)
|
|
14
13
|
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'Netatmo-Security')
|
|
15
14
|
.setCharacteristic(this.platform.Characteristic.Model, 'Indoor-Siren')
|
|
16
|
-
.setCharacteristic(this.platform.Characteristic.SerialNumber, this.
|
|
15
|
+
.setCharacteristic(this.platform.Characteristic.SerialNumber, this.device.id);
|
|
17
16
|
this.service = this.accessory.getService(this.platform.Service.Speaker)
|
|
18
17
|
|| this.accessory.addService(this.platform.Service.Speaker);
|
|
19
|
-
this.service.setCharacteristic(this.platform.Characteristic.Name, this.
|
|
18
|
+
this.service.setCharacteristic(this.platform.Characteristic.Name, this.device.name);
|
|
20
19
|
this.service.getCharacteristic(this.platform.Characteristic.Mute)
|
|
21
|
-
/*.onSet(this.setMuted.bind(this))*/
|
|
22
20
|
.onGet(this.isMuted.bind(this));
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
this.
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
this.platform.log.error('Failed to update siren sound status', error);
|
|
34
|
-
}
|
|
35
|
-
try {
|
|
36
|
-
const timeTampered = this.accessory.context.device.activity ? this.accessory.context.device.activity : 0;
|
|
37
|
-
const minimumTime = (new Date().getTime() / 1000) - 90;
|
|
38
|
-
const tamperingDetected = timeTampered > this.state.TamperStatus || timeTampered > minimumTime;
|
|
39
|
-
if (this.accessory.context.device.activity !== this.state.TamperStatus) {
|
|
40
|
-
this.platform.log.info(accessory.displayName + ' Tampered Status: ' + tamperingDetected + ' (' + this.state.TamperStatus + ' -> ' + this.accessory.context.device.activity + ')');
|
|
41
|
-
}
|
|
42
|
-
else if (tamperingDetected === true) {
|
|
43
|
-
this.platform.log.debug(accessory.displayName + ' Tampered Status: ' + tamperingDetected + ' (' + this.state.TamperStatus + ' -> ' + this.accessory.context.device.activity + ')');
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
this.platform.log.error('Failed to update tampered sensor status', error);
|
|
21
|
+
}
|
|
22
|
+
// Push fresh device data from the platform's single poll loop.
|
|
23
|
+
update(device) {
|
|
24
|
+
this.device = device;
|
|
25
|
+
try {
|
|
26
|
+
const soundDetected = device.status !== 'no_sound';
|
|
27
|
+
if (device.status !== this.state.SoundStatus) {
|
|
28
|
+
this.platform.log.info(`${this.accessory.displayName} Sound Status: ${soundDetected} (${this.state.SoundStatus} -> ${device.status})`);
|
|
48
29
|
}
|
|
49
|
-
|
|
30
|
+
this.state.SoundStatus = device.status;
|
|
31
|
+
this.service.updateCharacteristic(this.platform.Characteristic.Mute, !soundDetected);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
this.platform.log.error('Failed to update siren sound status', error);
|
|
35
|
+
}
|
|
50
36
|
}
|
|
51
|
-
/*async setMuted(value: CharacteristicValue) {
|
|
52
|
-
const sound = value ? 'no_sound' : 'warning';
|
|
53
|
-
this.platform.log.info(this.accessory.displayName + ' Sound Characteristic: ' + sound + ' (' + this.state.SoundStatus + ' / ' + this.accessory.context.device.status + ')');
|
|
54
|
-
this.platform.netatmoAPI.setState(this.accessory.context.device, sound).then(() => {
|
|
55
|
-
this.state.SoundStatus = sound;
|
|
56
|
-
this.service.updateCharacteristic(this.platform.Characteristic.Mute, value);
|
|
57
|
-
});
|
|
58
|
-
}*/
|
|
59
37
|
async isMuted() {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return playing;
|
|
38
|
+
var _a;
|
|
39
|
+
return ((_a = this.device) === null || _a === void 0 ? void 0 : _a.status) === 'no_sound';
|
|
63
40
|
}
|
|
64
41
|
}
|
|
65
42
|
exports.IndoorSirenAccessory = IndoorSirenAccessory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indoorSirenAccessory.js","sourceRoot":"","sources":["../../src/accessory/indoorSirenAccessory.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"indoorSirenAccessory.js","sourceRoot":"","sources":["../../src/accessory/indoorSirenAccessory.ts"],"names":[],"mappings":";;;AAKA,MAAa,oBAAoB;IAO/B,YACmB,QAAiC,EACjC,SAA4B;QAD5B,aAAQ,GAAR,QAAQ,CAAyB;QACjC,cAAS,GAAT,SAAS,CAAmB;QANvC,UAAK,GAAG;YACd,WAAW,EAAE,UAAU;SACxB,CAAC;QAMA,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QAEvC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAE;aACnE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,kBAAkB,CAAC;aAChF,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC;aACrE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEhF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;eACpE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE5D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEpF,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC;aAC9D,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,+DAA+D;IAC/D,MAAM,CAAC,MAAW;QAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI;YACF,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC;YACnD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,kBAAkB,aAAa,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;aACxI;YACD,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,CAAC;SACtF;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;SACvE;IACH,CAAC;IAED,KAAK,CAAC,OAAO;;QACX,OAAO,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,MAAK,UAAU,CAAC;IAC5C,CAAC;CAEF;AA9CD,oDA8CC"}
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import { PlatformAccessory, CharacteristicValue } from 'homebridge';
|
|
2
|
-
import { NetatmoSecurityPlatform } from '../platform';
|
|
3
|
-
export declare class TagSensorAccessory {
|
|
2
|
+
import { NetatmoSecurityPlatform, NetatmoAccessory } from '../platform';
|
|
3
|
+
export declare class TagSensorAccessory implements NetatmoAccessory {
|
|
4
4
|
private readonly platform;
|
|
5
5
|
private readonly accessory;
|
|
6
|
-
private
|
|
7
|
-
private
|
|
6
|
+
private contactService;
|
|
7
|
+
private motionService;
|
|
8
|
+
private device;
|
|
9
|
+
private sensorStatus;
|
|
10
|
+
private lastSmallMoveSeen;
|
|
11
|
+
private motionDetected;
|
|
12
|
+
private motionTimer?;
|
|
8
13
|
constructor(platform: NetatmoSecurityPlatform, accessory: PlatformAccessory);
|
|
9
|
-
|
|
14
|
+
update(device: any): void;
|
|
15
|
+
private handleVibration;
|
|
16
|
+
private pulseVibration;
|
|
17
|
+
private contactState;
|
|
10
18
|
isOpen(): Promise<CharacteristicValue>;
|
|
11
19
|
}
|
|
12
20
|
//# sourceMappingURL=tagSensorAccessory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tagSensorAccessory.d.ts","sourceRoot":"","sources":["../../src/accessory/tagSensorAccessory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tagSensorAccessory.d.ts","sourceRoot":"","sources":["../../src/accessory/tagSensorAccessory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAMxE,qBAAa,kBAAmB,YAAW,gBAAgB;IAavD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAb5B,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,YAAY,CAAa;IAIjC,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAC,CAAgC;gBAGjC,QAAQ,EAAE,uBAAuB,EACjC,SAAS,EAAE,iBAAiB;IA+B/C,MAAM,CAAC,MAAM,EAAE,GAAG;IAqBlB,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,YAAY;IAKd,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC;CAI7C"}
|
|
@@ -1,66 +1,93 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TagSensorAccessory = void 0;
|
|
4
|
+
// How long the vibration MotionSensor stays "detected" after a tag_small_move,
|
|
5
|
+
// so HomeKit reliably fires the false->true notification edge.
|
|
6
|
+
const VIBRATION_PULSE_MS = 10000;
|
|
4
7
|
class TagSensorAccessory {
|
|
5
|
-
// Load device
|
|
6
8
|
constructor(platform, accessory) {
|
|
7
9
|
this.platform = platform;
|
|
8
10
|
this.accessory = accessory;
|
|
9
|
-
this.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
};
|
|
11
|
+
this.sensorStatus = 'unknown';
|
|
12
|
+
this.motionDetected = false;
|
|
13
|
+
this.device = accessory.context.device;
|
|
13
14
|
this.accessory.getService(this.platform.Service.AccessoryInformation)
|
|
14
15
|
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'Netatmo-Security')
|
|
15
16
|
.setCharacteristic(this.platform.Characteristic.Model, 'Tag-Sensor')
|
|
16
|
-
.setCharacteristic(this.platform.Characteristic.SerialNumber, this.
|
|
17
|
-
|
|
17
|
+
.setCharacteristic(this.platform.Characteristic.SerialNumber, this.device.id);
|
|
18
|
+
// Contact sensor: open/closed from the device status.
|
|
19
|
+
this.contactService = this.accessory.getService(this.platform.Service.ContactSensor)
|
|
18
20
|
|| this.accessory.addService(this.platform.Service.ContactSensor);
|
|
19
|
-
this.
|
|
20
|
-
this.
|
|
21
|
+
this.contactService.setCharacteristic(this.platform.Characteristic.Name, this.device.name);
|
|
22
|
+
this.contactService.getCharacteristic(this.platform.Characteristic.ContactSensorState)
|
|
21
23
|
.onGet(this.isOpen.bind(this));
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
this.platform.log.info(accessory.displayName + ' Tampered Status: ' + tamperingDetected + ' (' + this.state.TamperStatus + ' -> ' + this.accessory.context.device.activity + ')');
|
|
42
|
-
}
|
|
43
|
-
else if (tamperingDetected === true) {
|
|
44
|
-
this.platform.log.debug(accessory.displayName + ' Tampered Status: ' + tamperingDetected + ' (' + this.state.TamperStatus + ' -> ' + this.accessory.context.device.activity + ')');
|
|
45
|
-
}
|
|
46
|
-
this.state.TamperStatus = this.accessory.context.device.activity;
|
|
47
|
-
this.service.updateCharacteristic(this.platform.Characteristic.StatusTampered, tamperingDetected);
|
|
48
|
-
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
this.platform.log.error('Failed to update tampered sensor status', error);
|
|
24
|
+
// Vibration: a separate MotionSensor so HomeKit can notify when someone
|
|
25
|
+
// taps/knocks the door (tag_small_move) without it being a normal open/close.
|
|
26
|
+
this.motionService = this.accessory.getService(this.platform.Service.MotionSensor)
|
|
27
|
+
|| this.accessory.addService(this.platform.Service.MotionSensor, this.device.name + ' Vibration', 'vibration');
|
|
28
|
+
this.motionService.setCharacteristic(this.platform.Characteristic.Name, this.device.name + ' Vibration');
|
|
29
|
+
this.motionService.getCharacteristic(this.platform.Characteristic.MotionDetected)
|
|
30
|
+
.onGet(() => this.motionDetected);
|
|
31
|
+
// Present the two services as one cohesive accessory: the door contact is the
|
|
32
|
+
// primary function, the vibration motion sensor is linked to it.
|
|
33
|
+
this.contactService.setPrimaryService(true);
|
|
34
|
+
this.contactService.addLinkedService(this.motionService);
|
|
35
|
+
}
|
|
36
|
+
// Push fresh device data from the platform's single poll loop.
|
|
37
|
+
update(device) {
|
|
38
|
+
this.device = device;
|
|
39
|
+
try {
|
|
40
|
+
const open = device.status === 'open';
|
|
41
|
+
if (device.status !== this.sensorStatus) {
|
|
42
|
+
this.platform.log.info(`${this.accessory.displayName} Sensor Status: ${open} (${this.sensorStatus} -> ${device.status})`);
|
|
51
43
|
}
|
|
52
|
-
|
|
44
|
+
this.sensorStatus = device.status;
|
|
45
|
+
this.contactService.updateCharacteristic(this.platform.Characteristic.ContactSensorState, this.contactState());
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
this.platform.log.error('Failed to update contact sensor status', error);
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
this.handleVibration(device.lastSmallMove || 0);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
this.platform.log.error('Failed to update vibration sensor', error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
handleVibration(lastSmallMove) {
|
|
58
|
+
// First update after (re)start: adopt the current value without firing, so an
|
|
59
|
+
// old event still in the backlog doesn't trigger a false alert.
|
|
60
|
+
if (this.lastSmallMoveSeen === undefined) {
|
|
61
|
+
this.lastSmallMoveSeen = lastSmallMove;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const now = new Date().getTime() / 1000;
|
|
65
|
+
const isNew = lastSmallMove > this.lastSmallMoveSeen;
|
|
66
|
+
const isRecent = lastSmallMove > now - 60;
|
|
67
|
+
this.lastSmallMoveSeen = lastSmallMove;
|
|
68
|
+
if (isNew && isRecent) {
|
|
69
|
+
this.pulseVibration();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
pulseVibration() {
|
|
73
|
+
this.platform.log.info(`${this.accessory.displayName} Vibration detected`);
|
|
74
|
+
this.motionDetected = true;
|
|
75
|
+
this.motionService.updateCharacteristic(this.platform.Characteristic.MotionDetected, true);
|
|
76
|
+
if (this.motionTimer) {
|
|
77
|
+
clearTimeout(this.motionTimer);
|
|
78
|
+
}
|
|
79
|
+
this.motionTimer = setTimeout(() => {
|
|
80
|
+
this.motionDetected = false;
|
|
81
|
+
this.motionService.updateCharacteristic(this.platform.Characteristic.MotionDetected, false);
|
|
82
|
+
}, VIBRATION_PULSE_MS);
|
|
53
83
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
return isTampered;
|
|
84
|
+
contactState() {
|
|
85
|
+
var _a;
|
|
86
|
+
const C = this.platform.Characteristic.ContactSensorState;
|
|
87
|
+
return ((_a = this.device) === null || _a === void 0 ? void 0 : _a.status) === 'open' ? C.CONTACT_NOT_DETECTED : C.CONTACT_DETECTED;
|
|
59
88
|
}
|
|
60
89
|
async isOpen() {
|
|
61
|
-
|
|
62
|
-
this.platform.log.debug(this.accessory.displayName + ' Sensor Characteristic: ' + isOpen + ' (' + this.state.SensorStatus + ' / ' + this.accessory.context.device.status + ')');
|
|
63
|
-
return isOpen;
|
|
90
|
+
return this.contactState();
|
|
64
91
|
}
|
|
65
92
|
}
|
|
66
93
|
exports.TagSensorAccessory = TagSensorAccessory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tagSensorAccessory.js","sourceRoot":"","sources":["../../src/accessory/tagSensorAccessory.ts"],"names":[],"mappings":";;;AAKA,
|
|
1
|
+
{"version":3,"file":"tagSensorAccessory.js","sourceRoot":"","sources":["../../src/accessory/tagSensorAccessory.ts"],"names":[],"mappings":";;;AAKA,+EAA+E;AAC/E,+DAA+D;AAC/D,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC,MAAa,kBAAkB;IAY7B,YACmB,QAAiC,EACjC,SAA4B;QAD5B,aAAQ,GAAR,QAAQ,CAAyB;QACjC,cAAS,GAAT,SAAS,CAAmB;QAVvC,iBAAY,GAAG,SAAS,CAAC;QAKzB,mBAAc,GAAG,KAAK,CAAC;QAO7B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QAEvC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAE;aACnE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,kBAAkB,CAAC;aAChF,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC;aACnE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEhF,sDAAsD;QACtD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC;eACjF,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAClE,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3F,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC;aACnF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEjC,wEAAwE;QACxE,8EAA8E;QAC9E,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC;eAC/E,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,YAAY,EAAE,WAAW,CAAC,CAAC;QAC/G,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;QACzG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC;aAC9E,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEpC,8EAA8E;QAC9E,iEAAiE;QACjE,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3D,CAAC;IAED,+DAA+D;IAC/D,MAAM,CAAC,MAAW;QAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC;YACtC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,YAAY,EAAE;gBACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,mBAAmB,IAAI,KAAK,IAAI,CAAC,YAAY,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;aAC3H;YACD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;YAClC,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;SAChH;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;SAC1E;QAED,IAAI;YACF,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC;SACjD;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;SACrE;IACH,CAAC;IAEO,eAAe,CAAC,aAAqB;QAC3C,8EAA8E;QAC9E,gEAAgE;QAChE,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE;YACxC,IAAI,CAAC,iBAAiB,GAAG,aAAa,CAAC;YACvC,OAAO;SACR;QACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;QACxC,MAAM,KAAK,GAAG,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACrD,MAAM,QAAQ,GAAG,aAAa,GAAG,GAAG,GAAG,EAAE,CAAC;QAC1C,IAAI,CAAC,iBAAiB,GAAG,aAAa,CAAC;QACvC,IAAI,KAAK,IAAI,QAAQ,EAAE;YACrB,IAAI,CAAC,cAAc,EAAE,CAAC;SACvB;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,qBAAqB,CAAC,CAAC;QAC3E,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAC3F,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAChC;QACD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAC9F,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACzB,CAAC;IAEO,YAAY;;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC;QAC1D,OAAO,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,MAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;CAEF;AAxGD,gDAwGC"}
|
package/dist/platform.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { API, DynamicPlatformPlugin, PlatformAccessory, Logger, PlatformConfig, Service, Characteristic } from 'homebridge';
|
|
2
2
|
import NetatmoAPI from './util/NetatmoAPI';
|
|
3
|
+
export interface NetatmoAccessory {
|
|
4
|
+
update(device: any): void;
|
|
5
|
+
}
|
|
3
6
|
export declare class NetatmoSecurityPlatform implements DynamicPlatformPlugin {
|
|
4
7
|
readonly log: Logger;
|
|
5
8
|
readonly config: PlatformConfig;
|
|
@@ -7,11 +10,13 @@ export declare class NetatmoSecurityPlatform implements DynamicPlatformPlugin {
|
|
|
7
10
|
readonly Service: typeof Service;
|
|
8
11
|
readonly Characteristic: typeof Characteristic;
|
|
9
12
|
readonly accessories: PlatformAccessory[];
|
|
13
|
+
private readonly handlers;
|
|
10
14
|
netatmoAPI: NetatmoAPI;
|
|
11
15
|
constructor(log: Logger, config: PlatformConfig, api: API);
|
|
12
16
|
configureAccessory(accessory: PlatformAccessory): void;
|
|
13
|
-
|
|
17
|
+
private createHandler;
|
|
18
|
+
discoverDevices(): Promise<void>;
|
|
14
19
|
startRefreshTask(): void;
|
|
15
|
-
|
|
20
|
+
pollDevices(): Promise<void>;
|
|
16
21
|
}
|
|
17
22
|
//# sourceMappingURL=platform.d.ts.map
|
package/dist/platform.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5H,OAAO,UAAU,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5H,OAAO,UAAU,MAAM,mBAAmB,CAAC;AAM3C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;CAC3B;AASD,qBAAa,uBAAwB,YAAW,qBAAqB;aAQjD,GAAG,EAAE,MAAM;aACX,MAAM,EAAE,cAAc;aACtB,GAAG,EAAE,GAAG;IAT1B,SAAgB,OAAO,EAAE,OAAO,OAAO,CAAwB;IAC/D,SAAgB,cAAc,EAAE,OAAO,cAAc,CAA+B;IACpF,SAAgB,WAAW,EAAE,iBAAiB,EAAE,CAAM;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuC;IACzD,UAAU,EAAE,UAAU,CAAC;gBAGZ,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,GAAG;IAiB1B,kBAAkB,CAAC,SAAS,EAAE,iBAAiB;IAW/C,OAAO,CAAC,aAAa;IAYf,eAAe;IAkCrB,gBAAgB;IASV,WAAW;CAmBlB"}
|
package/dist/platform.js
CHANGED
|
@@ -8,8 +8,13 @@ const settings_1 = require("./settings");
|
|
|
8
8
|
const tagSensorAccessory_1 = require("./accessory/tagSensorAccessory");
|
|
9
9
|
const NetatmoAPI_1 = __importDefault(require("./util/NetatmoAPI"));
|
|
10
10
|
const indoorSirenAccessory_1 = require("./accessory/indoorSirenAccessory");
|
|
11
|
+
const SUPPORTED_TYPES = ['NACamDoorTag', 'NIS'];
|
|
12
|
+
// homesdata is cached after first fetch (see NetatmoAPI.getHomeData), so each
|
|
13
|
+
// poll costs 2 API calls (homestatus + getevents). At 15s that's ~480 req/h,
|
|
14
|
+
// just under Netatmo's ~500 req/h per-user limit. Don't go below 15s without
|
|
15
|
+
// also reducing calls per poll.
|
|
16
|
+
const POLL_INTERVAL_MS = 15000;
|
|
11
17
|
class NetatmoSecurityPlatform {
|
|
12
|
-
// Load platform
|
|
13
18
|
constructor(log, config, api) {
|
|
14
19
|
this.log = log;
|
|
15
20
|
this.config = config;
|
|
@@ -17,91 +22,108 @@ class NetatmoSecurityPlatform {
|
|
|
17
22
|
this.Service = this.api.hap.Service;
|
|
18
23
|
this.Characteristic = this.api.hap.Characteristic;
|
|
19
24
|
this.accessories = [];
|
|
25
|
+
this.handlers = new Map();
|
|
20
26
|
log.debug('Finished loading platform:', this.config.name);
|
|
21
27
|
this.netatmoAPI = new NetatmoAPI_1.default(log, this.api.user.storagePath());
|
|
22
|
-
log.debug('Finished initializing platform:', this.config.name);
|
|
23
28
|
this.api.on('didFinishLaunching', () => {
|
|
24
29
|
log.debug('Executed didFinishLaunching callback');
|
|
25
|
-
|
|
26
|
-
this.netatmoAPI.init(config).then(() => {
|
|
30
|
+
this.netatmoAPI.init(config).then(async () => {
|
|
27
31
|
log.debug('Authenticated with provider:', this.config.name);
|
|
28
|
-
this.discoverDevices();
|
|
32
|
+
await this.discoverDevices();
|
|
29
33
|
this.startRefreshTask();
|
|
30
|
-
log.debug('Config loaded: ' + JSON.stringify({ ...config, refresh_token: '******', client_secret: '********' }));
|
|
31
34
|
}).catch((error) => {
|
|
32
35
|
var _a;
|
|
33
36
|
log.error('Netatmo authentication failed, plugin disabled until restart: ' + ((_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : error));
|
|
34
37
|
});
|
|
35
38
|
});
|
|
36
39
|
}
|
|
37
|
-
//
|
|
40
|
+
// Restore a cached accessory: build its handler so the platform can push updates.
|
|
38
41
|
configureAccessory(accessory) {
|
|
39
|
-
|
|
42
|
+
var _a;
|
|
43
|
+
const handler = this.createHandler(accessory);
|
|
44
|
+
if (handler) {
|
|
40
45
|
this.log.debug('Loading accessory from cache:', accessory.displayName);
|
|
41
|
-
|
|
42
|
-
this.accessories.push(accessory);
|
|
43
|
-
}
|
|
44
|
-
else if (accessory.context.device.type === 'NACamDoorTag') {
|
|
45
|
-
this.log.debug('Loading accessory from cache:', accessory.displayName);
|
|
46
|
-
new tagSensorAccessory_1.TagSensorAccessory(this, accessory);
|
|
46
|
+
this.handlers.set(accessory.UUID, handler);
|
|
47
47
|
this.accessories.push(accessory);
|
|
48
48
|
}
|
|
49
49
|
else {
|
|
50
|
-
this.log.debug('Device type not supported: ' + accessory.context.device.type);
|
|
50
|
+
this.log.debug('Device type not supported: ' + ((_a = accessory.context.device) === null || _a === void 0 ? void 0 : _a.type));
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
53
|
+
createHandler(accessory) {
|
|
54
|
+
var _a;
|
|
55
|
+
switch ((_a = accessory.context.device) === null || _a === void 0 ? void 0 : _a.type) {
|
|
56
|
+
case 'NIS':
|
|
57
|
+
return new indoorSirenAccessory_1.IndoorSirenAccessory(this, accessory);
|
|
58
|
+
case 'NACamDoorTag':
|
|
59
|
+
return new tagSensorAccessory_1.TagSensorAccessory(this, accessory);
|
|
60
|
+
default:
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Discover devices once: register new accessories, build handlers, push initial state.
|
|
65
|
+
async discoverDevices() {
|
|
66
|
+
var _a, _b;
|
|
67
|
+
let devices;
|
|
68
|
+
try {
|
|
69
|
+
devices = await this.netatmoAPI.getHomeDevices();
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
this.log.error('Failed to discover devices: ' + ((_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : error));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
for (const device of devices) {
|
|
76
|
+
if (!SUPPORTED_TYPES.includes(device.type)) {
|
|
77
|
+
this.log.debug('Skipped unsupported accessory: ' + device.name);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
device.name = (device.name || '').trimEnd();
|
|
81
|
+
const uuid = this.api.hap.uuid.generate(device.id);
|
|
82
|
+
const existing = this.accessories.find(a => a.UUID === uuid);
|
|
83
|
+
if (existing) {
|
|
84
|
+
existing.context.device = device;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.log.info('Adding new accessory: ' + device.name);
|
|
88
|
+
const accessory = new this.api.platformAccessory(device.name, uuid);
|
|
89
|
+
accessory.context.device = device;
|
|
90
|
+
const handler = this.createHandler(accessory);
|
|
91
|
+
if (!handler) {
|
|
59
92
|
continue;
|
|
60
93
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (existingAccessory) {
|
|
65
|
-
this.log.debug('Existing accessory discovered: ' + existingAccessory.displayName);
|
|
66
|
-
this.configureAccessory(existingAccessory);
|
|
67
|
-
existingAccessory.context.device = device;
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
this.log.debug('Adding newly discovered accessory: ' + device.name);
|
|
71
|
-
const accessory = new this.api.platformAccessory(device.name, uuid);
|
|
72
|
-
accessory.context.device = device;
|
|
73
|
-
this.configureAccessory(accessory);
|
|
74
|
-
this.api.registerPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, [accessory]);
|
|
75
|
-
}
|
|
94
|
+
this.handlers.set(uuid, handler);
|
|
95
|
+
this.accessories.push(accessory);
|
|
96
|
+
this.api.registerPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, [accessory]);
|
|
76
97
|
}
|
|
77
|
-
|
|
98
|
+
(_b = this.handlers.get(uuid)) === null || _b === void 0 ? void 0 : _b.update(device);
|
|
99
|
+
}
|
|
78
100
|
}
|
|
79
|
-
// Refresh task
|
|
80
101
|
startRefreshTask() {
|
|
81
102
|
setInterval(() => {
|
|
82
|
-
|
|
83
|
-
|
|
103
|
+
this.pollDevices().catch((error) => {
|
|
104
|
+
var _a;
|
|
105
|
+
this.log.error('Failed to refresh status: ' + ((_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : error));
|
|
106
|
+
});
|
|
107
|
+
}, POLL_INTERVAL_MS);
|
|
108
|
+
}
|
|
109
|
+
// Single poll loop: fetch all devices and push fresh data to each handler.
|
|
110
|
+
async pollDevices() {
|
|
111
|
+
const devices = await this.netatmoAPI.getHomeDevices();
|
|
112
|
+
for (const device of devices) {
|
|
113
|
+
if (!SUPPORTED_TYPES.includes(device.type)) {
|
|
114
|
+
continue;
|
|
84
115
|
}
|
|
85
|
-
|
|
86
|
-
|
|
116
|
+
const uuid = this.api.hap.uuid.generate(device.id);
|
|
117
|
+
const handler = this.handlers.get(uuid);
|
|
118
|
+
if (!handler) {
|
|
119
|
+
continue;
|
|
87
120
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
refreshStatus() {
|
|
92
|
-
this.netatmoAPI.getHomeDevices().then((devices) => {
|
|
93
|
-
for (const device of devices) {
|
|
94
|
-
if (device.type !== 'NACamDoorTag' && device.type !== 'NIS') {
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
const uuid = this.api.hap.uuid.generate(device.id);
|
|
98
|
-
const existingAccessory = this.accessories.find(accessory => accessory.UUID === uuid);
|
|
99
|
-
if (existingAccessory) {
|
|
100
|
-
existingAccessory.context.device = device;
|
|
101
|
-
this.accessories.push(existingAccessory);
|
|
102
|
-
}
|
|
121
|
+
const accessory = this.accessories.find(a => a.UUID === uuid);
|
|
122
|
+
if (accessory) {
|
|
123
|
+
accessory.context.device = device;
|
|
103
124
|
}
|
|
104
|
-
|
|
125
|
+
handler.update(device);
|
|
126
|
+
}
|
|
105
127
|
}
|
|
106
128
|
}
|
|
107
129
|
exports.NetatmoSecurityPlatform = NetatmoSecurityPlatform;
|
package/dist/platform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAwD;AACxD,uEAAoE;AACpE,mEAA2C;AAC3C,2EAAwE;
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export default class NetatmoAPI {
|
|
|
7
7
|
refreshToken: null;
|
|
8
8
|
tokenExpire: number;
|
|
9
9
|
_authPromise: null;
|
|
10
|
+
homeStructure: null;
|
|
10
11
|
get tokenFile(): string;
|
|
11
12
|
loadPersistedRefreshToken(): any;
|
|
12
13
|
persistRefreshToken(): void;
|
|
@@ -16,7 +17,7 @@ export default class NetatmoAPI {
|
|
|
16
17
|
client(): import("axios").AxiosInstance;
|
|
17
18
|
setState(device: any, status: any): Promise<any>;
|
|
18
19
|
getEvents(homeId: any): Promise<any>;
|
|
19
|
-
getHomeData(): Promise<any>;
|
|
20
|
+
getHomeData(force?: boolean): Promise<any>;
|
|
20
21
|
getHomeStatus(homeId: any): Promise<any>;
|
|
21
22
|
getHomeDevices(): Promise<any[]>;
|
|
22
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetatmoAPI.d.ts","sourceRoot":"","sources":["../../src/util/NetatmoAPI.js"],"names":[],"mappings":"AAWA;
|
|
1
|
+
{"version":3,"file":"NetatmoAPI.d.ts","sourceRoot":"","sources":["../../src/util/NetatmoAPI.js"],"names":[],"mappings":"AAWA;IAUE,2CAIC;IAbD,UAAW;IACX,aAAc;IACd,kBAAmB;IACnB,kBAAmB;IACnB,mBAAoB;IACpB,oBAAgB;IAChB,mBAAoB;IACpB,oBAAqB;IAQrB,wBAEC;IAED,iCAaC;IAED,4BAQC;IAED,wCAWC;IAED,8BAgCC;IAID,wCAYC;IAED,wCAMC;IAED,iDAiBC;IAED,qCAMC;IAKD,2CAaC;IAED,yCAMC;IAED,iCAyBC;CAEF"}
|
package/dist/util/NetatmoAPI.js
CHANGED
|
@@ -22,6 +22,7 @@ class NetatmoAPI {
|
|
|
22
22
|
this.refreshToken = null;
|
|
23
23
|
this.tokenExpire = 0;
|
|
24
24
|
this._authPromise = null;
|
|
25
|
+
this.homeStructure = null;
|
|
25
26
|
this.log = logger;
|
|
26
27
|
this.storagePath = storagePath;
|
|
27
28
|
this.log.info('Netatmo API constructed.');
|
|
@@ -144,11 +145,21 @@ class NetatmoAPI {
|
|
|
144
145
|
const events = data.events;
|
|
145
146
|
return events;
|
|
146
147
|
}
|
|
147
|
-
|
|
148
|
+
// The home structure (device list, names, types) is essentially static, so we
|
|
149
|
+
// fetch /homesdata once and cache it. This keeps the poll loop down to 2 API
|
|
150
|
+
// calls (homestatus + getevents) instead of 3, leaving room for a faster poll.
|
|
151
|
+
async getHomeData(force = false) {
|
|
152
|
+
if (this.homeStructure && !force) {
|
|
153
|
+
return this.homeStructure;
|
|
154
|
+
}
|
|
148
155
|
await this.ensureAuth();
|
|
149
156
|
const response = await this.client().get('/homesdata');
|
|
150
157
|
const data = response.data.body;
|
|
151
|
-
const home = data.homes[0];
|
|
158
|
+
const home = data.homes && data.homes[0];
|
|
159
|
+
if (!home) {
|
|
160
|
+
throw new Error('No Netatmo home found for this account.');
|
|
161
|
+
}
|
|
162
|
+
this.homeStructure = home;
|
|
152
163
|
return home;
|
|
153
164
|
}
|
|
154
165
|
async getHomeStatus(homeId) {
|
|
@@ -165,16 +176,20 @@ class NetatmoAPI {
|
|
|
165
176
|
const devices = [];
|
|
166
177
|
home.modules.map((moduleInfo) => {
|
|
167
178
|
const moduleStatus = status.modules.find((module) => moduleInfo.id === module.id);
|
|
168
|
-
const
|
|
169
|
-
const
|
|
170
|
-
|
|
179
|
+
const moduleEvents = events.filter((event) => moduleInfo.id === event.module_id);
|
|
180
|
+
const lastEventTime = (type) => {
|
|
181
|
+
const matching = moduleEvents.filter((event) => event.type === type);
|
|
182
|
+
return matching.length > 0 ? Math.max.apply(Math, matching.map((event) => event.time)) : 0;
|
|
183
|
+
};
|
|
171
184
|
const device = { ...moduleStatus,
|
|
172
185
|
name: moduleInfo.name,
|
|
173
186
|
category: moduleInfo.category,
|
|
174
187
|
setup_date: moduleInfo.setup_date,
|
|
175
188
|
room_id: moduleInfo.room_id,
|
|
176
189
|
home_id: home.id,
|
|
177
|
-
|
|
190
|
+
// tag_small_move = a light vibration/tap without opening (someone knocking);
|
|
191
|
+
// tag_big_move accompanies a normal open/close, so we don't surface it.
|
|
192
|
+
lastSmallMove: lastEventTime('tag_small_move'),
|
|
178
193
|
};
|
|
179
194
|
devices.push(device);
|
|
180
195
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetatmoAPI.js","sourceRoot":"","sources":["../../src/util/NetatmoAPI.js"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAC1B,0DAAiC;AACjC,4CAAoB;AACpB,gDAAwB;AAExB,+EAA+E;AAC/E,qEAAqE;AACrE,+EAA+E;AAC/E,kCAAkC;AAClC,kFAAkF;AAClF,kFAAkF;AAClF,MAAqB,UAAU;
|
|
1
|
+
{"version":3,"file":"NetatmoAPI.js","sourceRoot":"","sources":["../../src/util/NetatmoAPI.js"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"displayName": "Homebridge Netatmo Security MK",
|
|
3
3
|
"name": "homebridge-netatmo-security-mk",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.4",
|
|
5
5
|
"description": "Extended HomeKit support for Netatmo Security products (door/window tags, siren). Fork of Anzure/homebridge-netatmo-security.",
|
|
6
6
|
"author": "maximekduval",
|
|
7
7
|
"license": "Apache-2.0",
|
|
@@ -39,13 +39,9 @@
|
|
|
39
39
|
],
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"axios": "^0.25.0",
|
|
42
|
-
"body-parser": "^1.20.1",
|
|
43
|
-
"express": "^4.18.2",
|
|
44
42
|
"form-data": "^4.0.0"
|
|
45
43
|
},
|
|
46
44
|
"devDependencies": {
|
|
47
|
-
"@types/body-parser": "^1.19.2",
|
|
48
|
-
"@types/express": "^4.17.14",
|
|
49
45
|
"@types/node": "^16.10.9",
|
|
50
46
|
"@typescript-eslint/eslint-plugin": "^5.0.0",
|
|
51
47
|
"@typescript-eslint/parser": "^5.0.0",
|
package/dist/util/LegacyAPI.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LegacyAPI.d.ts","sourceRoot":"","sources":["../../src/util/LegacyAPI.js"],"names":[],"mappings":"AAGA,+EAqBC"}
|
package/dist/util/LegacyAPI.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const axios_1 = __importDefault(require("axios"));
|
|
7
|
-
const querystring_1 = require("querystring");
|
|
8
|
-
function NetatmoAPI(config) {
|
|
9
|
-
if (axios_1.default.defaults.headers.common['Authorization'] === null || axios_1.default.defaults.headers.common['Authorization'] === undefined) {
|
|
10
|
-
const credentials = {
|
|
11
|
-
client_id: config.client_id,
|
|
12
|
-
client_secret: config.client_secret,
|
|
13
|
-
grant_type: 'password',
|
|
14
|
-
username: config.username,
|
|
15
|
-
password: config.password,
|
|
16
|
-
scope: 'read_camera write_camera',
|
|
17
|
-
};
|
|
18
|
-
const response = axios_1.default.post('https://api.netatmo.com/oauth2/token', (0, querystring_1.stringify)(credentials));
|
|
19
|
-
const token = response.data.access_token;
|
|
20
|
-
axios_1.default.defaults.headers.common['Authorization'] = `Bearer ${token}`;
|
|
21
|
-
}
|
|
22
|
-
return axios_1.default.create({
|
|
23
|
-
baseURL: 'https://api.netatmo.com/api/',
|
|
24
|
-
responseType: 'json',
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
exports.default = NetatmoAPI;
|
|
28
|
-
//# sourceMappingURL=LegacyAPI.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LegacyAPI.js","sourceRoot":"","sources":["../../src/util/LegacyAPI.js"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAC1B,6CAAwC;AAExC,SAAwB,UAAU,CAAC,MAAM;IAEvC,IAAI,eAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,eAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,SAAS,EAAE;QAC3H,MAAM,WAAW,GAAG;YAClB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,0BAA0B;SAClC,CAAC;QACF,MAAM,QAAQ,GAAG,eAAK,CAAC,IAAI,CAAC,sCAAsC,EAAE,IAAA,uBAAS,EAAC,WAAW,CAAC,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;QACzC,eAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;KACpE;IAED,OAAO,eAAK,CAAC,MAAM,CAAC;QAClB,OAAO,EAAE,8BAA8B;QACvC,YAAY,EAAE,MAAM;KACrB,CAAC,CAAC;AAEL,CAAC;AArBD,6BAqBC"}
|
package/dist/util/Webhook.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=Webhook.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Webhook.d.ts","sourceRoot":"","sources":["../../src/util/Webhook.js"],"names":[],"mappings":""}
|
package/dist/util/Webhook.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// todo
|
|
3
|
-
/*
|
|
4
|
-
|
|
5
|
-
import express from 'express';
|
|
6
|
-
import bodyParser from 'body-parser';
|
|
7
|
-
|
|
8
|
-
var app = express();
|
|
9
|
-
var port = 3000;
|
|
10
|
-
app.use(bodyParser.json());
|
|
11
|
-
|
|
12
|
-
app.get('/', (req, res) => {
|
|
13
|
-
var body = req.body;
|
|
14
|
-
res.json({
|
|
15
|
-
message: '',
|
|
16
|
-
});
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
var server = app.listen(port, () => {
|
|
20
|
-
var host = server.address().address;
|
|
21
|
-
var port = server.address().port;
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
*/
|
|
25
|
-
//# sourceMappingURL=Webhook.js.map
|
package/dist/util/Webhook.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Webhook.js","sourceRoot":"","sources":["../../src/util/Webhook.js"],"names":[],"mappings":";AAAA,OAAO;AAEP;;;;;;;;;;;;;;;;;;;;;EAqBE"}
|
package/dist/util/axios.d.ts
DELETED
package/dist/util/axios.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"axios.d.ts","sourceRoot":"","sources":["../../src/util/axios.js"],"names":[],"mappings":""}
|
package/dist/util/axios.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const axios_1 = __importDefault(require("axios"));
|
|
7
|
-
exports.default = axios_1.default.create({
|
|
8
|
-
validateStatus: (status) => status < 500,
|
|
9
|
-
});
|
|
10
|
-
//# sourceMappingURL=axios.js.map
|
package/dist/util/axios.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"axios.js","sourceRoot":"","sources":["../../src/util/axios.js"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAE1B,kBAAe,eAAK,CAAC,MAAM,CAAC;IAC1B,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,GAAG;CACzC,CAAC,CAAC"}
|