-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
167 lines (149 loc) · 4.44 KB
/
server.js
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
const http = require('http');
const fs = require('fs');
const sqlite3 = require('sqlite3').verbose();
const express = require('express');
// read device configs
let raw_config = fs.readFileSync('config.json');
let config = JSON.parse(raw_config);
var pars = [];
console.log('Device configs:');
for (device of config.installed_devices){
console.log(device);
console.log(config.device_configs[device]);
pars = pars.concat(config.device_configs[device].params);
};
// connect to sqlite database
let db = new sqlite3.Database('./weather.db', sqlite3.OPEN_READONLY, (err) => {
if (err) {
console.error(err.message);
}
console.log('Connected to the weather database.');
});
// get data from database
var pars_as = pars.map(par => `${par} as ${par}`).join(', ')
var sql = `SELECT ts as ts, ${pars_as} FROM weather WHERE ts >= datetime(CURRENT_TIMESTAMP, 'localtime', '-1 day');`;
var tss = [];
//var air_temps = [];
//var air_pressures = [];
//var humidities = [];
//var aqis = [];
//var pm2_5s = [];
//var pm10s = [];
var par_arrays = {};
for (par of pars){
par_arrays[par] = []
};
var update = {};
var records = [];
function init_data(){
return new Promise(resolve=>{
// re-initialize arrays
tss= []
for (par of pars){
par_arrays[par] = []
};
// get data from sql db
db.all(sql, [], (err, rows) => {
if (err) {
throw err;
}
rows.forEach((row) => {
// console.log(row.ts, row.air_temp, row.air_pressure, row.humidity, row.aqi, row.pm2_5, row.pm10);
tss.push(row.ts);
//air_temps.push(row.air_temp);
//air_pressures.push(row.air_pressure);
//humidities.push(row.humidity);
//aqis.push(row.aqi);
//pm2_5s.push(row.pm2_5);
//pm10s.push(row.pm10);
for (par of pars){
par_arrays[par].push(row[par])
};
});
resolve(tss, par_arrays);
});
});
}
var latest_ts;
var sql_update;
function update_data(){
return new Promise(resolve=>{
if (Object.keys(update).length > 0){latest_ts = update.ts};
update = {};
console.log('checking for update, last ts:', latest_ts);
sql_update = `SELECT ts as ts, ${pars_as} FROM weather WHERE ts > \'${latest_ts}\';`;
db.all(sql_update, [], (err, rows) => {
if (err) {
throw err;
}
// get new data to send as update
if (tss.length > 0){
rows.forEach((row) => {
// console.log(row.ts, row.air_temp, row.air_pressure, row.humidity, row.aqi, row.pm2_5, row.pm10);
update = {...row};
});
}
resolve(update);
});
});
}
// create http server
const server = http.createServer((req, res) => {
if (req.url == "/"){
res.writeHead(200, { 'content-type': 'text/html' });
fs.createReadStream('./static/index.html').pipe(res)
}
else if (req.url == '/style.css'){
res.writeHead(200, {'content-type': 'text/css'});
fs.createReadStream('./static/style.css').pipe(res)
}
else if ((req.url == '/weather-update/') & (req.method == 'POST')){
console.log('Heard POST request:');
req.on('data', function (data) {
console.log("got data:");
var data = JSON.parse(data);
console.log(data);
});
// var post = JSON.parse(body);
// deal_with_post_data(request,post);
// console.log(post);
res.writeHead(200, {'content-type': 'text/html'});
res.end();
};
});
// attach websocket to http server
const io = require('socket.io')(server);
io.on('connection', client => {
console.log("websocket on...");
client.emit('announcements', { message: 'Hello from the server!' });
// send database data to webpage via websocket
async function asyncInit(){
records = await init_data();
client.emit('data', Object.assign({}, {tss: tss}, par_arrays));
};
asyncInit();
client.on('event', data => {console.log("received data: ${data}")
});
client.on('disconnect', () => {console.log("websocket disconnected.")
});
});
// initialize latest_ts when server turns on
async function server_ts_init(){
records = await init_data();
latest_ts = tss.slice(-1)[0];
};
server_ts_init();
// periodically retrieve new data and send to clients
setInterval(() => {
async function asyncUpdate(){
records = await update_data();
if (Object.keys(update).length > 0){
console.log('got new data:', update);
io.sockets.emit('update', {update: update})
}
};
asyncUpdate();
}, 20 * 1000);
// start listening
server.listen(8000);
console.log("Listening on port 8000");