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