homebridge-plejd 1.2.5 → 1.2.7
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +7 -2
- package/config.schema.json +24 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/model/device.d.ts +8 -0
- package/dist/model/device.d.ts.map +1 -0
- package/dist/{model.js → model/device.js} +1 -1
- package/dist/model/device.js.map +1 -0
- package/dist/model/plejdSite.d.ts +479 -0
- package/dist/model/plejdSite.d.ts.map +1 -0
- package/dist/model/plejdSite.js +107 -0
- package/dist/model/plejdSite.js.map +1 -0
- package/dist/model/userInputConfig.d.ts +7 -0
- package/dist/model/userInputConfig.d.ts.map +1 -0
- package/dist/model/userInputConfig.js +3 -0
- package/dist/model/userInputConfig.js.map +1 -0
- package/dist/plejdApi.d.ts +19 -0
- package/dist/plejdApi.d.ts.map +1 -0
- package/dist/plejdApi.js +142 -0
- package/dist/plejdApi.js.map +1 -0
- package/dist/plejdPlatform.d.ts +10 -7
- package/dist/plejdPlatform.d.ts.map +1 -1
- package/dist/plejdPlatform.js +102 -42
- package/dist/plejdPlatform.js.map +1 -1
- package/dist/plejdPlatformAccessory.d.ts +2 -2
- package/dist/plejdPlatformAccessory.d.ts.map +1 -1
- package/dist/plejdPlatformAccessory.js +20 -11
- package/dist/plejdPlatformAccessory.js.map +1 -1
- package/dist/plejdService.d.ts +6 -2
- package/dist/plejdService.d.ts.map +1 -1
- package/dist/plejdService.js +56 -33
- package/dist/plejdService.js.map +1 -1
- package/dist/plejdUtils.d.ts.map +1 -1
- package/dist/plejdUtils.js +5 -1
- package/dist/plejdUtils.js.map +1 -1
- package/dist/settings.d.ts +2 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +12 -2
- package/dist/settings.js.map +1 -1
- package/my-site.json +2427 -0
- package/package.json +8 -5
- package/dist/model.d.ts +0 -13
- package/dist/model.d.ts.map +0 -1
- package/dist/model.js.map +0 -1
- package/docs/Extracting crypto key.md +0 -85
@@ -0,0 +1,107 @@
|
|
1
|
+
"use strict";
|
2
|
+
// Generated by https://quicktype.io
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
4
|
+
exports.TitleSv = exports.TitleEn = exports.TitleKey = exports.PredefinedLoadObjectID = exports.LoadType = exports.DescriptionSv = exports.DescriptionEn = exports.DescriptionKey = exports.SiteType = exports.PredefinedLoadClassName = exports.AllowedDimCurvesClassName = exports.AllowedDimCurvesType = exports.DimCurve = exports.OutputSettingClassName = exports.BootState = exports.InputSettingClassName = exports.ButtonType = exports.ObjectID = exports.DataType = exports.OutputType = exports.DeviceClassName = exports.PurpleType = void 0;
|
5
|
+
var PurpleType;
|
6
|
+
(function (PurpleType) {
|
7
|
+
PurpleType["Object"] = "Object";
|
8
|
+
})(PurpleType = exports.PurpleType || (exports.PurpleType = {}));
|
9
|
+
var DeviceClassName;
|
10
|
+
(function (DeviceClassName) {
|
11
|
+
DeviceClassName["Device"] = "Device";
|
12
|
+
})(DeviceClassName = exports.DeviceClassName || (exports.DeviceClassName = {}));
|
13
|
+
var OutputType;
|
14
|
+
(function (OutputType) {
|
15
|
+
OutputType["Light"] = "LIGHT";
|
16
|
+
})(OutputType = exports.OutputType || (exports.OutputType = {}));
|
17
|
+
var DataType;
|
18
|
+
(function (DataType) {
|
19
|
+
DataType["File"] = "File";
|
20
|
+
})(DataType = exports.DataType || (exports.DataType = {}));
|
21
|
+
var ObjectID;
|
22
|
+
(function (ObjectID) {
|
23
|
+
ObjectID["BcKqEZhBlZ"] = "BcKqEZhBlZ";
|
24
|
+
ObjectID["D4Dw87Hq21"] = "D4DW87HQ21";
|
25
|
+
ObjectID["DtkZ3Ev3DI"] = "dtkZ3Ev3DI";
|
26
|
+
ObjectID["LjUH1MRUUa"] = "LjUH1mRUUa";
|
27
|
+
ObjectID["OTNDhFmsnJ"] = "oTNDhFmsnJ";
|
28
|
+
})(ObjectID = exports.ObjectID || (exports.ObjectID = {}));
|
29
|
+
var ButtonType;
|
30
|
+
(function (ButtonType) {
|
31
|
+
ButtonType["PushButton"] = "PushButton";
|
32
|
+
})(ButtonType = exports.ButtonType || (exports.ButtonType = {}));
|
33
|
+
var InputSettingClassName;
|
34
|
+
(function (InputSettingClassName) {
|
35
|
+
InputSettingClassName["PlejdDeviceInputSetting"] = "PlejdDeviceInputSetting";
|
36
|
+
})(InputSettingClassName = exports.InputSettingClassName || (exports.InputSettingClassName = {}));
|
37
|
+
var BootState;
|
38
|
+
(function (BootState) {
|
39
|
+
BootState["UseLast"] = "UseLast";
|
40
|
+
})(BootState = exports.BootState || (exports.BootState = {}));
|
41
|
+
var OutputSettingClassName;
|
42
|
+
(function (OutputSettingClassName) {
|
43
|
+
OutputSettingClassName["PlejdDeviceOutputSetting"] = "PlejdDeviceOutputSetting";
|
44
|
+
})(OutputSettingClassName = exports.OutputSettingClassName || (exports.OutputSettingClassName = {}));
|
45
|
+
var DimCurve;
|
46
|
+
(function (DimCurve) {
|
47
|
+
DimCurve["LinearLogarithmicSlidingProportion"] = "LinearLogarithmicSlidingProportion";
|
48
|
+
})(DimCurve = exports.DimCurve || (exports.DimCurve = {}));
|
49
|
+
var AllowedDimCurvesType;
|
50
|
+
(function (AllowedDimCurvesType) {
|
51
|
+
AllowedDimCurvesType["Relation"] = "Relation";
|
52
|
+
})(AllowedDimCurvesType = exports.AllowedDimCurvesType || (exports.AllowedDimCurvesType = {}));
|
53
|
+
var AllowedDimCurvesClassName;
|
54
|
+
(function (AllowedDimCurvesClassName) {
|
55
|
+
AllowedDimCurvesClassName["DimCurve"] = "DimCurve";
|
56
|
+
AllowedDimCurvesClassName["PlejdMesh"] = "PlejdMesh";
|
57
|
+
AllowedDimCurvesClassName["Site"] = "Site";
|
58
|
+
AllowedDimCurvesClassName["User"] = "_User";
|
59
|
+
AllowedDimCurvesClassName["UserProfile"] = "UserProfile";
|
60
|
+
})(AllowedDimCurvesClassName = exports.AllowedDimCurvesClassName || (exports.AllowedDimCurvesClassName = {}));
|
61
|
+
var PredefinedLoadClassName;
|
62
|
+
(function (PredefinedLoadClassName) {
|
63
|
+
PredefinedLoadClassName["PredefinedLoad"] = "PredefinedLoad";
|
64
|
+
})(PredefinedLoadClassName = exports.PredefinedLoadClassName || (exports.PredefinedLoadClassName = {}));
|
65
|
+
var SiteType;
|
66
|
+
(function (SiteType) {
|
67
|
+
SiteType["Pointer"] = "Pointer";
|
68
|
+
})(SiteType = exports.SiteType || (exports.SiteType = {}));
|
69
|
+
var DescriptionKey;
|
70
|
+
(function (DescriptionKey) {
|
71
|
+
DescriptionKey["TrailingDescription"] = "TrailingDescription";
|
72
|
+
DescriptionKey["TrailingDim02Description"] = "TrailingDim02Description";
|
73
|
+
})(DescriptionKey = exports.DescriptionKey || (exports.DescriptionKey = {}));
|
74
|
+
var DescriptionEn;
|
75
|
+
(function (DescriptionEn) {
|
76
|
+
DescriptionEn["The230VIncandescentHalogenElectronicTransformatorMax100W"] = "230V Incandescent / Halogen, Electronic transformator - Max 100W";
|
77
|
+
DescriptionEn["The230VIncandescentHalogenElectronicTransformatorMax300W"] = "230V Incandescent / Halogen, Electronic transformator - Max 300W";
|
78
|
+
})(DescriptionEn = exports.DescriptionEn || (exports.DescriptionEn = {}));
|
79
|
+
var DescriptionSv;
|
80
|
+
(function (DescriptionSv) {
|
81
|
+
DescriptionSv["The230VDimbarLEDLjusk\u00E4llaMax100VA"] = "230V dimbar LED ljusk\u00E4lla - Max 100VA";
|
82
|
+
DescriptionSv["The230VDimbarLEDLjusk\u00E4llaMax200VA"] = "230V dimbar LED ljusk\u00E4lla - Max 200VA";
|
83
|
+
})(DescriptionSv = exports.DescriptionSv || (exports.DescriptionSv = {}));
|
84
|
+
var LoadType;
|
85
|
+
(function (LoadType) {
|
86
|
+
LoadType["TrailingEdge"] = "Trailing Edge";
|
87
|
+
LoadType["TrailingEdgeDim02"] = "Trailing Edge Dim02";
|
88
|
+
})(LoadType = exports.LoadType || (exports.LoadType = {}));
|
89
|
+
var PredefinedLoadObjectID;
|
90
|
+
(function (PredefinedLoadObjectID) {
|
91
|
+
PredefinedLoadObjectID["The6NawurOZ7M"] = "6nawurOZ7m";
|
92
|
+
PredefinedLoadObjectID["The7ES04HWWfG"] = "7ES04HWWfG";
|
93
|
+
})(PredefinedLoadObjectID = exports.PredefinedLoadObjectID || (exports.PredefinedLoadObjectID = {}));
|
94
|
+
var TitleKey;
|
95
|
+
(function (TitleKey) {
|
96
|
+
TitleKey["TrailingDim02Title"] = "TrailingDim02Title";
|
97
|
+
TitleKey["TrailingTitle"] = "TrailingTitle";
|
98
|
+
})(TitleKey = exports.TitleKey || (exports.TitleKey = {}));
|
99
|
+
var TitleEn;
|
100
|
+
(function (TitleEn) {
|
101
|
+
TitleEn["LEDTrailingEdgeCommon"] = "LED Trailing Edge (Common)";
|
102
|
+
})(TitleEn = exports.TitleEn || (exports.TitleEn = {}));
|
103
|
+
var TitleSv;
|
104
|
+
(function (TitleSv) {
|
105
|
+
TitleSv["LEDBakkantVanligast"] = "LED Bakkant (Vanligast)";
|
106
|
+
})(TitleSv = exports.TitleSv || (exports.TitleSv = {}));
|
107
|
+
//# sourceMappingURL=plejdSite.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"plejdSite.js","sourceRoot":"","sources":["../../src/model/plejdSite.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"userInputConfig.d.ts","sourceRoot":"","sources":["../../src/model/userInputConfig.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"userInputConfig.js","sourceRoot":"","sources":["../../src/model/userInputConfig.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
import EventEmitter from 'events';
|
3
|
+
import { Logger } from 'homebridge';
|
4
|
+
import { Site } from './model/plejdSite';
|
5
|
+
export default class PlejdRemoteApi extends EventEmitter {
|
6
|
+
log: Logger;
|
7
|
+
siteName: string;
|
8
|
+
username: string;
|
9
|
+
password: string;
|
10
|
+
includeRoomsAsLights: boolean;
|
11
|
+
sessionToken?: string;
|
12
|
+
site?: Site;
|
13
|
+
constructor(log: Logger, siteName: string, username: string, password: string, includeRoomsAsLights: boolean);
|
14
|
+
getPlejdRemoteSite: () => Promise<Site>;
|
15
|
+
private login;
|
16
|
+
private getSites;
|
17
|
+
private getSite;
|
18
|
+
}
|
19
|
+
//# sourceMappingURL=plejdApi.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"plejdApi.d.ts","sourceRoot":"","sources":["../src/plejdApi.ts"],"names":[],"mappings":";AACA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AA8BzC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,YAAY;IACtD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,OAAO,CAAC;IAE9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,IAAI,CAAC;gBAGV,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,oBAAoB,EAAE,OAAO;IAU/B,kBAAkB,QAAO,QAAQ,IAAI,CAAC,CAyBpC;IAEF,OAAO,CAAC,KAAK,CAsCX;IAEF,OAAO,CAAC,QAAQ,CAkCd;IAEF,OAAO,CAAC,OAAO,CAmCb;CACH"}
|
package/dist/plejdApi.js
ADDED
@@ -0,0 +1,142 @@
|
|
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 events_1 = __importDefault(require("events"));
|
8
|
+
const API_APP_ID = 'zHtVqXt8k4yFyk2QGmgp48D9xZr2G94xWYnF4dak';
|
9
|
+
const API_BASE_URL = 'https://cloud.plejd.com/parse/';
|
10
|
+
const API_LOGIN_URL = 'login';
|
11
|
+
const API_SITE_LIST_URL = 'functions/getSiteList';
|
12
|
+
const API_SITE_DETAILS_URL = 'functions/getSiteById';
|
13
|
+
class PlejdRemoteApi extends events_1.default {
|
14
|
+
constructor(log, siteName, username, password, includeRoomsAsLights) {
|
15
|
+
super();
|
16
|
+
this.getPlejdRemoteSite = () => {
|
17
|
+
return new Promise((resolve, reject) => {
|
18
|
+
this.login()
|
19
|
+
.then(() => {
|
20
|
+
this.getSites()
|
21
|
+
.then((site) => {
|
22
|
+
this.getSite(site)
|
23
|
+
.then((site) => {
|
24
|
+
resolve(site);
|
25
|
+
})
|
26
|
+
.catch((e) => {
|
27
|
+
this.log.error(`${e}`);
|
28
|
+
reject(e);
|
29
|
+
});
|
30
|
+
})
|
31
|
+
.catch((e) => {
|
32
|
+
this.log.error(`${e}`);
|
33
|
+
reject(e);
|
34
|
+
});
|
35
|
+
})
|
36
|
+
.catch((e) => {
|
37
|
+
this.log.error(`${e}`);
|
38
|
+
reject(e);
|
39
|
+
});
|
40
|
+
});
|
41
|
+
};
|
42
|
+
this.login = () => {
|
43
|
+
const instance = axios_1.default.create({
|
44
|
+
baseURL: API_BASE_URL,
|
45
|
+
headers: {
|
46
|
+
'X-Parse-Application-Id': API_APP_ID,
|
47
|
+
'Content-Type': 'application/json',
|
48
|
+
},
|
49
|
+
});
|
50
|
+
return new Promise((resolve, reject) => {
|
51
|
+
instance
|
52
|
+
.post(API_LOGIN_URL, {
|
53
|
+
username: this.username,
|
54
|
+
password: this.password,
|
55
|
+
})
|
56
|
+
.then((response) => {
|
57
|
+
this.log.debug('plejd-api: got session token response');
|
58
|
+
this.sessionToken = response.data.sessionToken;
|
59
|
+
if (!this.sessionToken) {
|
60
|
+
reject('no session token received.');
|
61
|
+
return;
|
62
|
+
}
|
63
|
+
resolve(response.data.sessionToken);
|
64
|
+
})
|
65
|
+
.catch((error) => {
|
66
|
+
if (error.response.status === 400) {
|
67
|
+
reject('error: server returned status 400. probably invalid credentials, please verify.');
|
68
|
+
}
|
69
|
+
else {
|
70
|
+
reject('error: unable to retrieve session token response: ' + error);
|
71
|
+
}
|
72
|
+
});
|
73
|
+
});
|
74
|
+
};
|
75
|
+
this.getSites = () => {
|
76
|
+
const instance = axios_1.default.create({
|
77
|
+
baseURL: API_BASE_URL,
|
78
|
+
headers: {
|
79
|
+
'X-Parse-Application-Id': API_APP_ID,
|
80
|
+
'X-Parse-Session-Token': this.sessionToken,
|
81
|
+
'Content-Type': 'application/json',
|
82
|
+
},
|
83
|
+
});
|
84
|
+
return new Promise((resolve, reject) => {
|
85
|
+
this.log.debug('Sending POST to ' + API_BASE_URL + API_SITE_LIST_URL);
|
86
|
+
instance
|
87
|
+
.post(API_SITE_LIST_URL)
|
88
|
+
.then((response) => {
|
89
|
+
this.log.debug('plejd-api: got detailed sites response');
|
90
|
+
const site = response.data.result.find((x) => x.site.title === this.siteName);
|
91
|
+
if (!site) {
|
92
|
+
reject('failed to find a site named ' + this.siteName);
|
93
|
+
return;
|
94
|
+
}
|
95
|
+
resolve(site);
|
96
|
+
})
|
97
|
+
.catch((error) => {
|
98
|
+
return reject('plejd-api: unable to retrieve list of sites. error: ' + error);
|
99
|
+
});
|
100
|
+
});
|
101
|
+
};
|
102
|
+
this.getSite = (site) => {
|
103
|
+
const instance = axios_1.default.create({
|
104
|
+
baseURL: API_BASE_URL,
|
105
|
+
headers: {
|
106
|
+
'X-Parse-Application-Id': API_APP_ID,
|
107
|
+
'X-Parse-Session-Token': this.sessionToken,
|
108
|
+
'Content-Type': 'application/json',
|
109
|
+
},
|
110
|
+
});
|
111
|
+
return new Promise((resolve, reject) => {
|
112
|
+
this.log.debug('Sending POST to ' + API_BASE_URL + API_SITE_DETAILS_URL);
|
113
|
+
instance
|
114
|
+
.post(API_SITE_DETAILS_URL, { siteId: site.site.siteId })
|
115
|
+
.then((response) => {
|
116
|
+
this.log.debug('plejd-api: got site details response');
|
117
|
+
if (response.data.result.length === 0) {
|
118
|
+
reject('No devices fount');
|
119
|
+
return;
|
120
|
+
}
|
121
|
+
this.site = response.data.result[0];
|
122
|
+
if (this.site) {
|
123
|
+
resolve(this.site);
|
124
|
+
}
|
125
|
+
else {
|
126
|
+
reject('No Crypto has been retrieved yet');
|
127
|
+
}
|
128
|
+
})
|
129
|
+
.catch((error) => {
|
130
|
+
return reject('plejd-api: unable to retrieve the crypto key. error: ' + error);
|
131
|
+
});
|
132
|
+
});
|
133
|
+
};
|
134
|
+
this.log = log;
|
135
|
+
this.includeRoomsAsLights = includeRoomsAsLights;
|
136
|
+
this.siteName = siteName;
|
137
|
+
this.username = username;
|
138
|
+
this.password = password;
|
139
|
+
}
|
140
|
+
}
|
141
|
+
exports.default = PlejdRemoteApi;
|
142
|
+
//# sourceMappingURL=plejdApi.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"plejdApi.js","sourceRoot":"","sources":["../src/plejdApi.ts"],"names":[],"mappings":"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"}
|
package/dist/plejdPlatform.d.ts
CHANGED
@@ -1,25 +1,28 @@
|
|
1
1
|
import { API, DynamicPlatformPlugin, Logger, PlatformAccessory, PlatformConfig, Service, Characteristic } from 'homebridge';
|
2
2
|
import { PlejdPlatformAccessoryHandler } from './plejdPlatformAccessory';
|
3
|
-
import { UserInputConfig } from './model';
|
3
|
+
import { UserInputConfig } from './model/userInputConfig';
|
4
4
|
import { PlejdService } from './plejdService';
|
5
|
+
import { Site } from './model/plejdSite';
|
5
6
|
export declare class PlejdPlatform implements DynamicPlatformPlugin {
|
6
7
|
readonly log: Logger;
|
7
8
|
readonly config: PlatformConfig;
|
8
9
|
readonly api: API;
|
9
10
|
readonly Service: typeof Service;
|
10
11
|
readonly Characteristic: typeof Characteristic;
|
11
|
-
|
12
|
-
|
12
|
+
userInputConfig?: UserInputConfig;
|
13
|
+
plejdService?: PlejdService;
|
13
14
|
readonly accessories: PlatformAccessory[];
|
14
15
|
readonly plejdHandlers: PlejdPlatformAccessoryHandler[];
|
15
16
|
constructor(log: Logger, config: PlatformConfig, api: API);
|
17
|
+
configurePlejd: () => void;
|
18
|
+
configureDevices: (log: Logger, config: PlatformConfig, site?: Site) => void;
|
16
19
|
/**
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
+
* This function is invoked when homebridge restores cached accessories from disk at startup.
|
21
|
+
* It should be used to setup event handlers for characteristics and update respective values.
|
22
|
+
*/
|
20
23
|
configureAccessory: (accessory: PlatformAccessory) => void;
|
21
24
|
discoverDevices: () => void;
|
22
|
-
onPlejdUpdates: (identifier: number, isOn: boolean, brightness?: number
|
25
|
+
onPlejdUpdates: (identifier: number, isOn: boolean, brightness?: number) => void;
|
23
26
|
private generateId;
|
24
27
|
}
|
25
28
|
//# sourceMappingURL=plejdPlatform.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"plejdPlatform.d.ts","sourceRoot":"","sources":["../src/plejdPlatform.ts"],"names":[],"mappings":"AAAA,OAAO,
|
1
|
+
{"version":3,"file":"plejdPlatform.d.ts","sourceRoot":"","sources":["../src/plejdPlatform.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,qBAAqB,EACrB,MAAM,EACN,iBAAiB,EACjB,cAAc,EACd,OAAO,EACP,cAAc,EACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,qBAAa,aAAc,YAAW,qBAAqB;aAcvC,GAAG,EAAE,MAAM;aACX,MAAM,EAAE,cAAc;aACtB,GAAG,EAAE,GAAG;IAf1B,SAAgB,OAAO,EAAE,OAAO,OAAO,CAAwB;IAC/D,SAAgB,cAAc,EAAE,OAAO,cAAc,CACvB;IAEvB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,YAAY,CAAC;IAGnC,SAAgB,WAAW,EAAE,iBAAiB,EAAE,CAAM;IAEtD,SAAgB,aAAa,EAAE,6BAA6B,EAAE,CAAM;gBAGlD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,GAAG;IAO1B,cAAc,aA8BZ;IAEF,gBAAgB,QAAS,MAAM,UAAU,cAAc,SAAS,IAAI,UA+ElE;IAEF;;;OAGG;IACH,kBAAkB,cAAe,iBAAiB,UAGhD;IAEF,eAAe,aAsCb;IAEF,cAAc,eAAgB,MAAM,QAAQ,OAAO,eAAe,MAAM,UAwDtE;IAEF,OAAO,CAAC,UAAU,CAEhB;CACH"}
|
package/dist/plejdPlatform.js
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
6
|
exports.PlejdPlatform = void 0;
|
4
7
|
const settings_1 = require("./settings");
|
5
8
|
const plejdPlatformAccessory_1 = require("./plejdPlatformAccessory");
|
6
9
|
const plejdService_1 = require("./plejdService");
|
10
|
+
const plejdApi_1 = __importDefault(require("./plejdApi"));
|
7
11
|
class PlejdPlatform {
|
8
12
|
constructor(log, config, api) {
|
9
13
|
this.log = log;
|
@@ -14,22 +18,104 @@ class PlejdPlatform {
|
|
14
18
|
// this is used to track restored cached accessories
|
15
19
|
this.accessories = [];
|
16
20
|
this.plejdHandlers = [];
|
21
|
+
this.configurePlejd = () => {
|
22
|
+
if (this.config.password && this.config.username) {
|
23
|
+
this.log.info('Using login information to fetch devices & crypto key');
|
24
|
+
this.log.info('Any devices added manually will update the downloaded devices');
|
25
|
+
const pApi = new plejdApi_1.default(this.log, this.config.site || 'Default Site', this.config.username, this.config.password, true);
|
26
|
+
pApi
|
27
|
+
.getPlejdRemoteSite()
|
28
|
+
.then((site) => this.configureDevices(this.log, this.config, site))
|
29
|
+
.catch((e) => this.log.error(`Plejd remote access error: ${e}`));
|
30
|
+
}
|
31
|
+
else if (this.config.crypto_key &&
|
32
|
+
this.config.devices &&
|
33
|
+
this.config.devices.count > 0) {
|
34
|
+
this.log.info('Using supplied crypto key & devices');
|
35
|
+
this.configureDevices(this.log, this.config, undefined);
|
36
|
+
}
|
37
|
+
else {
|
38
|
+
this.log.warn('No settings are prepared, either supply crypto key & devices OR username, password & site');
|
39
|
+
}
|
40
|
+
};
|
41
|
+
this.configureDevices = (log, config, site) => {
|
42
|
+
const devices = config.devices;
|
43
|
+
if (site) {
|
44
|
+
config.crypto_key = site.plejdMesh.cryptoKey;
|
45
|
+
const items = [];
|
46
|
+
// Extract devices
|
47
|
+
site.devices.forEach((item) => {
|
48
|
+
const name = item.title;
|
49
|
+
const id = item.deviceId;
|
50
|
+
const e = site.plejdDevices.find((x) => x.deviceId === id);
|
51
|
+
const dim = e.firmware.notes;
|
52
|
+
let identifier = site.inputAddress[id][0];
|
53
|
+
if (dim.endsWith('-02') &&
|
54
|
+
items.find((a) => a.identifier === identifier) !== undefined) {
|
55
|
+
identifier += 1;
|
56
|
+
}
|
57
|
+
const res = {
|
58
|
+
name: name,
|
59
|
+
model: dim,
|
60
|
+
identifier: identifier,
|
61
|
+
isDimmer: settings_1.PLEJD_LIGHTS.includes(dim),
|
62
|
+
uuid: this.generateId(identifier.toString()),
|
63
|
+
};
|
64
|
+
items.push(res);
|
65
|
+
});
|
66
|
+
items.forEach((item) => {
|
67
|
+
const pre = devices.findIndex((x) => x.identifier === item.identifier);
|
68
|
+
if (pre !== -1) {
|
69
|
+
devices[pre].name = item.name;
|
70
|
+
}
|
71
|
+
else {
|
72
|
+
devices.push(item);
|
73
|
+
}
|
74
|
+
});
|
75
|
+
}
|
76
|
+
for (let i = 0; i < devices.length; i++) {
|
77
|
+
if (devices[i].model) {
|
78
|
+
devices[i].isDimmer = settings_1.PLEJD_LIGHTS.includes(devices[i].model);
|
79
|
+
}
|
80
|
+
else {
|
81
|
+
log.error('Missing device model |', devices[i].name);
|
82
|
+
}
|
83
|
+
if (devices[i].identifier) {
|
84
|
+
devices[i].uuid = this.generateId(devices[i].identifier.toString());
|
85
|
+
}
|
86
|
+
else {
|
87
|
+
log.error('Missing device identifier |', devices[i].name);
|
88
|
+
}
|
89
|
+
}
|
90
|
+
if (!config.crypto_key) {
|
91
|
+
log.error('No Crypto key was found in the configuration. Check the plugin documentation for more info');
|
92
|
+
}
|
93
|
+
const cryptoKey = Buffer.from(config.crypto_key.replace(/-/g, ''), 'hex');
|
94
|
+
this.userInputConfig = {
|
95
|
+
devices: devices,
|
96
|
+
cryptoKey: cryptoKey,
|
97
|
+
};
|
98
|
+
log.info('Plejd Crypto Key:', this.userInputConfig.cryptoKey);
|
99
|
+
log.info('Plejd Devices:', this.userInputConfig.devices);
|
100
|
+
this.plejdService = new plejdService_1.PlejdService(this.userInputConfig, log, this.onPlejdUpdates.bind(this));
|
101
|
+
this.api.on('didFinishLaunching', () => this.discoverDevices());
|
102
|
+
};
|
17
103
|
/**
|
18
|
-
|
19
|
-
|
20
|
-
|
104
|
+
* This function is invoked when homebridge restores cached accessories from disk at startup.
|
105
|
+
* It should be used to setup event handlers for characteristics and update respective values.
|
106
|
+
*/
|
21
107
|
this.configureAccessory = (accessory) => {
|
22
108
|
this.log.info('Loading accessory from cache | ', accessory.displayName);
|
23
109
|
this.accessories.push(accessory);
|
24
110
|
};
|
25
111
|
this.discoverDevices = () => {
|
26
|
-
const units = this.userInputConfig.devices.map(x => x.uuid);
|
27
|
-
const notRegistered = this.accessories.filter(ac => !units.includes(ac.UUID));
|
112
|
+
const units = this.userInputConfig.devices.map((x) => x.uuid);
|
113
|
+
const notRegistered = this.accessories.filter((ac) => !units.includes(ac.UUID));
|
28
114
|
if (notRegistered.length > 0) {
|
29
115
|
this.api.unregisterPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, notRegistered);
|
30
116
|
}
|
31
117
|
for (const device of this.userInputConfig.devices) {
|
32
|
-
const existingAccessory = this.accessories.find(accessory => accessory.UUID === device.uuid);
|
118
|
+
const existingAccessory = this.accessories.find((accessory) => accessory.UUID === device.uuid);
|
33
119
|
if (existingAccessory) {
|
34
120
|
this.plejdHandlers.push(new plejdPlatformAccessory_1.PlejdPlatformAccessoryHandler(this, existingAccessory, device));
|
35
121
|
}
|
@@ -40,20 +126,22 @@ class PlejdPlatform {
|
|
40
126
|
// See above.
|
41
127
|
this.plejdHandlers.push(new plejdPlatformAccessory_1.PlejdPlatformAccessoryHandler(this, accessory, device));
|
42
128
|
// link the accessory to your platform
|
43
|
-
this.api.registerPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, [
|
129
|
+
this.api.registerPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, [
|
130
|
+
accessory,
|
131
|
+
]);
|
44
132
|
}
|
45
133
|
}
|
46
134
|
};
|
47
135
|
this.onPlejdUpdates = (identifier, isOn, brightness) => {
|
48
136
|
var _a, _b, _c;
|
49
|
-
const uuid = (_a = this.userInputConfig.devices.find(d => d.identifier === identifier)) === null || _a === void 0 ? void 0 : _a.uuid;
|
137
|
+
const uuid = (_a = this.userInputConfig.devices.find((d) => d.identifier === identifier)) === null || _a === void 0 ? void 0 : _a.uuid;
|
50
138
|
if (uuid === undefined) {
|
51
139
|
this.log.warn(`Got updates on a device with identifier ${identifier} but it is not registered in HB settings`);
|
52
140
|
return;
|
53
141
|
}
|
54
|
-
const existingAccessory = this.accessories.find(accessory => accessory.UUID === uuid);
|
55
|
-
const device = this.userInputConfig.devices.find(dev => dev.identifier === identifier);
|
56
|
-
const plejdHandler = this.plejdHandlers.find(dev => dev.device.identifier === identifier);
|
142
|
+
const existingAccessory = this.accessories.find((accessory) => accessory.UUID === uuid);
|
143
|
+
const device = this.userInputConfig.devices.find((dev) => dev.identifier === identifier);
|
144
|
+
const plejdHandler = this.plejdHandlers.find((dev) => dev.device.identifier === identifier);
|
57
145
|
if (existingAccessory && device && plejdHandler) {
|
58
146
|
if (device.isDimmer) {
|
59
147
|
const ser = existingAccessory.getService(this.Service.Lightbulb);
|
@@ -70,7 +158,8 @@ class PlejdPlatform {
|
|
70
158
|
}
|
71
159
|
}
|
72
160
|
else {
|
73
|
-
(_c = (_b = existingAccessory
|
161
|
+
(_c = (_b = existingAccessory
|
162
|
+
.getService(this.Service.Switch)) === null || _b === void 0 ? void 0 : _b.getCharacteristic(this.Characteristic.On)) === null || _c === void 0 ? void 0 : _c.updateValue(isOn);
|
74
163
|
}
|
75
164
|
plejdHandler.updateState(isOn, brightness);
|
76
165
|
}
|
@@ -82,36 +171,7 @@ class PlejdPlatform {
|
|
82
171
|
return this.api.hap.uuid.generate(input);
|
83
172
|
};
|
84
173
|
this.log.debug('Finished initializing platform:', this.config.platform);
|
85
|
-
|
86
|
-
if (!config.devices) {
|
87
|
-
log.warn('No devices are configured');
|
88
|
-
}
|
89
|
-
const devices = config.devices;
|
90
|
-
for (let i = 0; i < devices.length; i++) {
|
91
|
-
if (devices[i].model) {
|
92
|
-
devices[i].isDimmer = settings_1.PLEJD_LIGHTS.includes((devices[i].model));
|
93
|
-
}
|
94
|
-
else {
|
95
|
-
log.error('Missing device model |', devices[i].name);
|
96
|
-
}
|
97
|
-
if (devices[i].identifier) {
|
98
|
-
devices[i].uuid = this.generateId(devices[i].identifier.toString());
|
99
|
-
}
|
100
|
-
else {
|
101
|
-
log.error('Missing device identifier |', devices[i].name);
|
102
|
-
}
|
103
|
-
}
|
104
|
-
if (!config.crypto_key) {
|
105
|
-
log.error('No Crypto key was found in the configuration. Check the plugin documentation for more info');
|
106
|
-
}
|
107
|
-
const cryptoKey = Buffer.from((config.crypto_key).replace(/-/g, ''), 'hex');
|
108
|
-
this.userInputConfig = {
|
109
|
-
devices: devices,
|
110
|
-
cryptoKey: cryptoKey,
|
111
|
-
};
|
112
|
-
this.log.debug('UserConfig: ', this.userInputConfig);
|
113
|
-
this.plejdService = new plejdService_1.PlejdService(this.userInputConfig, log, this.onPlejdUpdates.bind(this));
|
114
|
-
this.api.on('didFinishLaunching', () => this.discoverDevices());
|
174
|
+
api.on('didFinishLaunching', this.configurePlejd);
|
115
175
|
}
|
116
176
|
}
|
117
177
|
exports.PlejdPlatform = PlejdPlatform;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"plejdPlatform.js","sourceRoot":"","sources":["../src/plejdPlatform.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"plejdPlatform.js","sourceRoot":"","sources":["../src/plejdPlatform.ts"],"names":[],"mappings":"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"}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { PlatformAccessory } from 'homebridge';
|
2
|
-
import { Device } from './model';
|
2
|
+
import { Device } from './model/device';
|
3
3
|
import { PlejdPlatform } from './plejdPlatform';
|
4
4
|
/**
|
5
5
|
* Platform Accessory
|
@@ -13,7 +13,7 @@ export declare class PlejdPlatformAccessoryHandler {
|
|
13
13
|
private service;
|
14
14
|
private state;
|
15
15
|
constructor(platform: PlejdPlatform, accessory: PlatformAccessory, device: Device);
|
16
|
-
updateState: (isOn: boolean, brightness?: number
|
16
|
+
updateState: (isOn: boolean, brightness?: number) => void;
|
17
17
|
private setOn;
|
18
18
|
private getOn;
|
19
19
|
private setBrightness;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"plejdPlatformAccessory.d.ts","sourceRoot":"","sources":["../src/plejdPlatformAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAuB,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,
|
1
|
+
{"version":3,"file":"plejdPlatformAccessory.d.ts","sourceRoot":"","sources":["../src/plejdPlatformAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAuB,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQhD;;;;GAIG;AACH,qBAAa,6BAA6B;IAKtC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;aACV,MAAM,EAAE,MAAM;IANhC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAc;gBAGR,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,iBAAiB,EAC7B,MAAM,EAAE,MAAM;IAoDhC,WAAW,SAAU,OAAO,eAAe,MAAM,UAoB/C;IAEF,OAAO,CAAC,KAAK,CAaX;IAEF,OAAO,CAAC,KAAK,CAOX;IAEF,OAAO,CAAC,aAAa,CAWnB;IAEF,OAAO,CAAC,aAAa,CAOnB;CACH"}
|