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:
Martin M
2019-08-19 23:05:52 -03:00
committed by GitHub
parent 420d6746a6
commit 171faa617b
16 changed files with 217 additions and 182 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -1,7 +0,0 @@
const deviceRawPowerUsage = require('./deviceRawPowerUsage');
const currentMonthPowerUsage = require('./currentMonthPowerUsage');
module.exports = {
deviceRawPowerUsage,
currentMonthPowerUsage,
};

View File

@@ -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;