aboutsummaryrefslogtreecommitdiff
path: root/services/data-logger.js
blob: 0948221f2e891fa750f38e7ce43fa27593c3c4b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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
}