Moved functions to seperate files

main
fbp 2 years ago
parent 9650ca7ed6
commit 2637679fda

@ -0,0 +1,7 @@
const { Armed, Disarmed, Triggered, Arming, Disarming } = require("./states")
const StateManager = {
alarmStatus: Armed
};
module.exports = StateManager;

@ -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
};

@ -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;
}

@ -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;

35
package-lock.json generated

@ -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",

@ -1,5 +1,6 @@
{
"dependencies": {
"cors": "^2.8.5",
"dotenv": "^16.3.1",
"express": "^4.18.2",
"mqtt": "^5.0.2",

@ -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;

@ -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;
Loading…
Cancel
Save