<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Funk on Kabelbruch</title><link>https://kabelbruch.de/categories/funk/</link><description>Recent content in Funk on Kabelbruch</description><image><title>Kabelbruch</title><url>https://kabelbruch.de/og-image.png</url><link>https://kabelbruch.de/og-image.png</link></image><generator>Hugo</generator><language>de-DE</language><lastBuildDate>Sat, 07 Nov 2026 11:50:00 +0100</lastBuildDate><atom:link href="https://kabelbruch.de/categories/funk/index.xml" rel="self" type="application/rss+xml"/><item><title>Grafschaft-Mesh: Mein erster MeshCore-Repeater</title><link>https://kabelbruch.de/posts/grafschaft-mesh-erster-meshcore-repeater/</link><pubDate>Sat, 07 Nov 2026 11:50:00 +0100</pubDate><guid>https://kabelbruch.de/posts/grafschaft-mesh-erster-meshcore-repeater/</guid><description>Zwei Heltec V4, ein Abend: Repeater mit Observer, Room Server und eine eigene Region für die Grafschaft Bentheim. Und warum Deutschland und die Niederlande sich im MeshCore-Netz nicht hören.</description><content:encoded><![CDATA[<p>Freitagnachmittag kamen zwei Heltec WiFi LoRa 32 V4. Kurz nach Mitternacht liefen in Uelsen ein Repeater, der alles, was er hört, an meinen eigenen Server meldet, ein Room Server als schwarzes Brett und eine eigene Region für die Grafschaft Bentheim. Nur zum Reden ist noch niemand da.</p>
<p>Das ist der Anfang von <a href="https://grafschaft-mesh.de" target="_blank" rel="noopener noreferrer">grafschaft-mesh.de</a>, einem offenen Funknetz für Uelsen und die Umgebung. Hier steht, wie der erste Abend gelaufen ist, inklusive der Stellen, an denen ich falsch abgebogen bin.</p>
<h2 id="worum-gehts">Worum geht&rsquo;s?</h2>
<p><strong>MeshCore</strong> ist ein Funknetz für Textnachrichten. Es läuft auf LoRa im 868-MHz-Band, also ohne Mobilfunk und ohne Internet. Die Geräte kosten zwischen 20 und 40 Euro und brauchen kaum Strom. Nachrichten springen von Gerät zu Gerät, bis sie ankommen. Das klingt nach Meshtastic, und die Hardware ist auch dieselbe. Die beiden Systeme verstehen sich aber nicht, man entscheidet sich beim Flashen für eins.</p>
<p>MeshCore trennt die Rollen strenger als Meshtastic:</p>
<ul>
<li>Ein <strong>Companion</strong> ist das Gerät, das ich mit mir herumtrage. Es hängt per Bluetooth am Handy, die App ist die Oberfläche.</li>
<li>Ein <strong>Repeater</strong> steht fest, möglichst hoch, und leitet Nachrichten weiter. Er ist das, was das Netz trägt.</li>
<li>Ein <strong>Room Server</strong> ist eine Art schwarzes Brett im Funk. Dazu weiter unten mehr.</li>
</ul>
<p>Weil Companions nichts weiterleiten, braucht ein Ort mindestens einen Repeater. In Uelsen gab es bisher keinen. Also habe ich angefangen.</p>
<h2 id="die-hardware">Die Hardware</h2>
<p>Im Einsatz sind gerade drei Geräte:</p>
<ul>
<li><strong>Heltec Mesh Node T114</strong> als Companion. Der nRF52840 ist sparsam, das Gerät hat ein kleines Display.</li>
<li><strong>Heltec WiFi LoRa 32 V4</strong> als Repeater. ESP32-S3 mit WLAN, das brauche ich gleich noch.</li>
<li>Ein zweiter <strong>V4</strong> als Room Server.</li>
</ul>
<p><img alt="Zwei Heltec WiFi LoRa 32 V4 mit Antennen, auf den kleinen Displays die Namen KAB-Uelsen-01 und KAB-Uelsen-Room-01 mit Frequenz 869,618 MHz und SF8. Dazwischen das ausgebaute GPS-Modul mit Kabel, daneben der Heltec T114 im türkisfarbenen Gehäuse und die Verpackungen" loading="lazy" src="/posts/grafschaft-mesh-erster-meshcore-repeater/meshcore-hardware.jpg" title="Room Server (unten links), Repeater (unten rechts), T114 als Companion (oben links) und in der Mitte das ausgebaute GPS-Modul. Die IP-Adresse auf dem Repeater-Display habe ich geschwärzt."></p>
<p>Beim V4 gibt es eine Falle, auf die ich ohne die Messwerte der Hamburger Community hereingefallen wäre. Der V4 hat einen <strong>Leistungsverstärker</strong>. Der Wert, den man per <code>set tx</code> einstellt, ist also nicht das, was hinten aus der Antenne kommt. Laut den <a href="https://hansemesh.de/anleitungen/einstellungen-deutschland/" target="_blank" rel="noopener noreferrer">Messungen von HanseMesh</a> ergibt <code>tx 22</code> am V4 rund 800 mW. Erlaubt sind in diesem Teil des 868-MHz-Bands 500 mW ERP. Mit <code>tx 16</code> liegt der V4 bei etwa 467 mW, und das habe ich eingestellt.</p>
<p>Die Firmware achtet darauf nicht. Viele Anleitungen setzen <code>tx 22</code>, weil das bei Geräten ohne Verstärker der normale Höchstwert ist.</p>
<h2 id="deutschland-und-die-niederlande-hören-sich-nicht">Deutschland und die Niederlande hören sich nicht</h2>
<p>Uelsen liegt wenige Kilometer von der niederländischen Grenze entfernt. In Twente gibt es deutlich mehr MeshCore-Repeater als bei uns. Mein erster Gedanke war deshalb, einfach die niederländischen Einstellungen zu nehmen.</p>
<p>Das geht seit Mai 2026 nicht mehr. Frequenz und Bandbreite sind auf beiden Seiten gleich, aber Spreading Factor und Coding Rate nicht:</p>
<table>
	<thead>
			<tr>
					<th></th>
					<th>Deutschland</th>
					<th>Niederlande</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Frequenz</td>
					<td>869,618 MHz</td>
					<td>869,618 MHz</td>
			</tr>
			<tr>
					<td>Bandbreite</td>
					<td>62,5 kHz</td>
					<td>62,5 kHz</td>
			</tr>
			<tr>
					<td>Spreading Factor</td>
					<td>8</td>
					<td>7</td>
			</tr>
			<tr>
					<td>Coding Rate</td>
					<td>8</td>
					<td>5</td>
			</tr>
	</tbody>
