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 defCLI, RAM reductions.
Conflict resolutions (the important part)
- Prefs file layout (
src/helpers/CommonCLI.cpp) — upstream 1.16 claimed offsets 291/292 forflood_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.
allowPacketForward()(examples/simple_repeater/MyMesh.cpp) — both mechanisms are now active, in this order:- MHR adaptive flood-hop ceiling (
mhrEffectiveFloodMax(), user ceilingflood.max, default 32) — replaces the fixedflood_maxcheck; - upstream
flood.max.unscoped(default 64) for unscoped floods; - 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).
-
Default
flood_advert_interval— upstream's new 47 h wins (was 12 h in the fork's base). -
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_repeater→SenseCap_Solar_repeater.uf2andSenseCap_Solar_repeater-ota-dfu.zipSenseCap_Solar_companion_radio_ble(for bench testing)
Flashing the P1 (nRF52840):
- Preferred — Bluetooth OTA DFU: use the
-ota-dfu.zipwith 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.
- Alternative — UF2: double-press reset → UF2 drive appears → drag the
.uf2onto 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)
- Prefs-Dateilayout (
src/helpers/CommonCLI.cpp) — Upstream 1.16 belegt die Offsets 291/292 mitflood_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.
-
allowPacketForward()(examples/simple_repeater/MyMesh.cpp) — beide Mechanismen sind jetzt aktiv, in dieser Reihenfolge: adaptive MHR-Flood-Hop-Obergrenze (mhrEffectiveFloodMax(), User-Ceilingflood.max, Default 32), dann Upstreamflood.max.unscoped(Default 64), dann Upstreamflood.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 üblicherweiseflood.max.advert 8zuerst — gewollt. -
Default
flood_advert_interval— Upstreams neue 47 h gewinnen (vorher 12 h in der Fork-Basis). -
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_repeater→SenseCap_Solar_repeater.uf2undSenseCap_Solar_repeater-ota-dfu.zipSenseCap_Solar_companion_radio_ble(für Bench-Tests)
Flashen des P1 (nRF52840):
- Bevorzugt — Bluetooth-OTA-DFU: die
-ota-dfu.zipmit 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.
- Alternativ — UF2: Reset doppelt drücken → UF2-Laufwerk erscheint →
.uf2daraufziehen. (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).