Как обновить данные из json-файла с помощью charts.js? - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь создать живой график с данными от моих датчиков, и в настоящее время он работает, но я не уверен, как заставить его обновляться самостоятельно.Я использую node / express / pug, и у меня есть бэкэнд, который прослушивает сообщения MQTT и добавляет их в файл json, сохраняя последние 30 значений или около того.Маршрутизация веб-интерфейса index.js анализирует JSON и структурирует его в массивы, которые передаются в шаблон pug, к которому затем может получить доступ javascript внутри него.

Мой вопрос, чтобы динамически перезагрузить его,Могу ли я сделать это через index.js или мне нужно сделать это по-другому?В идеале какое-то уведомление, когда файл обновляется из бэкэнда во внешний интерфейс, но таймер будет вполне адекватным.Обновления будут около 1000 мс.Я довольно новичок в разработке javascript / web.

Мой файл index.js, последняя часть является соответствующей частью:

var router = express.Router();
var db;
var fs = require('fs');
var moment = require('moment');

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Sematek StrainMonitor' });
  next();
});

//when rawdata is loaded, load client
router.get('/rawdata', function(req, res) {

  var dateFrom = req.query.from;
  var dateTo = req.query.to;
  var dateFromEpoch = moment(dateFrom).unix();
  var dateToEpoch = moment(dateTo).unix();

  let searchQuery;
  if ((dateFromEpoch) && (dateToEpoch)) {
    searchQuery = "{epoch : { $gt :  " + dateFromEpoch + ", $lt : " + dateToEpoch + "}}";
  };

  req.conn.then(client=> client.db('test').collection('sensor0').find({searchQuery}).toArray(function(err, docs) {
    if(err) { console.error(err) }
    if (!docs) {
      console.log("oops.. didn't retrieve any docs from the mongodb serv");
    }
    const dataPairsDB = docs.map(e => ({x: e.epoch, y: e.data}) );
    let datasetDB = [];
    let labelsetDB = [];
    dataPairsDB.forEach((num,index) => {
      labelsetDB.push(moment.unix(dataPairsDB[index].x).format('HH:mm:ss'));
      datasetDB.push(dataPairsDB[index].y);
    });

    console.log(req.query)

    //gets CloudMQTT values from JSON file and converts it into two arrays for Chart.js display
      let data = JSON.parse(fs.readFileSync("./json/latest-value.json"));

      const dataPairs = data.readings.map(e => ({x: e.epoch, y: e.data}) );
      let dataset = [];
      let labelset = [];
      dataPairs.forEach((num,index) => {
        labelset.push(moment.unix(dataPairs[index].x).format('HH:mm:ss'));
        dataset.push(dataPairs[index].y);
      });

    if (req.cookies.isLoggedIn == 'true') {
      res.render('rawdata', {
        docs : docs,
        datasetDB : JSON.stringify(datasetDB),
        labelsetDB : JSON.stringify(labelsetDB),
        dataset : JSON.stringify(dataset),
        labelset : JSON.stringify(labelset)
      });
    } else {
      res.redirect(401,'/');
    }
  }))
});

Из моего файла rawdata.pug:

        canvas(id="line-chart" )
        script(src='https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js')
        script(type='text/javascript').
            var dataset = JSON.parse('!{dataset}');
            var labelset = JSON.parse('!{labelset}');
        script(src='/scripts/charter.js') 

1 Ответ

0 голосов
/ 19 февраля 2019

Просто попросите веб-страницу подписаться на ту же тему MQTT (использование MQTT поверх веб-сокетов, см. Клиент Paho Javascript) и обновлять в режиме реального времени, не возвращаясь к серверной части и извлекая все исторические данные каждый раз, когда добавляется новое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...