MeshCore Repeater konfigurieren: Checkliste für 1.16/1.17 und Fehlersuche

Ein Repeater mit Werksdefaults belastet das Netz mehr, als er nützt. Diese Checkliste führt durch alle Parameter, die in Norddeutschland Konsens sind — zum Abhaken vor dem ersten Advert.

Vorab

Diese Checkliste gilt für die Stock-Firmware ab 1.16. Ältere Versionen kennen flood.max.unscoped nicht, und alles unter 1.14 verwirft Multi-Byte-Pfade und floodet ungefiltert. Wer noch EVO fährt: EVO ist mit 1.15 eingestellt worden, 1.16 hat die EVO-Funktionen übernommen.

Alle Befehle klein schreiben (set, nicht Set). Änderungen an Funkparametern brauchen einen Reboot. Hardware und Aufbau stehen unter Repeater aufbauen und in der Geräteübersicht.

  • Firmware ist 1.16 oder 1.17.1, geprüft mit get version
  • Private Key per USB mit get prv.key gesichert, bevor du irgendetwas flashst

Name und Identität

  • set name <Name> mit Standort und Kontaktmöglichkeit. Einen verbindlichen Namensstandard gibt es nicht, aber ein Kontakt im Namen erspart Rätselraten, wenn dein Repeater Ärger macht.
  • ID-Präfix prüfen: Die ersten zwei Hex-Zeichen dürfen in deiner Nachbarschaft nicht doppelt vorkommen, sonst werden Traces unlesbar. Wunschpräfix per gessaman.com/mc-keygen setzen.
  • Nur stationär betreiben. Mobile Repeater zerstören gelernte Pfade.

Regionen und unscoped Traffic

Regionen entscheiden, welche Nachrichten dein Repeater weiterleitet. Details, Schema und Fallstricke stehen unter Regionen und Scopes, hier nur die Kurzfassung.

  • Nur lokale Regionen eintragen, in Hamburg de-hh, de-nord und hansemesh. Maximal etwa 10, technisch 32 à 29 Byte. Groß-/Kleinschreibung zählt.
  • de sperren. Die Region wird wie * missbraucht, Hamburg und Sachsen haben sie abgeschaltet.
  • Nach jeder Änderung region save, sonst ist die Liste nach dem Reboot weg.
BefehlWertWarum
set flood.max10Scoped Floods enden nach 10 Hops statt 64. Ab 7 bis 8 Hops liegt die Zuverlässigkeit ohnehin nur noch bei 70 bis 80 %.
set flood.max.unscoped2 bis 5, je nach LageUnscoped Pakete laufen nur noch ein paar Hops. Neulinge ohne Scope kommen lokal noch an, das Netz wird nicht überschwemmt. Ländlich eher 5, in dichten Netzen 2 bis 3. Nur überlastete Kern-Repeater setzen 0.
set flood.max.advert3 bis 5Flood-Adverts fremder Nodes werden nach wenigen Hops gestoppt.

flood.max.unscoped 0 nur mit Bedacht: Auf Firmware bis 1.16 brach das die Fernadministration, weil Remote-Admin und Pfadsuche unscoped laufen; mit der aktuellen Firmware ist das behoben. Ein hartes denyf * auf Stock-Firmware unter 1.15 sperrt zusätzlich DMs, Traces und Adverts.

Duty Cycle

  • set dutycycle 10

In Deutschland gelten 10 % im rollierenden 60-Minuten-Fenster, also 360 Sekunden Sendezeit pro Stunde. Der Default liegt bei 50 % und ist damit nicht legal. Bis 1.15 hieß der Befehl set af 9, die Formel war 100 / (af + 1). Bei 0,5 bis 0,75 s pro Paket schafft ein Repeater so 600 bis 700 Pakete pro Stunde. Das ist die Kapazität des gesamten Kanals, nicht nur deine.

BefehlWertWarum
set advert.interval.zero240Zero-Hop-Advert alle 4 Stunden, das ist der Maximalwert. Nachbarn lernen dich, ohne dass jemand außer ihnen etwas davon merkt.
set advert.interval.flood0 oder 48 bis 1500 heißt aus. Wer den Repeater in der Ferne sichtbar haben will, nimmt 48 bis 150 Stunden. Nicht 168, sonst filtern manche Karten den Repeater als offline.

