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