2018-04-20 15:55:30 +00:00
|
|
|
var express = require('express'),
|
|
|
|
app = express(),
|
|
|
|
server = require('http').createServer(app),
|
|
|
|
io = require('socket.io').listen(server);
|
|
|
|
var cookieParser = require('cookie-parser');
|
|
|
|
var bodyParser = require('body-parser');
|
|
|
|
var cookieSession = require('cookie-session');
|
|
|
|
var flash = require('connect-flash');
|
|
|
|
var Flukso = require("./flukso");
|
|
|
|
var IpPoll = require("./ip-poll");
|
|
|
|
var CTDOApi = require("./ctdo-api");
|
|
|
|
var routes = require("./routes");
|
|
|
|
var path = require('path');
|
|
|
|
var mqttClient = require('mqtt');
|
|
|
|
|
|
|
|
var spaceanswer = {
|
|
|
|
api: "0.13",
|
|
|
|
ext_ccc: "erfa",
|
|
|
|
space: "Chaostreff Dortmund",
|
|
|
|
logo: "https://www.chaostreff-dortmund.de/presse/logo/logo_ctdo.png",
|
|
|
|
icon: {
|
|
|
|
open: "https://status.ctdo.de/img/green.png",
|
|
|
|
closed: "https://status.ctdo.de/img/red.png"
|
|
|
|
},
|
|
|
|
url: "https://www.chaostreff-dortmund.de/",
|
|
|
|
location: {
|
|
|
|
address: "Braunschweiger Str 22, 44145 Dortmund, Germany",
|
|
|
|
lon: 7.4649449,
|
|
|
|
lat: 51.527611
|
|
|
|
},
|
|
|
|
contact: {
|
|
|
|
phone: "+49 231 8 404 777",
|
|
|
|
irc: "irc://irc.hackint.eu/#ccc.do",
|
|
|
|
ml: "discuss@lists.chaostreff-dortmund.de",
|
|
|
|
twitter: "@ctdo",
|
2022-09-04 10:43:56 +00:00
|
|
|
issue_mail: "hostmaster@chaostreff-dortmund.de"
|
2018-04-20 15:55:30 +00:00
|
|
|
},
|
|
|
|
issue_report_channels: ["issue_mail"],
|
|
|
|
state: {
|
|
|
|
open: null,
|
|
|
|
lastchange: 0,
|
|
|
|
icon: {
|
|
|
|
open: "https://status.ctdo.de/img/green.png",
|
|
|
|
closed: "https://status.ctdo.de/img/red.png"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
feeds: {
|
|
|
|
blog: {
|
|
|
|
type: "application/rss+xml",
|
|
|
|
url: "https://www.chaostreff-dortmund.de/feed/"
|
|
|
|
},
|
|
|
|
calendar: {
|
|
|
|
type: "ical",
|
|
|
|
url: "https://www.chaostreff-dortmund.de/events.ics"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
sensors: {
|
|
|
|
power_consumption: [{
|
|
|
|
unit: "W",
|
|
|
|
name: "mains power",
|
|
|
|
description: "overall power consumption from our space",
|
|
|
|
location: "basement",
|
|
|
|
value: 0
|
2019-11-20 12:18:03 +00:00
|
|
|
}],
|
|
|
|
people_now_present: [{
|
|
|
|
value: 0,
|
|
|
|
names: []
|
|
|
|
}]
|
2018-04-20 15:55:30 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
var simpleanswer = {state: "unknown", count: 0, names: [], lastchange: 0, power: 0};
|
|
|
|
var usercountanswer = {
|
|
|
|
at: 0, current_value: 0, datapoints: []
|
|
|
|
};
|
|
|
|
|
|
|
|
var ippoll = new IpPoll("rpi3.raum.ctdo.de");
|
|
|
|
var ctdoapi = new CTDOApi("api.ctdo.de/names.php");
|
|
|
|
var flukso = new Flukso("flukso.raum.ctdo.de", "/sensor/cf00e0b22230f4a8870af58f2b8719dd");
|
|
|
|
var mqtt = mqttClient.connect('mqtt://raum.ctdo.de');
|
|
|
|
var connected = false;
|
|
|
|
|
|
|
|
var port = '9911';
|
|
|
|
var address = 'localhost';
|
|
|
|
|
|
|
|
ctdoapi.on('done', function (answer) {
|
|
|
|
simpleanswer.count = answer.count;
|
|
|
|
simpleanswer.names = answer.names;
|
|
|
|
|
2019-12-10 21:52:31 +00:00
|
|
|
spaceanswer.sensors.people_now_present[0].value = answer.count;
|
|
|
|
spaceanswer.sensors.people_now_present[0].names = answer.names;
|
2019-11-20 12:18:03 +00:00
|
|
|
|
2018-04-20 15:55:30 +00:00
|
|
|
if (usercountanswer.datapoints.length > 20) {
|
|
|
|
usercountanswer.datapoints.shift();
|
|
|
|
}
|
|
|
|
|
|
|
|
usercountanswer.datapoints.push({at: new Date().getTime(), value: simpleanswer.count});
|
|
|
|
});
|
|
|
|
|
|
|
|
ippoll.on('doneState', function (state) {
|
2021-07-16 07:28:14 +00:00
|
|
|
spaceanswer.state.open = state;
|
2018-04-20 15:55:30 +00:00
|
|
|
spaceanswer.state.lastchange = Math.floor(new Date().getTime() / 1000);
|
2021-07-16 07:28:14 +00:00
|
|
|
simpleanswer.state = state;
|
2018-04-20 15:55:30 +00:00
|
|
|
simpleanswer.lastchange = spaceanswer.state.lastchange;
|
|
|
|
simpleanswer.lastchange = new Date().getTime();
|
|
|
|
io.sockets.emit('sdata', {data: simpleanswer});
|
|
|
|
});
|
|
|
|
|
|
|
|
flukso.on('done', function (num) {
|
|
|
|
simpleanswer.power = num;
|
|
|
|
spaceanswer.sensors.power_consumption[0].value = num;
|
|
|
|
io.sockets.emit('sdata', {data: simpleanswer});
|
|
|
|
});
|
|
|
|
|
|
|
|
flukso.on('failed', function (error) {
|
|
|
|
console.log("Flukso: " + error);
|
|
|
|
});
|
|
|
|
|
|
|
|
mqtt.on('connect', function () {
|
|
|
|
console.log("connected to mqtt");
|
|
|
|
mqtt.subscribe('raumstatus/simple');
|
|
|
|
});
|
|
|
|
|
|
|
|
mqtt.on('message', function (topic, message) {
|
|
|
|
if (topic === 'raumstatus/simple') {
|
|
|
|
connected = (message.toString() === 'true');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
function sendSimple() {
|
|
|
|
mqtt.publish('raumstatus/simple', JSON.stringify(simpleanswer));
|
|
|
|
}
|
|
|
|
|
|
|
|
function work() {
|
|
|
|
ctdoapi.poll();
|
|
|
|
ippoll.pollState();
|
|
|
|
sendSimple();
|
|
|
|
}
|
|
|
|
|
|
|
|
setInterval(work, 60000);
|
|
|
|
work();
|
|
|
|
|
|
|
|
setInterval(flukso.pollPower, 5000);
|
|
|
|
flukso.pollPower();
|
|
|
|
|
|
|
|
app.use(express.static('public'));
|
|
|
|
app.use(cookieParser());
|
|
|
|
app.use(bodyParser.urlencoded({extended: true}));
|
|
|
|
app.use(bodyParser.json({extended: true}));
|
|
|
|
app.use(cookieSession({secret: 'ctdo', cookie: {maxAge: 60000}}));
|
|
|
|
app.use(flash());
|
|
|
|
|
|
|
|
app.set('/views');
|
|
|
|
app.set('view engine', 'jade');
|
|
|
|
app.disable('x-powered-by');
|
|
|
|
app.enable('trust proxy');
|
|
|
|
|
|
|
|
app.get('/api/spaceapi/v13', function (req, res) {
|
|
|
|
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
|
|
res.setHeader("Cache-Control", "no-cache");
|
|
|
|
res.send(spaceanswer);
|
|
|
|
});
|
|
|
|
|
|
|
|
app.get('/api/simple/v2', function (req, res) {
|
|
|
|
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
|
|
res.setHeader("Cache-Control", "no-cache");
|
|
|
|
res.send(simpleanswer);
|
|
|
|
});
|
|
|
|
|
|
|
|
app.get('/api/usercount', function (req, res) {
|
|
|
|
usercountanswer.at = simpleanswer.lastchange;
|
|
|
|
usercountanswer.current_value = simpleanswer.count;
|
|
|
|
res.send(usercountanswer);
|
|
|
|
});
|
|
|
|
|
|
|
|
function getstatusImage(req, res) {
|
|
|
|
if (spaceanswer.state.open == true) {
|
|
|
|
res.sendFile(path.resolve(__dirname, 'public/img/green.png'));
|
|
|
|
} else if (spaceanswer.state.open == false) {
|
|
|
|
res.sendFile(path.resolve(__dirname, 'public/img/red.png'));
|
|
|
|
} else {
|
|
|
|
res.sendFile(path.resolve(__dirname, 'public/img/yellow.png'));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
app.get('/api/simple/image', function (req, res) {
|
|
|
|
getstatusImage(req, res);
|
|
|
|
});
|
|
|
|
|
|
|
|
app.get('/api/simple/image.png', function (req, res) {
|
|
|
|
getstatusImage(req, res);
|
|
|
|
});
|
|
|
|
|
|
|
|
//app.get('/db', routes.db);
|
|
|
|
//app.post('/form', routes.form);
|
|
|
|
app.get('/', routes.index);
|
|
|
|
|
|
|
|
var server = server.listen(port, address, function (err) {
|
|
|
|
if (err) {
|
|
|
|
console.log(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
var message = 'Server is running @ http://' + address + ':' + port;
|
|
|
|
console.log(message);
|
|
|
|
});
|