Die Rechnung dahinter: 70 Hamburger Repeater mit je 70 Wiederholungen bei 48 Stunden ergeben 4.900 Pakete, rund 100 Adverts pro Stunde reiner Overhead. Flood-Adverts machten zeitweise die Hälfte des gesamten Traffics aus.

  • Zero-Hop auf 240 Minuten
  • Flood-Advert auf 0 oder in Absprache mit der Region 48 bis 150 Stunden

Timing und Pfade

BefehlWertWarum
set txdelay0.7Kern-Repeater mit vielen Nachbarn 2.0. Zu hohe Werte bremsen das ganze Netz, zu niedrige erzeugen Kollisionen.
set direct.txdelay0.5Verzögerung für gerichtete Pakete. Kern-Repeater 0.9.
set rxdelay0Kein echtes Delay, sondern ein Filter für schlecht gehörte Flood-Pakete. An Kern-Repeatern in dichten Netzen bis 6.
set path.hash.mode23-Byte-Pfade. 1 Byte bedeutet nur 256 mögliche IDs und ständige Kollisionen. Companions nutzen Modus 1.
set loop.detectminimalReicht mit 3-Byte-Pfaden, spart Aussetzer.
set cad offHardware-CAD blockiert den Kanal bis zu 4 Sekunden. Die Software-Lösung ist genauso gut, ohne Aussetzer.
set int.thresh0In EVO war 1 Listen-Before-Talk, in Stock 1.16/1.17 bringt es nichts.
set agc.reset.interval60Setzt die Empfänger-Regelung regelmäßig zurück. Hilft, wenn der Repeater bei Störern taub wird.
set multi.acks1Etwas mehr Traffic, spürbar zuverlässigere Zustellung.

Die Delay-Werte sind die wichtigsten Zeilen dieser Tabelle. Ein normaler Repeater am Rand nimmt die Standardwerte, ein Kern-Repeater mit vielen Nachbarn die höheren Werte, sonst reden alle gleichzeitig.

  • Alle Werte aus der Tabelle gesetzt, in der App zum Schluss oben den Haken zum Speichern drücken, dann Reboot

Empfänger: rxgain und Rauschen

  • set radio.rxgain on ist der Standard. Ausnahme Heltec V4 und T096 auf 1.17.1: dort set radio.fem.rxgain off und set radio.rxgain off

1.17.1 schaltet den Vorverstärker per Default ein. Auf Heltec V4 und T096 hebt das den Noise Floor von etwa -115 auf -84 dBm, weil der Verstärker vor allem Rauschen verstärkt. Auf 1.16 ist der Verstärker per Default aus.

Gut ist ein Grundrauschen von -110 bis -117 dBm. Liegt es dauerhaft über -100 dBm, sitzt in der Nähe eine Störquelle wie ein Mobilfunkmast oder ein Balkonkraftwerk. Dann hilft ein SAW-Filter, an Mastenstandorten bis zu 14 dB.

Sendeleistung und ERP

Erlaubt sind 500 mW ERP, das sind 27 dBm. ERP ist nicht der Wert am Chip, sondern das, was die Antenne abstrahlt:

ERP [dBm] = tx [dBm] + Antennengewinn [dBd] - Kabel und Stecker [dB]
dBd = dBi - 2,15

Verluste: SMA-Übergang etwa 0,3 dB, N etwa 0,2 dB, RG58 etwa 1 dB pro Meter, H155 0,27 bis 0,55 dB pro Meter. Rechne mit dem realen Gewinn, nicht dem Aufdruck. Eine als 5 dBi verkaufte Antenne liefert oft 2 bis 3 dBi, siehe 868-MHz-Antenne.

Boardtx-WertLeistung am Chip
SX1262 (RAK, Xiao, Heltec V3)22ca. 158 mW, 22 dBm
Heltec V416ca. 467 mW
Heltec V417ca. 520 mW
Heltec V422ca. 800 mW, über dem Limit
T09612250 mW
T09613380 mW
T09616560 mW

