Skip to content

Rebase onto Upstream v1.16.0 + SenseCAP Solar P1 (OTA) — 2026-07-10

(Deutsche Übersetzung weiter unten / German translation below)

What happened

All 31 MHR commits were rebased from the old base (v1.15, c940ea5f) onto the upstream v1.16.0 release commit (07a3ca9e, tag repeater-v1.16.0, June 6 2026). The pre-rebase state is preserved on branch backup/main-pre-rebase-1.16.

What v1.16.0 brings to this fork

Relevant upstream changes now included (see release blog):

  • SenseCAP Solar TX LED fix — directly relevant to the P1 solar router.
  • flood.max.unscoped / flood.max.advert — new per-type flood limits (see conflict resolution below for how they compose with MHR).
  • Default flood advert interval 47 h (was 12 h) — less periodic airtime.
  • Neighbor-discovery fix when path.hash.mode != 0.
  • Power-saving improvements (ESP repeaters, nRF companions), 32-symbol preamble for SF ≤ 8, 6-byte ACKs, region def CLI, RAM reductions.

Conflict resolutions (the important part)

  1. Prefs file layout (src/helpers/CommonCLI.cpp) — upstream 1.16 claimed offsets 291/292 for flood_max_unscoped/flood_max_advert; MHR fields moved back accordingly:
Field Old offset (fork 1.15) New offset (fork 1.16)
flood_max_unscoped (upstream) 291
flood_max_advert (upstream) 292
tx_snr_weight 291 293
tx_hop_weight 295 297
supp_* (5 fields, Stage B) 299–303 301–305
bofn_enable / bofn_window_ms 304/305 306/307
Phase-2 backbone fields 307+ 309+

⚠️ Consequence: a /com_prefs file written by the old fork firmware is read with shifted MHR offsets once. All MHR fields are sanitised (constrain / default-restore) on load, so nothing breaks — but after the first boot on the new firmware, verify your MHR settings once via CLI (get txsnrweight, get txhopweight, get flood.max, …) and re-set if needed. Upstream fields (through offset 292) are unaffected.

  1. allowPacketForward() (examples/simple_repeater/MyMesh.cpp) — both mechanisms are now active, in this order:
  2. MHR adaptive flood-hop ceiling (mhrEffectiveFloodMax(), user ceiling flood.max, default 32) — replaces the fixed flood_max check;
  3. upstream flood.max.unscoped (default 64) for unscoped floods;
  4. upstream flood.max.advert (default 8) for adverts.

The MHR adaptive cap is the tightest general limit; the upstream per-type limits act as additional guards. flood.max.advert 8 will usually bind for adverts before the adaptive cap does — that is intended (adverts don't need network-diameter reach).

  1. Default flood_advert_interval — upstream's new 47 h wins (was 12 h in the fork's base).

  2. CONTRIBUTING.md / README.md — doc-only; fork versions kept, upstream NOTE formatting adopted.

SenseCAP Solar Node P1 / P1-Pro as MHR router

CI (.github/workflows/build.yml) now also builds:

  • SenseCap_Solar_repeaterSenseCap_Solar_repeater.uf2 and SenseCap_Solar_repeater-ota-dfu.zip
  • SenseCap_Solar_companion_radio_ble (for bench testing)

Flashing the P1 (nRF52840):

  1. Preferred — Bluetooth OTA DFU: use the -ota-dfu.zip with the nRF Connect / nRF Device Firmware Update app.

    ⚠️ Known upstream issue meshcore-dev/MeshCore#2206: repeater firmware newer than 1.9.1 does not boot on the P1-Pro when flashed via serial DFU (adafruit-nrfutil / web flasher) — it flashes without error but never starts. OTA DFU works.

  2. Alternative — UF2: double-press reset → UF2 drive appears → drag the .uf2 onto it. (Works when the device is physically accessible.)

After flashing, configure via USB serial CLI: set freq/sf/bw/cr, region, passwords, time <epoch> — see upstream repeater docs. MHR defaults are active (Phase 0 + Stage A + Best-of-N); Stage B (supp.enable) and Phase 2 (bb.enable) stay off until bench-tested (docs/MHR/BENCH_TEST_PLAN.md).


🇩🇪 Deutsche Übersetzung

Rebase auf Upstream v1.16.0 + SenseCAP Solar P1 (OTA) — 10.07.2026

Was passiert ist

