From 2637679fdaef672cf81159cc10f8127738248085 Mon Sep 17 00:00:00 2001 From: fbp Date: Tue, 15 Aug 2023 14:14:34 +0200 Subject: [PATCH] Moved functions to seperate files --- StateManager.js | 7 +++ functions.js | 77 +++++++++++++++++++++++++++ index.js | 121 +++++++++--------------------------------- mqtt.js | 29 ++++++++++ package-lock.json | 35 ++++++++++++ package.json | 1 + routes/events.js | 21 ++++++++ routes/index.js | 21 ++++++++ state.js => states.js | 0 9 files changed, 216 insertions(+), 96 deletions(-) create mode 100644 StateManager.js create mode 100644 functions.js create mode 100644 mqtt.js create mode 100644 routes/events.js rename state.js => states.js (100%) diff --git a/StateManager.js b/StateManager.js new file mode 100644 index 0000000..e141891 --- /dev/null +++ b/StateManager.js @@ -0,0 +1,7 @@ +const { Armed, Disarmed, Triggered, Arming, Disarming } = require("./states") + +const StateManager = { + alarmStatus: Armed +}; + +module.exports = StateManager; \ No newline at end of file diff --git a/functions.js b/functions.js new file mode 100644 index 0000000..8913b1b --- /dev/null +++ b/functions.js @@ -0,0 +1,77 @@ +const db = require("./db"); +const mqttClient = require("./mqtt"); + +const StateManager = require("./StateManager"); +const { Armed, Disarmed, Triggered, Arming, Disarming } = require("./states"); + +function insertEvent(deviceId, eventType) { + db.query(` + INSERT INTO events (deviceId, type) + VALUES ($1, $2) + `, [ + deviceId, + eventType + ]); +} + +function triggerAlarm(deviceId) { + mqttClient.publish("alarm/state", JSON.stringify({ status: Triggered })); + StateManager.alarmStatus = Triggered; + console.log("Alarm has been triggered", deviceId); + insertEvent(deviceId, Triggered); +} + +function disarmingAlarm(deviceId) { + mqttClient.publish("alarm/state", JSON.stringify({ status: Disarming })); + StateManager.alarmStatus = Disarming; + console.log("Alarm has been set to Disarming"); + clearTimeout(timer); + timer = setTimeout(disarmingTimerRunout, 10000, deviceId); + insertEvent(deviceId, Disarming); +} + +function disarmingTimerRunout(deviceId) { + if (StateManager.alarmStatus === Disarming) { + disarmAlarm(deviceId); + } +} + +function armAlarm(deviceId) { + mqttClient.publish("alarm/state", JSON.stringify({ status: Arming })); + StateManager.alarmStatus = Arming; + console.log("Alarm has been set to Arming"); + clearTimeout(timer); + timer = setTimeout(armingTimerRunout, 10000, deviceId); + insertEvent(deviceId, Arming); +} + +function armingTimerRunout(deviceId) { + if (StateManager.alarmStatus === Arming) { + mqttClient.publish("alarm/state", JSON.stringify({ status: Armed })); + mqttClient.publish("door/lock", JSON.stringify({ deviceId: 2, lock: true })); + StateManager.alarmStatus = Armed; + console.log("Alarm has been set to Armed"); + insertEvent(deviceId, Armed); + } +} + +function disarmAlarm(deviceId) { + mqttClient.publish("alarm/state", JSON.stringify({ status: Disarmed })); + mqttClient.publish("door/lock", JSON.stringify({ deviceId: 2, lock: false })); + StateManager.alarmStatus = Disarmed; + clearTimeout(timer); + console.log("Alarm has been set to Disarmed"); + insertEvent(deviceId, Disarmed); +} + +let timer; + +module.exports = { + insertEvent, + triggerAlarm, + disarmingAlarm, + disarmingTimerRunout, + armAlarm, + armingTimerRunout, + disarmAlarm +}; \ No newline at end of file diff --git a/index.js b/index.js index 06d2e17..837a8b3 100644 --- a/index.js +++ b/index.js @@ -1,107 +1,34 @@ require("dotenv").config(); -const mqtt = require("mqtt"); const express = require("express"); +const cors = require("cors"); const db = require("./db"); -const { Armed, Disarmed, Triggered, Arming, Disarming } = require("./state"); +const mqttClient = require("./mqtt"); + +const StateManager = require("./StateManager"); +const { Armed, Disarmed, Triggered, Arming, Disarming } = require("./states"); const app = express(); -app.use(require("./routes")) +app.use(express.json()); +app.use(cors()); + +app.use(require("./routes")); -app.use(express.static("public")); +// app.use(express.static("public")); app.listen(process.env.PORT || 8080, () => { console.log(`Listening on port ${process.env.PORT || 8080}`); }); -const mqttClient = mqtt.connect(process.env.MQTT, { clean: true, }); - -mqttClient.on("connect", (a) => { - console.log(`Connected to ${process.env.MQTT}`); - // mqttClient.publish("door/lock", JSON.stringify({ deviceId: 2, lock: true })); - // setTimeout(() => { - // mqttClient.publish("door/lock", JSON.stringify({ deviceId: 2, lock: false })); - // }, 3000); - - - mqttClient.publish("alarm/state", JSON.stringify({ status: alarmStatus })); - // mqttClient.publish("alarm/state", JSON.stringify({ status: "Triggered" })); - // setTimeout(() => { - // mqttClient.publish("alarm/state", JSON.stringify({ status: "Arming" })); - // }, 5000); -}); - -mqttClient.subscribe("motion"); -// mqttClient.subscribe("sound"); -mqttClient.subscribe("temperature"); -mqttClient.subscribe("light"); -mqttClient.subscribe("door/status"); -mqttClient.subscribe("display/arm"); -mqttClient.subscribe("display/disarm"); - -function insertEvent(deviceId, eventType) { - db.query(` - INSERT INTO events (deviceId, type) - VALUES ($1, $2) - `, [ - deviceId, - eventType - ]); -} - -function triggerAlarm(deviceId) { - mqttClient.publish("alarm/state", JSON.stringify({ status: Triggered })); - alarmStatus = Triggered; - console.log("Alarm has been triggered"); - insertEvent(deviceId, Triggered); -} - -function disarmingAlarm(deviceId) { - mqttClient.publish("alarm/state", JSON.stringify({ status: Disarming })); - alarmStatus = Disarming; - console.log("Alarm has been set to Disarming"); - timer = setTimeout(disarmingTimerRunout, 30, deviceId); - insertEvent(deviceId, Disarming); -} - -function disarmingTimerRunout(deviceId) { - if (alarmStatus === Disarming) { - triggerAlarm(deviceId); - } -} - -function armAlarm(deviceId) { - mqttClient.publish("alarm/state", JSON.stringify({ status: Arming })); - alarmStatus = Arming; - console.log("Alarm has been set to Arming"); - timer = setTimeout(armingTimerRunout, 30, deviceId); - insertEvent(deviceId, Arming); -} - -function armingTimerRunout(deviceId) { - if (alarmStatus === Arming) { - mqttClient.publish("alarm/state", JSON.stringify({ status: Armed })); - mqttClient.publish("door/lock", JSON.stringify({ deviceId: 2, lock: true })); - alarmStatus = Armed; - console.log("Alarm has been set to Armed"); - insertEvent(deviceId, Armed); - } -} - -function disarmAlarm(deviceId) { - mqttClient.publish("alarm/state", JSON.stringify({ status: Disarmed })); - mqttClient.publish("door/lock", JSON.stringify({ deviceId: 2, lock: false })); - alarmStatus = Disarmed; - clearTimeout(timer); - console.log("Alarm has been set to Disarmed"); - insertEvent(deviceId, Disarmed); -} - -let timer; - -let alarmStatus = Armed; +const {insertEvent, + triggerAlarm, + disarmingAlarm, + disarmingTimerRunout, + armAlarm, + armingTimerRunout, + disarmAlarm} = require("./functions"); mqttClient.on("message", (topic, message, packet) => { // console.log(packet); @@ -111,7 +38,7 @@ mqttClient.on("message", (topic, message, packet) => { switch (topic) { case "motion": { const data = JSON.parse(message); - if ((alarmStatus === Armed || alarmStatus === Triggered) && data.value === true) { + if ((StateManager.alarmStatus === Armed || StateManager.alarmStatus === Triggered) && data.value === true) { console.log("motion"); triggerAlarm(data.deviceId); } @@ -119,7 +46,7 @@ mqttClient.on("message", (topic, message, packet) => { } case "sound": { const data = JSON.parse(message); - if (alarmStatus === Armed || alarmStatus === Triggered) { + if (StateManager.alarmStatus === Armed || StateManager.alarmStatus === Triggered) { console.log("sound", data.value); triggerAlarm(data.deviceId); } @@ -128,19 +55,21 @@ mqttClient.on("message", (topic, message, packet) => { case "door/status": { const data = JSON.parse(message); console.log(data); - if ((alarmStatus === Armed || alarmStatus === Triggered) && data.open === true) { + if ((StateManager.alarmStatus === Armed || StateManager.alarmStatus === Triggered) && data.open === true) { console.log("door sensor"); - disarmingAlarm(data.deviceId); + triggerAlarm(data.deviceId); } break; } - case "arm": { + case "display/arm": { const data = JSON.parse(message); + console.log(topic, data); armAlarm(data.deviceId); break; } - case "disarm": { + case "display/disarm": { const data = JSON.parse(message); + console.log(topic, data); disarmAlarm(data.deviceId); break; } diff --git a/mqtt.js b/mqtt.js new file mode 100644 index 0000000..d4ba7e6 --- /dev/null +++ b/mqtt.js @@ -0,0 +1,29 @@ +const StateManager = require("./StateManager"); +const mqtt = require("mqtt"); + +const mqttClient = mqtt.connect(process.env.MQTT, { clean: true, }); + +mqttClient.on("connect", (a) => { + console.log(`Connected to ${process.env.MQTT}`); + // mqttClient.publish("door/lock", JSON.stringify({ deviceId: 2, lock: true })); + // setTimeout(() => { + // mqttClient.publish("door/lock", JSON.stringify({ deviceId: 2, lock: false })); + // }, 3000); + + console.log(StateManager.alarmStatus); + mqttClient.publish("alarm/state", JSON.stringify({ status: StateManager.alarmStatus })); + // mqttClient.publish("alarm/state", JSON.stringify({ status: "Triggered" })); + // setTimeout(() => { + // mqttClient.publish("alarm/state", JSON.stringify({ status: "Arming" })); + // }, 5000); +}); + +mqttClient.subscribe("motion"); +// mqttClient.subscribe("sound"); +mqttClient.subscribe("temperature"); +mqttClient.subscribe("light"); +mqttClient.subscribe("door/status"); +mqttClient.subscribe("display/arm"); +mqttClient.subscribe("display/disarm"); + +module.exports = mqttClient; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index df674da..1d72e89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4.18.2", "mqtt": "^5.0.2", @@ -241,6 +242,18 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -800,6 +813,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -1416,6 +1437,15 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1829,6 +1859,11 @@ } } }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, "object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", diff --git a/package.json b/package.json index fecbc97..3a40821 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "dependencies": { + "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4.18.2", "mqtt": "^5.0.2", diff --git a/routes/events.js b/routes/events.js new file mode 100644 index 0000000..fdc331c --- /dev/null +++ b/routes/events.js @@ -0,0 +1,21 @@ +const express = require("express"); +const Router = express.Router(); + +const db = require("../db"); + +Router.get("/events", async (req, res) => { + try { + const databaseResult = await db.query(` + SELECT * FROM events; + `); + + const events = databaseResult.rows; + + return res.status(200).send(events); + } catch { + console.error(error); + return res.sendStatus(500); + } +}) + +module.exports = Router; \ No newline at end of file diff --git a/routes/index.js b/routes/index.js index 059a326..1f96262 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,4 +1,25 @@ const express = require("express"); const Router = express.Router(); +const StateManager = require("../StateManager"); +const { Armed, Disarmed, Triggered, Arming, Disarming } = require("../states"); +const { armAlarm, disarmAlarm } = require("../functions"); + +Router.use(require("./events")); + +Router.get("/alarm/state", (req, res) => { + return res.send({ status: StateManager.alarmStatus }); +}); + +Router.post("/alarm/arm", (req, res) => { + armAlarm(3); + return res.send({ status: StateManager.alarmStatus }); +}); + +Router.post("/alarm/disarm", (req, res) => { + disarmAlarm(3); + return res.send({ status: StateManager.alarmStatus }); +}); + + module.exports = Router; \ No newline at end of file diff --git a/state.js b/states.js similarity index 100% rename from state.js rename to states.js