Beispiel: SX1262 mit 22 dBm, Antenne 3 dBi (0,85 dBd), 1 m H155 und zwei SMA-Übergänge ergeben rund 22,5 dBm ERP, deutlich unter 27. Ein Heltec V4 mit tx 17 (27,2 dBm) und derselben Antenne liegt bei etwa 27,5 dBm ERP, also knapp drüber. Mit einer 6,5-dBi-Antenne (4,35 dBd) landet der V4 bei tx 16 schon bei rund 30 dBm, das ist 1 W.

  • set tx so gewählt, dass die Rechnung unter 27 dBm bleibt
  • Zu hohe Werte auf dem V4 werden gekappt und können die Endstufe beschädigen

1.16 gegen 1.17: was sich ändert

1.161.17.x
Neuflood.max.unscoped, flood.max.advert, PowerSaving aus IoTThinksKollisions-Fixes, Login-Response nicht mehr als Flood
rxgainDefault ausDefault an, manuell ausschalten
Bekannte Bugsregion load friert die CLI ein, App-Menü nutzen. T096 auf 1.17.0 sendet nicht, 1.17.1 nehmen. Nach Login-Bug notfalls per Flood anmelden und Pfad neu setzen.

Nach jedem Update prüfen

  • get version zeigt die erwartete Version
  • Coding Rate steht auf 8. Nach Updates wurde schon CR 5 beobachtet, das Narrow-Preset braucht 869,618 MHz, BW 62,5 kHz, SF 8, CR 8
  • Regionen noch vorhanden, Updates haben sie sporadisch gelöscht
  • dutycycle, Advert-Intervalle und Flood-Limits kontrollieren
  • rxgain und fem.rxgain aus
  • Uhrzeit stimmt, sonst werden Adverts verworfen. Ohne RTC-Modul nach jedem Reboot clock sync
  • Wenn Werte unerklärlich falsch sind: mit Erase flashen und alles neu setzen

Auslastung messen

  • Airtime in der Status-Abfrage: RX 12 bis 17 % und TX unter 1 % sind in Ordnung. Ab 10 bis 14 % Kanalauslastung wird es kritisch, über 30 % fällt das Netz aus.
  • Paketfehler: 20 bis 25 % sind in dichten Netzen normal, 11 % sehr gut, bis 50 % an exponierten Standorten. Duplikate 13 bis 15 % sind normal.
  • Debug Flag 2 im Log bedeutet, der Kanal war 4 Sekunden belegt und TX blockiert. Dann txdelay erhöhen oder den Standort hinterfragen.
  • Nachbarn: Links unter -6 dB sind nicht stabil. Über 20 Nachbarn mit 30 bis 70 % Fehlern: rxdelay hoch, TX runter, Filter einbauen.
  • Langzeitsicht über analyzer.letsmesh.net, meshcore-analyzer.eu und map.kiekr.app. Observer erzeugen keinen Mesh-Traffic.

Fallstricke

  • EVO-Migration. EVO hängt Parameter am Dateiende an, 1.16 liest sie an anderer Stelle. Nach dem Wechsel stehen falsche Werte im Speicher. Mit Erase flashen oder jeden Parameter einzeln neu setzen.
  • ESP32-Bootloop nach EVO-Flash. Merged-Datei ohne Erase aufgespielt. Erst Standard mit Erase, dann neu.
  • UF2 gegen merged. UF2 überschreibt nur die App, die Config bleibt. Merged löscht auch das Dateisystem.
  • Regionen ohne region save. In der App eingetragen, aber nicht gespeichert: nach dem Reboot weg.
  • Position nach Reboot deaktiviert. Bekannter Bug, nach jedem Neustart prüfen.
  • Uhr springt zurück. Ohne RTC steht die Zeit nach Reboot auf 1970 oder 2024, nRF-Quarze driften zudem nach etwa 50 Tagen. Ein DS3231 an I2C wird automatisch erkannt.
  • Automatische Abfragen. Home-Assistant-Skripte fragen per Flood ab und laufen durchs ganze Land. Pfad fest setzen oder abschalten.
  • Alte Firmware in der Nachbarschaft. Repeater unter 1.14 verwerfen 2- und 3-Byte-Pfade. Betreiber ansprechen, Update oder Abbau.

