diff --git a/index.js b/index.js index e7b8627..1eeb591 100644 --- a/index.js +++ b/index.js @@ -16,17 +16,148 @@ app.listen(process.env.PORT || 8080, () => { console.log(`Listening on port ${process.env.PORT || 8080}`); }); -const mqttClient = mqtt.connect(process.env.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); }); mqttClient.subscribe("motion"); -mqttClient.subscribe("sound"); +// 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; mqttClient.on("message", (topic, message) => { - console.log(topic, message.toString()); + // console.log(topic, message.toString()); + switch (topic) { + case "motion": { + const data = JSON.parse(message); + if (alarmStatus === Armed && data.value === true) { + console.log("motion"); + triggerAlarm(data.deviceId); + } + break; + } + case "sound": { + const data = JSON.parse(message); + if (alarmStatus === Armed) { + console.log("sound", data.value); + triggerAlarm(data.deviceId); + } + break; + } + case "door/status": { + const data = JSON.parse(message); + console.log(data); + if (alarmStatus === Armed && data.open === true) { + console.log("door sensor"); + disarmingAlarm(data.deviceId); + } + break; + } + case "arm": { + const data = JSON.parse(message); + armAlarm(data.deviceId); + break; + } + case "disarm": { + const data = JSON.parse(message); + 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; + } + default: + console.log("Unsupported topic received: " + topic); + break; + } }); \ No newline at end of file