</table>
<p>Geräte mit SF8 und SF7 können sich gegenseitig nicht dekodieren. Die Niederlande sind am 9. Mai umgestiegen, seitdem sind die beiden Netze getrennt. HanseMesh rät ausdrücklich davon ab, das niederländische Preset in Deutschland auch nur testweise auf einem Repeater einzustellen. Für deutsche Geräte wäre der Repeater unsichtbar, er würde aber trotzdem einen guten Standort belegen.</p>
<p>Ich bin beim deutschen Profil geblieben. Wer in der Grafschaft mitmacht, soll Anschluss an Emsland und Niedersachsen haben und nicht an einem Netz hängen, das auf deutscher Seite niemand hört. Spannend wird der 14. November: Dann stellt Hamburg sein Netz für 24 Stunden testweise auf SF7 um. Falls Deutschland irgendwann nachzieht, rücken die Netze wieder zusammen.</p>
<p>Für den Repeater ist das ein einziger Befehl:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">set radio 869.618,62.5,8,8
</span></span></code></pre></div><h2 id="repeater-und-observer-in-einem-gerät">Repeater und Observer in einem Gerät</h2>
<p>Ich wollte nicht nur einen Repeater, sondern auch sehen, was er hört. Dafür gibt es <strong>Observer</strong>: Geräte, die alle empfangenen Pakete per MQTT an einen Server schicken. Dort zeichnet eine Analysesoftware Karte, Paketliste und Funkwege.</p>
<p>Das Problem: Die offizielle Repeater-Firmware kann kein MQTT. Es gab zwei Wege:</p>
<ol>
<li>Offizielle Firmware, und ein Rechner hängt per USB daneben und schickt die Daten weiter. Dann steht der Repeater aber dort, wo der Rechner steht, und nicht dort, wo er funktechnisch hingehört.</li>
<li>Eine <strong>Community-Firmware mit eingebautem MQTT</strong>. Der V4 hat WLAN und kann direkt melden.</li>
</ol>
<p>Ich habe den zweiten Weg genommen, mit der MQTT-Observer-Firmware von agessaman. Sie bringt eine eigene Flash-Seite mit, und man wählt dort die Rolle „Repeater“. Das Gerät leitet also ganz normal weiter und meldet nebenbei.</p>
<p>Zwei Dinge in der Anleitung hätten mich erwischt, wenn ich sie einfach übernommen hätte:</p>
<ul>
<li>Die Schnellstart-Befehle sind ein US-Beispiel. Dort stehen <code>set tx 22</code>, was am V4 wie oben beschrieben zu viel ist, und <code>set repeat off</code>. Letzteres macht aus dem Repeater einen reinen Empfänger.</li>
<li><strong>Ab Werk sind zwei MQTT-Ziele vorbelegt</strong>, beide bei einem großen öffentlichen Analysedienst. Ohne Änderung hätte mein Repeater also sofort alles, was er hört, dorthin geschickt. Ich habe das erste Ziel auf meinen eigenen Broker umgestellt und das zweite abgeschaltet.</li>
</ul>
<p>Der MQTT-Teil der Konfiguration sieht so aus:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">set mqtt.iata FMO
</span></span><span class="line"><span class="cl">set mqtt1.preset custom
</span></span><span class="line"><span class="cl">set mqtt1.server mqtts://mqtt.example.org:8883
</span></span><span class="line"><span class="cl">set mqtt1.username &lt;benutzer&gt;
</span></span><span class="line"><span class="cl">set mqtt1.password &lt;passwort&gt;
</span></span><span class="line"><span class="cl">set mqtt2.preset none
</span></span></code></pre></div><p><code>FMO</code> ist der Flughafencode von Münster/Osnabrück. Die Firmware gruppiert Observer nach Flughafen-Kürzeln. Twente (<code>ENS</code>) wäre näher gewesen, aber es geht ja ums deutsche Netz.</p>
<p>Auf der Serverseite laufen ein Mosquitto mit TLS und Anmeldung und dahinter der MeshCore-Analyzer CoreScope, beide in Docker auf dem Server von grafschaft-mesh.de. Dass alles zusammenspielt, sah ich ein paar Minuten nach dem Flashen: In der Paketliste stand das erste Advert von <code>KAB-Uelsen-01</code>, gehört von <code>KAB-Uelsen-01</code>. Mein Repeater hatte sich selbst gehört.</p>
<h2 id="das-erste-lebenszeichen">Das erste Lebenszeichen</h2>
<p>Danach habe ich mit dem Companion zwei Nachrichten in den öffentlichen Kanal geschrieben: „Hey“ und „Kann mich jemand empfangen?“. Beide tauchten im Analyzer auf, direkt gehört, ohne Umweg über andere Repeater. Die Kette Handy, Companion, Repeater, WLAN, MQTT, Server, Analyzer funktionierte also.</p>
<p><img alt="Paketliste im Analyzer CoreScope: unten vier Adverts von KAB-Uelsen-01, darüber zwei Nachrichten im Kanal Public von KAB-Mobile-01 mit den Texten „Hey“ und „Kann mich jemand empfangen?“, alle beobachtet von KAB-Uelsen-01 mit dem Kürzel FMO" loading="lazy" src="/posts/grafschaft-mesh-erster-meshcore-repeater/analyzer-erste-pakete.png" title="Die ersten Pakete im Analyzer, von unten nach oben gelesen: vier Adverts des Repeaters, dann meine beiden Testnachrichten."></p>
<p>Geantwortet hat niemand. Die Liste der Repeater in der App blieb leer.</p>
<p>Daraus habe ich anfangs zu viel geschlossen. Repeater melden sich nur selten: an direkte Nachbarn etwa alle vier Stunden, durchs ganze Netz bei den üblichen Einstellungen nur alle 50 Stunden oder seltener. Dass nach ein paar Minuten nichts auftaucht, heißt also nicht, dass niemand da ist. Ich lasse den Companion jetzt länger laufen und schaue auf die Karten. Gut möglich, dass die Grafschaft aber wirklich noch leer ist. Genau deshalb gibt es grafschaft-mesh.de.</p>
<p>Beim Durchsehen der Server-Konfiguration ist mir außerdem aufgefallen, dass im Analyzer noch das <strong>niederländische Profil</strong> als Grundlage für die Auswertung der Sendezeit stand. Das stammte aus meiner Planung, als ich noch dachte, wir nehmen die NL-Werte. Korrigiert, Container neu gestartet.</p>
<h2 id="wie-genau-soll-der-standort-sein">Wie genau soll der Standort sein?</h2>
<p>Ein Repeater kann im Advert seine Position mitsenden. Dann erscheint er auf Karten, und andere können Entfernungen und Funkwege nachvollziehen. Ohne Position zeichnet der Analyzer ihn gar nicht ein.</p>
<p>Mein V4 hat ein GPS-Modul. Damit hätte er seine Position auf den Meter genau gesendet, per Funk an jeden in Reichweite und von dort auf öffentliche Karten, wo ich sie später nicht mehr löschen kann. Auf grafschaft-mesh.de verspreche ich anderen Betreibern, ihre Repeater nur an der Ortsmitte zu zeigen.</p>
<p>Für mich selbst habe ich das anders entschieden. Meine Adresse steht ohnehin im Impressum. Ein Repeater, der auf rund 100 Meter genau verortet ist, hilft bei der Planung mehr als einer in der Ortsmitte. Ich habe die Koordinaten also auf drei Nachkommastellen gerundet und fest eingetragen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">set lat 52.xxx
</span></span><span class="line"><span class="cl">set lon 6.xxx
</span></span><span class="line"><span class="cl">gps advert prefs
</span></span><span class="line"><span class="cl">gps off
</span></span></code></pre></div><p><code>gps advert prefs</code> sorgt dafür, dass im Advert die gespeicherte Position steht und nicht die vom GPS. Das GPS-Modul habe ich danach ausgebaut. Für einen festen Repeater mit WLAN bringt es nichts: Die Position ist fest, die Uhrzeit kommt per NTP. Sinnvoll ist GPS für Messfahrten mit einem mobilen Gerät oder für Repeater ohne Internet, etwa mit Solarstrom auf einem Feld.</p>
<h2 id="der-room-server">Der Room Server</h2>
<p>Den zweiten V4 habe ich als <strong>Room Server</strong> eingerichtet. Wer sich anmeldet, kann dort Beiträge schreiben, und der Room Server hebt die letzten davon auf. Kommt jemand nach einer Pause zurück, bekommt er die verpassten Beiträge nachgeliefert.</p>
<p>Was er <strong>nicht</strong> macht, war mir vorher nicht klar: Er ist kein Zwischenspeicher für Direktnachrichten. Ist der Empfänger einer Direktnachricht nicht erreichbar, wird sie nicht zugestellt, und das Netz merkt sie sich auch nirgends. Wer jemanden erreichen will, der vielleicht gerade offline ist, schreibt in den Raum.</p>
<p>Repeater und Room Server gehören auf getrennte Geräte. Ein Room Server kann zwar mitweiterleiten, die MeshCore-Doku rät aber ausdrücklich davon ab. Ihm fehlen dann Funktionen, die nur die Repeater-Firmware hat.</p>
<p>Zum Zugang habe ich mich für die offene Variante entschieden: Lesen geht ohne Passwort, Schreiben mit dem Gast-Passwort <code>hello</code>. Das ist die Werkseinstellung und unter MeshCore-Leuten so etwas wie der Standard für offene Räume. Ein Passwort, das auf einer Website steht, schützt ohnehin nichts. Das <strong>Admin-Passwort</strong> dagegen sollte man unbedingt ändern, ab Werk ist es <code>password</code>.</p>
<h2 id="eine-region-für-die-grafschaft">Eine Region für die Grafschaft</h2>
<p>MeshCore kennt <strong>Regionen</strong>, richtig nutzbar sind sie ab Firmware 1.15. Ein Repeater leitet Flood-Nachrichten, also Nachrichten an alle, nur noch für die Regionen weiter, die er kennt. Das soll verhindern, dass in dichten Gebieten jeder Repeater den Verkehr aus halb Deutschland weiterreicht.</p>
<p>Mein erster Vorschlag war <code>de-ni-noh</code>: Deutschland, Niedersachsen, das Kfz-Kennzeichen der Grafschaft. Bei Peine und Braunschweig gibt es genau dieses Schema. Dann habe ich im <a href="https://meshcore-de.fyi/" target="_blank" rel="noopener noreferrer">deutschen MeshCore-Wiki</a> die Regeln gelesen. Regionale Regionen sollen <strong>kein <code>de-</code>-Präfix</strong> und keine Hierarchie im Namen haben. Außerdem sollen es verständliche Namen sein, keine Abkürzungen. <code>de-ni-noh</code> verstößt also gleich zweimal dagegen.</p>
<p>Es heißt jetzt <code>grafschaft-bentheim</code>. Nur <code>grafschaft</code> wäre nicht eindeutig, Grafschaften gibt es einige. Dazu trägt der Repeater die Basisregionen <code>europe</code>, <code>de</code> und <code>de-ni</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">region put grafschaft-bentheim
</span></span><span class="line"><span class="cl">region allowf grafschaft-bentheim
</span></span><span class="line"><span class="cl">region save
</span></span></code></pre></div><p>Das <code>allowf</code> steht für „Flood erlauben“. Ohne das kennt der Repeater die Region zwar, leitet aber nichts weiter. Ohne <code>region save</code> ist alles nach dem nächsten Neustart weg.</p>
<p>Wichtig war mir, Nachrichten <strong>ohne</strong> Region weiter zuzulassen. Die meisten Leute haben in ihrer App keine eingestellt. Würde der Repeater diese Nachrichten verwerfen, käme ein Neuling mit seinem ersten „Moin“ nicht über meinen Repeater hinaus und wüsste nicht, warum.</p>
<p>Am Handy ging es dann einfacher, als ich dachte. Die App hat eine Funktion, die die Regionen der Repeater in der Nähe ausliest. Sie hat <code>grafschaft-bentheim</code> von meinem Repeater angeboten. Das war gleich die Bestätigung, dass er die Region richtig gespeichert hatte. Die Einstellung für eine Standard-Region gibt es in der iOS-App allerdings nicht, nur unter Android. Den Kanal „Public“ konnte ich aber auf die Region setzen. Unterwegs muss ich daran denken, das zurückzustellen, sonst leiten fremde Repeater meine Nachrichten nicht weiter.</p>
<h2 id="kleinkram-am-rand">Kleinkram am Rand</h2>
<p>Ein paar Dinge, über die ich gestolpert bin:</p>
<ul>
<li><strong>Im Analyzer heißt der Repeater „B20C“.</strong> Das sind die ersten beiden Bytes seines öffentlichen Schlüssels. MeshCore schreibt in den Weg eines Pakets nicht die Namen der Repeater, sondern nur dieses Kürzel. Mit <code>set path.hash.mode 1</code> sind es zwei Bytes statt einem. Bei einem Byte würden sich Repeater schnell ein Kürzel teilen.</li>
<li><strong>Die serielle Konsole des Companions gibt es nicht.</strong> Repeater und Room Server haben eine Textkonsole per USB, der Companion nicht. Er spricht mit der App ein eigenes Protokoll, und die Bluetooth-Variante hat USB gar nicht einkompiliert. Mit <code>meshcore-cli</code> kommt man per Bluetooth heran, unter Linux hat mich das aber eine halbe Stunde gekostet und am Ende nicht geklappt. Die App reicht.</li>
<li><strong>Ein Name, ein Schema.</strong> Ich hatte mir vorher ein Namensschema ausgedacht, <code>KAB-</code> für Kabelbruch, dann Ort, dann Nummer. Mein Companion hieß da schon <code>KAB-Mobile-01</code> statt <code>KAB-Mobil-01</code>. Ich habe das Schema angepasst und nicht das Gerät.</li>
</ul>
<h2 id="und-die-website">Und die Website?</h2>
<p>Auf <a href="https://grafschaft-mesh.de" target="_blank" rel="noopener noreferrer">grafschaft-mesh.de</a> stehen jetzt das Funkprofil, die Region, der Raum und eine Karte. Die Karte zeigt Repeater nur, wenn ihre Betreiber zustimmen, und nur an der Ortsmitte. Zum Mitmachen gibt es eine Signal-Gruppe.</p>
<p><img alt="Karte auf grafschaft-mesh.de mit dem Gebiet zwischen Uelsen, Nordhorn, Lingen und Enschede. Ein Punkt bei Uelsen, im Popup: KAB-Uelsen-01, Uelsen, aktiv, zuletzt gehört vor 2 Stunden" loading="lazy" src="/posts/grafschaft-mesh-erster-meshcore-repeater/karte-grafschaft-mesh.jpg" title="Die öffentliche Karte: Der Punkt sitzt bewusst an der Ortsmitte, nicht am echten Standort."></p>
<p>In die Datenschutzerklärung habe ich einen eigenen Abschnitt zu den Funkdaten geschrieben. Der wichtigste Satz darin: <strong>Der öffentliche Kanal ist für den Analyzer lesbar.</strong> Sein Schlüssel ist allgemein bekannt, das ist kein Geheimnis und kein Fehler. Es ist aber genau das, was jemand wissen will, bevor er dort zum ersten Mal schreibt. Direktnachrichten und andere Kanäle bleiben verschlüsselt.</p>
<p>Die Besucherstatistik läuft wie hier auf Kabelbruch über <a href="/posts/besucherstatistik-matomo-log-import/">Matomo mit Log-Import</a>, ohne Tracking-Skript. Zwei Dinge waren neu: Die Kartenkacheln werden gar nicht erst protokolliert, und <code>.json</code>-Dateien zählen beim Import nicht mehr als Seitenaufruf. Sonst wäre jeder Kartenaufruf doppelt gezählt worden, einmal für die Seite und einmal für die Liste der Repeater, die die Karte nachlädt.</p>
<h2 id="was-ich-daraus-mitnehme">Was ich daraus mitnehme</h2>
<p><strong>Werte aus Anleitungen nicht blind übernehmen.</strong> Zwei der Schnellstart-Befehle hätten meinen Repeater entweder zu laut oder taub gemacht. Und ab Werk hätte er alles an einen fremden Server geschickt.</p>
<p><strong>Gleiche Frequenz heißt nicht gleiches Netz.</strong> Die Grenze zu den Niederlanden ist im Funk gerade eine echte Grenze, obwohl beide Seiten auf 869,618 MHz senden.</p>
<p><strong>Eine leere Liste beweist nichts.</strong> Repeater melden sich selten. Ob wirklich niemand in Reichweite ist, zeigt sich erst nach Stunden.</p>
<p><strong>Erst die Regeln lesen, dann den Namen festlegen.</strong> Bei Regionen kommt es darauf an, dass alle denselben Namen benutzen. Einen Namen, den andere schon übernommen haben, ändert man später nicht mehr so leicht.</p>
<h2 id="was-als-nächstes-kommt">Was als Nächstes kommt</h2>
<ul>
<li>Der Repeater steht noch im Arbeitszimmer. Auf dem Dachboden wird er deutlich weiter reichen.</li>
<li>Eine erste Messfahrt durch Uelsen mit dem Companion, um zu sehen, wie weit er wirklich kommt.</li>
<li>Nachbarn finden: in Nordhorn, Lingen und im Emsland. Wer dort schon funkt, darf sich gern melden.</li>
<li>Und irgendwann die Idee, mit der alles angefangen hat: ein Netz, das in Uelsen auch dann noch Nachrichten überträgt, wenn Strom und Mobilfunk ausfallen. Dafür braucht es aber mehr als einen Repeater.</li>
</ul>
]]></content:encoded></item></channel></rss>