homebridge-netatmo-security-mk 1.0.2 → 1.0.3
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 +6 -2
- package/dist/accessory/tagSensorAccessory.d.ts.map +1 -1
- package/dist/accessory/tagSensorAccessory.js +41 -37
- 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 +22 -2
- package/dist/util/NetatmoAPI.js.map +1 -1
- package/package.json +1 -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,11 +1,15 @@
|
|
|
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
6
|
private service;
|
|
7
|
+
private device;
|
|
7
8
|
private state;
|
|
8
9
|
constructor(platform: NetatmoSecurityPlatform, accessory: PlatformAccessory);
|
|
10
|
+
update(device: any): void;
|
|
11
|
+
private contactState;
|
|
12
|
+
private isRecentActivity;
|
|
9
13
|
isTampered(): Promise<CharacteristicValue>;
|
|
10
14
|
isOpen(): Promise<CharacteristicValue>;
|
|
11
15
|
}
|
|
@@ -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;AAExE,qBAAa,kBAAmB,YAAW,gBAAgB;IASvD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAT5B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,KAAK,CAGX;gBAGiB,QAAQ,EAAE,uBAAuB,EACjC,SAAS,EAAE,iBAAiB;IAsB/C,MAAM,CAAC,MAAM,EAAE,GAAG;IA4BlB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,gBAAgB;IAKlB,UAAU,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI1C,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC;CAI7C"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TagSensorAccessory = void 0;
|
|
4
4
|
class TagSensorAccessory {
|
|
5
|
-
// Load device
|
|
6
5
|
constructor(platform, accessory) {
|
|
7
6
|
this.platform = platform;
|
|
8
7
|
this.accessory = accessory;
|
|
@@ -10,57 +9,62 @@ class TagSensorAccessory {
|
|
|
10
9
|
SensorStatus: 'unknown',
|
|
11
10
|
TamperStatus: 0,
|
|
12
11
|
};
|
|
12
|
+
this.device = accessory.context.device;
|
|
13
13
|
this.accessory.getService(this.platform.Service.AccessoryInformation)
|
|
14
14
|
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'Netatmo-Security')
|
|
15
15
|
.setCharacteristic(this.platform.Characteristic.Model, 'Tag-Sensor')
|
|
16
|
-
.setCharacteristic(this.platform.Characteristic.SerialNumber, this.
|
|
16
|
+
.setCharacteristic(this.platform.Characteristic.SerialNumber, this.device.id);
|
|
17
17
|
this.service = this.accessory.getService(this.platform.Service.ContactSensor)
|
|
18
18
|
|| this.accessory.addService(this.platform.Service.ContactSensor);
|
|
19
|
-
this.service.setCharacteristic(this.platform.Characteristic.Name, this.
|
|
19
|
+
this.service.setCharacteristic(this.platform.Characteristic.Name, this.device.name);
|
|
20
20
|
this.service.getCharacteristic(this.platform.Characteristic.ContactSensorState)
|
|
21
21
|
.onGet(this.isOpen.bind(this));
|
|
22
22
|
this.service.getCharacteristic(this.platform.Characteristic.StatusTampered)
|
|
23
23
|
.onGet(this.isTampered.bind(this));
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
catch (error) {
|
|
34
|
-
this.platform.log.error('Failed to update contact sensor status', error);
|
|
35
|
-
}
|
|
36
|
-
try {
|
|
37
|
-
const timeTampered = this.accessory.context.device.activity ? this.accessory.context.device.activity : 0;
|
|
38
|
-
const minimumTime = (new Date().getTime() / 1000) - 90;
|
|
39
|
-
const tamperingDetected = timeTampered > this.state.TamperStatus || timeTampered > minimumTime;
|
|
40
|
-
if (this.accessory.context.device.activity !== this.state.TamperStatus) {
|
|
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);
|
|
24
|
+
}
|
|
25
|
+
// Push fresh device data from the platform's single poll loop.
|
|
26
|
+
update(device) {
|
|
27
|
+
this.device = device;
|
|
28
|
+
const C = this.platform.Characteristic;
|
|
29
|
+
try {
|
|
30
|
+
const open = device.status === 'open';
|
|
31
|
+
if (device.status !== this.state.SensorStatus) {
|
|
32
|
+
this.platform.log.info(`${this.accessory.displayName} Sensor Status: ${open} (${this.state.SensorStatus} -> ${device.status})`);
|
|
48
33
|
}
|
|
49
|
-
|
|
50
|
-
|
|
34
|
+
this.state.SensorStatus = device.status;
|
|
35
|
+
this.service.updateCharacteristic(C.ContactSensorState, this.contactState());
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
this.platform.log.error('Failed to update contact sensor status', error);
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const activity = device.activity || 0;
|
|
42
|
+
const tampered = this.isRecentActivity(activity);
|
|
43
|
+
if (activity !== this.state.TamperStatus) {
|
|
44
|
+
this.platform.log.info(`${this.accessory.displayName} Tampered Status: ${tampered} (${this.state.TamperStatus} -> ${activity})`);
|
|
51
45
|
}
|
|
52
|
-
|
|
46
|
+
this.state.TamperStatus = activity;
|
|
47
|
+
this.service.updateCharacteristic(C.StatusTampered, tampered);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
this.platform.log.error('Failed to update tampered sensor status', error);
|
|
51
|
+
}
|
|
53
52
|
}
|
|
54
|
-
|
|
53
|
+
contactState() {
|
|
54
|
+
var _a;
|
|
55
|
+
const C = this.platform.Characteristic.ContactSensorState;
|
|
56
|
+
return ((_a = this.device) === null || _a === void 0 ? void 0 : _a.status) === 'open' ? C.CONTACT_NOT_DETECTED : C.CONTACT_DETECTED;
|
|
57
|
+
}
|
|
58
|
+
isRecentActivity(activity) {
|
|
55
59
|
const minimumTime = (new Date().getTime() / 1000) - 90;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
60
|
+
return activity > minimumTime;
|
|
61
|
+
}
|
|
62
|
+
async isTampered() {
|
|
63
|
+
var _a;
|
|
64
|
+
return this.isRecentActivity(((_a = this.device) === null || _a === void 0 ? void 0 : _a.activity) || 0);
|
|
59
65
|
}
|
|
60
66
|
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;
|
|
67
|
+
return this.contactState();
|
|
64
68
|
}
|
|
65
69
|
}
|
|
66
70
|
exports.TagSensorAccessory = TagSensorAccessory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tagSensorAccessory.js","sourceRoot":"","sources":["../../src/accessory/tagSensorAccessory.ts"],"names":[],"mappings":";;;AAKA,MAAa,kBAAkB;
|
|
1
|
+
{"version":3,"file":"tagSensorAccessory.js","sourceRoot":"","sources":["../../src/accessory/tagSensorAccessory.ts"],"names":[],"mappings":"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"}
|
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":";;;;;;AAEA,yCAAwD;AACxD,uEAAoE;AACpE,mEAA2C;AAC3C,2EAAwE;AASxE,MAAM,eAAe,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AAChD,8EAA8E;AAC9E,6EAA6E;AAC7E,6EAA6E;AAC7E,gCAAgC;AAChC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,MAAa,uBAAuB;IAOlC,YACkB,GAAW,EACX,MAAsB,EACtB,GAAQ;QAFR,QAAG,GAAH,GAAG,CAAQ;QACX,WAAM,GAAN,MAAM,CAAgB;QACtB,QAAG,GAAH,GAAG,CAAK;QATV,YAAO,GAAmB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;QAC/C,mBAAc,GAA0B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;QACpE,gBAAW,GAAwB,EAAE,CAAC;QACrC,aAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;QAQ9D,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;YACrC,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBAC3C,GAAG,CAAC,KAAK,CAAC,8BAA8B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC5D,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC7B,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;;gBACjB,GAAG,CAAC,KAAK,CAAC,gEAAgE,GAAG,CAAC,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,mCAAI,KAAK,CAAC,CAAC,CAAC;YAC1G,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kFAAkF;IAClF,kBAAkB,CAAC,SAA4B;;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,OAAO,EAAE;YACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;YACvE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAClC;aAAM;YACL,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,6BAA6B,IAAG,MAAA,SAAS,CAAC,OAAO,CAAC,MAAM,0CAAE,IAAI,CAAA,CAAC,CAAC;SAChF;IACH,CAAC;IAEO,aAAa,CAAC,SAA4B;;QAChD,QAAQ,MAAA,SAAS,CAAC,OAAO,CAAC,MAAM,0CAAE,IAAI,EAAE;YACtC,KAAK,KAAK;gBACR,OAAO,IAAI,2CAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACnD,KAAK,cAAc;gBACjB,OAAO,IAAI,uCAAkB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACjD;gBACE,OAAO,SAAS,CAAC;SACpB;IACH,CAAC;IAED,uFAAuF;IACvF,KAAK,CAAC,eAAe;;QACnB,IAAI,OAAc,CAAC;QACnB,IAAI;YACF,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;SAClD;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAC,KAAa,aAAb,KAAK,uBAAL,KAAK,CAAU,OAAO,mCAAI,KAAK,CAAC,CAAC,CAAC;YACpF,OAAO;SACR;QACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBAC1C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;gBAChE,SAAS;aACV;YACD,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC7D,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;aAClC;iBAAM;gBACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;gBACtD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACpE,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;gBAClC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBAC9C,IAAI,CAAC,OAAO,EAAE;oBACZ,SAAS;iBACV;gBACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACjC,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,sBAAW,EAAE,wBAAa,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;aAC/E;YACD,MAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,0CAAE,MAAM,CAAC,MAAM,CAAC,CAAC;SACzC;IACH,CAAC;IAED,gBAAgB;QACd,WAAW,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;;gBACjC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,GAAG,CAAC,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,mCAAI,KAAK,CAAC,CAAC,CAAC;YAC3E,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACvB,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,WAAW;QACf,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;QACvD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBAC1C,SAAS;aACV;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,OAAO,EAAE;gBACZ,SAAS;aACV;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC9D,IAAI,SAAS,EAAE;gBACb,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;aACnC;YACD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SACxB;IACH,CAAC;CAEF;AAhHD,0DAgHC"}
|
|
@@ -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,qCAeC;IAKD,2CAaC;IAED,yCAMC;IAED,iCAqBC;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.');
|
|
@@ -142,13 +143,32 @@ class NetatmoAPI {
|
|
|
142
143
|
const response = await this.client().get('/getevents?home_id=' + homeId);
|
|
143
144
|
const data = response.data.body.home;
|
|
144
145
|
const events = data.events;
|
|
146
|
+
// TEMP diagnostic: log recent event types so we can map vibration vs open/close.
|
|
147
|
+
// Remove once the event-type mapping is implemented.
|
|
148
|
+
const recent = (new Date().getTime() / 1000) - 120;
|
|
149
|
+
const sample = (events || [])
|
|
150
|
+
.filter((e) => e.time > recent)
|
|
151
|
+
.map((e) => ({ type: e.type, module_id: e.module_id, time: e.time }));
|
|
152
|
+
if (sample.length > 0) {
|
|
153
|
+
this.log.info('[event-types] ' + JSON.stringify(sample));
|
|
154
|
+
}
|
|
145
155
|
return events;
|
|
146
156
|
}
|
|
147
|
-
|
|
157
|
+
// The home structure (device list, names, types) is essentially static, so we
|
|
158
|
+
// fetch /homesdata once and cache it. This keeps the poll loop down to 2 API
|
|
159
|
+
// calls (homestatus + getevents) instead of 3, leaving room for a faster poll.
|
|
160
|
+
async getHomeData(force = false) {
|
|
161
|
+
if (this.homeStructure && !force) {
|
|
162
|
+
return this.homeStructure;
|
|
163
|
+
}
|
|
148
164
|
await this.ensureAuth();
|
|
149
165
|
const response = await this.client().get('/homesdata');
|
|
150
166
|
const data = response.data.body;
|
|
151
|
-
const home = data.homes[0];
|
|
167
|
+
const home = data.homes && data.homes[0];
|
|
168
|
+
if (!home) {
|
|
169
|
+
throw new Error('No Netatmo home found for this account.');
|
|
170
|
+
}
|
|
171
|
+
this.homeStructure = home;
|
|
152
172
|
return home;
|
|
153
173
|
}
|
|
154
174
|
async getHomeStatus(homeId) {
|
|
@@ -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.3",
|
|
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",
|