mirror of
https://github.com/skydiver/ewelink-api.git
synced 2026-01-04 03:54:59 +01:00
Release v1.4.0 (#11)
* refactor websocket / power usage * cooldown between api requests during testing * refactor power state methods * remove unused code * cooldown between api requests during testing * version bump
This commit is contained in:
@@ -1,38 +0,0 @@
|
||||
/**
|
||||
* Return daily power usage
|
||||
*
|
||||
* @param hundredDaysKwhData
|
||||
*
|
||||
* @returns {{daily: *, monthly: *}}
|
||||
*/
|
||||
const currentMonthPowerUsage = ({ hundredDaysKwhData }) => {
|
||||
const today = new Date();
|
||||
const days = today.getDate();
|
||||
|
||||
let monthlyUsage = 0;
|
||||
const dailyUsage = [];
|
||||
|
||||
for (let day = 0; day < days; day += 1) {
|
||||
const s = hundredDaysKwhData.substr(6 * day, 2);
|
||||
const c = hundredDaysKwhData.substr(6 * day + 2, 2);
|
||||
const f = hundredDaysKwhData.substr(6 * day + 4, 2);
|
||||
const h = parseInt(s, 16);
|
||||
const y = parseInt(c, 16);
|
||||
const I = parseInt(f, 16);
|
||||
const E = parseFloat(`${h}.${y}${I}`);
|
||||
|
||||
dailyUsage.push({
|
||||
day: days - day,
|
||||
usage: E,
|
||||
});
|
||||
|
||||
monthlyUsage += E;
|
||||
}
|
||||
|
||||
return {
|
||||
monthly: monthlyUsage,
|
||||
daily: dailyUsage,
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = currentMonthPowerUsage;
|
||||
@@ -1,50 +0,0 @@
|
||||
const WebSocketRequest = require('../websocket');
|
||||
const payloads = require('../payloads');
|
||||
const { _get } = require('../helpers');
|
||||
|
||||
/**
|
||||
* Get specific device power usage (raw data)
|
||||
*
|
||||
* @param apiUrl
|
||||
* @param at
|
||||
* @param apiKey
|
||||
* @param deviceId
|
||||
*
|
||||
* @returns {Promise<{error: string}|{response: {hundredDaysKwhData: *}, status: string}>}
|
||||
*/
|
||||
const deviceRawPowerUsage = async ({ apiUrl, at, apiKey, deviceId }) => {
|
||||
const payloadLogin = payloads.wssLoginPayload({ at, apiKey });
|
||||
|
||||
const payloadUpdate = payloads.wssUpdatePayload({
|
||||
apiKey,
|
||||
deviceId,
|
||||
params: { hundredDaysKwh: 'get' },
|
||||
});
|
||||
|
||||
const response = await WebSocketRequest(apiUrl, [
|
||||
payloadLogin,
|
||||
payloadUpdate,
|
||||
]);
|
||||
|
||||
const error = _get(response, 'error', false);
|
||||
if (error) {
|
||||
return response;
|
||||
}
|
||||
|
||||
const hundredDaysKwhData = _get(
|
||||
response[1],
|
||||
'config.hundredDaysKwhData',
|
||||
false
|
||||
);
|
||||
|
||||
if (!hundredDaysKwhData) {
|
||||
return { error: 'No power usage data found.' };
|
||||
}
|
||||
|
||||
return {
|
||||
status: 'ok',
|
||||
data: { hundredDaysKwhData },
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = deviceRawPowerUsage;
|
||||
@@ -1,7 +0,0 @@
|
||||
const deviceRawPowerUsage = require('./deviceRawPowerUsage');
|
||||
const currentMonthPowerUsage = require('./currentMonthPowerUsage');
|
||||
|
||||
module.exports = {
|
||||
deviceRawPowerUsage,
|
||||
currentMonthPowerUsage,
|
||||
};
|
||||
@@ -1,53 +0,0 @@
|
||||
const W3CWebSocket = require('websocket').w3cwebsocket;
|
||||
const WebSocketAsPromised = require('websocket-as-promised');
|
||||
const delay = require('delay');
|
||||
|
||||
/**
|
||||
* Parse WebSocket errors and return user friendly messages
|
||||
*
|
||||
* @param e
|
||||
*
|
||||
* @returns {{error: string}|{msg: string, error: number}}
|
||||
*/
|
||||
const customThrowError = e => {
|
||||
const loginError = e.message.indexOf('WebSocket is not opened');
|
||||
if (loginError > -1) {
|
||||
return { error: 401, msg: 'Authentication error' };
|
||||
}
|
||||
return { error: 'An unknown error occurred' };
|
||||
};
|
||||
|
||||
/**
|
||||
* Open WebSocket connection and send provided payloads
|
||||
*
|
||||
* @param url
|
||||
* @param payloads
|
||||
* @param delayTime
|
||||
*
|
||||
* @returns {Array}
|
||||
*/
|
||||
const WebSocketRequest = async (url, payloads, ...{ delayTime = 1000 }) => {
|
||||
const wsp = new WebSocketAsPromised(url, {
|
||||
createWebSocket: wss => new W3CWebSocket(wss),
|
||||
});
|
||||
|
||||
const responses = [];
|
||||
wsp.onMessage.addListener(message => responses.push(JSON.parse(message)));
|
||||
|
||||
try {
|
||||
await wsp.open();
|
||||
|
||||
for (const payload of payloads) {
|
||||
await wsp.send(payload);
|
||||
await delay(delayTime);
|
||||
}
|
||||
|
||||
await wsp.close();
|
||||
} catch (e) {
|
||||
return customThrowError(e);
|
||||
}
|
||||
|
||||
return responses;
|
||||
};
|
||||
|
||||
module.exports = WebSocketRequest;
|
||||
Reference in New Issue
Block a user