First commit

Halb fertig
This commit is contained in:
2019-04-02 22:07:35 +02:00
commit 3695b33c83
14 changed files with 1858 additions and 0 deletions

45
app.js Normal file
View 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
View 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

File diff suppressed because it is too large Load Diff

18
package.json Normal file
View 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

File diff suppressed because one or more lines are too long

View 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);
}
}
});

View 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
*/

View 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
View 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
View 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
View 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
View File

@@ -0,0 +1,6 @@
extends layout
block content
h1= message
h2= error.status
pre #{error.stack}

15
views/index.pug Normal file
View 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
View 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')