Repeater-Hardware

Boards, die in der Checkliste vorkommen:

Fehlersuche: Er läuft, aber etwas stimmt nicht

Die häufigsten Symptome aus der Support-Gruppe, jeweils mit Ursache und Lösung. Erst die Checkliste oben abarbeiten, dann hier weiterlesen.

Repeater wird nicht angezeigt

Symptom

Der Repeater läuft, aber er erscheint nicht auf der Karte, nicht in der App eines Companions oder nicht auf mapme.sh.

Ursachen

Ein Repeater wird nur sichtbar, wenn jemand einen Advert von ihm empfängt. Ohne Advert kein Eintrag, egal auf welcher Karte. Jede Karte bekommt ihre Daten anders:

KarteWoher die Daten kommenWann der Repeater erscheint
map.kiekr.app[PRUEFEN: Datenquelle]Gilt als beste Repeater-Übersicht
mapme.shAdvert beim aktiven Mappen empfangenNur wenn zusätzlich mindestens ein Hex gemappt wurde; Live-Modus sofort, sonst 3 bis 5 Minuten
meshcore.co.uk / map.meshcore.ioManueller Upload oder Auto-UploaderNach manuellem Eintrag
analyzer.meshcorenetz.de, analyzer.letsmesh.netObserver per MQTTEtwa 24 Stunden bis Daten auftauchen

Weitere Ursachen: Observer hören keine EVO-Adverts. Zero-Hop-Adverts gehen nur alle 240 Minuten raus. Alte Firmware unter 1.14 verwirft Pakete mit Multi-Byte-Pfad.

Lösung

  1. Löse in der App über das Repeater-Menü einen Advert aus und warte. Beim Mappen kannst du den Repeater-Admin darum bitten, siehe Coverage Mapping.
  2. Prüfe die Advert-Intervalle: set advert.interval.zero 240, Flood-Advert 0 oder 150 Stunden. Nicht 168, sonst filtern Tools zu früh.
  3. Nutze im Companion in der Nähe „Discover Nearby Nodes" (ab Firmware 1.10). Das findet den Repeater ohne Advert.
  4. Für meshcore.co.uk trage den Repeater manuell ein. Für Observer-Karten warte einen Tag.
  5. Läuft der Repeater auf EVO, erscheint er bei Observern nicht. EVO ist seit 1.16 obsolet, wechsle auf Stock.

Keine Nachbarn (Neighbours leer)

Symptom

Die Nachbarliste im Repeater zeigt 0 Einträge, oft nach Reboot, Firmware-Update oder Standortwechsel.

Ursachen

Die Nachbarliste enthält nur direkte Nachbarn und wird aus empfangenen Adverts aufgebaut. Nach einem Neustart ist sie leer, das ist normal. Da Zero-Hop-Adverts nur alle 4 Stunden kommen, dauert das Füllen. Weitere Ursachen: int.thresh falsch gesetzt, der Repeater hört sich selbst und blockiert sich. Uhr steht falsch und Adverts werden verworfen (siehe unten). Standort im Tal oder unter Alu-Dämmung. Seit 1.9.0 ist die Liste auf 50 Nachbarn begrenzt.

Lösung

  1. Warten. Mit „discover neighbours" in der App füllt sich die Liste schneller.
  2. set int.thresh 0 und auf 1.17.1 zusätzlich set cad off. Die Hardware-CAD erzeugt 4-Sekunden-Aussetzer, die Software-Lösung ist genauso gut.
  3. Bleibt der Repeater taub: set agc.reset.interval 4.
  4. Prüfe die Link-Qualität. Für stabile Repeater-Links brauchst du mindestens -6 dB SNR, -10 dB ist grenzwertig.
  5. Zeigt die Liste plötzlich 0 nach Tagen im Betrieb, prüfe die Uhr.

