iobroker.eusec 1.1.0 → 1.1.2
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/README.md +13 -0
- package/admin/i18n/uk/translations.json +26 -0
- package/build/lib/interfaces.js +16 -2
- package/build/lib/interfaces.js.map +7 -1
- package/build/lib/log.js +70 -48
- package/build/lib/log.js.map +7 -1
- package/build/lib/tools.js +79 -84
- package/build/lib/tools.js.map +7 -1
- package/build/lib/types.js +92 -61
- package/build/lib/types.js.map +7 -1
- package/build/lib/utils.js +239 -234
- package/build/lib/utils.js.map +7 -1
- package/build/lib/video.js +243 -258
- package/build/lib/video.js.map +7 -1
- package/build/lib/web.js +58 -84
- package/build/lib/web.js.map +7 -1
- package/build/main.js +1177 -1421
- package/build/main.js.map +7 -1
- package/io-package.json +32 -4
- package/package.json +20 -42
package/build/lib/utils.js
CHANGED
|
@@ -1,264 +1,269 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
24
11
|
};
|
|
25
|
-
var
|
|
26
|
-
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
27
19
|
};
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
25
|
+
var utils_exports = {};
|
|
26
|
+
__export(utils_exports, {
|
|
27
|
+
changeRole: () => changeRole,
|
|
28
|
+
convertCamelCaseToSnakeCase: () => convertCamelCaseToSnakeCase,
|
|
29
|
+
deleteStates: () => deleteStates,
|
|
30
|
+
getDataFilePath: () => getDataFilePath,
|
|
31
|
+
getImageAsHTML: () => getImageAsHTML,
|
|
32
|
+
getVideoClipLength: () => getVideoClipLength,
|
|
33
|
+
handleUpdate: () => handleUpdate,
|
|
34
|
+
isEmpty: () => isEmpty,
|
|
35
|
+
lowestUnusedNumber: () => lowestUnusedNumber,
|
|
36
|
+
moveFiles: () => moveFiles,
|
|
37
|
+
removeFiles: () => removeFiles,
|
|
38
|
+
removeLastChar: () => removeLastChar,
|
|
39
|
+
setStateAsync: () => setStateAsync,
|
|
40
|
+
setStateChangedAsync: () => setStateChangedAsync,
|
|
41
|
+
sleep: () => sleep
|
|
42
|
+
});
|
|
43
|
+
module.exports = __toCommonJS(utils_exports);
|
|
44
|
+
var import_eufy_security_client = require("eufy-security-client");
|
|
45
|
+
var import_path = __toESM(require("path"));
|
|
46
|
+
var import_fs_extra = __toESM(require("fs-extra"));
|
|
47
|
+
var utils = __toESM(require("@iobroker/adapter-core"));
|
|
48
|
+
const setStateChangedAsync = async function(adapter, id, value) {
|
|
49
|
+
return await adapter.setStateChangedAsync(id, value === void 0 || value === null ? null : { val: value, ack: true }).catch();
|
|
37
50
|
};
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (str)
|
|
41
|
-
|
|
42
|
-
return false;
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
51
|
+
const isEmpty = function(str) {
|
|
52
|
+
if (str) {
|
|
53
|
+
if (str.length > 0)
|
|
54
|
+
return false;
|
|
45
55
|
return true;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
46
58
|
};
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return "";
|
|
59
|
+
const getImageAsHTML = function(data, mime = "image/jpg") {
|
|
60
|
+
if (data && data.length > 0)
|
|
61
|
+
return `<img src="data:${mime};base64,${data.toString("base64")}" style="width: auto ;height: 100%;" />`;
|
|
62
|
+
return "";
|
|
52
63
|
};
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return path_1.default.join(dir_path, fileName);
|
|
64
|
+
const getDataFilePath = function(adapter, stationSerial, folderName, fileName) {
|
|
65
|
+
const dir_path = import_path.default.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);
|
|
66
|
+
if (!import_fs_extra.default.existsSync(dir_path)) {
|
|
67
|
+
import_fs_extra.default.mkdirSync(dir_path, { mode: 509, recursive: true });
|
|
68
|
+
}
|
|
69
|
+
return import_path.default.join(dir_path, fileName);
|
|
60
70
|
};
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
await adapter.setStateAsync(state_id, { val: value, ack: true });
|
|
71
|
+
const setStateAsync = async function(adapter, state_id, common_name, value, role = "text", type = "string") {
|
|
72
|
+
await adapter.setObjectNotExistsAsync(state_id, {
|
|
73
|
+
type: "state",
|
|
74
|
+
common: {
|
|
75
|
+
name: common_name,
|
|
76
|
+
type,
|
|
77
|
+
role,
|
|
78
|
+
read: true,
|
|
79
|
+
write: false
|
|
80
|
+
},
|
|
81
|
+
native: {}
|
|
82
|
+
});
|
|
83
|
+
await adapter.setStateAsync(state_id, { val: value, ack: true });
|
|
75
84
|
};
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
85
|
+
const removeFiles = function(adapter, stationSerial, folderName, device_sn) {
|
|
86
|
+
return new Promise((resolve, reject) => {
|
|
87
|
+
try {
|
|
88
|
+
const dir_path = import_path.default.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);
|
|
89
|
+
if (import_fs_extra.default.existsSync(dir_path)) {
|
|
90
|
+
const files = import_fs_extra.default.readdirSync(dir_path).filter((fn) => fn.startsWith(device_sn));
|
|
79
91
|
try {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const files = fs_extra_1.default.readdirSync(dir_path).filter(fn => fn.startsWith(device_sn));
|
|
83
|
-
try {
|
|
84
|
-
files.map(filename => fs_extra_1.default.removeSync(path_1.default.join(dir_path, filename)));
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
resolve();
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
reject(error);
|
|
92
|
+
files.map((filename) => import_fs_extra.default.removeSync(import_path.default.join(dir_path, filename)));
|
|
93
|
+
} catch (error) {
|
|
93
94
|
}
|
|
94
|
-
|
|
95
|
+
}
|
|
96
|
+
resolve();
|
|
97
|
+
} catch (error) {
|
|
98
|
+
reject(error);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
95
101
|
};
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
102
|
+
const moveFiles = function(adapter, stationSerial, device_sn, srcFolderName, dstFolderName) {
|
|
103
|
+
return new Promise((resolve, reject) => {
|
|
104
|
+
try {
|
|
105
|
+
const dirSrcPath = import_path.default.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, srcFolderName);
|
|
106
|
+
const dirDstPath = import_path.default.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, dstFolderName);
|
|
107
|
+
if (!import_fs_extra.default.existsSync(dirDstPath)) {
|
|
108
|
+
import_fs_extra.default.mkdirSync(dirDstPath, { mode: 509, recursive: true });
|
|
109
|
+
}
|
|
110
|
+
if (import_fs_extra.default.existsSync(dirSrcPath)) {
|
|
111
|
+
const files = import_fs_extra.default.readdirSync(dirSrcPath).filter((fn) => fn.startsWith(device_sn));
|
|
99
112
|
try {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
if (!fs_extra_1.default.existsSync(dirDstPath)) {
|
|
103
|
-
fs_extra_1.default.mkdirSync(dirDstPath, { mode: 0o775, recursive: true });
|
|
104
|
-
}
|
|
105
|
-
if (fs_extra_1.default.existsSync(dirSrcPath)) {
|
|
106
|
-
const files = fs_extra_1.default.readdirSync(dirSrcPath).filter(fn => fn.startsWith(device_sn));
|
|
107
|
-
try {
|
|
108
|
-
files.map(filename => fs_extra_1.default.moveSync(path_1.default.join(dirSrcPath, filename), path_1.default.join(dirDstPath, filename)));
|
|
109
|
-
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
resolve();
|
|
113
|
+
files.map((filename) => import_fs_extra.default.moveSync(import_path.default.join(dirSrcPath, filename), import_path.default.join(dirDstPath, filename)));
|
|
114
|
+
} catch (error) {
|
|
114
115
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
}
|
|
117
|
+
resolve();
|
|
118
|
+
} catch (error) {
|
|
119
|
+
reject(error);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
119
122
|
};
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}, arr.length + startingFrom);
|
|
123
|
+
const lowestUnusedNumber = function(sequence, startingFrom) {
|
|
124
|
+
const arr = sequence.slice(0);
|
|
125
|
+
arr.sort((a, b) => a - b);
|
|
126
|
+
return arr.reduce((lowest, num, i) => {
|
|
127
|
+
const seqIndex = i + startingFrom;
|
|
128
|
+
return num !== seqIndex && seqIndex < lowest ? seqIndex : lowest;
|
|
129
|
+
}, arr.length + startingFrom);
|
|
128
130
|
};
|
|
129
|
-
exports.lowestUnusedNumber = lowestUnusedNumber;
|
|
130
131
|
const sleep = async (ms) => {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
return new Promise((resolve) => {
|
|
133
|
+
setTimeout(resolve, ms);
|
|
134
|
+
});
|
|
134
135
|
};
|
|
135
|
-
exports.sleep = sleep;
|
|
136
136
|
const getVideoClipLength = (device) => {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
catch (error) {
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
break;
|
|
160
|
-
case "3":
|
|
161
|
-
// Corrisponds to 60 seconds?? (this mode exists only for battery doorbells; mode: Optimal Battery Life)
|
|
162
|
-
break;
|
|
137
|
+
let length = 60;
|
|
138
|
+
const workingMode = device.getRawProperty(import_eufy_security_client.CommandType.CMD_SET_PIR_POWERMODE);
|
|
139
|
+
if (workingMode !== void 0) {
|
|
140
|
+
switch (workingMode) {
|
|
141
|
+
case "0":
|
|
142
|
+
if (device.isCamera2Product() || device.isIndoorCamera() || device.isSoloCameras())
|
|
143
|
+
length = 20;
|
|
144
|
+
else if (device.isBatteryDoorbell() || device.isBatteryDoorbell2())
|
|
145
|
+
length = 30;
|
|
146
|
+
break;
|
|
147
|
+
case "1":
|
|
148
|
+
break;
|
|
149
|
+
case "2":
|
|
150
|
+
const customValue = device.getRawProperty(import_eufy_security_client.CommandType.CMD_DEV_RECORD_TIMEOUT);
|
|
151
|
+
if (customValue !== void 0) {
|
|
152
|
+
try {
|
|
153
|
+
length = Number.parseInt(customValue);
|
|
154
|
+
} catch (error) {
|
|
155
|
+
}
|
|
163
156
|
}
|
|
157
|
+
break;
|
|
158
|
+
case "3":
|
|
159
|
+
break;
|
|
164
160
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
exports.getVideoClipLength = getVideoClipLength;
|
|
168
|
-
const removeLastChar = function (text, char) {
|
|
169
|
-
const strArr = [...text];
|
|
170
|
-
strArr.splice(text.lastIndexOf(char), 1);
|
|
171
|
-
return strArr.join("");
|
|
161
|
+
}
|
|
162
|
+
return length;
|
|
172
163
|
};
|
|
173
|
-
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
if (states)
|
|
178
|
-
Object.keys(states).forEach(async (id) => {
|
|
179
|
-
await adapter.extendObjectAsync(id, {
|
|
180
|
-
type: "state",
|
|
181
|
-
common: {
|
|
182
|
-
role: role
|
|
183
|
-
}
|
|
184
|
-
}, {}).catch();
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
catch (error) {
|
|
188
|
-
log.error(`state: ${state} role: ${role} - Error:`, error);
|
|
189
|
-
}
|
|
164
|
+
const removeLastChar = function(text, char) {
|
|
165
|
+
const strArr = [...text];
|
|
166
|
+
strArr.splice(text.lastIndexOf(char), 1);
|
|
167
|
+
return strArr.join("");
|
|
190
168
|
};
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
const states = await adapter.getStatesAsync(`*.${
|
|
169
|
+
const changeRole = async function(adapter, log, state, role) {
|
|
170
|
+
try {
|
|
171
|
+
const states = await adapter.getStatesAsync(`*.${state}`);
|
|
194
172
|
if (states)
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
173
|
+
Object.keys(states).forEach(async (id) => {
|
|
174
|
+
await adapter.extendObjectAsync(id, {
|
|
175
|
+
type: "state",
|
|
176
|
+
common: {
|
|
177
|
+
role
|
|
178
|
+
}
|
|
179
|
+
}, {}).catch();
|
|
180
|
+
});
|
|
181
|
+
} catch (error) {
|
|
182
|
+
log.error(`state: ${state} role: ${role} - Error:`, error);
|
|
183
|
+
}
|
|
198
184
|
};
|
|
199
|
-
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
185
|
+
const deleteStates = async function(adapter, property) {
|
|
186
|
+
const states = await adapter.getStatesAsync(`*.${property}`);
|
|
187
|
+
if (states)
|
|
188
|
+
Object.keys(states).forEach(async (id) => {
|
|
189
|
+
await adapter.delObjectAsync(id).catch();
|
|
190
|
+
});
|
|
191
|
+
};
|
|
192
|
+
const handleUpdate = async function(adapter, log, old_version) {
|
|
193
|
+
if (old_version <= 0.61) {
|
|
194
|
+
try {
|
|
195
|
+
const all = await adapter.getStatesAsync("T*");
|
|
196
|
+
if (all) {
|
|
197
|
+
Object.keys(all).forEach(async (id) => {
|
|
198
|
+
await adapter.delObjectAsync(id, { recursive: false }).catch();
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
const channels = await adapter.getChannelsOfAsync();
|
|
202
|
+
if (channels) {
|
|
203
|
+
Object.values(channels).forEach(async (channel) => {
|
|
204
|
+
if (channel.common.name !== "info") {
|
|
205
|
+
await adapter.delObjectAsync(channel._id, { recursive: false }).catch();
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
const devices = await adapter.getDevicesAsync();
|
|
210
|
+
if (devices) {
|
|
211
|
+
Object.values(devices).forEach(async (device) => {
|
|
212
|
+
await adapter.delObjectAsync(device._id, { recursive: false }).catch();
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
} catch (error) {
|
|
216
|
+
log.error("Version 0.6.1: Error:", error);
|
|
227
217
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
}
|
|
218
|
+
}
|
|
219
|
+
if (old_version <= 0.74) {
|
|
220
|
+
try {
|
|
221
|
+
await adapter.setObjectAsync("verify_code", {
|
|
222
|
+
type: "state",
|
|
223
|
+
common: {
|
|
224
|
+
name: "2FA verification code",
|
|
225
|
+
type: "string",
|
|
226
|
+
role: "state",
|
|
227
|
+
read: true,
|
|
228
|
+
write: true
|
|
229
|
+
},
|
|
230
|
+
native: {}
|
|
231
|
+
});
|
|
232
|
+
} catch (error) {
|
|
233
|
+
log.error("Version 0.7.4: Error:", error);
|
|
245
234
|
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
}
|
|
235
|
+
}
|
|
236
|
+
if (old_version <= 1) {
|
|
237
|
+
for (const state of ["last_event_pic_url", "last_event_pic_html", "last_event_video_url"]) {
|
|
238
|
+
try {
|
|
239
|
+
await deleteStates(adapter, state);
|
|
240
|
+
} catch (error) {
|
|
241
|
+
log.error(`Version 1.0.0 - ${state}: Error:`, error);
|
|
242
|
+
}
|
|
255
243
|
}
|
|
244
|
+
}
|
|
256
245
|
};
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
return
|
|
260
|
-
|
|
261
|
-
});
|
|
246
|
+
const convertCamelCaseToSnakeCase = function(value) {
|
|
247
|
+
return value.replace(/[A-Z]/g, (letter, index) => {
|
|
248
|
+
return index == 0 ? letter.toLowerCase() : "_" + letter.toLowerCase();
|
|
249
|
+
});
|
|
262
250
|
};
|
|
263
|
-
|
|
264
|
-
|
|
251
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
252
|
+
0 && (module.exports = {
|
|
253
|
+
changeRole,
|
|
254
|
+
convertCamelCaseToSnakeCase,
|
|
255
|
+
deleteStates,
|
|
256
|
+
getDataFilePath,
|
|
257
|
+
getImageAsHTML,
|
|
258
|
+
getVideoClipLength,
|
|
259
|
+
handleUpdate,
|
|
260
|
+
isEmpty,
|
|
261
|
+
lowestUnusedNumber,
|
|
262
|
+
moveFiles,
|
|
263
|
+
removeFiles,
|
|
264
|
+
removeLastChar,
|
|
265
|
+
setStateAsync,
|
|
266
|
+
setStateChangedAsync,
|
|
267
|
+
sleep
|
|
268
|
+
});
|
|
269
|
+
//# sourceMappingURL=utils.js.map
|
package/build/lib/utils.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/lib/utils.ts"],
|
|
4
|
+
"sourcesContent": ["import { CommandType, Device } from \"eufy-security-client\";\r\nimport path from \"path\";\r\nimport fse from \"fs-extra\";\r\nimport * as utils from \"@iobroker/adapter-core\";\r\n\r\nimport { ioBrokerLogger } from \"./log\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\r\nexport const setStateChangedAsync = async function(adapter: ioBroker.Adapter, id: string, value: any): ioBroker.SetStateChangedPromise {\r\n return await adapter.setStateChangedAsync(id, value === undefined || value === null ? null : { val: value, ack: true }).catch();\r\n};\r\n\r\nexport const isEmpty = function(str: string | null | undefined): boolean {\r\n if (str) {\r\n if (str.length > 0)\r\n return false;\r\n return true;\r\n }\r\n return true;\r\n};\r\n\r\nexport const getImageAsHTML = function(data: Buffer, mime = \"image/jpg\"): string {\r\n if (data && data.length > 0)\r\n return `<img src=\"data:${mime};base64,${data.toString(\"base64\")}\" style=\"width: auto ;height: 100%;\" />`;\r\n return \"\";\r\n}\r\n\r\nexport const getDataFilePath = function(adapter: ioBroker.Adapter, stationSerial: string, folderName: string, fileName: string): string {\r\n const dir_path = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);\r\n if (!fse.existsSync(dir_path)) {\r\n fse.mkdirSync(dir_path, {mode: 0o775, recursive: true});\r\n }\r\n return path.join(dir_path, fileName);\r\n}\r\n\r\nexport const setStateAsync = async function(adapter: ioBroker.Adapter, state_id: string, common_name: string, value: string, role = \"text\", type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"mixed\" | \"file\" | undefined = \"string\"): Promise<void> {\r\n await adapter.setObjectNotExistsAsync(state_id, {\r\n type: \"state\",\r\n common: {\r\n name: common_name,\r\n type: type,\r\n role: role,\r\n read: true,\r\n write: false,\r\n },\r\n native: {\r\n },\r\n });\r\n await adapter.setStateAsync(state_id, { val: value, ack: true });\r\n}\r\n\r\nexport const removeFiles = function(adapter: ioBroker.Adapter, stationSerial: string, folderName: string, device_sn: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const dir_path = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);\r\n if (fse.existsSync(dir_path)) {\r\n const files = fse.readdirSync(dir_path).filter(fn => fn.startsWith(device_sn));\r\n try {\r\n files.map(filename => fse.removeSync(path.join(dir_path, filename)));\r\n } catch (error) {\r\n }\r\n }\r\n resolve();\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n\r\nexport const moveFiles = function(adapter: ioBroker.Adapter, stationSerial: string, device_sn: string, srcFolderName: string, dstFolderName: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const dirSrcPath = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, srcFolderName);\r\n const dirDstPath = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, dstFolderName);\r\n if (!fse.existsSync(dirDstPath)) {\r\n fse.mkdirSync(dirDstPath, {mode: 0o775, recursive: true});\r\n }\r\n if (fse.existsSync(dirSrcPath)) {\r\n const files = fse.readdirSync(dirSrcPath).filter(fn => fn.startsWith(device_sn));\r\n try {\r\n files.map(filename => fse.moveSync(path.join(dirSrcPath, filename), path.join(dirDstPath, filename)));\r\n } catch (error) {\r\n }\r\n }\r\n resolve();\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n\r\nexport const lowestUnusedNumber = function (sequence: number[], startingFrom: number): number {\r\n const arr = sequence.slice(0);\r\n arr.sort((a, b) => a - b);\r\n return arr.reduce((lowest, num, i) => {\r\n const seqIndex = i + startingFrom;\r\n return num !== seqIndex && seqIndex < lowest ? seqIndex : lowest\r\n }, arr.length + startingFrom);\r\n}\r\n\r\nexport const sleep = async (ms: number): Promise<void> => {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n};\r\n\r\nexport const getVideoClipLength = (device: Device): number => {\r\n let length = 60;\r\n const workingMode = device.getRawProperty(CommandType.CMD_SET_PIR_POWERMODE);\r\n if (workingMode !== undefined) {\r\n switch(workingMode) {\r\n case \"0\":\r\n if (device.isCamera2Product() || device.isIndoorCamera() || device.isSoloCameras())\r\n length = 20;\r\n else if (device.isBatteryDoorbell() || device.isBatteryDoorbell2())\r\n length = 30;\r\n break;\r\n case \"1\":\r\n // Corrisponds to 60 seconds\r\n break;\r\n case \"2\":\r\n const customValue = device.getRawProperty(CommandType.CMD_DEV_RECORD_TIMEOUT);\r\n if (customValue !== undefined) {\r\n try {\r\n length = Number.parseInt(customValue);\r\n } catch(error) {\r\n }\r\n }\r\n break;\r\n case \"3\":\r\n // Corrisponds to 60 seconds?? (this mode exists only for battery doorbells; mode: Optimal Battery Life)\r\n break;\r\n }\r\n }\r\n return length;\r\n};\r\n\r\nexport const removeLastChar = function(text: string, char: string): string {\r\n const strArr = [...text];\r\n strArr.splice(text.lastIndexOf(char), 1);\r\n return strArr.join(\"\");\r\n}\r\n\r\nexport const changeRole = async function(adapter: ioBroker.Adapter, log: ioBrokerLogger, state: string, role: string): Promise<void> {\r\n try {\r\n const states = await adapter.getStatesAsync(`*.${state}`);\r\n if (states)\r\n Object.keys(states).forEach(async id => {\r\n await adapter.extendObjectAsync(id, {\r\n type: \"state\",\r\n common: {\r\n role: role\r\n }\r\n }, {}).catch();\r\n });\r\n } catch (error) {\r\n log.error(`state: ${state} role: ${role} - Error:`, error);\r\n }\r\n};\r\n\r\nexport const deleteStates = async function(adapter: ioBroker.Adapter, property: string): Promise<void> {\r\n const states = await adapter.getStatesAsync(`*.${property}`);\r\n if (states)\r\n Object.keys(states).forEach(async id => {\r\n await adapter.delObjectAsync(id).catch();\r\n });\r\n};\r\n\r\nexport const handleUpdate = async function(adapter: ioBroker.Adapter, log: ioBrokerLogger, old_version: number): Promise<void> {\r\n if (old_version <= 0.61) {\r\n try {\r\n const all = await adapter.getStatesAsync(\"T*\");\r\n if (all) {\r\n Object.keys(all).forEach(async id => {\r\n await adapter.delObjectAsync(id, { recursive: false }).catch();\r\n });\r\n }\r\n const channels = await adapter.getChannelsOfAsync();\r\n if (channels) {\r\n Object.values(channels).forEach(async channel => {\r\n if (channel.common.name !== \"info\") {\r\n await adapter.delObjectAsync(channel._id, {recursive: false}).catch();\r\n }\r\n });\r\n }\r\n const devices = await adapter.getDevicesAsync();\r\n if (devices) {\r\n Object.values(devices).forEach(async device => {\r\n await adapter.delObjectAsync(device._id, {recursive: false}).catch();\r\n });\r\n }\r\n } catch (error) {\r\n log.error(\"Version 0.6.1: Error:\", error);\r\n }\r\n }\r\n if (old_version <= 0.74) {\r\n try {\r\n await adapter.setObjectAsync(\"verify_code\", {\r\n type: \"state\",\r\n common: {\r\n name: \"2FA verification code\",\r\n type: \"string\",\r\n role: \"state\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n });\r\n } catch (error) {\r\n log.error(\"Version 0.7.4: Error:\", error);\r\n }\r\n }\r\n if (old_version <= 1) {\r\n for (const state of [\"last_event_pic_url\", \"last_event_pic_html\", \"last_event_video_url\"]) {\r\n try {\r\n await deleteStates(adapter, state);\r\n } catch (error) {\r\n log.error(`Version 1.0.0 - ${state}: Error:`, error);\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const convertCamelCaseToSnakeCase = function (value: string): string {\r\n return value.replace(/[A-Z]/g, (letter, index) => {\r\n return index == 0 ? letter.toLowerCase() : \"_\" + letter.toLowerCase();\r\n });\r\n};"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAoC;AACpC,kBAAiB;AACjB,sBAAgB;AAChB,YAAuB;AAKhB,MAAM,uBAAuB,eAAe,SAA2B,IAAY,OAA6C;AACnI,SAAO,MAAM,QAAQ,qBAAqB,IAAI,UAAU,UAAa,UAAU,OAAO,OAAO,EAAE,KAAK,OAAO,KAAK,KAAK,CAAC,EAAE,MAAM;AAClI;AAEO,MAAM,UAAU,SAAS,KAAyC;AACrE,MAAI,KAAK;AACL,QAAI,IAAI,SAAS;AACb,aAAO;AACX,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEO,MAAM,iBAAiB,SAAS,MAAc,OAAO,aAAqB;AAC7E,MAAI,QAAQ,KAAK,SAAS;AACtB,WAAO,kBAAkB,eAAe,KAAK,SAAS,QAAQ;AAClE,SAAO;AACX;AAEO,MAAM,kBAAkB,SAAS,SAA2B,eAAuB,YAAoB,UAA0B;AACpI,QAAM,WAAW,YAAAA,QAAK,KAAK,MAAM,2BAA2B,OAAO,GAAG,eAAe,UAAU;AAC/F,MAAI,CAAC,gBAAAC,QAAI,WAAW,QAAQ,GAAG;AAC3B,oBAAAA,QAAI,UAAU,UAAU,EAAC,MAAM,KAAO,WAAW,KAAI,CAAC;AAAA,EAC1D;AACA,SAAO,YAAAD,QAAK,KAAK,UAAU,QAAQ;AACvC;AAEO,MAAM,gBAAgB,eAAe,SAA2B,UAAkB,aAAqB,OAAe,OAAO,QAAQ,OAA4F,UAAyB;AAC7P,QAAM,QAAQ,wBAAwB,UAAU;AAAA,IAC5C,MAAM;AAAA,IACN,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,IACX;AAAA,IACA,QAAQ,CACR;AAAA,EACJ,CAAC;AACD,QAAM,QAAQ,cAAc,UAAU,EAAE,KAAK,OAAO,KAAK,KAAK,CAAC;AACnE;AAEO,MAAM,cAAc,SAAS,SAA2B,eAAuB,YAAoB,WAAkC;AACxI,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,QAAI;AACA,YAAM,WAAW,YAAAA,QAAK,KAAK,MAAM,2BAA2B,OAAO,GAAG,eAAe,UAAU;AAC/F,UAAI,gBAAAC,QAAI,WAAW,QAAQ,GAAG;AAC1B,cAAM,QAAQ,gBAAAA,QAAI,YAAY,QAAQ,EAAE,OAAO,QAAM,GAAG,WAAW,SAAS,CAAC;AAC7E,YAAI;AACA,gBAAM,IAAI,cAAY,gBAAAA,QAAI,WAAW,YAAAD,QAAK,KAAK,UAAU,QAAQ,CAAC,CAAC;AAAA,QACvE,SAAS,OAAP;AAAA,QACF;AAAA,MACJ;AACA,cAAQ;AAAA,IACZ,SAAS,OAAP;AACE,aAAO,KAAK;AAAA,IAChB;AAAA,EACJ,CAAC;AACL;AAEO,MAAM,YAAY,SAAS,SAA2B,eAAuB,WAAmB,eAAuB,eAAsC;AAChK,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,QAAI;AACA,YAAM,aAAa,YAAAA,QAAK,KAAK,MAAM,2BAA2B,OAAO,GAAG,eAAe,aAAa;AACpG,YAAM,aAAa,YAAAA,QAAK,KAAK,MAAM,2BAA2B,OAAO,GAAG,eAAe,aAAa;AACpG,UAAI,CAAC,gBAAAC,QAAI,WAAW,UAAU,GAAG;AAC7B,wBAAAA,QAAI,UAAU,YAAY,EAAC,MAAM,KAAO,WAAW,KAAI,CAAC;AAAA,MAC5D;AACA,UAAI,gBAAAA,QAAI,WAAW,UAAU,GAAG;AAC5B,cAAM,QAAQ,gBAAAA,QAAI,YAAY,UAAU,EAAE,OAAO,QAAM,GAAG,WAAW,SAAS,CAAC;AAC/E,YAAI;AACA,gBAAM,IAAI,cAAY,gBAAAA,QAAI,SAAS,YAAAD,QAAK,KAAK,YAAY,QAAQ,GAAG,YAAAA,QAAK,KAAK,YAAY,QAAQ,CAAC,CAAC;AAAA,QACxG,SAAS,OAAP;AAAA,QACF;AAAA,MACJ;AACA,cAAQ;AAAA,IACZ,SAAS,OAAP;AACE,aAAO,KAAK;AAAA,IAChB;AAAA,EACJ,CAAC;AACL;AAEO,MAAM,qBAAqB,SAAU,UAAoB,cAA8B;AAC1F,QAAM,MAAM,SAAS,MAAM,CAAC;AAC5B,MAAI,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACxB,SAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM;AAClC,UAAM,WAAW,IAAI;AACrB,WAAO,QAAQ,YAAY,WAAW,SAAS,WAAW;AAAA,EAC9D,GAAG,IAAI,SAAS,YAAY;AAChC;AAEO,MAAM,QAAQ,OAAO,OAA8B;AACtD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,eAAW,SAAS,EAAE;AAAA,EAC1B,CAAC;AACL;AAEO,MAAM,qBAAqB,CAAC,WAA2B;AAC1D,MAAI,SAAS;AACb,QAAM,cAAc,OAAO,eAAe,wCAAY,qBAAqB;AAC3E,MAAI,gBAAgB,QAAW;AAC3B,YAAO,aAAa;AAAA,MAChB,KAAK;AACD,YAAI,OAAO,iBAAiB,KAAK,OAAO,eAAe,KAAK,OAAO,cAAc;AAC7E,mBAAS;AAAA,iBACJ,OAAO,kBAAkB,KAAK,OAAO,mBAAmB;AAC7D,mBAAS;AACb;AAAA,MACJ,KAAK;AAED;AAAA,MACJ,KAAK;AACD,cAAM,cAAc,OAAO,eAAe,wCAAY,sBAAsB;AAC5E,YAAI,gBAAgB,QAAW;AAC3B,cAAI;AACA,qBAAS,OAAO,SAAS,WAAW;AAAA,UACxC,SAAQ,OAAN;AAAA,UACF;AAAA,QACJ;AACA;AAAA,MACJ,KAAK;AAED;AAAA,IACR;AAAA,EACJ;AACA,SAAO;AACX;AAEO,MAAM,iBAAiB,SAAS,MAAc,MAAsB;AACvE,QAAM,SAAS,CAAC,GAAG,IAAI;AACvB,SAAO,OAAO,KAAK,YAAY,IAAI,GAAG,CAAC;AACvC,SAAO,OAAO,KAAK,EAAE;AACzB;AAEO,MAAM,aAAa,eAAe,SAA2B,KAAqB,OAAe,MAA6B;AACjI,MAAI;AACA,UAAM,SAAS,MAAM,QAAQ,eAAe,KAAK,OAAO;AACxD,QAAI;AACA,aAAO,KAAK,MAAM,EAAE,QAAQ,OAAM,OAAM;AACpC,cAAM,QAAQ,kBAAkB,IAAI;AAAA,UAChC,MAAM;AAAA,UACN,QAAQ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ,GAAG,CAAC,CAAC,EAAE,MAAM;AAAA,MACjB,CAAC;AAAA,EACT,SAAS,OAAP;AACE,QAAI,MAAM,UAAU,eAAe,iBAAiB,KAAK;AAAA,EAC7D;AACJ;AAEO,MAAM,eAAe,eAAe,SAA2B,UAAiC;AACnG,QAAM,SAAS,MAAM,QAAQ,eAAe,KAAK,UAAU;AAC3D,MAAI;AACA,WAAO,KAAK,MAAM,EAAE,QAAQ,OAAM,OAAM;AACpC,YAAM,QAAQ,eAAe,EAAE,EAAE,MAAM;AAAA,IAC3C,CAAC;AACT;AAEO,MAAM,eAAe,eAAe,SAA2B,KAAqB,aAAoC;AAC3H,MAAI,eAAe,MAAM;AACrB,QAAI;AACA,YAAM,MAAM,MAAM,QAAQ,eAAe,IAAI;AAC7C,UAAI,KAAK;AACL,eAAO,KAAK,GAAG,EAAE,QAAQ,OAAM,OAAM;AACjC,gBAAM,QAAQ,eAAe,IAAI,EAAE,WAAW,MAAM,CAAC,EAAE,MAAM;AAAA,QACjE,CAAC;AAAA,MACL;AACA,YAAM,WAAW,MAAM,QAAQ,mBAAmB;AAClD,UAAI,UAAU;AACV,eAAO,OAAO,QAAQ,EAAE,QAAQ,OAAM,YAAW;AAC7C,cAAI,QAAQ,OAAO,SAAS,QAAQ;AAChC,kBAAM,QAAQ,eAAe,QAAQ,KAAK,EAAC,WAAW,MAAK,CAAC,EAAE,MAAM;AAAA,UACxE;AAAA,QACJ,CAAC;AAAA,MACL;AACA,YAAM,UAAU,MAAM,QAAQ,gBAAgB;AAC9C,UAAI,SAAS;AACT,eAAO,OAAO,OAAO,EAAE,QAAQ,OAAM,WAAU;AAC3C,gBAAM,QAAQ,eAAe,OAAO,KAAK,EAAC,WAAW,MAAK,CAAC,EAAE,MAAM;AAAA,QACvE,CAAC;AAAA,MACL;AAAA,IACJ,SAAS,OAAP;AACE,UAAI,MAAM,yBAAyB,KAAK;AAAA,IAC5C;AAAA,EACJ;AACA,MAAI,eAAe,MAAM;AACrB,QAAI;AACA,YAAM,QAAQ,eAAe,eAAe;AAAA,QACxC,MAAM;AAAA,QACN,QAAQ;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,QACX;AAAA,QACA,QAAQ,CAAC;AAAA,MACb,CAAC;AAAA,IACL,SAAS,OAAP;AACE,UAAI,MAAM,yBAAyB,KAAK;AAAA,IAC5C;AAAA,EACJ;AACA,MAAI,eAAe,GAAG;AAClB,eAAW,SAAS,CAAC,sBAAsB,uBAAuB,sBAAsB,GAAG;AACvF,UAAI;AACA,cAAM,aAAa,SAAS,KAAK;AAAA,MACrC,SAAS,OAAP;AACE,YAAI,MAAM,mBAAmB,iBAAiB,KAAK;AAAA,MACvD;AAAA,IACJ;AAAA,EACJ;AACJ;AAEO,MAAM,8BAA8B,SAAU,OAAuB;AACxE,SAAO,MAAM,QAAQ,UAAU,CAAC,QAAQ,UAAU;AAC9C,WAAO,SAAS,IAAI,OAAO,YAAY,IAAI,MAAM,OAAO,YAAY;AAAA,EACxE,CAAC;AACL;",
|
|
6
|
+
"names": ["path", "fse"]
|
|
7
|
+
}
|