diff options
| author | James Barnett <noreply@jamesbarnett.xyz> | 2018-04-07 21:43:17 +0100 |
|---|---|---|
| committer | James Barnett <noreply@jamesbarnett.xyz> | 2018-04-07 21:43:17 +0100 |
| commit | 1301d90e93af799a9054f133847ebf3cbda15f9d (patch) | |
| tree | 7c9e12431c63a7a52523d2cd1f15e144dcaf680f /services/data-fetcher.js | |
| parent | 24b4a39fce61dd9bd8ab7757f3bbda0636adc8c9 (diff) | |
| download | tplink-energy-monitor-1301d90e93af799a9054f133847ebf3cbda15f9d.tar.xz tplink-energy-monitor-1301d90e93af799a9054f133847ebf3cbda15f9d.zip | |
Add support for switching between multiple plugs
Diffstat (limited to 'services/data-fetcher.js')
| -rw-r--r-- | services/data-fetcher.js | 247 |
1 files changed, 148 insertions, 99 deletions
diff --git a/services/data-fetcher.js b/services/data-fetcher.js index 93f5020..7ef3594 100644 --- a/services/data-fetcher.js +++ b/services/data-fetcher.js @@ -10,31 +10,34 @@ setTimeout(function() { fetchDailyUsage(); fetchMonthlyUsage(); fetchPowerState(); -}, 5000) +}, 2000) -let cachedRealtimeUsageData = {}; -let cachedDailyUsageData = {}; -let cachedMonthlyUsageData = {}; -let cachedPowerState = {}; +let cachedRealtimeUsageData = []; +let cachedDailyUsageData = []; +let cachedMonthlyUsageData = []; +let cachedPowerState = []; function fetchRealtimeUsage() { - let deviceId = 1; // TODO + if(app.getWsClientCount() > 0 || cachedRealtimeUsageData.length === 0) { - console.log('connected clients', app.getWsClientCount()); - if(app.getWsClientCount() > 0) { - deviceManager.getDevice(deviceId).emeter.getRealtime().then(response => { + deviceManager.getAllDevices().forEach(device => { - // Voltage seems to be reported as its peak to peak value, not RMS. - // Show the RMS value since thats what would you expect to see. - // i.e. 220v not 310v (in the U.K) - response.voltage = response.voltage / Math.sqrt(2); + let deviceId = device.deviceId; + device.emeter.getRealtime().then(response => { - cachedRealtimeUsageData = response; - - dataBroadcaster.broadcastRealtimeUsageUpdate(response); + // Voltage seems to be reported as its peak to peak value, not RMS. + // Show the RMS value since thats what would you expect to see. + // i.e. 220v not 310v (in the U.K) + response.voltage = response.voltage / Math.sqrt(2); + updateCache(cachedRealtimeUsageData, deviceId, response); + + dataBroadcaster.broadcastRealtimeUsageUpdate(deviceId, response); + }); + }); + } setTimeout(fetchRealtimeUsage, 1000); @@ -42,107 +45,127 @@ function fetchRealtimeUsage() { function fetchDailyUsage() { - let deviceId = 1; - - // Get last x days - let totalDaysRequired = 30; // TODO currently only works for up to 2 months spans - let currentMoment = moment(); - let previousMoment = moment().subtract(totalDaysRequired, 'days'); - - // Month + 1 as the API months are index 1 based. - deviceManager.getDevice(deviceId).emeter.getDayStats(currentMoment.year(), currentMoment.month() +1).then(currentPeriodStats => { - - // Check if we also need the previous month to meet the required total number of samples - if(currentMoment.month() !== previousMoment.month()) { + if(app.getWsClientCount() > 0 || cachedDailyUsageData.length === 0) { + + // Get last x days + let totalDaysRequired = 30; // TODO currently only works for up to 2 months spans + let currentMoment = moment(); + let previousMoment = moment().subtract(totalDaysRequired, 'days'); + + // Month + 1 as the API months are index 1 based. + deviceManager.getAllDevices().forEach(device => { + + let deviceId = device.deviceId; + device.emeter.getDayStats(currentMoment.year(), currentMoment.month() +1).then(currentPeriodStats => { + + // Check if we also need the previous month to meet the required total number of samples + if(currentMoment.month() !== previousMoment.month()) { + + // Get previous month. This currently wont work if the previousMoment is more than 1 month before the currentMoment (see above) + device.emeter.getDayStats(previousMoment.year(), previousMoment.month() +1).then(previousPeriodStats => { + + let currentMonthStats = fillMissingDays(currentPeriodStats, currentMoment); + let previousMonthStats = fillMissingDays(previousPeriodStats, previousMoment); + let combinedStats = previousMonthStats.concat(currentMonthStats); + + let result = trimStatResults(combinedStats, totalDaysRequired); + + updateCache(cachedDailyUsageData, deviceId, result); + + dataBroadcaster.broadcastDailyUsageUpdate(deviceId, result); + + }); + } + else { + let dayStats = fillMissingDays(currentPeriodStats, currentMoment); - // Get previous month. This currently wont work if the previousMoment is more than 1 month before the currentMoment (see above) - deviceManager.getDevice(deviceId).emeter.getDayStats(previousMoment.year(), previousMoment.month() +1).then(previousPeriodStats => { - - let currentMonthStats = fillMissingDays(currentPeriodStats, currentMoment); - let previousMonthStats = fillMissingDays(previousPeriodStats, previousMoment); - let combinedStats = previousMonthStats.concat(currentMonthStats); - - let result = trimStatResults(combinedStats, totalDaysRequired); - - cachedDailyUsageData = result; - - dataBroadcaster.broadcastDailyUsageUpdate(result); - + let result = trimStatResults(dayStats, totalDaysRequired); + updateCache(cachedDailyUsageData, deviceId, result); + + dataBroadcaster.broadcastDailyUsageUpdate(deviceId, result); + } + }); - } - else { - let dayStats = fillMissingDays(currentPeriodStats, currentMoment); - - let result = trimStatResults(dayStats, totalDaysRequired); - cachedDailyUsageData = result; - dataBroadcaster.broadcastDailyUsageUpdate(result); - } + }); - }); + } setTimeout(fetchDailyUsage, 300000); // 5 mins; } function fetchMonthlyUsage() { - let deviceId = 1; - - // Get last x months - let totalMonthsRequired = 12; // TODO currently only works for up to 14 month (2 year) spans - let currentMoment = moment(); - let previousMoment = moment().subtract(totalMonthsRequired, 'months'); - - deviceManager.getDevice(deviceId).emeter.getMonthStats(currentMoment.year()).then(currentPeriodStats => { - - // Check if we also need the previous year to meet the required total number of samples - if(currentMoment.month() + 1 < totalMonthsRequired) { - - // Get previous year (assuming the totalMonthsRequired limit described above). - deviceManager.getDevice(deviceId).emeter.getMonthStats(previousMoment.year()).then(previousPeriodStats => { - - let currentYearStats = fillMissingMonths(currentPeriodStats, currentMoment); - let previousYearStats = fillMissingMonths(previousPeriodStats, previousMoment); - let combinedStats = previousYearStats.concat(currentYearStats); - - let result = trimStatResults(combinedStats, totalMonthsRequired); - - cachedMonthlyUsageData = result; - - dataBroadcaster.broadcastMonthlyUsageUpdate(result); - + if(app.getWsClientCount() > 0 || cachedMonthlyUsageData.length === 0) { + + // Get last x months + let totalMonthsRequired = 12; // TODO currently only works for up to 14 month (2 year) spans + let currentMoment = moment(); + let previousMoment = moment().subtract(totalMonthsRequired, 'months'); + + deviceManager.getAllDevices().forEach(device => { + + let deviceId = device.deviceId; + device.emeter.getMonthStats(currentMoment.year()).then(currentPeriodStats => { + + // Check if we also need the previous year to meet the required total number of samples + if(currentMoment.month() + 1 < totalMonthsRequired) { + + // Get previous year (assuming the totalMonthsRequired limit described above). + device.emeter.getMonthStats(previousMoment.year()).then(previousPeriodStats => { + + let currentYearStats = fillMissingMonths(currentPeriodStats, currentMoment); + let previousYearStats = fillMissingMonths(previousPeriodStats, previousMoment); + let combinedStats = previousYearStats.concat(currentYearStats); + + let result = trimStatResults(combinedStats, totalMonthsRequired); + + updateCache(cachedMonthlyUsageData, deviceId, result); + + dataBroadcaster.broadcastMonthlyUsageUpdate(deviceId, result); + + }); + } + else { + let monthStats = fillMissingMonths(currentPeriodStats, currentMoment); + + let result = trimStatResults(monthStats, totalMonthsRequired); + + updateCache(cachedMonthlyUsageData, deviceId, result); + + dataBroadcaster.broadcastMonthlyUsageUpdate(deviceId, result); + } + }); - } - else { - let monthStats = fillMissingMonths(currentPeriodStats, currentMoment); - - let result = trimStatResults(monthStats, totalMonthsRequired); - cachedMonthlyUsageData = result; - - dataBroadcaster.broadcastMonthlyUsageUpdate(result); - } + }); - }); + } setTimeout(fetchMonthlyUsage, 1800000); // 30 mins } function fetchPowerState() { - let deviceId = 1 + if(app.getWsClientCount() > 0 || cachedPowerState.length === 0) { - deviceManager.getDevice(deviceId).getSysInfo().then(response => { + deviceManager.getAllDevices().forEach(device => { - let powerState = { - isOn: (response.relay_state === 1), - uptime: response.on_time - }; + let deviceId = device.deviceId; + device.getSysInfo().then(response => { - cachedPowerState = powerState; - dataBroadcaster.broadcastPowerStateUpdate(powerState); - }); + let powerState = { + isOn: (response.relay_state === 1), + uptime: response.on_time + }; + + updateCache(cachedPowerState, deviceId, powerState); + dataBroadcaster.broadcastPowerStateUpdate(deviceId, powerState); + }); + }); + + } setTimeout(fetchPowerState, 60000); } @@ -218,11 +241,37 @@ function trimStatResults(stats, maxSamples) { return stats.splice(stats.length - maxSamples, stats.length); } -module.exports.getCachedData = function() { +function getCachedData(cache, deviceId) { + let cacheEntry = cache.find(d => d.deviceId == deviceId); + if(cacheEntry === undefined) { + return cacheEntry; + } + else { + return cacheEntry.data; + } +} + +function updateCache(cache, deviceId, data) { + + let cachedData = cache.find(d => d.deviceId == deviceId); + + if(cachedData === undefined) { + cache.push({ + deviceId: deviceId, + data: data + }); + } + else { + cachedData.data = data; + } +} + +module.exports.getCachedData = function(deviceId) { + return { - realtimeUsage: cachedRealtimeUsageData, - dailyUsage: cachedDailyUsageData, - monthlyUsage: cachedMonthlyUsageData, - powerState: cachedPowerState + realtimeUsage: getCachedData(cachedRealtimeUsageData, deviceId), + dailyUsage: getCachedData(cachedDailyUsageData, deviceId), + monthlyUsage: getCachedData(cachedMonthlyUsageData, deviceId), + powerState: getCachedData(cachedPowerState, deviceId) } }
\ No newline at end of file |