You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

146 lines
3.3 KiB
JavaScript

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