diff --git a/js/status/max-hops-chart.js b/js/status/max-hops-chart.js
new file mode 100644
index 0000000..8cddf44
--- /dev/null
+++ b/js/status/max-hops-chart.js
@@ -0,0 +1,77 @@
+function getHopsColor(maxHops) {
+ switch(maxHops){
+ case 0: return 'rgb(41, 156, 70)';
+ case 1: return 'rgb(41, 156, 70)';
+ case 2: return 'rgb(79, 170, 77)';
+ case 3: return 'rgb(118, 182, 84)';
+ case 4: return 'rgb(157, 195, 91)';
+ case 5: return 'rgb(195, 208, 98)';
+ case 6: return 'rgb(229, 189, 82)';
+ case 7: return 'rgb(242, 161, 67)';
+ }
+ return 'rgb(200, 200, 200)';
+}
+
+async function maxHopsGraph() {
+ const canvas = document.getElementById('maxHopsChart');
+ const ctx = canvas.getContext('2d');
+
+ // Loading message
+ ctx.font = '16px Arial';
+ ctx.fillStyle = 'gray';
+ ctx.textAlign = 'center';
+ ctx.fillText('Loading data...', canvas.width / 2, canvas.height / 2);
+
+ try {
+ await fetchNodes();
+
+ // Initialize buckets
+ const countsByHops = {};
+ for (let i = 0; i <= 7; i++) countsByHops[i] = 0;
+
+ const nodesWithMaxHops = nodes.filter(n => n.max_hops !== null && n.max_hops !== undefined);
+
+ for (const node of nodesWithMaxHops) {
+ const val = Number(node.max_hops);
+ countsByHops[val] += 1;
+ }
+
+ const labels = [0, 1, 2, 3, 4, 5, 6, 7];
+ const counts = labels.map(n => countsByHops[n]);
+ const backgroundColors = labels.map(n => getHopsColor(n));
+
+ const chartContainer = document.getElementById('maxHopsContainer');
+ if (chartContainer) chartContainer.style.height = `${labels.length * 35 + 50}px`;
+
+ new Chart(ctx, {
+ type: 'bar',
+ data: {
+ labels,
+ datasets: [{
+ label: 'Antal',
+ data: counts,
+ backgroundColor: backgroundColors,
+ }],
+ },
+ options: {
+ responsive: true,
+ maintainAspectRatio: false,
+ indexAxis: 'y',
+ scales: {
+ y: { ticks: { autoSkip: false, font: { size: 12 } } },
+ x: { beginAtZero: true },
+ },
+ plugins: { legend: { display: false } },
+ },
+ });
+ } catch (error) {
+ console.error('Error building max_hops chart:', error);
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ ctx.fillStyle = 'red';
+ ctx.fillText('Error loading data', canvas.width / 2, canvas.height / 2);
+ }
+}
+
+maxHopsGraph();
+
+
diff --git a/sitemap.xml b/sitemap.xml
index 0de6b17..a00b860 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -1 +1 @@
-
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.
Antalet enheter av respektive Enhetsroll som synts i meshet de senaste 30 dagarna. I större mesh så som Stockholm bör i princip all noder vara Client eller Client Mute. Enbart ett fåtal Router eller Repeater behövs. Dessa måste vara placerade extremt strategiskt, till exempel högst upp i en skidbacke. Router Client är en avvecklad roll som inte finns längre, men i meshen lever det kvar några noder som inte blivit uppdaterade. För mer info see vår dokumentation.
Grafen visar position precision, eller noggrannhet, på de noder som rapporterat sin position de senaste 30 dagarna. Vi ser gärna att man använder en noggrannhet på ±182m eller noggrannare. Detta är dock inte möjligt att ställa in i iPhone Appen. -För mer info se vår dokumentation.
Antalet enheter av firmware version som synts i meshet de senaste 30 dagarna. Information om firmware information skickas inte över meshet. Men det går att härleda till viss del utifrån vilken information de paket som skickas innehåller.
Visar antalet noder som är markerade som “unmessagable” respektive “messagable” baserat på de senaste 30 dagarnas aktivitet. Inställningen “unmessagable” används för att identifiera oövervakade infrastrukturnoder så att meddelanden inte skickas till noder som aldrig kommer att svara. Noder som inte har denna inställning definierad räknas som “messagable” eftersom denna egenskap infördes i version 2.6.8.
Visar antalet noder som har “ok_to_mqtt” aktiverad eller avstängd under de senaste 30 dagarna. Flaggan är en begäran om att paket inte ska vidarebefordras till MQTT-servrar och karttjänster som sthlm-mesh. Begäran behöver dock inte respekteras. För att undvika exponering på karttjänster bör man använda krypterade kanaler istället för att dela information publikt. -Äldre firmware skickar inte denna flagga och behandlas som falskt värde.
Visar genomsnittlig batterinivå av de noder som rapporterat batteri nivå och inte har fast strömförsörjning.
Visar den genomsnittliga Channel Utilization, det vill säga hur mycket radiofrekvensen används, baserat på rapporter från enheter i meshen. Eftersom enheter inte skickar telemetri när kanalutnyttjandet är högt kan siffran bli missvisande. Detsamma gäller för portabla enheter eller enheter som är placerade inomhus. Förhoppningsvis ger grafen ändå ett värdefullt underlag för att förstå hur meshen mår.
Antalet enheter av respektive hårdvarutyp som synts i meshet de senaste 30 dagarna.
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.