UNPKG

node-red-contrib-tplink-tapo-connect-api

Version:

This unofficial node-RED node allows connection to TP-Link Tapo devices. This project has been enhanced with AI support to enable new features. Starting with v0.50, we have added support for the KLAP protocol. To prioritize the operation of this node, we

151 lines 5.48 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EnergyController = void 0; /** * Controller for energy monitoring functionality * Single responsibility: Energy data retrieval and management */ class EnergyController { constructor(sendRequest) { this.sendRequest = sendRequest; } /** * Get current energy usage information */ async getEnergyUsage() { const request = { method: 'get_energy_usage', params: {} }; const response = await this.sendRequest(request); // Handle different response formats if (response.error_code !== undefined) { // Standard TAPO API response format: {error_code: 0, result: {...}} if (response.error_code !== 0) { throw new Error(`Failed to get energy usage: ${response.error_code}`); } return response.result; } else { // Direct energy data response format (KLAP protocol) return response; } } /** * Get current power consumption */ async getCurrentPower() { var _a, _b, _c; const request = { method: 'get_current_power', params: {} }; const response = await this.sendRequest(request); // Handle different response formats if (response.error_code !== undefined) { // Standard TAPO API response format: {error_code: 0, result: {...}} if (response.error_code !== 0) { throw new Error(`Failed to get current power: ${response.error_code}`); } return (_b = (_a = response.result) === null || _a === void 0 ? void 0 : _a.current_power) !== null && _b !== void 0 ? _b : 0; } else { // Direct response format (KLAP protocol) - response itself contains current_power return (_c = response === null || response === void 0 ? void 0 : response.current_power) !== null && _c !== void 0 ? _c : 0; } } /** * Get energy statistics for specified period */ async getEnergyStatistics(interval = 'day') { const request = { method: 'get_energy_data', params: { interval, start_timestamp: this.getStartTimestamp(interval) } }; const response = await this.sendRequest(request); // Handle different response formats if (response.error_code !== undefined) { // Standard TAPO API response format: {error_code: 0, result: {...}} if (response.error_code !== 0) { throw new Error(`Failed to get energy statistics: ${response.error_code}`); } return response.result; } else { // Direct response format (KLAP protocol) return response; } } /** * Check if device supports energy monitoring */ static supportsEnergyMonitoring(deviceModel) { const supportedModels = [ 'P110', 'P110M', 'P115', // Plugs with energy monitoring 'HS110', // Legacy models 'KP115', 'KP125' // Kasa models ]; return supportedModels.some(model => deviceModel.toUpperCase().includes(model.toUpperCase())); } /** * Validate energy usage data */ validateEnergyData(data) { // Check if essential fields are present const hasRequiredFields = data.current_power !== undefined || data.today_energy !== undefined || data.today_runtime !== undefined; // Check for reasonable values const hasValidValues = (data.current_power === undefined || data.current_power >= 0) && (data.today_energy === undefined || data.today_energy >= 0) && (data.today_runtime === undefined || data.today_runtime >= 0); return hasRequiredFields && hasValidValues; } /** * Format energy data for display */ formatEnergyData(data) { const parts = []; if (data.current_power !== undefined) { parts.push(`Current Power: ${data.current_power}W`); } if (data.today_energy !== undefined) { parts.push(`Today Energy: ${data.today_energy}Wh`); } if (data.today_runtime !== undefined) { const hours = Math.floor(data.today_runtime / 60); const minutes = data.today_runtime % 60; parts.push(`Today Runtime: ${hours}h ${minutes}m`); } if (data.month_energy !== undefined) { parts.push(`Month Energy: ${data.month_energy}Wh`); } return parts.join(', '); } /** * Get start timestamp for statistics query */ getStartTimestamp(interval) { const now = new Date(); const start = new Date(now); switch (interval) { case 'day': start.setHours(0, 0, 0, 0); break; case 'week': start.setDate(start.getDate() - 7); start.setHours(0, 0, 0, 0); break; case 'month': start.setMonth(start.getMonth() - 1); start.setHours(0, 0, 0, 0); break; } return Math.floor(start.getTime() / 1000); } } exports.EnergyController = EnergyController; //# sourceMappingURL=energy-controller.js.map