docs: v0.2.6 - WordPress article, systemd service, message splitting fix

- Add WordPress blog post describing the bot (docs/)
- Add systemd service file for production deployment
- Message split numbering [x/y], increase delay to 3s

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
ppfeiffer 2026-02-15 14:49:56 +01:00
parent 077e0032cf
commit 7a0ff15b51
5 changed files with 96 additions and 4 deletions

View file

@ -1,5 +1,14 @@
# Changelog
## [0.2.6] - 2026-02-15
### Added
- WordPress-Beitrag unter docs/wordpress-beitrag.html
- Systemd Service-File meshdd-bot.service
- Nachrichten-Splitting mit [x/y] Nummerierung
### Changed
- Pause zwischen gesplitteten Nachrichten auf 3 Sekunden erhöht
## [0.2.5] - 2026-02-15
### Added
- Automatisches Aufteilen langer Nachrichten (max 170 Zeichen) mit 1,5s Pause

View file

@ -1,4 +1,4 @@
version: "0.2.5"
version: "0.2.6"
bot:
name: "MeshDD-Bot"

View file

@ -0,0 +1,66 @@
<h2>MeshDD-Bot - Ein Meshtastic Bot für das Dresdner Mesh-Netzwerk</h2>
<p>Mit dem <strong>MeshDD-Bot</strong> haben wir einen eigenentwickelten Bot für unser Meshtastic Mesh-Netzwerk in Dresden in Betrieb genommen. Der Bot verbindet sich per TCP mit einem Meshtastic-Knoten, empfängt und verarbeitet Nachrichten aus dem Mesh und stellt ein Web-Dashboard mit Live-Karte bereit.</p>
<h3>Was kann der Bot?</h3>
<p>Der MeshDD-Bot reagiert auf Befehle, die direkt im Mesh-Chat gesendet werden. Aktuell stehen folgende Kommandos zur Verfügung:</p>
<ul>
<li><strong>/ping</strong> - Prüft, ob der Bot erreichbar ist</li>
<li><strong>/nodes</strong> - Zeigt die Anzahl der bekannten Nodes im Netzwerk</li>
<li><strong>/mesh</strong> - Liefert eine detaillierte Übersicht des Mesh-Netzwerks: Online-Nodes, aktive Nodes der letzten 24 Stunden, Hop-Verteilung und die am häufigsten verwendeten Hardware-Modelle</li>
<li><strong>/weather</strong> - Zeigt das aktuelle Wetter an der Position des anfragenden Nodes (Fallback: Dresden Zentrum)</li>
<li><strong>/stats</strong> - Statistiken zu Nodes und beantworteten Anfragen</li>
<li><strong>/info</strong> - Bot-Name, Version und Laufzeit</li>
<li><strong>/uptime</strong> - Wie lange der Bot bereits läuft</li>
<li><strong>/help</strong> - Liste aller verfügbaren Kommandos</li>
</ul>
<p>Längere Antworten werden automatisch auf mehrere Nachrichten aufgeteilt und mit einer Nummerierung wie <code>[1/3]</code> versehen, damit im Mesh nichts verloren geht.</p>
<h3>Web-Dashboard mit Live-Updates</h3>
<p>Unter <code>http://&lt;server&gt;:8080</code> steht ein Web-Dashboard zur Verfügung, das in Echtzeit via WebSocket aktualisiert wird. Es zeigt:</p>
<ul>
<li><strong>Status-Karten</strong> mit der Gesamtzahl der Nodes, aktiven Nodes (24h) und beantworteten Anfragen inkl. Aufschlüsselung nach Kommando</li>
<li><strong>Nodes-Tabelle</strong> mit Name, Hardware-Modell, SNR, Batteriestatus (farbcodiert), Hop-Anzahl und letzter Aktivität</li>
<li><strong>Nachrichten-Feed</strong> mit Absender, Kanalname und Zeitstempel</li>
<li><strong>Hell/Dunkel-Modus</strong> per Knopfdruck umschaltbar</li>
</ul>
<h3>Live-Karte</h3>
<p>Über den Karten-Link im Dashboard öffnet sich eine Leaflet-Karte mit OpenStreetMap, auf der alle Nodes mit bekannter Position dargestellt werden. Die Marker sind farblich nach Hop-Anzahl kodiert:</p>
<ul>
<li><span style="color:#2196F3;"><strong>Blau</strong></span> - Direkt erreichbar (0 Hops)</li>
<li><span style="color:#4CAF50;"><strong>Grün</strong></span> - 1 Hop</li>
<li><span style="color:#FF9800;"><strong>Orange</strong></span> - 2 Hops</li>
<li><span style="color:#F44336;"><strong>Rot</strong></span> - 3 Hops</li>
<li><span style="color:#9C27B0;"><strong>Lila</strong></span> - 4 Hops</li>
<li><span style="color:#795548;"><strong>Braun</strong></span> - 5+ Hops</li>
</ul>
<p>Beim Überfahren eines Markers mit der Maus erscheint ein Tooltip mit detaillierten Node-Informationen: Name, Hardware, Hops, SNR, Batteriestatus, Höhe und letzte Aktivität.</p>
<h3>Technik im Hintergrund</h3>
<p>Der Bot ist in Python geschrieben und nutzt folgende Technologien:</p>
<ul>
<li><strong>meshtastic</strong> - Python-Bibliothek für die TCP-Verbindung zum Meshtastic-Gerät</li>
<li><strong>aiohttp</strong> - Asynchroner Webserver mit WebSocket-Unterstützung</li>
<li><strong>SQLite</strong> - Lokale Datenbank für Nodes, Nachrichten und Kommando-Statistiken</li>
<li><strong>Leaflet.js</strong> - Interaktive Karte mit OpenStreetMap-Tiles</li>
<li><strong>Bootstrap 5.3</strong> - Responsive Dashboard mit Dark/Light Theme</li>
</ul>
<p>Die gesamte Konfiguration erfolgt über eine zentrale <code>config.yaml</code>, die zur Laufzeit überwacht wird - Änderungen werden automatisch ohne Neustart übernommen.</p>
<h3>Ausblick</h3>
<p>Der MeshDD-Bot wird kontinuierlich weiterentwickelt. Geplant sind unter anderem weitere Befehle, erweiterte Statistiken und zusätzliche Visualisierungen auf der Karte. Der Quellcode ist auf unserem Forgejo-Server verfügbar.</p>
<p><em>Aktueller Stand: Version 0.2.5</em></p>

View file

@ -217,12 +217,15 @@ class MeshBot:
async def _send_text(self, text: str, channel: int, max_len: int = 170):
if not self.interface:
return
parts = self._split_message(text, max_len)
# Reserve space for "[x/y] " prefix (max 7 bytes)
parts = self._split_message(text, max_len - 7)
total = len(parts)
for i, part in enumerate(parts):
if i > 0:
await asyncio.sleep(1.5)
await asyncio.sleep(3.0)
msg = f"[{i+1}/{total}] {part}" if total > 1 else part
try:
self.interface.sendText(part, channelIndex=channel)
self.interface.sendText(msg, channelIndex=channel)
except Exception:
logger.exception("Error sending text")

14
meshdd-bot.service Normal file
View file

@ -0,0 +1,14 @@
[Unit]
Description=MeshDD-Bot - Meshtastic Bot with Web Dashboard
After=network.target
[Service]
Type=simple
User=peter
WorkingDirectory=/home/peter/meshdd-bot
ExecStart=/home/peter/meshdd-bot/venv/bin/python main.py
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target