DAY29 平均资料POST上汶莱平台

上次教了用聚合方式找到指定资料的平均值 这次要把资料平均值POST上去
不过因为上次我们只是指定特定时间区间 这次我们需要随者日期做搜寻
同样先直接看到程序码

var mqtt = require('mqtt')
var client  = mqtt.connect('mqtt://127.0.0.1:1883')
const Readline = require('@serialport/parser-readline')
var SerialPort = require("serialport");
const parser = new Readline()
var arduinoCOMPort = "/dev/ttyUSB0";
var arduinoport = new SerialPort(arduinoCOMPort, {baudRate: 9600}).setEncoding('utf8');
var MongoClient=require('mongodb').MongoClient, assert = require('assert');;
const request = require('request-promise');
const { Console } = require('console');
var yesterdayStart = new Date(new Date(new Date().setHours(new Date().getHours()-1,00,00 )) );
var yesterdayEnd = new Date(new Date(new Date().setHours(new Date().getHours(),00,00 )) );
var lasttime = yesterdayStart.toLocaleString('zh-hant', { timeZone: 'Asia/Taipei' })
var nowtime = yesterdayEnd.toLocaleString('zh-hant', { timeZone: 'Asia/Taipei' })
var CO2avg,TVOCavg
console.log(lasttime)
console.log(nowtime)
arduinoport.on("open", (err) => {  
  console.log('serial port open'); //成功连接时印出port open
  if(err){
      console.log("no serial device found")//失败时印出 device not found
  }
},20);
arduinoport.pipe(parser)
parser.on('data', line =>{
  console.log(line)
  Arduno_data = JSON.parse(line);
  Sensor_data = Object.values(Arduno_data)
  Sensor_key = Object.keys(Arduno_data)
  console.log(Sensor_key)
  console.log(Sensor_data)
 MongoClient.connect("mongodb://127.0.0.1:27017/test", function(err,client){
    if(err){
        console.log(err);
        console.log('connecting fail');
        return;
    }
    console.log('connecting');
    setInterval(function(){
var yesterdayStart = new Date(new Date(new Date().setHours(new Date().getHours()-1,00,00 )) );
var yesterdayEnd = new Date(new Date(new Date().setHours(new Date().getHours(),00,00 )) );
    lasttime = yesterdayStart.toLocaleString('zh-hant', { timeZone: 'Asia/Taipei' })
    nowtime = yesterdayEnd.toLocaleString('zh-hant', { timeZone: 'Asia/Taipei' })
    console.log(lasttime)
    console.log(nowtime)
  },3600000)
    let udate = new Date();
    let time = udate.toLocaleString('zh-hant', { timeZone: 'Asia/Taipei' })
    var db_client = client.db('data_test')
    var db_table = db_client.collection('data')
    // console.log('connection success')
    db_client.collection('data',async function(err,collection){
      for(var i=0 ; i<Sensor_key.length;i++){
    collection.insertOne({ time:time, name:Sensor_key[i], data:Sensor_data[i] });
      }
      var getCO2Avg = await collection.aggregate([
        { $match: {'time': {"$gte": lasttime, "$lte": nowtime},'name':'CO2' } },
        {
          $group: {
            _id: "$name",
            avg: {
              $avg: "$data" 
            }
          }
        }
      ]).toArray();
      var getTVOCAvg = await collection.aggregate([
        { $match: {'time': {"$gte": lasttime, "$lte": nowtime},'name':'TVOC' } },
        {
          $group: {_id: "$name",avg: {$avg: "$data" }}
        }
      ]).toArray();
      CO2avg = Math.round(getCO2Avg[0].avg*100)/100
      TVOCavg = Math.round(getTVOCAvg[0].avg*100)/100

      console.log(CO2avg)
      console.log(TVOCavg)
       collection.find({'time': {"$gte": lasttime, "$lte": nowtime},'name':'CO2' }).toArray(function(err,items){
      if(err) throw err;
      for(i=0 ; i<items.length-1; i++){
        var sum = 0
        sum = sum + items[i].data
        let avgCO2 = (sum/items.length)
        // console.log(avgCO2)
        // console.log(sum)
        if(i = items.length-1){
          console.log(items[i]);
        }
      }
      console.log("DATA FOUND");
    });
  });
  })
  push()
})
let push = async () => {
if(Sensor_key[0] == 'CO2'){
  Sensordata = {
      method: 'POST',
      uri: 'http://127.0.0.1:30001/insert' ,
      headers: {
          'Content-Type': 'application/json'
      },
      body: {
          mac : "3024324b3a84",
          "sensorData" : {
              "CO2" : Sensor_data[0],
              "TVOC" : Sensor_data[1],
              "CO2平均" : CO2avg,
              "TVOC平均" : TVOCavg,
          }
      },
          json: true        
  }
}
request(Sensordata).then(function (response) {
  console.log(response)
  console.log("post success")
}).catch(function (err) {
  console.error(err);
  });
      
}
   
setInterval(function(){
  arduinoport.write('g')
},5000)

我们可以先看到 新的函式 Date()其实顾名思义就是 抓到现在的时间然後在用sethour 去取得上一个小时 的零分零秒 跟现在的零分零秒 能够取得时间後 我们再来就要去修改我们抓资料的区间 把原本设定固定的时间改成随时间不同会去做每小时的二氧化碳平均值更新
$match: {'time': {"$gte": lasttime, "$lte": nowtime},'name':'TVOC' }
最後就是将资料POST上汶莱网站

这样我们就完成每小时做平均值计算了


<<:  台湾游戏公司最新营收 | 第三季游戏公司营运「冻能」 | 蛤! 神逆转! 老大换人了 老二雄风不再

>>:  Day 30 KubeEdge的使用心得与总结

Day07:Boardcast Event(推播事件)

全文同步於个人 Docusaurus Blog 当某个使用者输入讯息发送到 server 後,若当...

[第19天]理财达人Mx. Ada-Telegram Bot

前言 本文说明使用Python建立Telegram Bot 。 注册 telegram帐号 找 @B...

Day 20 - 规划各功能模组的介面

紧接着今天我们要来规划各个功能模组的介面了! 首先是登入後的首页,会陈列使用者上传记帐资讯,包含图片...

Day 1:开始前的准备

缘起 各位好~我是一个软件工程师,追求每年都要有不一样的进步,今年追求的是把自己的基底在打的更稳,之...

Day 1:前言

程序语言的种类成千上万,决定好要学哪个了吗? 在FB程序语言社团里,几乎每天都会有人提问:「我该从...