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