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, changed: true })); StateManager.alarmStatus = Triggered; console.log("Alarm has been triggered", deviceId); insertEvent(deviceId, Triggered); } function disarmingAlarm(deviceId) { mqttClient.publish("alarm/state", JSON.stringify({ status: Disarming, changed: true })); 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, changed: true })); 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, changed: 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, changed: true })); StateManager.alarmStatus = Disarmed; clearTimeout(timer); console.log("Alarm has been set to Disarmed"); insertEvent(deviceId, Disarmed); } function lockDoor() { mqttClient.publish("door/lock", JSON.stringify({ deviceId: 2, lock: true })); } let doorTimer; function unlockDoor() { mqttClient.publish("door/lock", JSON.stringify({ deviceId: 2, lock: false })); clearTimeout(doorTimer); doorTimer = setTimeout(lockDoor, 5000); } let timer; module.exports = { insertEvent, triggerAlarm, disarmingAlarm, disarmingTimerRunout, armAlarm, armingTimerRunout, disarmAlarm, lockDoor, unlockDoor };