Alle 31 MHR-Commits wurden von der alten Basis (v1.15, c940ea5f) auf den Upstream-Release-Commit v1.16.0 (07a3ca9e, Tag repeater-v1.16.0, 6. Juni 2026) rebased. Der Stand vor dem Rebase ist als Branch backup/main-pre-rebase-1.16 gesichert.

Was v1.16.0 dem Fork bringt

Relevante Upstream-Änderungen, die jetzt enthalten sind (siehe Release-Blog):

  • SenseCAP-Solar-TX-LED-Fix — direkt relevant für den P1-Solar-Router.
  • flood.max.unscoped / flood.max.advert — neue typspezifische Flood-Limits (Zusammenspiel mit MHR: siehe Konfliktauflösung unten).
  • Standard-Flood-Advert-Intervall 47 h (vorher 12 h) — weniger periodische Airtime.
  • Neighbor-Discovery-Fix bei path.hash.mode != 0.
  • Power-Saving-Verbesserungen (ESP-Repeater, nRF-Companions), 32-Symbol-Preamble bei SF ≤ 8, 6-Byte-ACKs, region def-CLI, RAM-Reduktionen.

Konfliktauflösungen (der wichtige Teil)

  1. Prefs-Dateilayout (src/helpers/CommonCLI.cpp) — Upstream 1.16 belegt die Offsets 291/292 mit flood_max_unscoped/flood_max_advert; die MHR-Felder sind entsprechend nach hinten gerückt (Tabelle siehe englischer Teil oben).

⚠️ Konsequenz: Eine von der alten Fork-Firmware geschriebene /com_prefs wird einmalig mit verschobenen MHR-Offsets gelesen. Alle MHR-Felder werden beim Laden saniert (constrain / Default-Wiederherstellung), es bricht also nichts — aber nach dem ersten Boot auf der neuen Firmware die MHR-Einstellungen einmal per CLI prüfen (get txsnrweight, get txhopweight, get flood.max, …) und ggf. neu setzen. Upstream-Felder (bis Offset 292) sind nicht betroffen.

  1. allowPacketForward() (examples/simple_repeater/MyMesh.cpp) — beide Mechanismen sind jetzt aktiv, in dieser Reihenfolge: adaptive MHR-Flood-Hop-Obergrenze (mhrEffectiveFloodMax(), User-Ceiling flood.max, Default 32), dann Upstream flood.max.unscoped (Default 64), dann Upstream flood.max.advert (Default 8). Die adaptive MHR-Grenze ist das engste allgemeine Limit; die Upstream-Limits wirken als zusätzliche Wächter. Bei Adverts greift üblicherweise flood.max.advert 8 zuerst — gewollt.

  2. Default flood_advert_interval — Upstreams neue 47 h gewinnen (vorher 12 h in der Fork-Basis).

  3. CONTRIBUTING.md / README.md — nur Doku; Fork-Fassungen behalten, Upstream-NOTE-Formatierung übernommen.

SenseCAP Solar Node P1 / P1-Pro als MHR-Router

Die CI (.github/workflows/build.yml) baut jetzt zusätzlich:

  • SenseCap_Solar_repeaterSenseCap_Solar_repeater.uf2 und SenseCap_Solar_repeater-ota-dfu.zip
  • SenseCap_Solar_companion_radio_ble (für Bench-Tests)

Flashen des P1 (nRF52840):

  1. Bevorzugt — Bluetooth-OTA-DFU: die -ota-dfu.zip mit der App nRF Connect / nRF Device Firmware Update einspielen.

    ⚠️ Bekanntes Upstream-Problem meshcore-dev/MeshCore#2206: Repeater-Firmware neuer als 1.9.1 bootet nicht auf dem P1-Pro, wenn sie per seriellem DFU (adafruit-nrfutil / Web-Flasher) geflasht wird — flasht fehlerfrei, startet aber nie. OTA-DFU funktioniert.

  2. Alternativ — UF2: Reset doppelt drücken → UF2-Laufwerk erscheint → .uf2 daraufziehen. (Wenn das Gerät physisch erreichbar ist.)

Nach dem Flashen per USB-Seriell-CLI konfigurieren: set freq/sf/bw/cr, Region, Passwörter, time <epoch> — siehe Upstream-Repeater-Doku. Die MHR-Defaults sind aktiv (Phase 0 + Stufe A + Best-of-N); Stufe B (supp.enable) und Phase 2 (bb.enable) bleiben aus, bis sie auf der Bench getestet sind (docs/MHR/BENCH_TEST_PLAN.md).