diff --git a/js/status/device-roles.js b/js/status/device-roles.js index 1e51f2d..9a3e0b9 100644 --- a/js/status/device-roles.js +++ b/js/status/device-roles.js @@ -9,14 +9,12 @@ async function deviceRolesChart() { ctx.fillText('Loading data...', canvas.width / 2, canvas.height / 2); try { - const response = await fetch('https://map.sthlm-mesh.se/api/v1/nodes/'); - const data = await response.json(); - + await fetchNodes(); const predefinedLabels = ['CLIENT', 'CLIENT_MUTE', 'CLIENT_HIDDEN', 'ROUTER_LATE', 'ROUTER', 'ROUTER_CLIENT']; // Count role occurrences const roleCounts = {}; - data.nodes.forEach(node => { + nodes.forEach(node => { const role = node.role_name || "UNKNOWN"; roleCounts[role] = (roleCounts[role] || 0) + 1; }); diff --git a/js/status/nodes-seen.js b/js/status/nodes-seen.js index b7f8a70..d10cda9 100644 --- a/js/status/nodes-seen.js +++ b/js/status/nodes-seen.js @@ -1,21 +1,16 @@ +function countNodesSince(daysAgo) { + const now = new Date(); + const threshold = new Date(now); + threshold.setDate(threshold.getDate() - daysAgo); + return nodes.filter(node => new Date(node.updated_at) >= threshold).length; +} async function nodesSeen() { - const response = await fetch('https://map.sthlm-mesh.se/api/v1/nodes/'); - const data = await response.json(); - const nodes = data.nodes; - const now = new Date(); - - - const countNodesSince = (daysAgo) => { - const threshold = new Date(now); - threshold.setDate(threshold.getDate() - daysAgo); - return nodes.filter(node => new Date(node.updated_at) >= threshold).length; - }; + await fetchNodes(); document.getElementById("count-30").textContent = countNodesSince(30); document.getElementById("count-7").textContent = countNodesSince(7); document.getElementById("count-1").textContent = countNodesSince(1); - } -nodesSeen(); \ No newline at end of file +nodesSeen(); diff --git a/js/status/portnum-distribution-chart.js b/js/status/portnum-distribution-chart.js index 0114d91..9ea2463 100644 --- a/js/status/portnum-distribution-chart.js +++ b/js/status/portnum-distribution-chart.js @@ -1,20 +1,14 @@ -let allNodes = []; let highlightedIndex = -1; let chartInstance; -async function fetchNodes() { - const res = await fetch('https://map.sthlm-mesh.se/api/v1/nodes/'); - const data = await res.json(); - - const threshold = new Date(); - threshold.setDate(threshold.getDate() - 1); - allNodes = data.nodes.filter(node => new Date(node.updated_at) >= threshold); -} - function filterSuggestions(query) { const lowerQuery = query.toLowerCase(); - return allNodes?.filter(node => node.long_name?.toLowerCase().includes(lowerQuery)) || []; + const threshold = new Date(); + threshold.setDate(threshold.getDate() - 1); + return nodes + .filter(node => new Date(node.updated_at) >= threshold) + .filter(node => node.long_name?.toLowerCase().includes(lowerQuery)) || []; } function showSuggestions(matches) { @@ -178,4 +172,4 @@ async function portnumDistributionChart(nodeId = null) { } } -fetchNodes().then(() => portnumDistributionChart()); +portnumDistributionChart(); diff --git a/js/status/shared.js b/js/status/shared.js new file mode 100644 index 0000000..fbedde4 --- /dev/null +++ b/js/status/shared.js @@ -0,0 +1,21 @@ +let nodes = []; +let fetchPromise = null; + +async function fetchNodes() { + if (nodes.length > 0) return; + + if (!fetchPromise) { + fetchPromise = fetch('https://map.sthlm-mesh.se/api/v1/nodes/') + .then(res => res.json()) + .then(data => { + nodes = data.nodes; + fetchPromise = null; // reset after successful fetch + }) + .catch(err => { + fetchPromise = null; // reset on failure + throw err; + }); + } + + await fetchPromise; +} diff --git a/sitemap.xml b/sitemap.xml index cb9314d..ba20cf2 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://sthlm-mesh.se/docs/settings/2025-02-26T18:39:36+01:00https://sthlm-mesh.se/docs/device_role/2025-02-26T18:42:15+01:00https://sthlm-mesh.se/docs/position/2025-02-22T09:11:26+01:00https://sthlm-mesh.se/docs/mqtt/2025-03-31T19:16:34+02:00https://sthlm-mesh.se/docs/neighbor_info/2025-02-23T20:48:06+01:00https://sthlm-mesh.se/docs/kartor/2025-03-08T20:11:28+01:00https://sthlm-mesh.se/docs/solar_nodes/2025-04-12T20:27:51+02:00https://sthlm-mesh.se/docs/communities/2025-02-23T20:48:06+01:00https://sthlm-mesh.se/categories/https://sthlm-mesh.se/docs/2025-03-03T22:48:04+01:00https://sthlm-mesh.se/messages/2025-04-10T17:24:25+02:00https://sthlm-mesh.se/meetups/2025-04-10T07:31:33+02:00https://sthlm-mesh.se/about/2025-02-23T18:02:23+01:00https://sthlm-mesh.se/status/2025-04-09T22:07:50+02:00https://sthlm-mesh.se/2025-04-13T13:44:19+02:00https://sthlm-mesh.se/tags/ \ No newline at end of file +https://sthlm-mesh.se/docs/settings/2025-02-26T18:39:36+01:00https://sthlm-mesh.se/docs/device_role/2025-02-26T18:42:15+01:00https://sthlm-mesh.se/docs/position/2025-02-22T09:11:26+01:00https://sthlm-mesh.se/docs/mqtt/2025-03-31T19:16:34+02:00https://sthlm-mesh.se/docs/neighbor_info/2025-02-23T20:48:06+01:00https://sthlm-mesh.se/docs/kartor/2025-03-08T20:11:28+01:00https://sthlm-mesh.se/docs/solar_nodes/2025-04-12T20:27:51+02:00https://sthlm-mesh.se/docs/communities/2025-02-23T20:48:06+01:00https://sthlm-mesh.se/categories/https://sthlm-mesh.se/docs/2025-03-03T22:48:04+01:00https://sthlm-mesh.se/messages/2025-04-10T17:24:25+02:00https://sthlm-mesh.se/meetups/2025-04-10T07:31:33+02:00https://sthlm-mesh.se/about/2025-02-23T18:02:23+01:00https://sthlm-mesh.se/status/2025-04-14T22:55:54+02:00https://sthlm-mesh.se/2025-04-13T13:44:19+02:00https://sthlm-mesh.se/tags/ \ No newline at end of file diff --git a/status/index.html b/status/index.html index c6c5d0f..4329d5e 100644 --- a/status/index.html +++ b/status/index.html @@ -6,11 +6,11 @@ Skapade paket per nod Grafen nedan visar vilka noder som har skickat flest paket – Senaste 7 dagarna – Senaste 30 dagarna Text Meddelanden Antalet meddelanden per timme senaste 7 dygnen. Grafen visar meddelanden som skickats på LongFast kanalen, men även okrypterade meddelanden mellan noder. De meddelanden som skickas går att se här. -Skapade paket per nod Grafen nedan visar vilka noder som har skickat flest paket under det senaste dygnet. Graferna bygger på MQTT-data från ett begränsat antal noder.">

Fördelningen av olika pakettyper i nätverket under de senaste dygnet. Diagrammet visar hur nätverket används, inklusive meddelanden, positionstelemetri och andra systempaket. Sökrutan till höger kan användas för att visa antalet paket av respektive typ för en given nod.

Hårdvarumodeller

Antalet enheter av respektive hårdvarutyp som synts i meshet de senaste 30 dagarna.

OM

Graferna baseras på data från map.sthlm-mesh.se, där data samlas in från ett par noder i Stockholmsområdet. Data hämtas från API’t, som vi dessutom har utökat med fler funktioner för att möjliggöra mer analys. Visualisering sker genom biblioteket chartjs.org.

+