Unbekannter Repeater

Symptom

Im Trace, in der Nachbarliste oder auf mapme.sh taucht ein Repeater als „unknown" oder nur mit zwei Zeichen auf, etwa „ba".

Ursachen

Im Pfad steht standardmäßig nur ein Byte der Repeater-ID, also 256 mögliche Werte. Kollisionen sind häufig, zwei Repeater mit gleichem Präfix machen Traces unlesbar. Repeater ohne Namen, zum Beispiel ein Room Server mit Repeat an, erscheinen ebenfalls als „unknown". mapme.sh kann nur die zwei Zeichen aus dem Pfad zeigen und ordnet nach räumlicher Nähe bis 100 km zu, das kann falsch sein.

Lösung

  1. set path.hash.mode 2 auf Repeatern (3-Byte-Pfad), set path.hash.mode 1 auf Companions. Das braucht Firmware 1.14 oder neuer im Umfeld.
  2. Kollidiert dein Präfix mit einem Nachbarn, setze einen neuen Key mit Wunschpräfix über gessaman.com/mc-keygen und set prv.key. Sichere vorher den alten mit get prv.key per USB.
  3. Room Server nicht mit Repeater-Funktion kombinieren.
  4. Schreib einen Kontakt in den Repeaternamen, damit Nachbarn dich bei Problemen erreichen.

Falsche Zeit

Symptom

Nach Reboot oder Stromausfall steht die Uhr auf 1970 oder 2024. Nach etwa 50 Tagen Laufzeit driftet sie weg. Nachbarn und Kontakte verschwinden, ein Room Server spielt alte Nachrichten aus.

Ursache

Die meisten Boards haben keine Echtzeituhr. Der Quarz des nRF52 driftet, und nach einem Neustart fängt die Uhr bei null an. Adverts, die älter sind als die Systemzeit des Repeaters, werden verworfen. Deshalb leert eine falsche Uhr die Nachbarliste.

Lösung

  1. Sofort: clock sync aus der App oder time <epoch_sekunden> per CLI. Nach jedem Reset wiederholen.
  2. set timezone Europe/Berlin. Wird nach Reboot manchmal nicht gespeichert, nach dem Neustart prüfen.
  3. Dauerhaft: DS3231-RTC (ca. 2 Euro) an I2C, Adresse 0x68. Die Firmware erkennt das Modul automatisch und liest es beim Boot. Beim Xiao liegt I2C seit 1.6.2 auf D6/D7. Alternativ RV-3028 auf 0x52 oder PCF8563 auf 0x51.

Passwort und Admin-Zugriff

Symptom

Login am Repeater schlägt fehl. Die App zeigt „please wait" und kommt nicht weiter, oder Abfragen enden mit NO_RESPONSE.

Ursachen

  • Firmware 1.9.0 hat einen Login-Bug bei Passwörtern über 11 Zeichen.
  • flood.max.unscoped 0 bricht den Remote-Admin, weil Admin-Anfragen ohne Scope laufen.
  • Über 3 und mehr Hops ist der Zugriff fehleranfällig. Bei hohem Traffic kann der Pfad nicht gelernt werden und die Anfrage fällt auf Flood zurück.
  • Auf 1.17.x friert region load per CLI den Repeater ein. Auf 1.11.0 sind Konsolenbefehle unzuverlässig.
  • Room Server haben das Standardpasswort „hello".

Lösung

  1. Firmware aktualisieren. Auf alter Firmware Passwort mit höchstens 11 Zeichen nutzen.
  2. set flood.max.unscoped 3 bis 5, nie 0.
  3. Aus der Nähe per Zero-Hop verbinden oder in der App den Pfad manuell setzen. Mehrmals versuchen, notfalls App wechseln (MeshCore-App gegen KiekR).
  4. Regionen auf 1.17.x über das App-Menü setzen, nicht per region load in der CLI.
  5. Geht nichts mehr: per USB an den Webflasher und die USB-CLI nutzen. Dort funktioniert auch get prv.key zum Sichern des Keys.
  6. Gast-Zugang nicht offen lassen, sonst kommt Bot-Spam. Owner-Info ist nur mit Passwort lesbar.
  7. [PRUEFEN: CLI-Befehl zum Setzen des Admin-Passworts und Standardpasswort bei Repeatern]

