require("dotenv").config(); const express = require("express"); const cors = require("cors"); const db = require("./db"); const mqttClient = require("./mqtt"); const StateManager = require("./StateManager"); const { Armed, Disarmed, Triggered, Arming, Disarming } = require("./states"); const app = express(); app.use(express.json()); app.use(cors()); app.use(require("./routes")); // app.use(express.static("public")); app.listen(process.env.PORT || 8080, () => { console.log(`Listening on port ${process.env.PORT || 8080}`); }); const { insertEvent, triggerAlarm, disarmingAlarm, disarmingTimerRunout, armAlarm, armingTimerRunout, disarmAlarm, unlockDoor, lockDoor } = require("./functions"); mqttClient.on("message", (topic, message, packet) => { // console.log(packet); if (packet.retain) return; // console.log(topic, message.toString()); switch (topic) { case "motion": { const data = JSON.parse(message); if ((StateManager.alarmStatus === Armed || StateManager.alarmStatus === Triggered) && data.value === true) { console.log("motion"); triggerAlarm(data.deviceId); } break; } case "sound": { const data = JSON.parse(message); if (StateManager.alarmStatus === Armed || StateManager.alarmStatus === Triggered) { console.log("sound", data.value); triggerAlarm(data.deviceId); } break; } case "door/status": { const data = JSON.parse(message); console.log(data); if ((StateManager.alarmStatus === Armed || StateManager.alarmStatus === Triggered) && data.open === true) { console.log("door sensor"); triggerAlarm(data.deviceId); } if (data.open === false) { lockDoor(); } break; } case "display/arm": { const data = JSON.parse(message); console.log(topic, data); if (StateManager.alarmStatus === Disarmed) armAlarm(data.deviceId); break; } // case "display/disarm": { // const data = JSON.parse(message); // console.log(topic, data); // disarmAlarm(data.deviceId); // break; // } case "light": { const data = JSON.parse(message); db.query(` INSERT INTO light_measurements (deviceId, value) VALUES ($1, $2) `, [ data.deviceId, data.value ]); break; } case "temperature": { const data = JSON.parse(message); db.query(` INSERT INTO temperature_measurements (deviceId, value) VALUES ($1, $2) `, [ data.deviceId, data.value ]); break; } case "card/read": { const data = JSON.parse(message); console.log(data); const uids = ["s8K/CQ==", "fo3S0VABBOA=", "6XjCwg=="] if (uids.includes(data.cardUID)) { if (StateManager.alarmStatus != Disarmed) { disarmAlarm(); } unlockDoor(); } break; } case "display/passwordEntered": { const data = JSON.parse(message); console.log(data); const pins = ["1234", "112233"]; if (pins.includes(data.password.join(""))) { mqttClient.emit("display/passwordResponse", { deviceId: data.deviceId, correct: true, password: data.password }); if (StateManager.alarmStatus != Disarmed) { disarmAlarm(); } else { armAlarm(); } unlockDoor(); } else { mqttClient.emit("display/passwordResponse", { deviceId: data.deviceId, correct: false, password: data.password }); } break; } default: console.log("Unsupported topic received: " + topic); break; } });