homebridge-adt-pulse 2.2.0 → 3.0.0-beta.10
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/LICENSE +1 -1
- package/README.md +150 -111
- package/build/config.schema.json +320 -0
- package/build/src/index.js +6 -0
- package/build/src/index.js.map +1 -0
- package/build/src/lib/accessory.js +239 -0
- package/build/src/lib/accessory.js.map +1 -0
- package/build/src/lib/api.js +1876 -0
- package/build/src/lib/api.js.map +1 -0
- package/build/src/lib/detect.js +595 -0
- package/build/src/lib/detect.js.map +1 -0
- package/build/src/lib/platform.js +446 -0
- package/build/src/lib/platform.js.map +1 -0
- package/build/src/lib/regex.js +25 -0
- package/build/src/lib/regex.js.map +1 -0
- package/build/src/lib/schema.js +40 -0
- package/build/src/lib/schema.js.map +1 -0
- package/build/src/lib/utility.js +458 -0
- package/build/src/lib/utility.js.map +1 -0
- package/build/src/scripts/repl.js +173 -0
- package/build/src/scripts/repl.js.map +1 -0
- package/build/src/scripts/test-api.js +171 -0
- package/build/src/scripts/test-api.js.map +1 -0
- package/config.schema.json +301 -218
- package/package.json +42 -17
- package/api-test.js +0 -280
- package/api.js +0 -878
- package/index.js +0 -1312
|
@@ -0,0 +1,595 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
import { env } from 'node:process';
|
|
4
|
+
import { serializeError } from 'serialize-error';
|
|
5
|
+
import { debugLog, isPluginOutdated, removePersonalIdentifiableInformation, stackTracer, } from './utility.js';
|
|
6
|
+
export async function detectedNewDoSubmitHandlers(handlers, logger, debugMode) {
|
|
7
|
+
const knownRelativeUrls = [
|
|
8
|
+
'16.0.0-131',
|
|
9
|
+
'17.0.0-69',
|
|
10
|
+
'18.0.0-78',
|
|
11
|
+
'19.0.0-89',
|
|
12
|
+
'20.0.0-221',
|
|
13
|
+
'20.0.0-244',
|
|
14
|
+
'21.0.0-344',
|
|
15
|
+
'21.0.0-353',
|
|
16
|
+
'21.0.0-354',
|
|
17
|
+
'22.0.0-233',
|
|
18
|
+
'23.0.0-99',
|
|
19
|
+
'24.0.0-117',
|
|
20
|
+
'25.0.0-21',
|
|
21
|
+
'26.0.0-32',
|
|
22
|
+
'27.0.0-140',
|
|
23
|
+
].map((version) => `/myhome/${version}/quickcontrol/serv/RunRRACommand`);
|
|
24
|
+
const knownUrlParamsArm = [
|
|
25
|
+
'away',
|
|
26
|
+
'night',
|
|
27
|
+
'stay',
|
|
28
|
+
];
|
|
29
|
+
const knownUrlParamsArmState = [
|
|
30
|
+
'forcearm',
|
|
31
|
+
];
|
|
32
|
+
const knownUrlParamsHref = [
|
|
33
|
+
'rest/adt/ui/client/security/setForceArm',
|
|
34
|
+
'rest/adt/ui/client/security/setCancelProtest',
|
|
35
|
+
];
|
|
36
|
+
const detectedNewHandlers = handlers.filter((handler) => (!knownRelativeUrls.includes(handler.relativeUrl)
|
|
37
|
+
|| (handler.urlParams.arm !== null
|
|
38
|
+
&& !knownUrlParamsArm.includes(handler.urlParams.arm))
|
|
39
|
+
|| (handler.urlParams.armState !== null
|
|
40
|
+
&& !knownUrlParamsArmState.includes(handler.urlParams.armState))
|
|
41
|
+
|| !knownUrlParamsHref.includes(handler.urlParams.href)));
|
|
42
|
+
if (detectedNewHandlers.length > 0) {
|
|
43
|
+
const cleanedData = removePersonalIdentifiableInformation(detectedNewHandlers);
|
|
44
|
+
try {
|
|
45
|
+
const outdated = await isPluginOutdated();
|
|
46
|
+
if (outdated) {
|
|
47
|
+
if (logger !== null) {
|
|
48
|
+
logger.warn('Plugin has detected new do submit handlers. You are running an older plugin version, please update soon.');
|
|
49
|
+
}
|
|
50
|
+
if (debugMode) {
|
|
51
|
+
debugLog(logger, 'detect.ts / detectedNewDoSubmitHandlers()', 'warn', 'Plugin has detected new do submit handlers. You are running an older plugin version, please update soon');
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (debugMode === true) {
|
|
58
|
+
debugLog(logger, 'detect.ts / detectedNewDoSubmitHandlers()', 'error', 'Failed to check if plugin is outdated');
|
|
59
|
+
stackTracer('serialize-error', serializeError(error));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (logger !== null) {
|
|
63
|
+
logger.warn('Plugin has detected new do submit handlers. Notifying plugin author about this discovery ...');
|
|
64
|
+
}
|
|
65
|
+
if (debugMode) {
|
|
66
|
+
debugLog(logger, 'detect.ts / detectedNewDoSubmitHandlers()', 'warn', 'Plugin has detected new do submit handlers. Notifying plugin author about this discovery');
|
|
67
|
+
}
|
|
68
|
+
stackTracer('detect-content', cleanedData);
|
|
69
|
+
try {
|
|
70
|
+
await axios.post('https://9wv5o73w.ntfy.mrjackyliang.com', JSON.stringify({
|
|
71
|
+
title: 'Detected new do submit handlers',
|
|
72
|
+
description: 'New do submit handlers detected. Please update the plugin as soon as possible.',
|
|
73
|
+
content: JSON.stringify(cleanedData, null, 2),
|
|
74
|
+
}), {
|
|
75
|
+
family: 4,
|
|
76
|
+
headers: {
|
|
77
|
+
'Content-Type': 'application/json',
|
|
78
|
+
'User-Agent': `homebridge-adt-pulse/${env.npm_package_version ?? 'unknown'}`,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (debugMode === true) {
|
|
84
|
+
debugLog(logger, 'detect.ts / detectedNewDoSubmitHandlers()', 'error', 'Failed to notify plugin author about the new do submit handlers');
|
|
85
|
+
stackTracer('serialize-error', serializeError(error));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
export async function detectedNewGatewayInformation(device, logger, debugMode) {
|
|
93
|
+
const knownStatuses = [
|
|
94
|
+
'Offline',
|
|
95
|
+
'Online',
|
|
96
|
+
'Status Unknown',
|
|
97
|
+
];
|
|
98
|
+
const detectedNewStatus = (device.status !== null && !knownStatuses.includes(device.status));
|
|
99
|
+
if (detectedNewStatus) {
|
|
100
|
+
const cleanedData = removePersonalIdentifiableInformation(device);
|
|
101
|
+
try {
|
|
102
|
+
const outdated = await isPluginOutdated();
|
|
103
|
+
if (outdated) {
|
|
104
|
+
if (logger !== null) {
|
|
105
|
+
logger.warn('Plugin has detected new gateway information. You are running an older plugin version, please update soon.');
|
|
106
|
+
}
|
|
107
|
+
if (debugMode) {
|
|
108
|
+
debugLog(logger, 'detect.ts / detectedNewGatewayInformation()', 'warn', 'Plugin has detected new gateway information. You are running an older plugin version, please update soon');
|
|
109
|
+
}
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (debugMode === true) {
|
|
115
|
+
debugLog(logger, 'detect.ts / detectedNewGatewayInformation()', 'error', 'Failed to check if plugin is outdated');
|
|
116
|
+
stackTracer('serialize-error', serializeError(error));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (logger !== null) {
|
|
120
|
+
logger.warn('Plugin has detected new gateway information. Notifying plugin author about this discovery ...');
|
|
121
|
+
}
|
|
122
|
+
if (debugMode) {
|
|
123
|
+
debugLog(logger, 'detect.ts / detectedNewGatewayInformation()', 'warn', 'Plugin has detected new gateway information. Notifying plugin author about this discovery');
|
|
124
|
+
}
|
|
125
|
+
stackTracer('detect-content', cleanedData);
|
|
126
|
+
try {
|
|
127
|
+
await axios.post('https://9wv5o73w.ntfy.mrjackyliang.com', JSON.stringify({
|
|
128
|
+
title: 'Detected new gateway information',
|
|
129
|
+
description: 'New gateway information detected. Please update the plugin as soon as possible.',
|
|
130
|
+
content: JSON.stringify(cleanedData, null, 2),
|
|
131
|
+
}), {
|
|
132
|
+
family: 4,
|
|
133
|
+
headers: {
|
|
134
|
+
'Content-Type': 'application/json',
|
|
135
|
+
'User-Agent': `homebridge-adt-pulse/${env.npm_package_version ?? 'unknown'}`,
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
if (debugMode === true) {
|
|
141
|
+
debugLog(logger, 'detect.ts / detectedNewGatewayInformation()', 'error', 'Failed to notify plugin author about the new gateway information');
|
|
142
|
+
stackTracer('serialize-error', serializeError(error));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
export async function detectedNewOrbSecurityButtons(buttons, logger, debugMode) {
|
|
150
|
+
const knownButtonText = [
|
|
151
|
+
'Arm Away',
|
|
152
|
+
'Arm Night',
|
|
153
|
+
'Arm Stay',
|
|
154
|
+
'Clear Alarm',
|
|
155
|
+
'Disarm',
|
|
156
|
+
];
|
|
157
|
+
const knownLoadingText = [
|
|
158
|
+
'Arming Away',
|
|
159
|
+
'Arming Night',
|
|
160
|
+
'Arming Stay',
|
|
161
|
+
'Disarming',
|
|
162
|
+
];
|
|
163
|
+
const knownRelativeUrl = [
|
|
164
|
+
'quickcontrol/armDisarm.jsp',
|
|
165
|
+
];
|
|
166
|
+
const knownUrlParamsArm = [
|
|
167
|
+
'away',
|
|
168
|
+
'night',
|
|
169
|
+
'off',
|
|
170
|
+
'stay',
|
|
171
|
+
];
|
|
172
|
+
const knownUrlParamsArmState = [
|
|
173
|
+
'away',
|
|
174
|
+
'disarmed',
|
|
175
|
+
'disarmed_with_alarm',
|
|
176
|
+
'disarmed+with+alarm',
|
|
177
|
+
'night',
|
|
178
|
+
'night+stay',
|
|
179
|
+
'off',
|
|
180
|
+
'stay',
|
|
181
|
+
];
|
|
182
|
+
const knownUrlParamsHref = [
|
|
183
|
+
'rest/adt/ui/client/security/setArmState',
|
|
184
|
+
];
|
|
185
|
+
const detectedNewButtons = buttons.filter((button) => ((!button.buttonDisabled
|
|
186
|
+
&& ((button.buttonText !== null
|
|
187
|
+
&& !knownButtonText.includes(button.buttonText))
|
|
188
|
+
|| !knownLoadingText.includes(button.loadingText)
|
|
189
|
+
|| !knownRelativeUrl.includes(button.relativeUrl)
|
|
190
|
+
|| !knownUrlParamsArm.includes(button.urlParams.arm)
|
|
191
|
+
|| !knownUrlParamsArmState.includes(button.urlParams.armState)
|
|
192
|
+
|| !knownUrlParamsHref.includes(button.urlParams.href)))
|
|
193
|
+
|| (button.buttonDisabled
|
|
194
|
+
&& (button.buttonText !== null
|
|
195
|
+
&& !knownLoadingText.includes(button.buttonText)))));
|
|
196
|
+
if (detectedNewButtons.length > 0) {
|
|
197
|
+
const cleanedData = removePersonalIdentifiableInformation(detectedNewButtons);
|
|
198
|
+
try {
|
|
199
|
+
const outdated = await isPluginOutdated();
|
|
200
|
+
if (outdated) {
|
|
201
|
+
if (logger !== null) {
|
|
202
|
+
logger.warn('Plugin has detected new orb security buttons. You are running an older plugin version, please update soon.');
|
|
203
|
+
}
|
|
204
|
+
if (debugMode) {
|
|
205
|
+
debugLog(logger, 'detect.ts / detectedNewOrbSecurityButtons()', 'warn', 'Plugin has detected new orb security buttons. You are running an older plugin version, please update soon');
|
|
206
|
+
}
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
if (debugMode === true) {
|
|
212
|
+
debugLog(logger, 'detect.ts / detectedNewOrbSecurityButtons()', 'error', 'Failed to check if plugin is outdated');
|
|
213
|
+
stackTracer('serialize-error', serializeError(error));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (logger !== null) {
|
|
217
|
+
logger.warn('Plugin has detected new orb security buttons. Notifying plugin author about this discovery ...');
|
|
218
|
+
}
|
|
219
|
+
if (debugMode) {
|
|
220
|
+
debugLog(logger, 'detect.ts / detectedNewOrbSecurityButtons()', 'warn', 'Plugin has detected new orb security buttons. Notifying plugin author about this discovery');
|
|
221
|
+
}
|
|
222
|
+
stackTracer('detect-content', cleanedData);
|
|
223
|
+
try {
|
|
224
|
+
await axios.post('https://9wv5o73w.ntfy.mrjackyliang.com', JSON.stringify({
|
|
225
|
+
title: 'Detected new orb security buttons',
|
|
226
|
+
description: 'New orb security buttons detected. Please update the plugin as soon as possible.',
|
|
227
|
+
content: JSON.stringify(cleanedData, null, 2),
|
|
228
|
+
}), {
|
|
229
|
+
family: 4,
|
|
230
|
+
headers: {
|
|
231
|
+
'Content-Type': 'application/json',
|
|
232
|
+
'User-Agent': `homebridge-adt-pulse/${env.npm_package_version ?? 'unknown'}`,
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
if (debugMode === true) {
|
|
238
|
+
debugLog(logger, 'detect.ts / detectedNewOrbSecurityButtons()', 'error', 'Failed to notify plugin author about the new orb security buttons');
|
|
239
|
+
stackTracer('serialize-error', serializeError(error));
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
export async function detectedNewPanelInformation(device, logger, debugMode) {
|
|
247
|
+
const knownStatuses = [
|
|
248
|
+
'Online',
|
|
249
|
+
'Status Unknown',
|
|
250
|
+
];
|
|
251
|
+
const detectedNewStatus = (device.status !== null && !knownStatuses.includes(device.status));
|
|
252
|
+
if (detectedNewStatus) {
|
|
253
|
+
const cleanedData = removePersonalIdentifiableInformation(device);
|
|
254
|
+
try {
|
|
255
|
+
const outdated = await isPluginOutdated();
|
|
256
|
+
if (outdated) {
|
|
257
|
+
if (logger !== null) {
|
|
258
|
+
logger.warn('Plugin has detected new panel information. You are running an older plugin version, please update soon.');
|
|
259
|
+
}
|
|
260
|
+
if (debugMode) {
|
|
261
|
+
debugLog(logger, 'detect.ts / detectedNewPanelInformation()', 'warn', 'Plugin has detected new panel information. You are running an older plugin version, please update soon');
|
|
262
|
+
}
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
if (debugMode === true) {
|
|
268
|
+
debugLog(logger, 'detect.ts / detectedNewPanelInformation()', 'error', 'Failed to check if plugin is outdated');
|
|
269
|
+
stackTracer('serialize-error', serializeError(error));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (logger !== null) {
|
|
273
|
+
logger.warn('Plugin has detected new panel information. Notifying plugin author about this discovery ...');
|
|
274
|
+
}
|
|
275
|
+
if (debugMode) {
|
|
276
|
+
debugLog(logger, 'detect.ts / detectedNewPanelInformation()', 'warn', 'Plugin has detected new panel information. Notifying plugin author about this discovery');
|
|
277
|
+
}
|
|
278
|
+
stackTracer('detect-content', cleanedData);
|
|
279
|
+
try {
|
|
280
|
+
await axios.post('https://9wv5o73w.ntfy.mrjackyliang.com', JSON.stringify({
|
|
281
|
+
title: 'Detected new panel information',
|
|
282
|
+
description: 'New panel information detected. Please update the plugin as soon as possible.',
|
|
283
|
+
content: JSON.stringify(cleanedData, null, 2),
|
|
284
|
+
}), {
|
|
285
|
+
family: 4,
|
|
286
|
+
headers: {
|
|
287
|
+
'Content-Type': 'application/json',
|
|
288
|
+
'User-Agent': `homebridge-adt-pulse/${env.npm_package_version ?? 'unknown'}`,
|
|
289
|
+
},
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
if (debugMode === true) {
|
|
294
|
+
debugLog(logger, 'detect.ts / detectedNewPanelInformation()', 'error', 'Failed to notify plugin author about the new panel information');
|
|
295
|
+
stackTracer('serialize-error', serializeError(error));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
export async function detectedNewPanelStatus(summary, logger, debugMode) {
|
|
303
|
+
const knownStates = [
|
|
304
|
+
'Armed Away',
|
|
305
|
+
'Armed Night',
|
|
306
|
+
'Armed Stay',
|
|
307
|
+
'Disarmed',
|
|
308
|
+
'Status Unavailable',
|
|
309
|
+
];
|
|
310
|
+
const knownStatuses = [
|
|
311
|
+
'1 Sensor Open',
|
|
312
|
+
..._.range(256).map((_value, index) => `${index + 1} Sensors Open`),
|
|
313
|
+
'All Quiet',
|
|
314
|
+
'BURGLARY ALARM',
|
|
315
|
+
'Carbon Monoxide Alarm',
|
|
316
|
+
'FIRE ALARM',
|
|
317
|
+
'Motion',
|
|
318
|
+
'Sensor Bypassed',
|
|
319
|
+
'Sensor Problem',
|
|
320
|
+
'Sensors Bypassed',
|
|
321
|
+
'Sensors Tripped',
|
|
322
|
+
'Sensor Tripped',
|
|
323
|
+
'Uncleared Alarm',
|
|
324
|
+
'WATER ALARM',
|
|
325
|
+
];
|
|
326
|
+
const detectedNewState = (summary.state !== null && !knownStates.includes(summary.state));
|
|
327
|
+
const detectedNewStatus = (summary.status !== null && !knownStatuses.includes(summary.status));
|
|
328
|
+
if (detectedNewState || detectedNewStatus) {
|
|
329
|
+
const cleanedData = removePersonalIdentifiableInformation(summary);
|
|
330
|
+
try {
|
|
331
|
+
const outdated = await isPluginOutdated();
|
|
332
|
+
if (outdated) {
|
|
333
|
+
if (logger !== null) {
|
|
334
|
+
logger.warn('Plugin has detected a new panel state and/or status. You are running an older plugin version, please update soon.');
|
|
335
|
+
}
|
|
336
|
+
if (debugMode) {
|
|
337
|
+
debugLog(logger, 'detect.ts / detectedNewPanelStatus()', 'warn', 'Plugin has detected a new panel state and/or status. You are running an older plugin version, please update soon');
|
|
338
|
+
}
|
|
339
|
+
return false;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
if (debugMode === true) {
|
|
344
|
+
debugLog(logger, 'detect.ts / detectedNewPanelStatus()', 'error', 'Failed to check if plugin is outdated');
|
|
345
|
+
stackTracer('serialize-error', serializeError(error));
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
if (logger !== null) {
|
|
349
|
+
logger.warn('Plugin has detected a new panel state and/or status. Notifying plugin author about this discovery ...');
|
|
350
|
+
}
|
|
351
|
+
if (debugMode) {
|
|
352
|
+
debugLog(logger, 'detect.ts / detectedNewPanelStatus()', 'warn', 'Plugin has detected a new panel state and/or status. Notifying plugin author about this discovery');
|
|
353
|
+
}
|
|
354
|
+
stackTracer('detect-content', cleanedData);
|
|
355
|
+
try {
|
|
356
|
+
await axios.post('https://9wv5o73w.ntfy.mrjackyliang.com', JSON.stringify({
|
|
357
|
+
title: 'Detected a new panel state and/or status',
|
|
358
|
+
description: 'A new panel state and/or status detected. Please update the plugin as soon as possible.',
|
|
359
|
+
content: JSON.stringify(cleanedData, null, 2),
|
|
360
|
+
}), {
|
|
361
|
+
family: 4,
|
|
362
|
+
headers: {
|
|
363
|
+
'Content-Type': 'application/json',
|
|
364
|
+
'User-Agent': `homebridge-adt-pulse/${env.npm_package_version ?? 'unknown'}`,
|
|
365
|
+
},
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
catch (error) {
|
|
369
|
+
if (debugMode === true) {
|
|
370
|
+
debugLog(logger, 'detect.ts / detectedNewPanelStatus()', 'error', 'Failed to notify plugin author about the new panel state and/or status');
|
|
371
|
+
stackTracer('serialize-error', serializeError(error));
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return true;
|
|
375
|
+
}
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
export async function detectedNewPortalVersion(version, logger, debugMode) {
|
|
379
|
+
const knownVersions = [
|
|
380
|
+
'16.0.0-131',
|
|
381
|
+
'17.0.0-69',
|
|
382
|
+
'18.0.0-78',
|
|
383
|
+
'19.0.0-89',
|
|
384
|
+
'20.0.0-221',
|
|
385
|
+
'20.0.0-244',
|
|
386
|
+
'21.0.0-344',
|
|
387
|
+
'21.0.0-353',
|
|
388
|
+
'21.0.0-354',
|
|
389
|
+
'22.0.0-233',
|
|
390
|
+
'23.0.0-99',
|
|
391
|
+
'24.0.0-117',
|
|
392
|
+
'25.0.0-21',
|
|
393
|
+
'26.0.0-32',
|
|
394
|
+
'27.0.0-140',
|
|
395
|
+
];
|
|
396
|
+
const detectedNewVersion = (version.version !== null && !knownVersions.includes(version.version));
|
|
397
|
+
if (detectedNewVersion) {
|
|
398
|
+
const cleanedData = removePersonalIdentifiableInformation(version);
|
|
399
|
+
try {
|
|
400
|
+
const outdated = await isPluginOutdated();
|
|
401
|
+
if (outdated) {
|
|
402
|
+
if (logger !== null) {
|
|
403
|
+
logger.warn('Plugin has detected a new portal version. You are running an older plugin version, please update soon.');
|
|
404
|
+
}
|
|
405
|
+
if (debugMode) {
|
|
406
|
+
debugLog(logger, 'detect.ts / detectedNewPortalVersion()', 'warn', 'Plugin has detected a new portal version. You are running an older plugin version, please update soon');
|
|
407
|
+
}
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
if (debugMode === true) {
|
|
413
|
+
debugLog(logger, 'detect.ts / detectedNewPortalVersion()', 'error', 'Failed to check if plugin is outdated');
|
|
414
|
+
stackTracer('serialize-error', serializeError(error));
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
if (logger !== null) {
|
|
418
|
+
logger.warn('Plugin has detected a new portal version. Notifying plugin author about this discovery ...');
|
|
419
|
+
}
|
|
420
|
+
if (debugMode) {
|
|
421
|
+
debugLog(logger, 'detect.ts / detectedNewPortalVersion()', 'warn', 'Plugin has detected a new portal version. Notifying plugin author about this discovery');
|
|
422
|
+
}
|
|
423
|
+
stackTracer('detect-content', cleanedData);
|
|
424
|
+
try {
|
|
425
|
+
await axios.post('https://9wv5o73w.ntfy.mrjackyliang.com', JSON.stringify({
|
|
426
|
+
title: 'Detected a new portal version',
|
|
427
|
+
description: 'A new portal version detected. Please update the plugin as soon as possible.',
|
|
428
|
+
content: JSON.stringify(cleanedData, null, 2),
|
|
429
|
+
}), {
|
|
430
|
+
family: 4,
|
|
431
|
+
headers: {
|
|
432
|
+
'Content-Type': 'application/json',
|
|
433
|
+
'User-Agent': `homebridge-adt-pulse/${env.npm_package_version ?? 'unknown'}`,
|
|
434
|
+
},
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
catch (error) {
|
|
438
|
+
if (debugMode === true) {
|
|
439
|
+
debugLog(logger, 'detect.ts / detectedNewPortalVersion()', 'error', 'Failed to notify plugin author about the new portal version');
|
|
440
|
+
stackTracer('serialize-error', serializeError(error));
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
return true;
|
|
444
|
+
}
|
|
445
|
+
return false;
|
|
446
|
+
}
|
|
447
|
+
export async function detectedNewSensorsInformation(sensors, logger, debugMode) {
|
|
448
|
+
const knownDeviceTypes = [
|
|
449
|
+
'Audible Panic Button/Pendant',
|
|
450
|
+
'Carbon Monoxide Detector',
|
|
451
|
+
'Door/Window Sensor',
|
|
452
|
+
'Door Sensor',
|
|
453
|
+
'Fire (Smoke/Heat) Detector',
|
|
454
|
+
'Glass Break Detector',
|
|
455
|
+
'Keypad/Touchpad',
|
|
456
|
+
'Motion Sensor',
|
|
457
|
+
'Motion Sensor (Notable Events Only)',
|
|
458
|
+
'Silent Panic Button/Pendant',
|
|
459
|
+
'Temperature Sensor',
|
|
460
|
+
'Water/Flood Sensor',
|
|
461
|
+
'Window Sensor',
|
|
462
|
+
];
|
|
463
|
+
const knownStatuses = [
|
|
464
|
+
'Online',
|
|
465
|
+
'Status Unknown',
|
|
466
|
+
];
|
|
467
|
+
const detectedNewInformation = sensors.filter((sensor) => (!knownDeviceTypes.includes(sensor.deviceType)
|
|
468
|
+
|| !knownStatuses.includes(sensor.status)));
|
|
469
|
+
if (detectedNewInformation.length > 0) {
|
|
470
|
+
const cleanedData = removePersonalIdentifiableInformation(detectedNewInformation);
|
|
471
|
+
try {
|
|
472
|
+
const outdated = await isPluginOutdated();
|
|
473
|
+
if (outdated) {
|
|
474
|
+
if (logger !== null) {
|
|
475
|
+
logger.warn('Plugin has detected new sensors information. You are running an older plugin version, please update soon.');
|
|
476
|
+
}
|
|
477
|
+
if (debugMode) {
|
|
478
|
+
debugLog(logger, 'detect.ts / detectedNewSensorsInformation()', 'warn', 'Plugin has detected new sensors information. You are running an older plugin version, please update soon');
|
|
479
|
+
}
|
|
480
|
+
return false;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
if (debugMode === true) {
|
|
485
|
+
debugLog(logger, 'detect.ts / detectedNewSensorsInformation()', 'error', 'Failed to check if plugin is outdated');
|
|
486
|
+
stackTracer('serialize-error', serializeError(error));
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
if (logger !== null) {
|
|
490
|
+
logger.warn('Plugin has detected new sensors information. Notifying plugin author about this discovery ...');
|
|
491
|
+
}
|
|
492
|
+
if (debugMode) {
|
|
493
|
+
debugLog(logger, 'detect.ts / detectedNewSensorsInformation()', 'warn', 'Plugin has detected new sensors information. Notifying plugin author about this discovery');
|
|
494
|
+
}
|
|
495
|
+
stackTracer('detect-content', cleanedData);
|
|
496
|
+
try {
|
|
497
|
+
await axios.post('https://9wv5o73w.ntfy.mrjackyliang.com', JSON.stringify({
|
|
498
|
+
title: 'Detected new sensors information',
|
|
499
|
+
description: 'New sensors information detected. Please update the plugin as soon as possible.',
|
|
500
|
+
content: JSON.stringify(cleanedData, null, 2),
|
|
501
|
+
}), {
|
|
502
|
+
family: 4,
|
|
503
|
+
headers: {
|
|
504
|
+
'Content-Type': 'application/json',
|
|
505
|
+
'User-Agent': `homebridge-adt-pulse/${env.npm_package_version ?? 'unknown'}`,
|
|
506
|
+
},
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
catch (error) {
|
|
510
|
+
if (debugMode === true) {
|
|
511
|
+
debugLog(logger, 'detect.ts / detectedNewSensorsInformation()', 'error', 'Failed to notify plugin author about the new sensors information');
|
|
512
|
+
stackTracer('serialize-error', serializeError(error));
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
return true;
|
|
516
|
+
}
|
|
517
|
+
return false;
|
|
518
|
+
}
|
|
519
|
+
export async function detectedNewSensorsStatus(sensors, logger, debugMode) {
|
|
520
|
+
const knownIcons = [
|
|
521
|
+
'devStatAlarm',
|
|
522
|
+
'devStatLowBatt',
|
|
523
|
+
'devStatMotion',
|
|
524
|
+
'devStatOK',
|
|
525
|
+
'devStatOpen',
|
|
526
|
+
'devStatTamper',
|
|
527
|
+
'devStatUnknown',
|
|
528
|
+
];
|
|
529
|
+
const knownStatuses = [
|
|
530
|
+
'ALARM, Okay',
|
|
531
|
+
'ALARM, Open',
|
|
532
|
+
'Bypassed, Open',
|
|
533
|
+
'Closed',
|
|
534
|
+
'Motion',
|
|
535
|
+
'No Motion',
|
|
536
|
+
'Okay',
|
|
537
|
+
'Open',
|
|
538
|
+
'Tripped',
|
|
539
|
+
'Trouble, Open',
|
|
540
|
+
'Trouble, Closed',
|
|
541
|
+
'Unknown',
|
|
542
|
+
];
|
|
543
|
+
const detectedNewStatuses = sensors.filter((sensor) => (!knownIcons.includes(sensor.icon)
|
|
544
|
+
|| !knownStatuses.includes(sensor.status)));
|
|
545
|
+
if (detectedNewStatuses.length > 0) {
|
|
546
|
+
const cleanedData = removePersonalIdentifiableInformation(detectedNewStatuses);
|
|
547
|
+
try {
|
|
548
|
+
const outdated = await isPluginOutdated();
|
|
549
|
+
if (outdated) {
|
|
550
|
+
if (logger !== null) {
|
|
551
|
+
logger.warn('Plugin has detected new sensors status. You are running an older plugin version, please update soon.');
|
|
552
|
+
}
|
|
553
|
+
if (debugMode) {
|
|
554
|
+
debugLog(logger, 'detect.ts / detectedNewSensorsStatus()', 'warn', 'Plugin has detected new sensors status. You are running an older plugin version, please update soon');
|
|
555
|
+
}
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
catch (error) {
|
|
560
|
+
if (debugMode === true) {
|
|
561
|
+
debugLog(logger, 'detect.ts / detectedNewSensorsStatus()', 'error', 'Failed to check if plugin is outdated');
|
|
562
|
+
stackTracer('serialize-error', serializeError(error));
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
if (logger !== null) {
|
|
566
|
+
logger.warn('Plugin has detected new sensors status. Notifying plugin author about this discovery ...');
|
|
567
|
+
}
|
|
568
|
+
if (debugMode) {
|
|
569
|
+
debugLog(logger, 'detect.ts / detectedNewSensorsStatus()', 'warn', 'Plugin has detected new sensors status. Notifying plugin author about this discovery');
|
|
570
|
+
}
|
|
571
|
+
stackTracer('detect-content', cleanedData);
|
|
572
|
+
try {
|
|
573
|
+
await axios.post('https://9wv5o73w.ntfy.mrjackyliang.com', JSON.stringify({
|
|
574
|
+
title: 'Detected new sensors status',
|
|
575
|
+
description: 'New sensors status detected. Please update the plugin as soon as possible.',
|
|
576
|
+
content: JSON.stringify(cleanedData, null, 2),
|
|
577
|
+
}), {
|
|
578
|
+
family: 4,
|
|
579
|
+
headers: {
|
|
580
|
+
'Content-Type': 'application/json',
|
|
581
|
+
'User-Agent': `homebridge-adt-pulse/${env.npm_package_version ?? 'unknown'}`,
|
|
582
|
+
},
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
catch (error) {
|
|
586
|
+
if (debugMode === true) {
|
|
587
|
+
debugLog(logger, 'detect.ts / detectedNewSensorsStatus()', 'error', 'Failed to notify plugin author about the new sensors status');
|
|
588
|
+
stackTracer('serialize-error', serializeError(error));
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
return true;
|
|
592
|
+
}
|
|
593
|
+
return false;
|
|
594
|
+
}
|
|
595
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/lib/detect.ts"],"names":[],"mappings":"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"}
|