diff --git a/js/status/channel-utilization.js b/js/status/channel-utilization.js
new file mode 100644
index 0000000..1d43657
--- /dev/null
+++ b/js/status/channel-utilization.js
@@ -0,0 +1,87 @@
+async function channelUtilizationHourlyAverage() {
+ const canvas = document.getElementById('channelUtilizationChart');
+ const ctx = canvas.getContext('2d');
+
+ // show loading
+ ctx.font = '16px Arial';
+ ctx.fillStyle = 'gray';
+ ctx.textAlign = 'center';
+ ctx.fillText('Loading...', canvas.width/2, canvas.height/2);
+
+ try {
+ const response = await fetch('https://map.sthlm-mesh.se/api/v1/stats/channel-utilization-stats?days=7');
+ const data = await response.json();
+
+ const labels = data.map(entry => entry.recorded_at);
+ const values = data.map(entry => parseFloat(entry.avg_channel_utilization));
+
+ new Chart(ctx, {
+ type: 'line',
+ data: {
+ labels: labels,
+ datasets: [{
+ label: 'Hourly Avg Channel Utilization',
+ data: values,
+ borderColor: 'rgb(15, 169, 252)',
+ borderWidth: 2,
+ tension: 0.1,
+ pointRadius: 0,
+ }]
+ },
+ options: {
+ responsive: true,
+ maintainAspectRatio: false,
+ scales: {
+ x: {
+ type: 'time',
+ time: {
+ unit: 'day',
+ tooltipFormat: 'yyyy-MM-dd HH:mm',
+ displayFormats: { day: 'yyyy-MM-dd' }
+ },
+ },
+ y: {
+ min: 11,
+ max: 14,
+ title: { display: true, text: 'Avg. Channel Utilization (%)' }
+ }
+ },
+ plugins: {
+ legend: { display: false },
+ tooltip: { mode: 'index', intersect: false },
+ annotation: {
+ annotations: {
+ bad: {
+ type: 'box',
+ yMin: 13,
+ yMax: 15,
+ backgroundColor: 'rgba(255, 0, 0, 0.2)'
+ },
+ medium: {
+ type: 'box',
+ yMin: 12,
+ yMax: 13,
+ backgroundColor: 'rgba(234, 184, 57, 0.2)', //'rgba(255, 165, 0, 0.1)'
+ },
+ good: {
+ type: 'box',
+ yMin: 0,
+ yMax: 12,
+ backgroundColor: 'rgba(1, 163, 23, 0.1)', //'rgba(0, 128, 0, 0.1)'
+ }
+ }
+ }
+ }
+ }
+ });
+
+ } catch (err) {
+ console.error('Error loading channel utilization:', err);
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ ctx.fillStyle = 'red';
+ ctx.fillText('Error loading data', canvas.width/2, canvas.height/2);
+ }
+
+}
+
+channelUtilizationHourlyAverage();
\ No newline at end of file
diff --git a/sitemap.xml b/sitemap.xml
index 72199f1..0515b7f 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 med 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 vi kan se om en enhet kör en gammal firmware version genom att kolla efter “ok_to_mqtt” bitten som infördes i 2.5.0.9ac0e26.
Visar genomsnittlig batterinivå av de noder som rapporterat batteri nivå och inte har fast strömförsörjning.
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.