diff --git a/main.js b/main.js index eef21a7656a4502dd428169a921619ce34cbdf27..42f233a90cdf22097b0c06032e2934dee4c617be 100644 --- a/main.js +++ b/main.js @@ -5,6 +5,11 @@ const fs = require('node:fs'); // Prepend timestamp and severity to all console messages require('console-stamp')(console); +class DoorInfo { + state = null; + opener = null; +} + const web_host = process.env.HTTP_BIND; const web_port = process.env.HTTP_PORT; @@ -27,35 +32,64 @@ client.on('connect', () => { client.subscribe('door/#', () => {}); }); -let doorState = null; -let doorOpener = null; +let doors = { + 'ucc-door': new DoorInfo(), +}; + +const update_door_state = (door, state) => { + if (doors[door] === undefined) { + console.log(`Tried to update state for unknown door ${door}`); + return; + } + + switch (state) { + case "ON": + console.log(`Door ${door} opened!`); + doors[door].state = true; + break; + + case "OFF": + console.log(`Door ${door} closed!`); + doors[door].state = false; + break; + + default: + console.log(`Unknown message received for door ${door}`); + break; + } +}; + +const update_door_opener = (door, opener) => { + if (doors[door] === undefined) { + console.log(`Tried to update opener for unknown door ${door}`); + return; + } + + if (opener) { + console.log(`Marked door ${door} as opened by ${opener}`); + doors[door].opener = opener; + } +}; // Receive messages client.on('message', (topic, message) => { console.log(`Received message on topic ${topic}`); - if (topic === 'door/ucc-door/state') { - switch (message.toString()) { - case "ON": - console.log("Door opened!"); - doorState = true; - break; - - case "OFF": - console.log("Door closed!"); - doorState = false; - break; - - default: - console.log("Unknown message received..."); - break; - } + const topicparts = topic.split('/'); + if (topicparts.length != 3) { + console.log(`Unknown topic ${topic} received`); + return; } - else if (topic === 'door/ucc-door/openedby') { - const opener = message.toString(); - if (opener) { - doorOpener = opener; - } + + if (topicparts[0] === 'door' && topicparts[2] === 'state') { + update_door_state(topicparts[1], message.toString()); + } + else if (topicparts[0] === 'door' && topicparts[2] === 'openedby') { + update_door_opener(topicparts[1], message.toString()); + } + else { + console.log(`Unknown topic ${topic} received`); + } }); @@ -85,28 +119,28 @@ const server = http.createServer((req, res) => { } if (req.url === '/') { - if (doorState === null) { + if (doors['ucc-door'].state === null) { return send_file(res, 500, './pages/ucc_door_unavail.html', 'text/html'); } - const fname = doorState ? './pages/ucc_door_open.html' : './pages/ucc_door_closed.html'; + const fname = doors['ucc-door'].state ? './pages/ucc_door_open.html' : './pages/ucc_door_closed.html'; return send_file(res, 200, fname, 'text/html'); } if (req.url === '/state') { - if (doorState === null) { + if (doors['ucc-door'].state === null) { return send_json(res, 500, null); } - return send_json(res, 200, doorState); + return send_json(res, 200, doors['ucc-door'].state); } if (req.url === '/opener') { - if (doorOpener === null) { + if (doors['ucc-door'].opener === null) { return send_json(res, 500, null); } - return send_json(res, 200, doorState ? doorOpener : null); + return send_json(res, 200, doors['ucc-door'].state ? doors['ucc-door'].opener : null); } if (req.url === '/static/door_ucc_open.jpg') {