diff options
| author | James Barnett <james.barnett@fivium.co.uk> | 2018-10-21 19:19:21 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-10-21 19:19:21 +0100 |
| commit | 70f8a9aefe5ff56c44a871cdeef702f904e118f6 (patch) | |
| tree | dea50b1cfb3af425cdf8fa12df553ae7b5377c6d /services/data-logger.js | |
| parent | 7b699c8ca08aba2b400ce2cc04a5315c96ffae61 (diff) | |
| parent | c571c1d59031eaf510e560f3bdc62df2374ba45f (diff) | |
| download | tplink-energy-monitor-70f8a9aefe5ff56c44a871cdeef702f904e118f6.tar.xz tplink-energy-monitor-70f8a9aefe5ff56c44a871cdeef702f904e118f6.zip | |
Merge pull request #9 from jamesbarnett91/log-realtime-usage
Log realtime usage
Diffstat (limited to 'services/data-logger.js')
| -rw-r--r-- | services/data-logger.js | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/services/data-logger.js b/services/data-logger.js new file mode 100644 index 0000000..9c23de1 --- /dev/null +++ b/services/data-logger.js @@ -0,0 +1,94 @@ +const fs = require('fs'); +const dataBroadcaster = require('./data-broadcaster'); + +let logIntervalMs; +let maxLogEntries; + +loadLogConfig(); + +function loadLogConfig() { + try { + let config = JSON.parse(fs.readFileSync('logger-config.json', 'utf8')); + logIntervalMs = (config.logIntervalSeconds * 1000); + maxLogEntries = config.maxLogEntries; + + } + catch (err) { + console.warn('Error reading logger config. Reverting to defaults.', err); + logIntervalMs = 60000 // 1 min + maxLogEntries = 1440 // 24 hrs at 1/min + } +} + +function startLogging(device) { + setInterval(() => { log(device); }, logIntervalMs); + console.log('Logging started for ' + device.alias + ' [' + device.deviceId + '] every ' + (logIntervalMs/1000) + ' seconds'); +} + +function writeLog(filePath, log) { + fs.writeFile(filePath, JSON.stringify(log), { flag: 'w' }, (err) => { + if (err) { + console.warn('Error writing log for ' + device.alias + ' [' + device.deviceId + ']', err); + } + }); +} + +function getLogEntries(filePath, callback) { + + fs.access(filePath, fs.constants.F_OK, (err) => { + if(err) { + // No log file, init empty one + writeLog(filePath, []); + callback([]); + } + else { + fs.readFile(filePath, 'utf8', (err, data) => { + if (err) { + console.warn('Error reading usage log ' + filePath, err); + callback([]); + } + else { + callback(JSON.parse(data)); + } + }); + } + }); +} + +function log(device) { + + device.emeter.getRealtime().then(response => { + + let logEntry = { + ts: Date.now(), + pw: (('power_mw' in response) ? (response.power_mw / 1000) : response.power) + } + + let filePath = getLogPath(device.deviceId); + + getLogEntries(filePath, (entries) => { + entries.push(logEntry) + + // Remove old entries + entries.splice(0, entries.length - maxLogEntries); + + writeLog(filePath, entries); + dataBroadcaster.broadcastNewLogEntry(device.deviceId, logEntry); + }) + + }); +} + +function getLogPath(deviceId) { + return deviceId + '-log.json'; +} + +function getLogEntriesForDevice(deviceId, callback) { + return getLogEntries(getLogPath(deviceId), callback); +} + +module.exports = { + startLogging: startLogging, + log: log, + getLogEntriesForDevice: getLogEntriesForDevice +}
\ No newline at end of file |