Received packet errors zu hoch

Symptom

Der Repeater meldet 30 bis 70 % RX-Fehler, viele Duplikate, oder er wird nach kurzer Zeit taub.

Ursachen

Ein Teil der Fehler ist im dichten Netz normal. Hohe Werte entstehen an exponierten Standorten, die mehr hören als sie weitergeben können, durch Störquellen wie Mobilfunkmasten oder Balkonkraftwerk-Wechselrichter, oder durch die AGC, die bei viel Traffic zuläuft. Auf 1.17.1 ist rxgain standardmäßig an und hebt den Noise Floor auf -84 dBm.

WertBewertung
Unter 5 % RX-FehlerGuter Link
11 %Sehr gut
20 bis 25 %Normal im dichten Netz
Bis 50 %An exponierten Standorten üblich
Duplikate 13 bis 15 %Normal
Noise Floor -110 bis -120 dBmGut
Noise Floor -95 dBm oder höherStörquelle suchen

Lösung

  1. Auf 1.17.1: set radio.fem.rxgain off und set radio.rxgain off.
  2. set agc.reset.interval 4 gegen Taubheit.
  3. set rxdelay 0.2 bis 3.0 filtert schlecht gehörte Flood-Pakete, bei dichtem Netz testweise 3,0. set txdelay 0.5, an Kern-Repeatern mit vielen Nachbarn bis 1,5 bis 2,0.
  4. Bei Störumfeld ein SAW-Filter. Er senkt den Noise Floor um 10 bis 15 dB, bei -110 dBm ist er nicht nötig. Für über 22 dBm die 28-dB-Variante.
  5. Hört der Repeater zu viel: Sendeleistung runter, kleinere Antenne. Mehr zur Antennenwahl unter 868-MHz-Antenne.

OTA-Update hängt

Symptom

Das Update bleibt bei „Loading" oder bei 100 % stehen, der DFU-Vorgang startet nicht, oder der Repeater bootet danach im Loop.

Ursachen

Auf nRF52-Boards fehlt oft der OTAFIX-Bootloader, oder die falsche Bootloader-Variante ist installiert. Bluetooth-Reichweite zu groß, parallele BT-Verbindung offen, oder die DFU-App hängt. Bei der Migration von EVO auf 1.16 stehen die Parameter in anderer Reihenfolge und werden falsch gelesen.

Lösung

  1. nRF52: Bootloader OTAFIX 2.2 oder neuer installieren, die uf2-Datei im DFU-Modus auf das Laufwerk kopieren. Richtige Variante wählen, nicht „Sense", wenn das Board keins ist.
  2. In der DFU-App „Request high MTU" aus, Paketgröße 8, Abstand unter 10 Meter, MeshCore-App vorher schließen.
  3. Hängt es bei 100 %: Reset, dann per USB flashen. Hängt es bei „Loading": Erase-Image laden und neu flashen. Vorher get prv.key sichern.
  4. Nach EVO-Wechsel: mit Erase flashen oder alle Parameter einzeln per set nachtragen.
  5. ESP32-Boards: start ota per CLI startet den OTA-Modus über WLAN. [PRUEFEN: genauer Ablauf und Firmware-Voraussetzung]
  6. Per USB nur mit Chrome und einem USB-A-auf-C-Kabel. Unter Linux den Nutzer zur Gruppe dialout hinzufügen.

Wer den Repeater neu aufbaut, findet den kompletten Ablauf unter Repeater aufbauen und passende Hardware unter Geräte.

Fragen?

Bei Unklarheiten zu einzelnen Werten oder zur Absprache in deiner Region hilft die Telegram-Gruppe: t.me/meshcorede.

* Affiliate-Links: Kaufst du über einen mit * markierten Link bei Amazon, bekommt HanseMesh eine kleine Provision. Für dich ändert sich der Preis nicht. Wir verlinken nur Hardware, die in der Community im Einsatz ist.