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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Logger utility for TSVeSync
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 declare class Logger {
12
- private static instance;
13
- private currentLevel;
14
- private constructor();
15
- static getInstance(): Logger;
16
- setLevel(level: LogLevel): void;
17
- getLevel(): LogLevel;
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;
@@ -1,9 +1,14 @@
1
1
  "use strict";
2
2
  /**
3
- * Logger utility for TSVeSync
3
+ * Logger module for VeSync library
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.logger = exports.Logger = exports.LogLevel = void 0;
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 Logger {
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.log(`[DEBUG] ${message}`, ...args);
32
+ console.debug(`[DEBUG] ${message}`, ...args);
34
33
  }
35
34
  }
36
35
  info(message, ...args) {
37
36
  if (this.currentLevel <= LogLevel.INFO) {
38
- console.log(`[INFO] ${message}`, ...args);
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
- exports.Logger = Logger;
53
- // Export singleton instance
54
- exports.logger = Logger.getInstance();
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
+ };
@@ -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
  */
@@ -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)) {
@@ -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
- const url = `/v1/${this.deviceType}/${this.deviceType}-${this.cid}/energy/detail`;
121
- const [response] = await helpers_1.Helpers.callApi(url, 'get', null, helpers_1.Helpers.reqHeaders(this.manager));
122
- if ((response === null || response === void 0 ? void 0 : response.code) === 0) {
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
- logger_1.logger.error(`[${this.deviceName}] Failed to update energy data: ${JSON.stringify(response)}`);
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 || 'Not available',
148
- voltage: this.energy.voltage || 'Not available',
149
- energy_today: this.energy.energyToday || 'Not available',
150
- energy_week: this.energy.energyWeek || 'Not available',
151
- energy_month: this.energy.energyMonth || 'Not available',
152
- energy_year: this.energy.energyYear || 'Not available'
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
- logger_1.logger.error(`[${this.deviceName}] Failed to get weekly energy data: ${JSON.stringify(response)}`);
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
- logger_1.logger.error(`[${this.deviceName}] Failed to get monthly energy data: ${JSON.stringify(response)}`);
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
- logger_1.logger.error(`[${this.deviceName}] Failed to get yearly energy data: ${JSON.stringify(response)}`);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tsvesync",
3
- "version": "1.0.16",
3
+ "version": "1.0.18",
4
4
  "description": "A TypeScript library for interacting with VeSync smart home devices",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/lib/logger.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Logger utility for TSVeSync
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 class Logger {
14
- private static instance: Logger;
15
- private currentLevel: LogLevel = LogLevel.INFO;
16
-
17
- private constructor() {}
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
- static getInstance(): Logger {
20
- if (!Logger.instance) {
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.log(`[DEBUG] ${message}`, ...args);
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.log(`[INFO] ${message}`, ...args);
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
- // Export singleton instance
60
- export const logger = Logger.getInstance();
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)) {
@@ -138,19 +138,61 @@ export abstract class VeSyncOutlet extends VeSyncBaseDevice {
138
138
  }
139
139
 
140
140
  logger.debug(`[${this.deviceName}] Updating energy data`);
141
- const url = `/v1/${this.deviceType}/${this.deviceType}-${this.cid}/energy/detail`;
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
- null,
163
+ this.deviceType === 'wifi-switch-1.3' ? 'get' : 'post',
164
+ body,
146
165
  Helpers.reqHeaders(this.manager)
147
166
  );
148
167
 
149
- if (response?.code === 0) {
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
- logger.error(`[${this.deviceName}] Failed to update energy data: ${JSON.stringify(response)}`);
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 || 'Not available',
176
- voltage: this.energy.voltage || 'Not available',
177
- energy_today: this.energy.energyToday || 'Not available',
178
- energy_week: this.energy.energyWeek || 'Not available',
179
- energy_month: this.energy.energyMonth || 'Not available',
180
- energy_year: this.energy.energyYear || 'Not available'
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
- logger.error(`[${this.deviceName}] Failed to get weekly energy data: ${JSON.stringify(response)}`);
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
- logger.error(`[${this.deviceName}] Failed to get monthly energy data: ${JSON.stringify(response)}`);
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
- logger.error(`[${this.deviceName}] Failed to get yearly energy data: ${JSON.stringify(response)}`);
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