raumstatus/node/statusbot.js

187 lines
6.0 KiB
JavaScript

var express = require('express'),
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server),
notifier = require('node-notifier');
var flash = require('connect-flash');
var moment = require('moment');
var SnmpMac = require("./snmp-mac");
var IpPoll = require("./ip-poll");
var Flukso = require("./flukso");
var routes = require("./routes");
var path = require('path');
var spaceanswer = {
api: "0.13",
space: "Chaostreff Dortmund",
logo: "http://www.chaostreff-dortmund.de/logo/logo_ctdo.svg",
icon: {
open: "http://status.ctdo.de/img/green.png",
closed: "http://status.ctdo.de/img/red.png"
},
url: "http://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/#ctdo",
ml: "ccc@chaostreff-dortmund.de",
twitter: "@ctdo",
issue_mail: "server-admin@chaostreff-dortmund.de"
},
issue_report_channels: ["issue_mail"],
state: {
open: null,
lastchange: 0,
icon: {
open: "http://status.ctdo.de/img/green.png",
closed: "http://status.ctdo.de/img/red.png"
}
},
sensors: {
power_consumption: [{
unit: "W",
name: "mains power",
description: "overall power consumption from our space",
location: "basement",
value: 0}]
}
};
var simpleanswer = {state: "unknown", count: 0, names: [], lastchange: 0, power: 0};
var usercountanswer = {at: 0, current_value: 0, datapoints: [
{at: 0, value: 0}
]};
var snmpMac = new SnmpMac("juni.ctdo.de", "ctdo23");
var ippoll = new IpPoll("switch2.raum.ctdo.de", "195.160.169.30-120");
var flukso = new Flukso("flukso.raum.ctdo.de", "/sensor/cf00e0b22230f4a8870af58f2b8719dd");
var laststate = false;
snmpMac.on('done', function (res) {
simpleanswer.names = res;
simpleanswer.lastchange = new Date().getTime();
});
ippoll.on('doneCount', function (num) {
simpleanswer.count = num;
simpleanswer.lastchange = new Date().getTime();
ippoll.pollState();
});
ippoll.on('doneState', function (state) {
spaceanswer.state.open = state;
spaceanswer.state.lastchange = new Date().getTime();
simpleanswer.state = state;
simpleanswer.lastchange = spaceanswer.state.lastchange;
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});
});
io.configure(function () {
io.set('log level', 0);
});
notifier.on('click', function (notifierObject, options) {
// Happens if `wait: true` and user clicks notification
});
notifier.on('timeout', function (notifierObject, options) {
// Happens if `wait: true` and notification closes
});
function work() {
snmpMac.poll();
ippoll.pollCount();
if (spaceanswer.state.open == true && laststate != true) {
laststate == true;
notifier.notify({
title: 'CTDO - Statusänderung',
message: 'Der Chaostreff Dortmund ist nun offen.',
icon: path.join('public/img/green.png'), // absolute path (not balloons)
sound: true, // Only Notification Center or Windows Toasters
wait: true // wait with callback until user action is taken on notification
}, function (err, response) {
// response is response from notification
});
} else if (spaceanswer.state.open == false && lasttaste != false) {
laststate == false;
notifier.notify({
title: 'CTDO - Statusänderung',
message: 'Der Chaostreff Dortmund ist nun geschlossen.',
icon: path.join('public/img/red.png'), // absolute path (not balloons)
sound: true, // Only Notification Center or Windows Toasters
wait: true // wait with callback until user action is taken on notification
}, function (err, response) {
// response is response from notification
});
}
}
setInterval(work, 60000);
work();
setInterval(flukso.pollPower, 5000);
flukso.pollPower();
app.set('snmpMac', snmpMac); //TODO: wie kann man das schoener machen? (Modul in die Routes reintun)
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.disable('x-powered-by');
app.configure('development', function () {
app.use(express.errorHandler());
app.locals.pretty = true;
});
app.use(express.static(__dirname + '/public'));
app.use(express.bodyParser());
app.use(express.cookieParser('chaostreff'));
app.use(express.session({cookie: {maxAge: 60000}}));
app.use(flash());
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) {
ippoll.getHistory("-inf", "+inf", function (data) {
usercountanswer.datapoints.length = 0;
usercountanswer.at = simpleanswer.lastchange;
usercountanswer.current_value = simpleanswer.count;
usercountanswer.datapoints = data;
res.send(usercountanswer);
});
});
app.get('/api/simple/image', function (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('/db', routes.db);
app.post('/form', routes.form);
app.get('/', routes.index);
server.listen(3000, 'localhost');