Back to posts Edit this post
Copy content

25 May 17:08

Zadanko 12 bdjs
// model/signal.js import mongoose from "mongoose"; const signalSchema = new mongoose.Schema({ sensor: String, timestamp: Number, value: Number, error: Number }); signalSchema.index({ sensor: 1, timestamp: 1 }, { unique: true }); export const Signal = mongoose.model("Signal", signalSchema); // services/sheduler.js import fetch from "node-fetch"; import { Signal } from "../model/signal.js"; import { debug, error } from "../utils/logger.js"; const signalNames = ["s1", "s2", "s3", "s4", "s5", "s6"]; function startDataFetcher() { console.log("Scheduler wystartował"); const seconds = 200; const intervalMs = 400; setInterval(async () => { const cutoff = Date.now() - seconds * 1000; for (let signalName of signalNames) { try { const res = await fetch(`https://bdijs.ontime24.ovh/api/z12/signal/${signalName}`); const data = await res.json(); debug("Pobrane dane:", data); await Signal.updateOne( { sensor: data.sensor, timestamp: data.timestamp }, { $set: { sensor: data.sensor, timestamp: data.timestamp, value: data.value, error: data.error } }, { upsert: true } ); } catch (err) { error("Błąd pobierania danych:", err.message); } } try { await Signal.deleteMany({ timestamp: { $lt: cutoff } }); } catch (err) { error("Błąd usuwania starych danych:", err.message); } }, intervalMs); } export default startDataFetcher; // middleware/signal.js import { Signal } from "../model/signal.js"; const signalData = async function(req, res, next) { const signalName = req.params.sensor; const allowedSignals = ["s1", "s2", "s3", "s4", "s5", "s6"]; if (!allowedSignals.includes(signalName)) { req.d = { name: signalName, x: [], y: [] }; next(); return; } try { const cutoff = Date.now() - 200 * 1000; const signals = await Signal.find({ sensor: signalName, timestamp: { $gte: cutoff } }) .sort({ timestamp: 1 }); const x = signals.map(s => s.timestamp); const y = signals.map(s => s.value); req.d = { name: signalName, x: x, y: y }; } catch (err) { console.error("Błąd pobierania sygnałów:", err); req.d = { name: signalName, x: [], y: [] }; } next(); }; export default signalData; // routes/api.js import { Router } from "express"; import signalData from "../middleware/signal.js"; import pogoda from "../middleware/pogoda.js"; const router = Router(); router.get("/api/pogoda", pogoda, function(req, res, next) { res.json(req.d); }); router.get("/api/signal/:sensor", signalData, function(req, res, next) { res.json(req.d); }); export default router; // routes/index.js import { Router } from "express"; const router = Router(); router.get("/", function(req, res, next) { res.render("pogoda", { title: "Pogoda" }); }); router.get("/signal", function(req, res, next) { res.render("signal", { title: "Sygnały" }); }); export default router; <!-- views/signal.ejs --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0" > <link rel="stylesheet" href="/stylesheets/style.css" charset="utf-8"> <script src="/javascripts/jquery-4.0.0.min.js" charset="utf-8"></script> <script src="/javascripts/plotly-3.4.0.min.js" charset="utf-8"></script> <script src="/javascripts/signal.js" charset="utf-8"></script> </head> <body> <h1><%=title%></h1> <p>Wykres danych realtime z czujnika <span class="signal-name"></span></p> <div style="margin: 20px 0;"> <button class="sensor-btn" data-sensor="s1">s1</button> <button class="sensor-btn" data-sensor="s2">s2</button> <button class="sensor-btn" data-sensor="s3">s3</button> <button class="sensor-btn" data-sensor="s4">s4</button> <button class="sensor-btn" data-sensor="s5">s5</button> <button class="sensor-btn" data-sensor="s6">s6</button> </div> <div style="display:flex;flex-direction: row;flex-wrap: wrap; justify-content: center;"> <div style="width:100%;" > <h1 style="text-align:center;">Czujnik <span class="signal-name"></span></h1> <div id="signal"></div> </div> </div> <code><pre id="test"></pre></code> </body> </html> // public/javascripts/signal.js $(document).ready(() => { let currentSensor = "s1"; function drawPlot(d) { Plotly.newPlot("signal", [ { x: d.x, y: d.y, type: "scatter", mode: "lines", line: { color: "red", width: 2 }, marker: { color: "cyan", size: 0, line: { color: "white", width: 1 } } } ], { paper_bgcolor: "#111", plot_bgcolor: "#111", font: { color: "#eee" }, title: { text: d.name }, xaxis: { title: { text: "Czas" }, type: "date", tickformat: "%H:%M:%S", tickmode: "auto", nticks: 10, gridcolor: "#333", linecolor: "#aaa", tickcolor: "#aaa" }, yaxis: { title: { text: "Wartość" }, range: [-1.1, 1.1], gridcolor: "#333", linecolor: "#aaa", tickcolor: "#aaa" } }); $("span.signal-name").html(d.name); } function loadSignal() { $.get(`/api/signal/${currentSensor}`, (d, status) => { drawPlot(d); }); } $(".sensor-btn").on("click", function() { currentSensor = $(this).data("sensor"); loadSignal(); }); loadSignal(); setInterval(() => { loadSignal(); }, 1000); });

No files