tsvesync 1.0.16 → 1.0.18
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/lib/logger.d.ts +31 -12
- package/dist/lib/logger.js +61 -14
- package/dist/lib/vesync.d.ts +9 -1
- package/dist/lib/vesync.js +16 -1
- package/dist/lib/vesyncOutlet.js +63 -16
- package/package.json +1 -1
- package/src/lib/logger.ts +72 -17
- package/src/lib/vesync.ts +22 -3
- package/src/lib/vesyncOutlet.ts +62 -17
package/dist/lib/logger.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Logger
|
|
2
|
+
* Logger module for VeSync library
|
|
3
3
|
*/
|
|
4
4
|
export declare enum LogLevel {
|
|
5
5
|
DEBUG = 0,
|
|
@@ -8,16 +8,35 @@ export declare enum LogLevel {
|
|
|
8
8
|
ERROR = 3,
|
|
9
9
|
NONE = 4
|
|
10
10
|
}
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
setLevel(level: LogLevel)
|
|
17
|
-
getLevel()
|
|
18
|
-
debug(message: string, ...args: any[]): void;
|
|
19
|
-
info(message: string, ...args: any[]): void;
|
|
20
|
-
warn(message: string, ...args: any[]): void;
|
|
21
|
-
error(message: string, ...args: any[]): void;
|
|
11
|
+
export interface Logger {
|
|
12
|
+
debug: (message: string, ...args: any[]) => void;
|
|
13
|
+
info: (message: string, ...args: any[]) => void;
|
|
14
|
+
warn: (message: string, ...args: any[]) => void;
|
|
15
|
+
error: (message: string, ...args: any[]) => void;
|
|
16
|
+
setLevel?: (level: LogLevel) => void;
|
|
17
|
+
getLevel?: () => LogLevel | undefined;
|
|
22
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Set a custom logger implementation
|
|
21
|
+
* @param customLogger - Custom logger implementation
|
|
22
|
+
*/
|
|
23
|
+
export declare function setLogger(customLogger: Logger): void;
|
|
24
|
+
/**
|
|
25
|
+
* Reset to default logger
|
|
26
|
+
*/
|
|
27
|
+
export declare function resetLogger(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Get the current logger instance
|
|
30
|
+
*/
|
|
31
|
+
export declare function getLogger(): Logger;
|
|
32
|
+
/**
|
|
33
|
+
* Set the log level (only works with default logger)
|
|
34
|
+
* @param level - The log level to set
|
|
35
|
+
*/
|
|
36
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
37
|
+
/**
|
|
38
|
+
* Get the current log level (only works with default logger)
|
|
39
|
+
* @returns The current log level or undefined if using custom logger
|
|
40
|
+
*/
|
|
41
|
+
export declare function getLogLevel(): LogLevel | undefined;
|
|
23
42
|
export declare const logger: Logger;
|
package/dist/lib/logger.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Logger
|
|
3
|
+
* Logger module for VeSync library
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.logger = exports.
|
|
6
|
+
exports.logger = exports.LogLevel = void 0;
|
|
7
|
+
exports.setLogger = setLogger;
|
|
8
|
+
exports.resetLogger = resetLogger;
|
|
9
|
+
exports.getLogger = getLogger;
|
|
10
|
+
exports.setLogLevel = setLogLevel;
|
|
11
|
+
exports.getLogLevel = getLogLevel;
|
|
7
12
|
var LogLevel;
|
|
8
13
|
(function (LogLevel) {
|
|
9
14
|
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
@@ -12,16 +17,10 @@ var LogLevel;
|
|
|
12
17
|
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
13
18
|
LogLevel[LogLevel["NONE"] = 4] = "NONE";
|
|
14
19
|
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
15
|
-
class
|
|
20
|
+
class DefaultLogger {
|
|
16
21
|
constructor() {
|
|
17
22
|
this.currentLevel = LogLevel.INFO;
|
|
18
23
|
}
|
|
19
|
-
static getInstance() {
|
|
20
|
-
if (!Logger.instance) {
|
|
21
|
-
Logger.instance = new Logger();
|
|
22
|
-
}
|
|
23
|
-
return Logger.instance;
|
|
24
|
-
}
|
|
25
24
|
setLevel(level) {
|
|
26
25
|
this.currentLevel = level;
|
|
27
26
|
}
|
|
@@ -30,12 +29,12 @@ class Logger {
|
|
|
30
29
|
}
|
|
31
30
|
debug(message, ...args) {
|
|
32
31
|
if (this.currentLevel <= LogLevel.DEBUG) {
|
|
33
|
-
console.
|
|
32
|
+
console.debug(`[DEBUG] ${message}`, ...args);
|
|
34
33
|
}
|
|
35
34
|
}
|
|
36
35
|
info(message, ...args) {
|
|
37
36
|
if (this.currentLevel <= LogLevel.INFO) {
|
|
38
|
-
console.
|
|
37
|
+
console.info(`[INFO] ${message}`, ...args);
|
|
39
38
|
}
|
|
40
39
|
}
|
|
41
40
|
warn(message, ...args) {
|
|
@@ -49,6 +48,54 @@ class Logger {
|
|
|
49
48
|
}
|
|
50
49
|
}
|
|
51
50
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
// Default logger implementation
|
|
52
|
+
const defaultLogger = new DefaultLogger();
|
|
53
|
+
// Current logger instance
|
|
54
|
+
let currentLogger = defaultLogger;
|
|
55
|
+
/**
|
|
56
|
+
* Set a custom logger implementation
|
|
57
|
+
* @param customLogger - Custom logger implementation
|
|
58
|
+
*/
|
|
59
|
+
function setLogger(customLogger) {
|
|
60
|
+
currentLogger = customLogger;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Reset to default logger
|
|
64
|
+
*/
|
|
65
|
+
function resetLogger() {
|
|
66
|
+
currentLogger = defaultLogger;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get the current logger instance
|
|
70
|
+
*/
|
|
71
|
+
function getLogger() {
|
|
72
|
+
return currentLogger;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Set the log level (only works with default logger)
|
|
76
|
+
* @param level - The log level to set
|
|
77
|
+
*/
|
|
78
|
+
function setLogLevel(level) {
|
|
79
|
+
if (currentLogger === defaultLogger) {
|
|
80
|
+
currentLogger.setLevel(level);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get the current log level (only works with default logger)
|
|
85
|
+
* @returns The current log level or undefined if using custom logger
|
|
86
|
+
*/
|
|
87
|
+
function getLogLevel() {
|
|
88
|
+
if (currentLogger === defaultLogger) {
|
|
89
|
+
return currentLogger.getLevel();
|
|
90
|
+
}
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
// Export the logger interface for use throughout the application
|
|
94
|
+
exports.logger = {
|
|
95
|
+
debug: (message, ...args) => currentLogger.debug(message, ...args),
|
|
96
|
+
info: (message, ...args) => currentLogger.info(message, ...args),
|
|
97
|
+
warn: (message, ...args) => currentLogger.warn(message, ...args),
|
|
98
|
+
error: (message, ...args) => currentLogger.error(message, ...args),
|
|
99
|
+
setLevel: (level) => setLogLevel(level),
|
|
100
|
+
getLevel: () => getLogLevel()
|
|
101
|
+
};
|
package/dist/lib/vesync.d.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* VeSync API Device Library
|
|
3
3
|
*/
|
|
4
4
|
import { VeSyncBaseDevice } from './vesyncBaseDevice';
|
|
5
|
+
import { Logger } from './logger';
|
|
5
6
|
/**
|
|
6
7
|
* VeSync Manager Class
|
|
7
8
|
*/
|
|
@@ -29,8 +30,15 @@ export declare class VeSync {
|
|
|
29
30
|
scales: VeSyncBaseDevice[];
|
|
30
31
|
/**
|
|
31
32
|
* Initialize VeSync Manager
|
|
33
|
+
* @param username - VeSync account username
|
|
34
|
+
* @param password - VeSync account password
|
|
35
|
+
* @param timeZone - Optional timezone (defaults to America/New_York)
|
|
36
|
+
* @param debug - Optional debug mode flag
|
|
37
|
+
* @param redact - Optional redact mode flag
|
|
38
|
+
* @param apiUrl - Optional API base URL override
|
|
39
|
+
* @param customLogger - Optional custom logger implementation
|
|
32
40
|
*/
|
|
33
|
-
constructor(username: string, password: string, timeZone?: string, debug?: boolean, redact?: boolean);
|
|
41
|
+
constructor(username: string, password: string, timeZone?: string, debug?: boolean, redact?: boolean, apiUrl?: string, customLogger?: Logger);
|
|
34
42
|
/**
|
|
35
43
|
* Get/Set debug mode
|
|
36
44
|
*/
|
package/dist/lib/vesync.js
CHANGED
|
@@ -103,8 +103,15 @@ function objectFactory(details, manager) {
|
|
|
103
103
|
class VeSync {
|
|
104
104
|
/**
|
|
105
105
|
* Initialize VeSync Manager
|
|
106
|
+
* @param username - VeSync account username
|
|
107
|
+
* @param password - VeSync account password
|
|
108
|
+
* @param timeZone - Optional timezone (defaults to America/New_York)
|
|
109
|
+
* @param debug - Optional debug mode flag
|
|
110
|
+
* @param redact - Optional redact mode flag
|
|
111
|
+
* @param apiUrl - Optional API base URL override
|
|
112
|
+
* @param customLogger - Optional custom logger implementation
|
|
106
113
|
*/
|
|
107
|
-
constructor(username, password, timeZone = helpers_1.DEFAULT_TZ, debug = false, redact = true) {
|
|
114
|
+
constructor(username, password, timeZone = helpers_1.DEFAULT_TZ, debug = false, redact = true, apiUrl, customLogger) {
|
|
108
115
|
this._debug = debug;
|
|
109
116
|
this._redact = redact;
|
|
110
117
|
this._energyUpdateInterval = DEFAULT_ENERGY_UPDATE_INTERVAL;
|
|
@@ -130,6 +137,14 @@ class VeSync {
|
|
|
130
137
|
switches: this.switches,
|
|
131
138
|
bulbs: this.bulbs
|
|
132
139
|
};
|
|
140
|
+
// Set custom API URL if provided
|
|
141
|
+
if (apiUrl) {
|
|
142
|
+
(0, helpers_1.setApiBaseUrl)(apiUrl);
|
|
143
|
+
}
|
|
144
|
+
// Set custom logger if provided
|
|
145
|
+
if (customLogger) {
|
|
146
|
+
(0, logger_1.setLogger)(customLogger);
|
|
147
|
+
}
|
|
133
148
|
if (typeof timeZone === 'string' && timeZone) {
|
|
134
149
|
const regTest = /[^a-zA-Z/_]/;
|
|
135
150
|
if (regTest.test(timeZone)) {
|
package/dist/lib/vesyncOutlet.js
CHANGED
|
@@ -117,14 +117,58 @@ class VeSyncOutlet extends vesyncBaseDevice_1.VeSyncBaseDevice {
|
|
|
117
117
|
return;
|
|
118
118
|
}
|
|
119
119
|
logger_1.logger.debug(`[${this.deviceName}] Updating energy data`);
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (
|
|
120
|
+
// Different endpoints for different device types
|
|
121
|
+
let url;
|
|
122
|
+
if (this.deviceType === 'wifi-switch-1.3') {
|
|
123
|
+
url = `/v1/device/${this.deviceType}-${this.cid}/energy/detail`;
|
|
124
|
+
}
|
|
125
|
+
else if (this.deviceType.startsWith('ESO15')) {
|
|
126
|
+
url = '/outdoorsocket15a/v1/device/energy';
|
|
127
|
+
}
|
|
128
|
+
else if (this.deviceType.startsWith('ESW15')) {
|
|
129
|
+
url = '/15a/v1/device/energy';
|
|
130
|
+
}
|
|
131
|
+
else if (this.deviceType.startsWith('ESW03') || this.deviceType.startsWith('ESW01')) {
|
|
132
|
+
url = '/10a/v1/device/energy';
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
url = '/v1/device/energy';
|
|
136
|
+
}
|
|
137
|
+
const body = this.deviceType === 'wifi-switch-1.3' ? null : {
|
|
138
|
+
...helpers_1.Helpers.reqBody(this.manager, 'energy'),
|
|
139
|
+
uuid: this.uuid
|
|
140
|
+
};
|
|
141
|
+
const [response] = await helpers_1.Helpers.callApi(url, this.deviceType === 'wifi-switch-1.3' ? 'get' : 'post', body, helpers_1.Helpers.reqHeaders(this.manager));
|
|
142
|
+
// Handle different response formats
|
|
143
|
+
if ((response === null || response === void 0 ? void 0 : response.code) === 0 && response.result) {
|
|
123
144
|
this.energy = response.result;
|
|
124
145
|
logger_1.logger.debug(`[${this.deviceName}] Successfully updated energy data`);
|
|
125
146
|
}
|
|
147
|
+
else if ((response === null || response === void 0 ? void 0 : response.code) === 0) {
|
|
148
|
+
// Some devices return data directly in response
|
|
149
|
+
this.energy = {
|
|
150
|
+
power: response.power || '0',
|
|
151
|
+
voltage: response.voltage || '0',
|
|
152
|
+
energy: response.energy || '0',
|
|
153
|
+
energyToday: response.energy || '0',
|
|
154
|
+
energyWeek: response.energy || '0',
|
|
155
|
+
energyMonth: response.energy || '0',
|
|
156
|
+
energyYear: response.energy || '0'
|
|
157
|
+
};
|
|
158
|
+
logger_1.logger.debug(`[${this.deviceName}] Successfully updated energy data`);
|
|
159
|
+
}
|
|
126
160
|
else {
|
|
127
|
-
|
|
161
|
+
// For error responses, set defaults but don't log as error
|
|
162
|
+
this.energy = {
|
|
163
|
+
power: '0',
|
|
164
|
+
voltage: '0',
|
|
165
|
+
energy: '0',
|
|
166
|
+
energyToday: '0',
|
|
167
|
+
energyWeek: '0',
|
|
168
|
+
energyMonth: '0',
|
|
169
|
+
energyYear: '0'
|
|
170
|
+
};
|
|
171
|
+
logger_1.logger.debug(`[${this.deviceName}] Failed to update energy data: ${JSON.stringify(response)}`);
|
|
128
172
|
}
|
|
129
173
|
}
|
|
130
174
|
/**
|
|
@@ -144,12 +188,12 @@ class VeSyncOutlet extends vesyncBaseDevice_1.VeSyncBaseDevice {
|
|
|
144
188
|
}
|
|
145
189
|
await this.updateEnergy();
|
|
146
190
|
return {
|
|
147
|
-
power: this.energy.power || '
|
|
148
|
-
voltage: this.energy.voltage || '
|
|
149
|
-
energy_today: this.energy.energyToday || '
|
|
150
|
-
energy_week: this.energy.energyWeek || '
|
|
151
|
-
energy_month: this.energy.energyMonth || '
|
|
152
|
-
energy_year: this.energy.energyYear || '
|
|
191
|
+
power: this.energy.power || '0',
|
|
192
|
+
voltage: this.energy.voltage || '0',
|
|
193
|
+
energy_today: this.energy.energyToday || '0',
|
|
194
|
+
energy_week: this.energy.energyWeek || '0',
|
|
195
|
+
energy_month: this.energy.energyMonth || '0',
|
|
196
|
+
energy_year: this.energy.energyYear || '0'
|
|
153
197
|
};
|
|
154
198
|
}
|
|
155
199
|
/**
|
|
@@ -191,11 +235,12 @@ class VeSyncOutlet extends vesyncBaseDevice_1.VeSyncBaseDevice {
|
|
|
191
235
|
};
|
|
192
236
|
const [response] = await helpers_1.Helpers.callApi(isLegacyDevice ? `/${this.getApiPrefix()}/energy/week` : `/${this.getApiPrefix()}/energyweek`, isLegacyDevice ? 'get' : 'post', body, helpers_1.Helpers.reqHeaders(this.manager));
|
|
193
237
|
if ((response === null || response === void 0 ? void 0 : response.code) === 0) {
|
|
194
|
-
this.energy.week = response.result;
|
|
238
|
+
this.energy.week = response.result || response.energyWeek || '0';
|
|
195
239
|
logger_1.logger.debug(`[${this.deviceName}] Successfully retrieved weekly energy data`);
|
|
196
240
|
}
|
|
197
241
|
else {
|
|
198
|
-
|
|
242
|
+
this.energy.week = '0';
|
|
243
|
+
logger_1.logger.debug(`[${this.deviceName}] Failed to get weekly energy data: ${JSON.stringify(response)}`);
|
|
199
244
|
}
|
|
200
245
|
}
|
|
201
246
|
/**
|
|
@@ -214,11 +259,12 @@ class VeSyncOutlet extends vesyncBaseDevice_1.VeSyncBaseDevice {
|
|
|
214
259
|
};
|
|
215
260
|
const [response] = await helpers_1.Helpers.callApi(isLegacyDevice ? `/${this.getApiPrefix()}/energy/month` : `/${this.getApiPrefix()}/energymonth`, isLegacyDevice ? 'get' : 'post', body, helpers_1.Helpers.reqHeaders(this.manager));
|
|
216
261
|
if ((response === null || response === void 0 ? void 0 : response.code) === 0) {
|
|
217
|
-
this.energy.month = response.result;
|
|
262
|
+
this.energy.month = response.result || response.energyMonth || '0';
|
|
218
263
|
logger_1.logger.debug(`[${this.deviceName}] Successfully retrieved monthly energy data`);
|
|
219
264
|
}
|
|
220
265
|
else {
|
|
221
|
-
|
|
266
|
+
this.energy.month = '0';
|
|
267
|
+
logger_1.logger.debug(`[${this.deviceName}] Failed to get monthly energy data: ${JSON.stringify(response)}`);
|
|
222
268
|
}
|
|
223
269
|
}
|
|
224
270
|
/**
|
|
@@ -237,11 +283,12 @@ class VeSyncOutlet extends vesyncBaseDevice_1.VeSyncBaseDevice {
|
|
|
237
283
|
};
|
|
238
284
|
const [response] = await helpers_1.Helpers.callApi(isLegacyDevice ? `/${this.getApiPrefix()}/energy/year` : `/${this.getApiPrefix()}/energyyear`, isLegacyDevice ? 'get' : 'post', body, helpers_1.Helpers.reqHeaders(this.manager));
|
|
239
285
|
if ((response === null || response === void 0 ? void 0 : response.code) === 0) {
|
|
240
|
-
this.energy.year = response.result;
|
|
286
|
+
this.energy.year = response.result || response.energyYear || '0';
|
|
241
287
|
logger_1.logger.debug(`[${this.deviceName}] Successfully retrieved yearly energy data`);
|
|
242
288
|
}
|
|
243
289
|
else {
|
|
244
|
-
|
|
290
|
+
this.energy.year = '0';
|
|
291
|
+
logger_1.logger.debug(`[${this.deviceName}] Failed to get yearly energy data: ${JSON.stringify(response)}`);
|
|
245
292
|
}
|
|
246
293
|
}
|
|
247
294
|
/**
|
package/package.json
CHANGED
package/src/lib/logger.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Logger
|
|
2
|
+
* Logger module for VeSync library
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
export enum LogLevel {
|
|
@@ -10,36 +10,35 @@ export enum LogLevel {
|
|
|
10
10
|
NONE = 4
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
export interface Logger {
|
|
14
|
+
debug: (message: string, ...args: any[]) => void;
|
|
15
|
+
info: (message: string, ...args: any[]) => void;
|
|
16
|
+
warn: (message: string, ...args: any[]) => void;
|
|
17
|
+
error: (message: string, ...args: any[]) => void;
|
|
18
|
+
setLevel?: (level: LogLevel) => void;
|
|
19
|
+
getLevel?: () => LogLevel | undefined;
|
|
20
|
+
}
|
|
18
21
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
Logger.instance = new Logger();
|
|
22
|
-
}
|
|
23
|
-
return Logger.instance;
|
|
24
|
-
}
|
|
22
|
+
class DefaultLogger implements Logger {
|
|
23
|
+
private currentLevel: LogLevel = LogLevel.INFO;
|
|
25
24
|
|
|
26
25
|
setLevel(level: LogLevel): void {
|
|
27
26
|
this.currentLevel = level;
|
|
28
27
|
}
|
|
29
28
|
|
|
30
|
-
getLevel(): LogLevel {
|
|
29
|
+
getLevel(): LogLevel | undefined {
|
|
31
30
|
return this.currentLevel;
|
|
32
31
|
}
|
|
33
32
|
|
|
34
33
|
debug(message: string, ...args: any[]): void {
|
|
35
34
|
if (this.currentLevel <= LogLevel.DEBUG) {
|
|
36
|
-
console.
|
|
35
|
+
console.debug(`[DEBUG] ${message}`, ...args);
|
|
37
36
|
}
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
info(message: string, ...args: any[]): void {
|
|
41
40
|
if (this.currentLevel <= LogLevel.INFO) {
|
|
42
|
-
console.
|
|
41
|
+
console.info(`[INFO] ${message}`, ...args);
|
|
43
42
|
}
|
|
44
43
|
}
|
|
45
44
|
|
|
@@ -56,5 +55,61 @@ export class Logger {
|
|
|
56
55
|
}
|
|
57
56
|
}
|
|
58
57
|
|
|
59
|
-
//
|
|
60
|
-
|
|
58
|
+
// Default logger implementation
|
|
59
|
+
const defaultLogger: Logger = new DefaultLogger();
|
|
60
|
+
|
|
61
|
+
// Current logger instance
|
|
62
|
+
let currentLogger: Logger = defaultLogger;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Set a custom logger implementation
|
|
66
|
+
* @param customLogger - Custom logger implementation
|
|
67
|
+
*/
|
|
68
|
+
export function setLogger(customLogger: Logger): void {
|
|
69
|
+
currentLogger = customLogger;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Reset to default logger
|
|
74
|
+
*/
|
|
75
|
+
export function resetLogger(): void {
|
|
76
|
+
currentLogger = defaultLogger;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Get the current logger instance
|
|
81
|
+
*/
|
|
82
|
+
export function getLogger(): Logger {
|
|
83
|
+
return currentLogger;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Set the log level (only works with default logger)
|
|
88
|
+
* @param level - The log level to set
|
|
89
|
+
*/
|
|
90
|
+
export function setLogLevel(level: LogLevel): void {
|
|
91
|
+
if (currentLogger === defaultLogger) {
|
|
92
|
+
(currentLogger as DefaultLogger).setLevel(level);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Get the current log level (only works with default logger)
|
|
98
|
+
* @returns The current log level or undefined if using custom logger
|
|
99
|
+
*/
|
|
100
|
+
export function getLogLevel(): LogLevel | undefined {
|
|
101
|
+
if (currentLogger === defaultLogger) {
|
|
102
|
+
return (currentLogger as DefaultLogger).getLevel();
|
|
103
|
+
}
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Export the logger interface for use throughout the application
|
|
108
|
+
export const logger: Logger = {
|
|
109
|
+
debug: (message: string, ...args: any[]) => currentLogger.debug(message, ...args),
|
|
110
|
+
info: (message: string, ...args: any[]) => currentLogger.info(message, ...args),
|
|
111
|
+
warn: (message: string, ...args: any[]) => currentLogger.warn(message, ...args),
|
|
112
|
+
error: (message: string, ...args: any[]) => currentLogger.error(message, ...args),
|
|
113
|
+
setLevel: (level: LogLevel) => setLogLevel(level),
|
|
114
|
+
getLevel: () => getLogLevel()
|
|
115
|
+
};
|
package/src/lib/vesync.ts
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
* VeSync API Device Library
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { Helpers, API_RATE_LIMIT, DEFAULT_TZ } from './helpers';
|
|
5
|
+
import { Helpers, API_RATE_LIMIT, DEFAULT_TZ, setApiBaseUrl } from './helpers';
|
|
6
6
|
import { VeSyncBaseDevice } from './vesyncBaseDevice';
|
|
7
7
|
import { fanModules } from './vesyncFanImpl';
|
|
8
8
|
import { outletModules } from './vesyncOutletImpl';
|
|
9
9
|
import { switchModules } from './vesyncSwitchImpl';
|
|
10
10
|
import { bulbModules } from './vesyncBulbImpl';
|
|
11
11
|
import { VeSyncBulb } from './vesyncBulb';
|
|
12
|
-
import { logger } from './logger';
|
|
12
|
+
import { logger, setLogger, Logger } from './logger';
|
|
13
13
|
|
|
14
14
|
const DEFAULT_ENERGY_UPDATE_INTERVAL = 21600;
|
|
15
15
|
|
|
@@ -145,13 +145,22 @@ export class VeSync {
|
|
|
145
145
|
|
|
146
146
|
/**
|
|
147
147
|
* Initialize VeSync Manager
|
|
148
|
+
* @param username - VeSync account username
|
|
149
|
+
* @param password - VeSync account password
|
|
150
|
+
* @param timeZone - Optional timezone (defaults to America/New_York)
|
|
151
|
+
* @param debug - Optional debug mode flag
|
|
152
|
+
* @param redact - Optional redact mode flag
|
|
153
|
+
* @param apiUrl - Optional API base URL override
|
|
154
|
+
* @param customLogger - Optional custom logger implementation
|
|
148
155
|
*/
|
|
149
156
|
constructor(
|
|
150
157
|
username: string,
|
|
151
158
|
password: string,
|
|
152
159
|
timeZone: string = DEFAULT_TZ,
|
|
153
160
|
debug = false,
|
|
154
|
-
redact = true
|
|
161
|
+
redact = true,
|
|
162
|
+
apiUrl?: string,
|
|
163
|
+
customLogger?: Logger
|
|
155
164
|
) {
|
|
156
165
|
this._debug = debug;
|
|
157
166
|
this._redact = redact;
|
|
@@ -182,6 +191,16 @@ export class VeSync {
|
|
|
182
191
|
bulbs: this.bulbs
|
|
183
192
|
};
|
|
184
193
|
|
|
194
|
+
// Set custom API URL if provided
|
|
195
|
+
if (apiUrl) {
|
|
196
|
+
setApiBaseUrl(apiUrl);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Set custom logger if provided
|
|
200
|
+
if (customLogger) {
|
|
201
|
+
setLogger(customLogger);
|
|
202
|
+
}
|
|
203
|
+
|
|
185
204
|
if (typeof timeZone === 'string' && timeZone) {
|
|
186
205
|
const regTest = /[^a-zA-Z/_]/;
|
|
187
206
|
if (regTest.test(timeZone)) {
|
package/src/lib/vesyncOutlet.ts
CHANGED
|
@@ -138,19 +138,61 @@ export abstract class VeSyncOutlet extends VeSyncBaseDevice {
|
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
logger.debug(`[${this.deviceName}] Updating energy data`);
|
|
141
|
-
|
|
141
|
+
|
|
142
|
+
// Different endpoints for different device types
|
|
143
|
+
let url: string;
|
|
144
|
+
if (this.deviceType === 'wifi-switch-1.3') {
|
|
145
|
+
url = `/v1/device/${this.deviceType}-${this.cid}/energy/detail`;
|
|
146
|
+
} else if (this.deviceType.startsWith('ESO15')) {
|
|
147
|
+
url = '/outdoorsocket15a/v1/device/energy';
|
|
148
|
+
} else if (this.deviceType.startsWith('ESW15')) {
|
|
149
|
+
url = '/15a/v1/device/energy';
|
|
150
|
+
} else if (this.deviceType.startsWith('ESW03') || this.deviceType.startsWith('ESW01')) {
|
|
151
|
+
url = '/10a/v1/device/energy';
|
|
152
|
+
} else {
|
|
153
|
+
url = '/v1/device/energy';
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const body = this.deviceType === 'wifi-switch-1.3' ? null : {
|
|
157
|
+
...Helpers.reqBody(this.manager, 'energy'),
|
|
158
|
+
uuid: this.uuid
|
|
159
|
+
};
|
|
160
|
+
|
|
142
161
|
const [response] = await Helpers.callApi(
|
|
143
162
|
url,
|
|
144
|
-
'get',
|
|
145
|
-
|
|
163
|
+
this.deviceType === 'wifi-switch-1.3' ? 'get' : 'post',
|
|
164
|
+
body,
|
|
146
165
|
Helpers.reqHeaders(this.manager)
|
|
147
166
|
);
|
|
148
167
|
|
|
149
|
-
|
|
168
|
+
// Handle different response formats
|
|
169
|
+
if (response?.code === 0 && response.result) {
|
|
150
170
|
this.energy = response.result;
|
|
151
171
|
logger.debug(`[${this.deviceName}] Successfully updated energy data`);
|
|
172
|
+
} else if (response?.code === 0) {
|
|
173
|
+
// Some devices return data directly in response
|
|
174
|
+
this.energy = {
|
|
175
|
+
power: response.power || '0',
|
|
176
|
+
voltage: response.voltage || '0',
|
|
177
|
+
energy: response.energy || '0',
|
|
178
|
+
energyToday: response.energy || '0',
|
|
179
|
+
energyWeek: response.energy || '0',
|
|
180
|
+
energyMonth: response.energy || '0',
|
|
181
|
+
energyYear: response.energy || '0'
|
|
182
|
+
};
|
|
183
|
+
logger.debug(`[${this.deviceName}] Successfully updated energy data`);
|
|
152
184
|
} else {
|
|
153
|
-
|
|
185
|
+
// For error responses, set defaults but don't log as error
|
|
186
|
+
this.energy = {
|
|
187
|
+
power: '0',
|
|
188
|
+
voltage: '0',
|
|
189
|
+
energy: '0',
|
|
190
|
+
energyToday: '0',
|
|
191
|
+
energyWeek: '0',
|
|
192
|
+
energyMonth: '0',
|
|
193
|
+
energyYear: '0'
|
|
194
|
+
};
|
|
195
|
+
logger.debug(`[${this.deviceName}] Failed to update energy data: ${JSON.stringify(response)}`);
|
|
154
196
|
}
|
|
155
197
|
}
|
|
156
198
|
|
|
@@ -172,12 +214,12 @@ export abstract class VeSyncOutlet extends VeSyncBaseDevice {
|
|
|
172
214
|
|
|
173
215
|
await this.updateEnergy();
|
|
174
216
|
return {
|
|
175
|
-
power: this.energy.power || '
|
|
176
|
-
voltage: this.energy.voltage || '
|
|
177
|
-
energy_today: this.energy.energyToday || '
|
|
178
|
-
energy_week: this.energy.energyWeek || '
|
|
179
|
-
energy_month: this.energy.energyMonth || '
|
|
180
|
-
energy_year: this.energy.energyYear || '
|
|
217
|
+
power: this.energy.power || '0',
|
|
218
|
+
voltage: this.energy.voltage || '0',
|
|
219
|
+
energy_today: this.energy.energyToday || '0',
|
|
220
|
+
energy_week: this.energy.energyWeek || '0',
|
|
221
|
+
energy_month: this.energy.energyMonth || '0',
|
|
222
|
+
energy_year: this.energy.energyYear || '0'
|
|
181
223
|
};
|
|
182
224
|
}
|
|
183
225
|
|
|
@@ -228,10 +270,11 @@ export abstract class VeSyncOutlet extends VeSyncBaseDevice {
|
|
|
228
270
|
);
|
|
229
271
|
|
|
230
272
|
if (response?.code === 0) {
|
|
231
|
-
this.energy.week = response.result;
|
|
273
|
+
this.energy.week = response.result || response.energyWeek || '0';
|
|
232
274
|
logger.debug(`[${this.deviceName}] Successfully retrieved weekly energy data`);
|
|
233
275
|
} else {
|
|
234
|
-
|
|
276
|
+
this.energy.week = '0';
|
|
277
|
+
logger.debug(`[${this.deviceName}] Failed to get weekly energy data: ${JSON.stringify(response)}`);
|
|
235
278
|
}
|
|
236
279
|
}
|
|
237
280
|
|
|
@@ -259,10 +302,11 @@ export abstract class VeSyncOutlet extends VeSyncBaseDevice {
|
|
|
259
302
|
);
|
|
260
303
|
|
|
261
304
|
if (response?.code === 0) {
|
|
262
|
-
this.energy.month = response.result;
|
|
305
|
+
this.energy.month = response.result || response.energyMonth || '0';
|
|
263
306
|
logger.debug(`[${this.deviceName}] Successfully retrieved monthly energy data`);
|
|
264
307
|
} else {
|
|
265
|
-
|
|
308
|
+
this.energy.month = '0';
|
|
309
|
+
logger.debug(`[${this.deviceName}] Failed to get monthly energy data: ${JSON.stringify(response)}`);
|
|
266
310
|
}
|
|
267
311
|
}
|
|
268
312
|
|
|
@@ -290,10 +334,11 @@ export abstract class VeSyncOutlet extends VeSyncBaseDevice {
|
|
|
290
334
|
);
|
|
291
335
|
|
|
292
336
|
if (response?.code === 0) {
|
|
293
|
-
this.energy.year = response.result;
|
|
337
|
+
this.energy.year = response.result || response.energyYear || '0';
|
|
294
338
|
logger.debug(`[${this.deviceName}] Successfully retrieved yearly energy data`);
|
|
295
339
|
} else {
|
|
296
|
-
|
|
340
|
+
this.energy.year = '0';
|
|
341
|
+
logger.debug(`[${this.deviceName}] Failed to get yearly energy data: ${JSON.stringify(response)}`);
|
|
297
342
|
}
|
|
298
343
|
}
|
|
299
344
|
|