diff --git a/assets/scss/_styles_project.scss b/assets/scss/_styles_project.scss index 07e0079..584ef89 100644 --- a/assets/scss/_styles_project.scss +++ b/assets/scss/_styles_project.scss @@ -18,12 +18,6 @@ Might want to allow editing /* Change the color of the doc rightside sidebar links */ .td-sidebar-toc a { color: grey !important; } -/* -Hide links to the last change commit. -Ugly workaround that leves to colon ":" -*/ -.td-page-meta__lastmod a { display: none; } - /* Formating of inline blocks */ code { background-color: #f0f0f0; diff --git a/assets/scss/_variables_project.scss b/assets/scss/_variables_project.scss index 70938d6..6d7d017 100644 --- a/assets/scss/_variables_project.scss +++ b/assets/scss/_variables_project.scss @@ -6,6 +6,6 @@ Add styles or override variables from the theme here. /* Color and Style */ $primary: #30a552; -$secondary: #0d6efd;; +$secondary: #0d6efd; $tertiary: #8c68cd; $warning: #ffc107; \ No newline at end of file diff --git a/content/sv/_index.md b/content/sv/_index.md index b297ab7..ae1a1b5 100644 --- a/content/sv/_index.md +++ b/content/sv/_index.md @@ -42,15 +42,33 @@ Det är alltid trevligt att träffas och prata radio. Kolla in våra [Meetups]({ *

Främja aktivitet i meshet.

{{% /blocks/section %}} -{{% blocks/section color="primary" %}} + +{{% blocks/lead color="meshtastic-green" %}} Kom igång med Meshtastic {.h1} För att komma igång rekommenderar vi att följa instruktionerna på den officiella hemsidan: https://meshtastic.org. +{{% /blocks/lead %}} +{{% blocks/section type="row" color="info" %}} +{{% blocks/feature icon="fa-walkie-talkie" title="Införskaffa enhet" %}} +Det finns enheter för olika frekvensband, i Sverige och inom EU är det **868Mhz** som används. Några populära enheter: +[WisMesh Pocket](), +[seeed studio T1000-E](https://www.seeedstudio.com/SenseCAP-Card-Tracker-T1000-E-for-Meshtastic-p-5913.html), +[Heltec LoRa 32](https://heltec.org/project/wifi-lora-32-v3/), +[LILYGO T-Deck Plus](https://lilygo.cc/products/t-deck-plus-1), +[LILYGO T-Beam](https://lilygo.cc/products/t-beam). +{{% /blocks/feature %}} + +{{% blocks/feature icon="fa-microchip" title="Flasha firmware" %}} +När du fått din enhet behöver Meshtastic programvaran laddas på. Detta görs enklast via en dator: http://flasher.meshtastic.org/. +Vi rekommenderar den senaste betan, men titta tillbaka regelbundet då utvecklingen går snabbt. +{{% /blocks/feature %}} + +{{% blocks/feature icon="fab fa-app-store-ios" title="Konfigurera med appen" %}} +För att konfigurera din en rekommenderas den officiella appen för [iOS](https://apple.co/3Auysep) eller [Android](https://play.google.com/store/apps/details?id=com.geeksville.mesh&pli=1). +I Stockholm använder vi kanal-preseten **Long Fast**. För mer detaljer om enhetskonfiguration se vår sida: [rekommenderade inställningar]({{}}). +{{% /blocks/feature %}} -{{% alert title="Viktigt" color="success" %}} -Vi använder oss av 868mhz på preset Long Range - Fast. -{{% /alert %}} {{% /blocks/section %}} @@ -70,11 +88,11 @@ Vi använder oss av 868mhz på preset Long Range - Fast.
-

ROUTER

- ... +

Client Mute

+ ...
-

En nod placerad högt upp med fri sikt åt alla håll. Använder en optimerad och väl-testad setup. Måste koordineras med övriga meshet.

- Läs mer +

För portabla noder eller noder som används inomhus. Notera: En nod inställd på Client Mute kan fortfarande skicka och ta emot meddelanden.

+ Läs mer

@@ -90,11 +108,11 @@ Vi använder oss av 868mhz på preset Long Range - Fast.
-

Client Mute

- ... +

ROUTER

+ ...
-

För portabla noder eller noder som används inomhus. Notera: En nod inställd på Client Mute kan fortfarande skicka och ta emot meddelanden.

- Läs mer +

En nod placerad högt upp med fri sikt åt alla håll. Använder en optimerad och väl-testad setup. Måste koordineras med övriga meshet.

+ Läs mer

diff --git a/content/sv/docs/kartor.md b/content/sv/docs/kartor.md index 0095e27..427a61e 100644 --- a/content/sv/docs/kartor.md +++ b/content/sv/docs/kartor.md @@ -5,7 +5,8 @@ weight: 80 Det finns massvis med olika karttjänster, vi rekommenderar Liam Cottles karta: https://meshtastic.liamcottle.net/ - + + {{% alert title="Uppmärksamma" color="warning" %}} För att tillåta andra noder publicera din nod på kartan behöver `lora.config_ok_to_mqtt` vara aktiverat. diff --git a/content/sv/messages/index.html b/content/sv/messages/index.html new file mode 100644 index 0000000..810cf78 --- /dev/null +++ b/content/sv/messages/index.html @@ -0,0 +1,35 @@ +--- +title: Meddelanden +linkTitle: Meddelanden +menu: {main: {weight: 50}} +--- +
+

Senaste meddelanden

+ + +

Loading...

+
+ + diff --git a/content/sv/status/index.md b/content/sv/status/index.md index 1bdc992..e1eb006 100644 --- a/content/sv/status/index.md +++ b/content/sv/status/index.md @@ -9,6 +9,23 @@ Grafer och statistik specifikt för Stockholm's meshen. {{% /blocks/cover %}} {{% blocks/section color="white" %}} + +{{% alert title="Uppmärksamma" color="warning" %}} +Vi hade problem med datainsamlingen den 8/3 vilket påverkar graferna och statistiken. +{{% /alert %}} + +## Skapade paket per nod +Grafen nedan visar vilka noder som har skickat flest paket under det senaste dygnet. Vidarebefordrade meddelanden och krypterade paket är inte medräknade. +Datat i grafen är endast en uppskattning och bör inte ses som exakt. Graferna bygger på MQTT-data från ett begränsat antal noder. +Eftersom vi har begränsad bandbredd är det viktigt att hålla nere trafiken. En sändningsvolym på max 50–100 paket per dygn är önskvärd. +{{< lazy-img max-width="800px" aspect-ratio="1/1" +src="https://dash.roslund.cloud/render/d-solo/aedo2cbpvy800a/sthlm-mesh?orgId=1&theme=light&panelId=7&width=1000&height=1000&scale=1" >}} + +## Packet typer +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. +{{< lazy-img max-width="774px" aspect-ratio="774/387" +src="https://dash.roslund.cloud/render/d-solo/aedo2cbpvy800a/sthlm-mesh?orgId=1&theme=light&panelId=6&width=1000&height=500&scale=1" >}} + ## Kanalutnyttjande Den genomsnittliga kanalutnyttjandet i Stockholm under de senaste 7 dygnen. Observera att många noder slutar skicka telemetri vid hög belastning (över 25 %), vilket kan påverka grafens noggrannhet. Trots detta ger gränsvärdena i grafen en god indikation på nätverkets hälsa över tid. @@ -21,25 +38,12 @@ Antalet meddelande per timme senaste 7 dygnen. {{< lazy-img max-width="774px" aspect-ratio="774/387" src="https://dash.roslund.cloud/render/d-solo/aedo2cbpvy800a/sthlm-mesh?orgId=&from=now-7d&to=now&theme=light&panelId=4&width=1000&height=500&scale=1&tz=Europe%2FStockholm" >}} - ## Batteri Visar den genomsnittliga batteri-nivån i meshet senaste 7 dygnen. Grafen försöker exkludera noder som är inkopplade till en strömkälla och som således inte går på batteri. {{< lazy-img max-width="774px" aspect-ratio="774/387" src="https://dash.roslund.cloud/render/d-solo/aedo2cbpvy800a/sthlm-mesh?orgId=1&from=now-7d&to=now&theme=light&panelId=2&width=1000&height=500&scale=1&tz=Europe%2FStockholm" >}} -## Packet typer -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. -{{< lazy-img max-width="774px" aspect-ratio="774/387" -src="https://dash.roslund.cloud/render/d-solo/aedo2cbpvy800a/sthlm-mesh?orgId=1&theme=light&panelId=6&width=1000&height=500&scale=1" >}} - -## Skapade paket per nod -Grafen nedan visar vilka noder som har skickat flest paket under det senaste dygnet. Vidarebefordrade meddelanden och krypterade paket är inte medräknade. -Datat i grafen är endast en uppskattning och bör inte ses som exakt. Graferna bygger på MQTT-data från ett begränsat antal noder. -Eftersom vi har begränsad bandbredd är det viktigt att hålla nere trafiken. En sändningsvolym på max 50–100 paket per dygn är önskvärd. -{{< lazy-img max-width="800px" aspect-ratio="1/1" -src="https://dash.roslund.cloud/render/d-solo/aedo2cbpvy800a/sthlm-mesh?orgId=1&theme=light&panelId=7&width=1000&height=1000&scale=1" >}} - {{% /blocks/section %}} {{% blocks/section color=info %}} diff --git a/hugo.yaml b/hugo.yaml index 3db65ec..fdb2bdb 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -58,8 +58,6 @@ menu: - name: "Map" url: "https://map.sthlm-mesh.se/?lat=59.34338409949693&lng=378.0628967285156&zoom=10" weight: 80 - params: - target: "_blank" # Everything below this are Site Params params: @@ -136,6 +134,10 @@ params: readingtime: enable: false +services: + googleAnalytics: + id: G-4LJP3Y6HMZ + module: hugoVersion: extended: true diff --git a/layouts/partials/page-meta-lastmod.html b/layouts/partials/page-meta-lastmod.html new file mode 100644 index 0000000..381c9f1 --- /dev/null +++ b/layouts/partials/page-meta-lastmod.html @@ -0,0 +1,5 @@ +{{ if and .GitInfo .Site.Params.github_repo -}} +
+ {{ T "post_last_mod" }} {{ .Lastmod.Format .Site.Params.time_format_default -}} +
+{{ end -}} \ No newline at end of file diff --git a/static/js/messages.js b/static/js/messages.js new file mode 100644 index 0000000..5afc74f --- /dev/null +++ b/static/js/messages.js @@ -0,0 +1,145 @@ +document.addEventListener("DOMContentLoaded", async function () { + const messagesContainer = document.getElementById("messages"); + const radioButtons = document.querySelectorAll("input[name='btnradio']"); + const loadingDiv = document.getElementById("loading"); + const messagesList = document.createElement("div"); + messagesList.style="max-height:70vh;overflow: auto;" + messagesContainer.appendChild(messagesList); + + const state = { + messages: [], + nodesById: {}, + }; + + radioButtons.forEach(radio => { + radio.addEventListener("change", fetchMessages); + }); + + + async function fetchMessages() { + try { + let url = "https://map.sthlm-mesh.se/api/v1/text-messages?order=desc"; + const selectedRadio = document.querySelector("input[name='btnradio']:checked"); + + //If all is not selected we get 15 messages. If not we get 35 due to duplicates + if (selectedRadio.id !== "all") { + url += `&gateway_id=${selectedRadio.id}`; + url += `&count=15`; + } else { + url += `&count=35`; + } + + const response = await fetch(url); + const data = await response.json(); + + //Filter duplicate messages + state.messages = Array.from( + new Map(data.text_messages.map(msg => [msg.packet_id, msg])).values() + ); + + // fetch node info + for(const message of state.messages){ + await fetchNodeInfo(message.to); + await fetchNodeInfo(message.from); + await fetchNodeInfo(message.gateway_id); + } + + updateUI(); + } catch (error) { + console.error("Error fetching messages", error); + loadingDiv.innerHTML = `

Error fetching messages: ${error.message}

`; + } + } + async function fetchNodeInfo(nodeId) { + // do nothing if already fetched + if(nodeId in state.nodesById){ + return; + } + + // do nothing if broadcast address + if(nodeId.toString() === "4294967295"){ + return; + } + + try { + const response = await fetch(`https://map.sthlm-mesh.se/api/v1/nodes/${nodeId}`); + const data = await response.json(); + const node = data.node; + + if(node){ + state.nodesById[node.node_id] = node; + } + + } catch(e) { + // do nothing + } + + } + + function updateUI() { + loadingDiv.innerHTML = ""; // Clear the loading message + messagesList.innerHTML = ""; + state.messages.slice().reverse().forEach(message => { + const messageDiv = document.createElement("div"); + messageDiv.className = "d-flex mb-2"; + messageDiv.innerHTML = ` +
+
+ ${getNodeShortName(message.from)} +
+
+
+
+ ${getNodeLongName(message.from)} + ${message.to !== "4294967295" ? ` → ${getNodeLongName(message.to)}` : ""} +
+
+
${escapeMessageText(message.text)}
+
+
${formatMessageTimestamp(message.created_at)}
+
+ + `; + messagesList.appendChild(messageDiv); + }); + messagesList.scrollTop = messagesList.scrollHeight; + + } + + function getNodeColour(nodeId) { + return "#" + (nodeId & 0x00FFFFFF).toString(16).padStart(6, '0'); + } + + function getNodeHexId(nodeId) { + return "!" + parseInt(nodeId).toString(16); + } + + function getNodeShortName(nodeId) { + return state.nodesById[nodeId]?.short_name?.substring(0, 4) ?? "?"; + } + + function getNodeLongName(nodeId) { + return state.nodesById[nodeId]?.long_name ?? getNodeHexId(nodeId); + } + + function getNodeName(nodeId) { + const node = state.nodesById[nodeId]; + if(!node){ + return getNodeHexId(nodeId); + } + return `[${node.short_name}] ${node.long_name}`; + } + + function escapeMessageText(text) { + return text.replaceAll('<', '<').replaceAll('>', '>').replaceAll('\n', '
'); + } + + function formatMessageTimestamp(createdAt) { + const date = new Date(createdAt); + return date.toLocaleString('sv-SE', { hour12: false }).replace(' ', ' ').slice(0, 16); + } + + await fetchMessages(); + setInterval(fetchMessages, 30000); +});