First commit
Halb fertig
This commit is contained in:
45
app.js
Normal file
45
app.js
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
var createError = require('http-errors');
|
||||||
|
var express = require('express');
|
||||||
|
var path = require('path');
|
||||||
|
var cookieParser = require('cookie-parser');
|
||||||
|
var logger = require('morgan');
|
||||||
|
|
||||||
|
var indexRouter = require('./routes/index');
|
||||||
|
var usersRouter = require('./routes/users');
|
||||||
|
var switchRouter = require('./routes/switch');
|
||||||
|
|
||||||
|
var app = express();
|
||||||
|
|
||||||
|
// view engine setup
|
||||||
|
app.set('views', path.join(__dirname, 'views'));
|
||||||
|
app.set('view engine', 'pug');
|
||||||
|
|
||||||
|
app.use(logger('dev'));
|
||||||
|
app.use(express.json());
|
||||||
|
app.use(express.urlencoded({ extended: false }));
|
||||||
|
app.use(cookieParser());
|
||||||
|
app.use(express.static(path.join(__dirname, 'public')));
|
||||||
|
|
||||||
|
app.use(express.static("node_modules/moment/min"));
|
||||||
|
|
||||||
|
app.use('/', indexRouter);
|
||||||
|
app.use('/users', usersRouter);
|
||||||
|
app.use('/switch',switchRouter);
|
||||||
|
|
||||||
|
// catch 404 and forward to error handler
|
||||||
|
app.use(function(req, res, next) {
|
||||||
|
next(createError(404));
|
||||||
|
});
|
||||||
|
|
||||||
|
// error handler
|
||||||
|
app.use(function(err, req, res, next) {
|
||||||
|
// set locals, only providing error in development
|
||||||
|
res.locals.message = err.message;
|
||||||
|
res.locals.error = req.app.get('env') === 'development' ? err : {};
|
||||||
|
|
||||||
|
// render the error page
|
||||||
|
res.status(err.status || 500);
|
||||||
|
res.render('error');
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = app;
|
||||||
90
bin/www
Executable file
90
bin/www
Executable file
@@ -0,0 +1,90 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var app = require('../app');
|
||||||
|
var debug = require('debug')('laufschrift:server');
|
||||||
|
var http = require('http');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get port from environment and store in Express.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var port = normalizePort(process.env.PORT || '3011');
|
||||||
|
app.set('port', port);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create HTTP server.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var server = http.createServer(app);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listen on provided port, on all network interfaces.
|
||||||
|
*/
|
||||||
|
|
||||||
|
server.listen(port);
|
||||||
|
server.on('error', onError);
|
||||||
|
server.on('listening', onListening);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalize a port into a number, string, or false.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function normalizePort(val) {
|
||||||
|
var port = parseInt(val, 10);
|
||||||
|
|
||||||
|
if (isNaN(port)) {
|
||||||
|
// named pipe
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (port >= 0) {
|
||||||
|
// port number
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event listener for HTTP server "error" event.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function onError(error) {
|
||||||
|
if (error.syscall !== 'listen') {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
var bind = typeof port === 'string'
|
||||||
|
? 'Pipe ' + port
|
||||||
|
: 'Port ' + port;
|
||||||
|
|
||||||
|
// handle specific listen errors with friendly messages
|
||||||
|
switch (error.code) {
|
||||||
|
case 'EACCES':
|
||||||
|
console.error(bind + ' requires elevated privileges');
|
||||||
|
process.exit(1);
|
||||||
|
break;
|
||||||
|
case 'EADDRINUSE':
|
||||||
|
console.error(bind + ' is already in use');
|
||||||
|
process.exit(1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event listener for HTTP server "listening" event.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function onListening() {
|
||||||
|
var addr = server.address();
|
||||||
|
var bind = typeof addr === 'string'
|
||||||
|
? 'pipe ' + addr
|
||||||
|
: 'port ' + addr.port;
|
||||||
|
debug('Listening on ' + bind);
|
||||||
|
}
|
||||||
1400
package-lock.json
generated
Normal file
1400
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
18
package.json
Normal file
18
package.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"name": "laufschrift",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"start": "node ./bin/www"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"cookie-parser": "~1.4.3",
|
||||||
|
"debug": "~2.6.9",
|
||||||
|
"express": "~4.16.0",
|
||||||
|
"http-errors": "~1.6.2",
|
||||||
|
"moment": "^2.24.0",
|
||||||
|
"morgan": "~1.9.0",
|
||||||
|
"mqtt": "^2.18.8",
|
||||||
|
"pug": "^2.0.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
2
public/javascripts/jquery-3.3.1.min.js
vendored
Executable file
2
public/javascripts/jquery-3.3.1.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
97
public/javascripts/laufschrift.js
Normal file
97
public/javascripts/laufschrift.js
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
//
|
||||||
|
|
||||||
|
// Nach dem Laden des Dokumentes:
|
||||||
|
$(document).ready(function() {
|
||||||
|
console.log("Es geht los");
|
||||||
|
|
||||||
|
const URL = "switch/";
|
||||||
|
const brenndauer = 300; // Dauer der Anzeige in Sekunden
|
||||||
|
const checktime = 5000000; // alle 30sec Zustand prüfen
|
||||||
|
|
||||||
|
let status = "";
|
||||||
|
let tr;
|
||||||
|
let interval;
|
||||||
|
|
||||||
|
$('#versn').html("V " + VERSION + ' ' + VDATE); // Vesion anzeigen
|
||||||
|
|
||||||
|
|
||||||
|
$("#auszeile").hide(); // Meldezeile AUS schalten
|
||||||
|
|
||||||
|
// sendCommand(URL,"PowerOnState%200"); // OFF bei Power ON
|
||||||
|
// sendCommand(URL,"PulseTime%20"+(brenndauer+100)); // Brenndauer einstellen
|
||||||
|
|
||||||
|
|
||||||
|
sendCommand(URL,"get_status")
|
||||||
|
.then(st => {
|
||||||
|
console.log("Status = ",st);
|
||||||
|
checkStatus(st);
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#schalter").click(function() {
|
||||||
|
let message;
|
||||||
|
clearTimeout(interval);
|
||||||
|
if (status == 'ON') {
|
||||||
|
console.log("Sende OFF")
|
||||||
|
sendCommand(URL,"switch_off")
|
||||||
|
.then(st => {
|
||||||
|
console.log("Status = ", st);
|
||||||
|
checkStatus(st);
|
||||||
|
interval = setInterval(sendTimedCommand,5000);
|
||||||
|
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.log("Sende ON")
|
||||||
|
sendCommand(URL,"switch_on")
|
||||||
|
.then(st => {
|
||||||
|
console.log("Status = ",st);
|
||||||
|
checkStatus(st);
|
||||||
|
interval = setInterval(sendTimedCommand,5000);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function sendCommand(url,cmnd) {
|
||||||
|
const p = new Promise((resolve, reject) => {
|
||||||
|
$.getJSON(url + cmnd, function (data, err) { // AJAX Call
|
||||||
|
if (err != 'success') {
|
||||||
|
reject(err);
|
||||||
|
alert("Fehler <br />" + err); // if error, show it
|
||||||
|
} else {
|
||||||
|
console.log("gekommen: ", data);
|
||||||
|
resolve(data.status);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendTimedCommand() {
|
||||||
|
console.log("time check");
|
||||||
|
sendCommand(URL,'check')
|
||||||
|
.then(st => {
|
||||||
|
console.log("Timed Status= ", st);
|
||||||
|
status = st;
|
||||||
|
if (st != 'pending') {
|
||||||
|
clearTimeout(tr);
|
||||||
|
if (st == 'ON') {
|
||||||
|
$('#schalter').html('Laufschrift <b>AUS</b> schalten');
|
||||||
|
$('#status').text('EIN');
|
||||||
|
$('#statuszeile').addClass('machrot');
|
||||||
|
$('#auszeile').show();
|
||||||
|
} else {
|
||||||
|
$('#schalter').html('Laufschrift <b>EIN</b> schalten');
|
||||||
|
$('#status').text('AUS');
|
||||||
|
$('#statuszeile').removeClass('machrot');
|
||||||
|
$('#auszeile').hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function checkStatus(st) {
|
||||||
|
if (st == 'pending') {
|
||||||
|
tr = setTimeout(sendTimedCommand,500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
12
public/javascripts/version.js
Normal file
12
public/javascripts/version.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
// VersiosNummern und -Geschichte
|
||||||
|
|
||||||
|
var VERSION="1.0";
|
||||||
|
var VDATE="2019-04-02";
|
||||||
|
|
||||||
|
/* History
|
||||||
|
|
||||||
|
Rev. Datum Entwickler
|
||||||
|
|
||||||
|
1.0 2019-04-02 rxf
|
||||||
|
- Erste Version zum Testen
|
||||||
|
*/
|
||||||
76
public/stylesheets/laufschrift.css
Normal file
76
public/stylesheets/laufschrift.css
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
@CHARSET "UTF-8";
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: Arial, Verdana, Helevetica, sans-serif;
|
||||||
|
position:relative;
|
||||||
|
margin: 3px 0 3px 0;
|
||||||
|
padding: 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
width: 95%;
|
||||||
|
height: 100%;
|
||||||
|
margin: 20px auto;
|
||||||
|
border: solid 2px black;
|
||||||
|
background: #EEEEEE;
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#topline {
|
||||||
|
width: 97%;
|
||||||
|
margin: auto auto;
|
||||||
|
margin-top: 10px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#topline h2 {
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#buttons {
|
||||||
|
margin: auto auto;
|
||||||
|
margin-top:40px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#schalter {
|
||||||
|
font-size: 150%;
|
||||||
|
height: 50px;
|
||||||
|
border: 1px solid blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
#statuszeile {
|
||||||
|
margin-top: 20px;
|
||||||
|
font-size:130%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#auszeile {
|
||||||
|
width: 95%;
|
||||||
|
margin: auto auto;
|
||||||
|
margin-top: 20px;
|
||||||
|
color: red;
|
||||||
|
font-size: 95%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.machrot {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
#author {
|
||||||
|
font-size:80%;
|
||||||
|
height: 20px;
|
||||||
|
width: 95%;
|
||||||
|
margin: 20px auto 5px auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mailadr {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
#versn {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
9
routes/index.js
Normal file
9
routes/index.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
var express = require('express');
|
||||||
|
var router = express.Router();
|
||||||
|
|
||||||
|
/* GET home page. */
|
||||||
|
router.get('/', function(req, res, next) {
|
||||||
|
res.render('index', { title: 'Laufschrift' });
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = router;
|
||||||
53
routes/switch.js
Normal file
53
routes/switch.js
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
var express = require('express');
|
||||||
|
let router = express.Router();
|
||||||
|
let mqtt = require('mqtt');
|
||||||
|
let toSend = null;
|
||||||
|
|
||||||
|
const brenndauer = 20; // 20sec Relais ON
|
||||||
|
|
||||||
|
// MQTT:
|
||||||
|
let connected = false;
|
||||||
|
let status = 'MIST';
|
||||||
|
let client = mqtt.connect('mqtt://play.rexfue.de');
|
||||||
|
|
||||||
|
client.on('connect', function() {
|
||||||
|
connected = true;
|
||||||
|
client.subscribe('stat/laufschrift/POWER');
|
||||||
|
})
|
||||||
|
|
||||||
|
client.on('message',function(topix,message) {
|
||||||
|
let erg = message.toString();
|
||||||
|
console.log("Status = ",erg);
|
||||||
|
status = erg;
|
||||||
|
});
|
||||||
|
|
||||||
|
function doPublish(payload) {
|
||||||
|
status = 'pending';
|
||||||
|
client.publish('cmnd/laufschrift/Power',payload);
|
||||||
|
if (payload == 'On') {
|
||||||
|
setTimeout(doPublish,brenndauer*1000,"Off");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* GET switch data */
|
||||||
|
router.get('/:cmd', function(req, res, next) {
|
||||||
|
let cmd = req.params.cmd;
|
||||||
|
let wert = req.query.wert;
|
||||||
|
|
||||||
|
if (cmd == 'get_status') {
|
||||||
|
doPublish("");
|
||||||
|
} else if (cmd == 'switch_on') {
|
||||||
|
doPublish("On");
|
||||||
|
} else if (cmd == 'switch_off') {
|
||||||
|
doPublish("Off");
|
||||||
|
} else if (cmd == 'check') {
|
||||||
|
} else {
|
||||||
|
erg = { error: "invalid command"};
|
||||||
|
res.json(erg);
|
||||||
|
}
|
||||||
|
res.json({status:status});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = router;
|
||||||
10
routes/users.js
Normal file
10
routes/users.js
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
var express = require('express');
|
||||||
|
var router = express.Router();
|
||||||
|
|
||||||
|
/* GET users listing. */
|
||||||
|
router.get('/', function(req, res, next) {
|
||||||
|
res.json({status: "Gut"});
|
||||||
|
// res.send('respond with a resource');
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = router;
|
||||||
6
views/error.pug
Normal file
6
views/error.pug
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
extends layout
|
||||||
|
|
||||||
|
block content
|
||||||
|
h1= message
|
||||||
|
h2= error.status
|
||||||
|
pre #{error.stack}
|
||||||
15
views/index.pug
Normal file
15
views/index.pug
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
extends layout
|
||||||
|
|
||||||
|
block content
|
||||||
|
|
||||||
|
#topline
|
||||||
|
h2 Laufschrift steuern
|
||||||
|
|
||||||
|
#buttons
|
||||||
|
button.btn.btn-primary#schalter Laufschrift EIN schalten
|
||||||
|
|
||||||
|
#statuszeile
|
||||||
|
Status: Die Laufschrift ist <span id="status">AUS</span>.
|
||||||
|
|
||||||
|
#auszeile
|
||||||
|
Die Laufschrift schaltet sich automatisch um <span id="auszeit">12:00</span> Uhr aus.
|
||||||
25
views/layout.pug
Normal file
25
views/layout.pug
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
doctype html
|
||||||
|
html
|
||||||
|
head
|
||||||
|
title= title
|
||||||
|
meta(charset="utf-8")
|
||||||
|
meta(name="viewport" content="width=device-width,initial-scale=1, shrink-to-fit=no")
|
||||||
|
|
||||||
|
link(rel='stylesheet', href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous")
|
||||||
|
link(rel='stylesheet', href='/stylesheets/laufschrift.css')
|
||||||
|
|
||||||
|
body
|
||||||
|
#container
|
||||||
|
block content
|
||||||
|
#author
|
||||||
|
#mailadr
|
||||||
|
a(href="mailto:rexfue@gmail.com") mailto:rexfue@gmail.com
|
||||||
|
#versn Version: #{version} vom #{date}
|
||||||
|
|
||||||
|
script(src="javascripts/jquery-3.3.1.min.js")
|
||||||
|
// script(src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous")
|
||||||
|
script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous")
|
||||||
|
script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous")
|
||||||
|
script(src="/moment.min.js")
|
||||||
|
script(src='/javascripts/version.js')
|
||||||
|
script(src='/javascripts/laufschrift.js')
|
||||||
Reference in New Issue
Block a user