aboutsummaryrefslogtreecommitdiff
path: root/services/data-logger.js
diff options
context:
space:
mode:
authorJames Barnett <noreply@jamesbarnett.xyz>2018-10-07 16:09:42 +0100
committerJames Barnett <noreply@jamesbarnett.xyz>2018-10-07 16:09:42 +0100
commit8cecaff1ae7240902249676b7d24fadca03fc5a9 (patch)
treea381cd45ffa4577dd1818eb192c5ebaf53ae0b7d /services/data-logger.js
parentffadea4389bcf777b049d75a0f3bae5155b7d584 (diff)
downloadtplink-energy-monitor-8cecaff1ae7240902249676b7d24fadca03fc5a9.tar.xz
tplink-energy-monitor-8cecaff1ae7240902249676b7d24fadca03fc5a9.zip
Basic logging functionality. Logs every 60s.
Needs log rotation/management to avoid huge logfiles.
Diffstat (limited to 'services/data-logger.js')
-rw-r--r--services/data-logger.js59
1 files changed, 59 insertions, 0 deletions
diff --git a/services/data-logger.js b/services/data-logger.js
new file mode 100644
index 0000000..0948221
--- /dev/null
+++ b/services/data-logger.js
@@ -0,0 +1,59 @@
+const fs = require('fs');
+const dataBroadcaster = require('./data-broadcaster');
+
+function startLogging(device) {
+ setInterval(() => { log(device); }, 60000);
+ console.log('Logging started for ' + device.alias + ' [' + device.deviceId + ']');
+}
+
+function log(device) {
+
+ device.emeter.getRealtime().then(response => {
+
+ let logEntry = {
+ timestamp: Date.now(),
+ power: (('power_mw' in response) ? (response.power_mw / 1000) : response.power)
+ }
+
+ // TODO only log up to a max number of entries
+
+ fs.writeFile(device.deviceId + '-log.json', JSON.stringify(logEntry) + '\n', { flag: 'a' }, (err) => {
+ if(err) {
+ console.warn('Error writing log entry for ' + device.alias + ' [' + device.deviceId + ']', err);
+ }
+ else {
+ dataBroadcaster.broadcastNewLogEntry(device.deviceId, logEntry);
+ }
+
+ });
+
+ });
+
+}
+
+function getAllEntries(deviceId, callback) {
+ fs.readFile(deviceId + '-log.json', 'utf8', (err, data) => {
+ if(err) {
+ console.warn('Error reading usage log ' + deviceId + '-log.json', err);
+ return;
+ }
+ else {
+ let logLines = data.split(/\r?\n/);
+ let logEntries = [];
+
+ logLines.forEach(line => {
+ if(line.length > 0) {
+ logEntries.push(JSON.parse(line))
+ }
+ });
+
+ callback(logEntries);
+ }
+ });
+}
+
+module.exports = {
+ startLogging: startLogging,
+ log: log,
+ getAllEntries: getAllEntries
+} \ No newline at end of file