Files
tf-iot-dashboard/server.js
T

66 lines
1.6 KiB
JavaScript

const express = require("express");
const { createClient } = require("redis");
const PORT = process.env.PORT || 3000;
const REDIS_HOST = process.env.REDIS_HOST || "127.0.0.1";
const REDIS_PORT = parseInt(process.env.REDIS_PORT || "6379");
const REDIS_PASSWORD = process.env.REDIS_PASSWORD || undefined;
const app = express();
app.use(express.static("public"));
const redis = createClient({
socket: { host: REDIS_HOST, port: REDIS_PORT },
password: REDIS_PASSWORD,
});
redis.on("error", (err) => console.error("Redis error:", err.message));
async function start() {
await redis.connect();
console.log("Redis connected");
// API: latest sensor values
app.get("/api/latest", async (req, res) => {
try {
const data = await redis.hGetAll("iot:latest");
const items = Object.entries(data).map(([id, json]) => ({
sensor_id: id,
...JSON.parse(json),
}));
res.json(items);
} catch (e) {
res.json({ error: e.message });
}
});
// API: counters by device type
app.get("/api/counters", async (req, res) => {
try {
const data = await redis.hGetAll("iot:counters");
res.json(data);
} catch (e) {
res.json({ error: e.message });
}
});
// API: recent events
app.get("/api/recent", async (req, res) => {
try {
const items = await redis.zRange("iot:recent", 0, 49, { REV: true });
res.json(items.map(JSON.parse));
} catch (e) {
res.json({ error: e.message });
}
});
// Health check
app.get("/", (req, res) => {
res.send("IoT Dashboard OK");
});
app.listen(PORT, () => console.log(`Dashboard on port ${PORT}`));
}
start();