From 710790b81dfeb05d0808d9e3c6b2215a7efeba96 Mon Sep 17 00:00:00 2001 From: mikecarper Date: Wed, 15 Jul 2026 09:49:40 -0700 Subject: [PATCH] Enable LoRa OTA for nRF52 repeaters --- build.sh | 28 ++++++ docs/ota_easy.md | 5 +- docs/ota_user_guide.md | 21 +++- platformio.ini | 19 ++-- src/helpers/ota/OtaTargets.h | 97 ++++++++++++++++--- tools/mota/gen_targets.py | 4 +- tools/mota/test_mota.py | 11 +++ variants/heltec_mesh_solar/platformio.ini | 5 + variants/heltec_t1/platformio.ini | 5 + variants/heltec_tower_v2/platformio.ini | 5 + variants/keepteen_lt1/platformio.ini | 7 +- variants/lilygo_t_impulse_plus/platformio.ini | 5 + variants/mesh_pocket/platformio.ini | 5 + variants/minewsemi_me25ls01/platformio.ini | 5 + variants/nano_g2_ultra/platformio.ini | 5 + variants/rak3401/platformio.ini | 5 + variants/rak4631/platformio.ini | 44 ++++++++- variants/sensecap_solar/platformio.ini | 5 + variants/wio_wm1110/platformio.ini | 5 + 19 files changed, 260 insertions(+), 26 deletions(-) diff --git a/build.sh b/build.sh index cdcfe656..f517537e 100755 --- a/build.sh +++ b/build.sh @@ -1157,6 +1157,21 @@ filter_out_bluetooth_targets() { done } +is_lora_ota_only_target() { + local target_lc=${1,,} + [[ "$target_lc" == *lora_ota* ]] +} + +filter_out_lora_ota_only_targets() { + local target + + for target in "$@"; do + if ! is_lora_ota_only_target "$target"; then + printf '%s\n' "$target" + fi + done +} + is_logging_size_constrained_target() { case "$1" in Tiny_Relay_repeater|RAK_3x72_repeater|wio-e5_repeater|wio-e5-repeater_bridge_rs232|wio-e5-mini_repeater|wio-e5-mini_sensor) @@ -2045,6 +2060,7 @@ run_logging_matrix_build_targets() { local original_mqtt_debug_override=$MQTT_DEBUG_OVERRIDE local original_firmware_filename_infix=$FIRMWARE_FILENAME_INFIX local bluetooth_skip_count=0 + local lora_ota_only_skip_count=0 local logging_target_count=0 local build_status=0 local pass_status=0 @@ -2081,6 +2097,18 @@ run_logging_matrix_build_targets() { echo "Skipping ${bluetooth_skip_count} Bluetooth target(s) for logging-on pass." fi + lora_ota_only_skip_count=0 + for target in "${logging_targets[@]}"; do + if is_lora_ota_only_target "$target"; then + lora_ota_only_skip_count=$((lora_ota_only_skip_count + 1)) + fi + done + mapfile -t logging_targets < <(filter_out_lora_ota_only_targets "${logging_targets[@]}") + + if [ "$lora_ota_only_skip_count" -gt 0 ]; then + echo "Skipping ${lora_ota_only_skip_count} LoRa-OTA-only target(s) for logging-on pass because logging disables LoRa OTA." + fi + for target in "${logging_targets[@]}"; do if is_logging_size_constrained_target "$target"; then constrained_logging_targets+=("$target") diff --git a/docs/ota_easy.md b/docs/ota_easy.md index 6390ae73..09766e5c 100644 --- a/docs/ota_easy.md +++ b/docs/ota_easy.md @@ -31,7 +31,10 @@ You need: - A standard, non-logging Keymind OTA build on the source and destination nodes. Logging and MQTT builds do not include LoRa OTA. Use the WiFi or USB connection to update those. - An OTA-capable ESP32 destination with an A/B partition table. nRF52 has a single application slot and - cannot install this guide's full-image container; it requires an in-place delta plus the OTAFIX bootloader. + cannot install this guide's full-image container; it requires an in-place delta plus the exact matching + OTAFIX bootloader. On RAK4631 repeaters, the OTA target is named + `RAK_4631_repeater_no_external_sensors_lora_ota`; it retains built-in battery monitoring but omits optional + external environmental/GPS sensor packages to fit the safe in-place update limit. - The new, non-merged `.bin` application firmware for the destination's exact board **and role**. Do not package an ESP32 `-merged.bin` factory image. - A source node connected to the computer by USB serial. diff --git a/docs/ota_user_guide.md b/docs/ota_user_guide.md index d6d12ba9..61734f9b 100644 --- a/docs/ota_user_guide.md +++ b/docs/ota_user_guide.md @@ -9,8 +9,22 @@ bridge, logging, and roles without `tempradio` support exclude it. OTA radio traffic is accepted, generated, and relayed only while `tempradio` is actually running on that node. Every source, receiver, and intermediate repeater must therefore have an overlapping temporary-radio window. -> **Is my node supported?** OTA works on **ESP32** boards (e.g. Heltec V3) and on the **RAK4631** (nRF52, -> which needs the special MeshCore bootloader). Other boards build fine but can't self-update yet. +> **Is my node supported?** LoRa OTA firmware is available for supported **ESP32** boards and nRF52 +> repeater targets. Every nRF52 installation requires the OTAFIX bootloader built for that exact board; +> having an OTA-capable application image alone is not enough. Check the bootloader release for an exact +> board match before attempting an update. + +The following nRF52 repeater targets gained firmware-side LoRa OTA support in this release without losing +their normal external-sensor support: + +- Heltec Mesh Solar, T1, and Tower V2 +- Keepteen LT1, LilyGo T-Impulse Plus, Mesh Pocket, and Nano G2 Ultra +- Minewsemi ME25LS01, RAK3401, SenseCAP Solar, and Wio WM1110 + +The full-sensor `RAK_4631_repeater` image is too large for the safe nRF52 in-place update limit. Use +`RAK_4631_repeater_no_external_sensors_lora_ota` when LoRa OTA is required. That target removes optional +external environmental/GPS sensor packages, but retains the RAK4631's built-in battery-voltage reading, +battery telemetry, and `battery.alert` behavior. --- @@ -150,7 +164,8 @@ After it reboots, run `ota status` to confirm the new version. - A download that stalls or gets interrupted just **resumes** later, or you can `ota cancel` and try again. - If an **install** fails, the node won't boot a broken image — it lands in **recovery mode**: - - **RAK4631 / nRF52:** it appears as a USB drive; drag a known-good firmware `.uf2` onto it to recover. + - **nRF52:** it appears as a USB drive; drag a known-good firmware `.uf2` for that exact board onto it + to recover. - **ESP32:** it keeps the previous firmware in the other slot and rolls back. - When in doubt, you can always re-flash over USB the normal way. diff --git a/platformio.ini b/platformio.ini index ce095d0b..f8ab7596 100644 --- a/platformio.ini +++ b/platformio.ini @@ -108,15 +108,14 @@ lib_deps = ${arduino_base.lib_deps} https://github.com/oltaco/CustomLFS#0.2.2 -; Shared OTA recipe for board=rak4631-hardware nRF52 variants. nRF52840 has no A/B slot, so the update is +; Shared LoRa OTA recipe for nRF52840 variants. nRF52840 has no A/B slot, so the update is ; applied in place by the custom OTAFIX bootloader (in-place detools); the app only stages + verifies + -; approves it. Reuses the RAK4631 flash layout (src/helpers/ota/OtaFlashLayout_nrf52.h; FS_START 0xD4000 -; is the safe staging ceiling for every RAK4631 role/ldscript). The device must run the matching OTAFIX +; approves it. OtaFlashLayout_nrf52.h uses FS_START 0xD4000 as the safe staging ceiling for the supported +; S140 v6/v7 linker scripts. The device must run the matching OTAFIX ; bootloader for `applydelta` to actually apply. (detools.c is intentionally NOT built into the app — ; only the bootloader decodes.) The [rak4631] base defines this same recipe inline because it carries -; board-specific extras (fix_bsec_lib.py, BSEC lib) and a fixed post-script order; the simpler RAK4631 -; variants below just extend this section. -[rak4631_hw] +; board-specific extras (fix_bsec_lib.py, BSEC lib) and a fixed post-script order. +[nrf52_lora_ota] extends = nrf52_base extra_scripts = ${nrf52_base.extra_scripts} post:tools/mota/pio_endf.py @@ -128,6 +127,14 @@ build_src_filter = ${nrf52_base.build_src_filter} + lib_deps = ${nrf52_base.lib_deps} +; Compatibility alias retained for existing nRF52840 board definitions. +[rak4631_hw] +extends = nrf52_lora_ota +extra_scripts = ${nrf52_lora_ota.extra_scripts} +build_flags = ${nrf52_lora_ota.build_flags} +build_src_filter = ${nrf52_lora_ota.build_src_filter} +lib_deps = ${nrf52_lora_ota.lib_deps} + ; ----------------- RP2040 --------------------- [rp2040_base] diff --git a/src/helpers/ota/OtaTargets.h b/src/helpers/ota/OtaTargets.h index 9fded575..128d1aeb 100644 --- a/src/helpers/ota/OtaTargets.h +++ b/src/helpers/ota/OtaTargets.h @@ -2,7 +2,7 @@ #include // AUTO-GENERATED by tools/mota/gen_targets.py — do not edit by hand. -// 418 OTA-capable PlatformIO envs. Maps target_id (= sha2-256:4 of the env name, LE uint32) +// 491 OTA-capable PlatformIO envs. Maps target_id (= sha2-256:4 of the env name, LE uint32) // to the human-readable env name, so a node/tool can name a target seen over the air WITHOUT // transmitting the string in the .mota / LoRa protocol. Regenerate when the OTA env set changes. @@ -34,14 +34,13 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xc8104197, "GAT562_Mesh_Watch13_kiss_modem" }, { 0xf5eb61ec, "Generic_E22_kiss_modem" }, { 0x70d2d590, "Generic_E22_sx1262_repeater" }, - { 0xe1a7ffdf, "Generic_E22_sx1262_repeater_bridge_espnow" }, { 0xd5e04824, "Generic_E22_sx1268_repeater" }, - { 0x61a7b2dd, "Generic_E22_sx1268_repeater_bridge_espnow" }, { 0xa416bb20, "Generic_ESPNOW_comp_radio_usb" }, { 0x875f3744, "Generic_ESPNOW_repeatr" }, { 0xdaf349be, "Generic_ESPNOW_room_svr" }, { 0x93b93199, "Generic_ESPNOW_terminal_chat" }, { 0x5293da13, "Heltec_ct62_companion_radio_ble" }, + { 0xc6dd7723, "Heltec_ct62_companion_radio_ble_ps" }, { 0xf2eec98c, "Heltec_ct62_companion_radio_usb" }, { 0x48a986f1, "Heltec_ct62_kiss_modem" }, { 0xd2cf978c, "Heltec_ct62_repeater" }, @@ -59,6 +58,16 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x2bbe7fd8, "Heltec_E290_repeater" }, { 0x9e40157c, "Heltec_E290_repeater_bridge_espnow" }, { 0xb12e6e01, "Heltec_E290_room_server" }, + { 0xf6f835ec, "Heltec_mesh_solar_repeater" }, + { 0xfed35078, "Heltec_t096_companion_radio_ble" }, + { 0x35d42b35, "Heltec_t096_companion_radio_ble_femoff" }, + { 0x9f736ca7, "Heltec_t096_companion_radio_ble_femon" }, + { 0x2a3a88c9, "Heltec_t096_companion_radio_usb" }, + { 0x80dc72a9, "Heltec_t096_kiss_modem" }, + { 0x5d3180ae, "Heltec_t096_repeater" }, + { 0x0f67c768, "Heltec_t096_repeater_bridge_rs232" }, + { 0xa14d9f4a, "Heltec_t096_room_server" }, + { 0x6494fda0, "Heltec_t096_sensor" }, { 0x32bcdd14, "Heltec_t114_companion_radio_ble" }, { 0xfe937f14, "Heltec_t114_companion_radio_usb" }, { 0x5b9b1933, "Heltec_t114_kiss_modem" }, @@ -75,8 +84,13 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x21a73973, "Heltec_T190_kiss_modem" }, { 0x3067f656, "Heltec_T190_repeater_" }, { 0xfdb25057, "Heltec_T190_repeater_bridge_espnow_" }, + { 0x836e5931, "Heltec_T190_repeater_observer_mqtt" }, { 0x0f1767cd, "Heltec_T190_room_server_" }, + { 0x57172fcc, "Heltec_T190_room_server_observer_mqtt" }, + { 0x85edccd3, "Heltec_t1_repeater" }, + { 0x85a8c944, "Heltec_tower_v2_repeater" }, { 0x73387372, "heltec_tracker_v2_companion_radio_ble" }, + { 0xb43e97a3, "heltec_tracker_v2_companion_radio_ble_ps" }, { 0xe6eeffe1, "heltec_tracker_v2_companion_radio_usb" }, { 0x35f4e7ac, "heltec_tracker_v2_companion_radio_wifi" }, { 0xb62a1e75, "heltec_tracker_v2_kiss_modem" }, @@ -86,32 +100,44 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xed21ca4f, "heltec_tracker_v2_sensor" }, { 0x9f5f39a7, "heltec_tracker_v2_terminal_chat" }, { 0x081d2219, "Heltec_v2_companion_radio_ble" }, + { 0x7c498bc4, "Heltec_v2_companion_radio_ble_ps" }, { 0xc283ad60, "Heltec_v2_companion_radio_usb" }, { 0x4fbdc1e1, "Heltec_v2_companion_radio_wifi" }, { 0xc797fd73, "Heltec_v2_kiss_modem" }, { 0xab9871c8, "Heltec_v2_repeater" }, - { 0x5caaf9bf, "Heltec_v2_repeater_bridge_espnow" }, { 0x2075687c, "Heltec_v2_room_server" }, { 0x5d726067, "Heltec_v2_terminal_chat" }, { 0x9969bbc9, "Heltec_v3_companion_radio_ble" }, + { 0x804f7a3a, "Heltec_v3_companion_radio_ble_ps" }, { 0x22f900de, "Heltec_v3_companion_radio_usb" }, { 0xaca0e153, "Heltec_v3_companion_radio_wifi" }, + { 0x516c9c13, "Heltec_v3_companion_radio_wifi_mqtt" }, { 0xcb1c2e65, "Heltec_v3_kiss_modem" }, - { 0x9f2a6b84, "Heltec_v3_ota_test" }, { 0xd1b29b18, "Heltec_v3_repeater" }, { 0x644bb68d, "Heltec_v3_repeater_bridge_espnow" }, { 0xd19a9759, "Heltec_v3_repeater_bridge_rs232" }, + { 0xde40f56f, "Heltec_v3_repeater_observer_mqtt" }, { 0xc59d294e, "Heltec_v3_room_server" }, + { 0xceeddfaf, "Heltec_v3_room_server_observer_mqtt" }, { 0x21519537, "Heltec_v3_sensor" }, { 0x382bb181, "Heltec_v3_terminal_chat" }, + { 0x90581c83, "heltec_v4_3_companion_radio_ble_ps_femoff" }, { 0x01d8f124, "heltec_v4_companion_radio_ble" }, + { 0xe2f9583f, "heltec_v4_companion_radio_ble_ps" }, + { 0xd33b0986, "heltec_v4_companion_radio_ble_ps_femon" }, { 0x1a4d0096, "heltec_v4_companion_radio_usb" }, { 0x34240e36, "heltec_v4_companion_radio_wifi" }, + { 0x031cdf96, "heltec_v4_companion_radio_wifi_mqtt" }, { 0xd522a14f, "heltec_v4_expansionkit_repeater" }, + { 0x76657d76, "heltec_v4_expansionkit_repeater_observer_mqtt" }, + { 0x21ee03bd, "heltec_v4_expansionkit_room_server_observer_mqtt" }, + { 0xe2a1907b, "heltec_v4_expansionkit_tft_companion_radio_ble_ps" }, { 0xf75feb3e, "heltec_v4_kiss_modem" }, { 0xe792a051, "heltec_v4_repeater" }, { 0x2d5ea842, "heltec_v4_repeater_bridge_espnow" }, + { 0xab74db9e, "heltec_v4_repeater_observer_mqtt" }, { 0xeed78ce4, "heltec_v4_room_server" }, + { 0x7778b7e1, "heltec_v4_room_server_observer_mqtt" }, { 0x0b6847ed, "heltec_v4_sensor" }, { 0xab3e1ad3, "heltec_v4_terminal_chat" }, { 0x60fca2ae, "heltec_v4_tft_companion_radio_ble" }, @@ -123,24 +149,29 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x188f3ac1, "heltec_v4_tft_sensor" }, { 0x402055ec, "heltec_v4_tft_terminal_chat" }, { 0x12393f1f, "Heltec_Wireless_Paper_companion_radio_ble" }, + { 0x16fbab07, "Heltec_Wireless_Paper_companion_radio_ble_ps" }, { 0xed3ef5b8, "Heltec_Wireless_Paper_companion_radio_usb" }, { 0x8ea86381, "Heltec_Wireless_Paper_kiss_modem" }, { 0x09f57289, "Heltec_Wireless_Paper_repeater" }, { 0x148aeaab, "Heltec_Wireless_Paper_repeater_bridge_espnow" }, { 0x6e9f7fec, "Heltec_Wireless_Paper_room_server" }, { 0x6a25d024, "Heltec_Wireless_Tracker_companion_radio_ble" }, + { 0xc5a2cb41, "Heltec_Wireless_Tracker_companion_radio_ble_ps" }, { 0xc4a11710, "Heltec_Wireless_Tracker_companion_radio_usb" }, { 0x753947a4, "Heltec_Wireless_Tracker_kiss_modem" }, { 0xe6fa98b4, "Heltec_Wireless_Tracker_repeater" }, { 0xf8c27cf4, "Heltec_Wireless_Tracker_repeater_bridge_espnow" }, { 0x90e227d9, "Heltec_Wireless_Tracker_room_server" }, { 0x812f5e52, "Heltec_WSL3_companion_radio_ble" }, + { 0x61f961c5, "Heltec_WSL3_companion_radio_ble_ps" }, { 0x1ddd15c8, "Heltec_WSL3_companion_radio_usb" }, { 0x49d67d0d, "Heltec_WSL3_companion_radio_wifi" }, { 0xbc003322, "Heltec_WSL3_repeater" }, { 0x835b70c0, "Heltec_WSL3_repeater_bridge_espnow" }, { 0xd7460575, "Heltec_WSL3_repeater_bridge_rs232" }, + { 0x36acced5, "Heltec_WSL3_repeater_observer_mqtt" }, { 0x33e2c171, "Heltec_WSL3_room_server" }, + { 0x5be91148, "Heltec_WSL3_room_server_observer_mqtt" }, { 0xa165ae99, "Heltec_WSL3_sensor" }, { 0x04c5c2b7, "ikoka_handheld_nrf_e22_30dbm_096_companion_radio_ble" }, { 0x6c1ca659, "ikoka_handheld_nrf_e22_30dbm_096_companion_radio_usb" }, @@ -179,6 +210,7 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xf1ab4c28, "ikoka_stick_nrf_33dbm_kiss_modem" }, { 0xe5331f02, "ikoka_stick_nrf_33dbm_repeater" }, { 0xfba7177b, "ikoka_stick_nrf_33dbm_room_server" }, + { 0xde7dc472, "KeepteenLT1_repeater" }, { 0x69df7765, "LilyGo_T-Echo-Lite_companion_radio_ble" }, { 0xe9fbc9be, "LilyGo_T-Echo-Lite_kiss_modem" }, { 0x40818863, "LilyGo_T-Echo-Lite_non_shell_companion_radio_ble" }, @@ -195,11 +227,14 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xb92ec96b, "LilyGo_T-Echo_repeater" }, { 0x420ebc63, "LilyGo_T-Echo_room_server" }, { 0x967ccaee, "LilyGo_T3S3_sx1262_companion_radio_ble" }, + { 0x8021afa2, "LilyGo_T3S3_sx1262_companion_radio_ble_ps" }, { 0x5f7c7688, "LilyGo_T3S3_sx1262_companion_radio_usb" }, { 0xbd04e6e7, "LilyGo_T3S3_sx1262_kiss_modem" }, { 0x1aeac884, "LilyGo_T3S3_sx1262_repeater" }, { 0x07849209, "LilyGo_T3S3_sx1262_repeater_bridge_espnow" }, + { 0x0c79b100, "LilyGo_T3S3_sx1262_repeater_observer_mqtt" }, { 0xbfb60e7c, "LilyGo_T3S3_sx1262_room_server" }, + { 0x8a63de3a, "LilyGo_T3S3_sx1262_room_server_observer_mqtt" }, { 0x96036a68, "LilyGo_T3S3_sx1262_terminal_chat" }, { 0xb76a745c, "LilyGo_T3S3_sx1276_companion_radio_ble" }, { 0x43023193, "LilyGo_T3S3_sx1276_companion_radio_usb" }, @@ -208,13 +243,17 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xb59ea2ed, "LilyGo_T3S3_sx1276_repeater_bridge_espnow" }, { 0xbe372c6d, "LilyGo_T3S3_sx1276_room_server" }, { 0x6215e9eb, "LilyGo_T3S3_sx1276_terminal_chat" }, + { 0x07907102, "LilyGo_T_Impulse_Plus_repeater" }, { 0x3898ea56, "LilyGo_TBeam_1W_companion_radio_ble" }, + { 0x2fb7e218, "LilyGo_TBeam_1W_companion_radio_ble_ps" }, { 0x4f722e70, "LilyGo_TBeam_1W_companion_radio_usb" }, { 0x694eed25, "LilyGo_TBeam_1W_companion_radio_wifi" }, { 0x85b8b9d7, "LilyGo_TBeam_1W_kiss_modem" }, { 0xe8421e36, "LilyGo_TBeam_1W_repeater" }, { 0x82eaaf9e, "LilyGo_TBeam_1W_repeater_bridge_espnow" }, + { 0x9f9caba4, "LilyGo_TBeam_1W_repeater_observer_mqtt" }, { 0xe4a2de74, "LilyGo_TBeam_1W_room_server" }, + { 0x582c7826, "LilyGo_TBeam_1W_room_server_observer_mqtt" }, { 0xaeb637f1, "LilyGo_TDeck_companion_radio_ble" }, { 0x86813271, "LilyGo_TDeck_companion_radio_usb" }, { 0x67b2ff84, "LilyGo_TDeck_kiss_modem" }, @@ -228,35 +267,37 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x21c6d08d, "LilyGo_Tlora_C6_repeater_" }, { 0x34302c14, "LilyGo_Tlora_C6_room_server_" }, { 0x268d6fc1, "LilyGo_TLora_V2_1_1_6_companion_radio_ble" }, + { 0xeabe3b40, "LilyGo_TLora_V2_1_1_6_companion_radio_ble_ps" }, { 0x3c172d27, "LilyGo_TLora_V2_1_1_6_companion_radio_usb" }, { 0xf7c5d584, "LilyGo_TLora_V2_1_1_6_companion_radio_wifi" }, { 0x81960cc0, "LilyGo_TLora_V2_1_1_6_kiss_modem" }, { 0x504020ea, "LilyGo_TLora_V2_1_1_6_repeater" }, - { 0x8e5c0c88, "LilyGo_TLora_V2_1_1_6_repeater_bridge_espnow" }, - { 0x4e42e0ad, "LilyGo_TLora_V2_1_1_6_repeater_bridge_rs232" }, + { 0x9c652703, "LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt" }, { 0xa2ce002f, "LilyGo_TLora_V2_1_1_6_room_server" }, + { 0xdb780283, "LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt" }, { 0x6f16479e, "LilyGo_TLora_V2_1_1_6_terminal_chat" }, { 0x1018e5d1, "M5Stack_Unit_C6L_companion_radio_ble" }, { 0xc0ab5040, "M5Stack_Unit_C6L_companion_radio_usb" }, { 0xa2bf90bd, "M5Stack_Unit_C6L_kiss_modem" }, { 0xe6bff8f9, "M5Stack_Unit_C6L_repeater" }, { 0xb9cd26cb, "M5Stack_Unit_C6L_room_server" }, + { 0x9bc34bd5, "Mesh_pocket_repeater" }, { 0xdbfe2675, "Meshadventurer_sx1262_companion_radio_ble" }, { 0xb00241d0, "Meshadventurer_sx1262_companion_radio_usb" }, { 0x88e77fee, "Meshadventurer_sx1262_kiss_modem" }, { 0xae2d9caa, "Meshadventurer_sx1262_repeater" }, - { 0xecea445b, "Meshadventurer_sx1262_repeater_bridge_espnow" }, { 0xa0043e00, "Meshadventurer_sx1262_room_server" }, { 0x26bbf4ed, "Meshadventurer_sx1262_terminal_chat" }, { 0xdcc0f158, "Meshadventurer_sx1268_companion_radio_ble" }, { 0xe3320463, "Meshadventurer_sx1268_companion_radio_usb" }, { 0x852b928a, "Meshadventurer_sx1268_kiss_modem" }, { 0x0ec870e9, "Meshadventurer_sx1268_repeater" }, - { 0xc845072e, "Meshadventurer_sx1268_repeater_bridge_espnow" }, { 0x8f00c1f2, "Meshadventurer_sx1268_room_server" }, { 0xcea95e20, "Meshadventurer_sx1268_terminal_chat" }, { 0xd45277ff, "Meshimi_companion_radio_ble_" }, { 0x2cad9a9d, "Meshimi_repeater_" }, + { 0x77d0810c, "Minewsemi_me25ls01_repeater" }, + { 0xf8259880, "Nano_G2_Ultra_repeater" }, { 0x063f1f00, "nibble_screen_connect_companion_radio_ble_" }, { 0xa8a79da5, "nibble_screen_connect_companion_radio_usb_" }, { 0xc0d3815b, "nibble_screen_connect_companion_radio_wifi_" }, @@ -294,15 +335,18 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xfa8510fa, "RAK_3112_repeater" }, { 0xd34d8461, "RAK_3112_repeater_bridge_espnow" }, { 0x98077550, "RAK_3112_repeater_bridge_rs232" }, + { 0x11628e29, "RAK_3112_repeater_observer_mqtt" }, { 0x2ed959aa, "RAK_3112_room_server" }, + { 0xf1e7cadb, "RAK_3112_room_server_observer_mqtt" }, { 0xced7e127, "RAK_3112_sensor" }, { 0x6925aaf0, "RAK_3112_terminal_chat" }, + { 0x94c5555a, "RAK_3401_repeater" }, { 0x9f4d58ac, "RAK_4631_companion_radio_ble" }, { 0x48d3b5d4, "RAK_4631_companion_radio_usb" }, { 0x14e6965d, "RAK_4631_kiss_modem" }, - { 0x04d413fd, "RAK_4631_repeater" }, { 0x22ea8497, "RAK_4631_repeater_bridge_rs232_serial1" }, { 0x21bae522, "RAK_4631_repeater_bridge_rs232_serial2" }, + { 0xb876506d, "RAK_4631_repeater_no_external_sensors_lora_ota" }, { 0x626d80ed, "RAK_4631_room_server" }, { 0x8b1d6850, "RAK_4631_sensor" }, { 0xf1d3c5a8, "RAK_4631_terminal_chat" }, @@ -312,6 +356,7 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x4fa4ae55, "RAK_WisMesh_Tag_repeater" }, { 0x9cb0b232, "RAK_WisMesh_Tag_room_server" }, { 0x51fa1a49, "RAK_WisMesh_Tag_sensor" }, + { 0xdb73638b, "SenseCap_Solar_repeater" }, { 0xd904c2d5, "SenseCapIndicator-ESPNow_comp_radio_usb" }, { 0xd0df8303, "Station_G2_companion_radio_ble" }, { 0x5c1a54f8, "Station_G2_companion_radio_usb" }, @@ -321,7 +366,9 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x75587f24, "Station_G2_logging_repeater_bridge_espnow" }, { 0xf2128c81, "Station_G2_repeater" }, { 0x1b34e7b4, "Station_G2_repeater_bridge_espnow" }, + { 0xdbb6a855, "Station_G2_repeater_observer_mqtt" }, { 0x73c4a019, "Station_G2_room_server" }, + { 0xe4042b21, "Station_G2_room_server_observer_mqtt" }, { 0x8e549407, "Station_G3_ESP32_companion_radio_ble" }, { 0x1deac038, "Station_G3_ESP32_companion_radio_usb" }, { 0x2a2f303b, "Station_G3_ESP32_companion_radio_wifi" }, @@ -335,21 +382,28 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x000fc519, "t1000e_repeater" }, { 0x3e55e34d, "t1000e_room_server" }, { 0x16482630, "T_Beam_S3_Supreme_SX1262_companion_radio_ble" }, + { 0xce0f07ad, "T_Beam_S3_Supreme_SX1262_companion_radio_ble_ps" }, { 0x01c43d49, "T_Beam_S3_Supreme_SX1262_companion_radio_wifi" }, { 0x51fe3801, "T_Beam_S3_Supreme_SX1262_kiss_modem" }, { 0x857149e5, "T_Beam_S3_Supreme_SX1262_repeater" }, { 0xd9d64938, "T_Beam_S3_Supreme_SX1262_repeater_bridge_espnow" }, + { 0xcb7da3f5, "T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt" }, { 0x9952fbe3, "T_Beam_S3_Supreme_SX1262_room_server" }, + { 0x3729cd74, "T_Beam_S3_Supreme_SX1262_room_server_observer_mqtt" }, { 0xdc27c37c, "Tbeam_SX1262_companion_radio_ble" }, + { 0x9b9f8775, "Tbeam_SX1262_companion_radio_ble_ps" }, { 0xb27514a3, "Tbeam_SX1262_kiss_modem" }, { 0xe9ce038c, "Tbeam_SX1262_repeater" }, - { 0x06406dd4, "Tbeam_SX1262_repeater_bridge_espnow" }, + { 0xe295a7a4, "Tbeam_SX1262_repeater_observer_mqtt" }, { 0x189660b3, "Tbeam_SX1262_room_server" }, + { 0x99907475, "Tbeam_SX1262_room_server_observer_mqtt" }, { 0x2082078d, "Tbeam_SX1276_companion_radio_ble" }, + { 0x24a94c81, "Tbeam_SX1276_companion_radio_ble_ps" }, { 0x3750e80d, "Tbeam_SX1276_kiss_modem" }, { 0xe4b49973, "Tbeam_SX1276_repeater" }, - { 0x0c0c4605, "Tbeam_SX1276_repeater_bridge_espnow" }, + { 0xe1372b52, "Tbeam_SX1276_repeater_observer_mqtt" }, { 0x5a79bac1, "Tbeam_SX1276_room_server" }, + { 0x6f339514, "Tbeam_SX1276_room_server_observer_mqtt" }, { 0x8eaa289e, "Tenstar_C3_sx1262_kiss_modem" }, { 0x70e91bd9, "Tenstar_C3_sx1262_repeater" }, { 0x5a7e9c2d, "Tenstar_C3_sx1262_repeater_bridge_espnow" }, @@ -376,6 +430,7 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x087f99c0, "ThinkNode_M3_repeater" }, { 0x2afe6c63, "ThinkNode_M3_room_server" }, { 0xf2d61a1c, "ThinkNode_M5_companion_radio_ble" }, + { 0x14b1b097, "ThinkNode_M5_companion_radio_ble_ps" }, { 0x1da30414, "ThinkNode_M5_companion_radio_serial" }, { 0xae8fe1c9, "ThinkNode_M5_companion_radio_usb" }, { 0x67acd73f, "ThinkNode_M5_companion_radio_wifi" }, @@ -389,8 +444,21 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xe59c9373, "ThinkNode_M6_kiss_modem" }, { 0x236f605c, "ThinkNode_M6_repeater" }, { 0x93994fed, "ThinkNode_M6_room_server" }, + { 0x66c47cfd, "ThinkNode_M7_companion_radio_ble" }, + { 0xa01688a7, "ThinkNode_M7_companion_radio_usb" }, + { 0xa5f4a562, "ThinkNode_M7_companion_radio_wifi" }, + { 0xef83222b, "ThinkNode_M7_kiss_modem" }, + { 0xc36ec867, "ThinkNode_M7_repeater" }, + { 0x92f5bbea, "ThinkNode_M7_room_server" }, + { 0x708ac4dc, "ThinkNode_M9_companion_radio_ble_" }, + { 0xdc51bf13, "ThinkNode_M9_companion_radio_usb_" }, + { 0xc27f8304, "ThinkNode_M9_companion_radio_wifi_" }, + { 0x7190df40, "ThinkNode_M9_kiss_modem" }, + { 0x609d50b3, "ThinkNode_M9_repeater_" }, + { 0x5718c7ea, "ThinkNode_M9_room_server_" }, { 0x37443a5b, "WHY2025_badge_companion_radio_ble_" }, { 0x603384a7, "WHY2025_badge_repeater_" }, + { 0xce3ef40f, "wio_wm1110_repeater" }, { 0x475a2a6a, "WioTrackerL1_companion_radio_ble" }, { 0xf4175d2c, "WioTrackerL1_companion_radio_usb" }, { 0x3d831006, "WioTrackerL1_kiss_modem" }, @@ -399,6 +467,7 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x91eac424, "WioTrackerL1Eink_companion_radio_ble" }, { 0x7a84a8c4, "WioTrackerL1Eink_kiss_modem" }, { 0x67843a5f, "Xiao_C3_companion_radio_ble" }, + { 0x0e83fd51, "Xiao_C3_companion_radio_ble_ps" }, { 0xfad357ab, "Xiao_C3_companion_radio_usb" }, { 0x16af5c67, "Xiao_C3_companion_radio_wifi" }, { 0x8c105104, "Xiao_C3_kiss_modem" }, @@ -413,6 +482,7 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x93145fbb, "Xiao_nrf52_repeater" }, { 0x33a154ff, "Xiao_nrf52_room_server" }, { 0x6658b418, "Xiao_S3_companion_radio_ble" }, + { 0x0cfb9c00, "Xiao_S3_companion_radio_ble_ps" }, { 0x964f4f5c, "Xiao_S3_companion_radio_usb" }, { 0x0a5dc760, "Xiao_S3_kiss_modem" }, { 0xd08496ce, "Xiao_S3_repeater" }, @@ -420,13 +490,16 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x60ebfa87, "Xiao_S3_room_server" }, { 0x60f5fdc2, "Xiao_S3_sensor" }, { 0xe8f79d22, "Xiao_S3_WIO_companion_radio_ble" }, + { 0xb97bbb15, "Xiao_S3_WIO_companion_radio_ble_ps" }, { 0x9f27be15, "Xiao_S3_WIO_companion_radio_serial" }, { 0x396fecc7, "Xiao_S3_WIO_companion_radio_usb" }, { 0xf94e3407, "Xiao_S3_WIO_companion_radio_wifi" }, { 0xe1930103, "Xiao_S3_WIO_kiss_modem" }, { 0x9f19bcd1, "Xiao_S3_WIO_repeater" }, { 0xfcebff61, "Xiao_S3_WIO_repeater_bridge_espnow" }, + { 0xac5c1405, "Xiao_S3_WIO_repeater_observer_mqtt" }, { 0xccb734e2, "Xiao_S3_WIO_room_server" }, + { 0x634ff632, "Xiao_S3_WIO_room_server_observer_mqtt" }, { 0xf967a300, "Xiao_S3_WIO_sensor" }, { 0xa0cc1c36, "Xiao_S3_WIO_terminal_chat" }, }; diff --git a/tools/mota/gen_targets.py b/tools/mota/gen_targets.py index ff25928d..a6a0423d 100644 --- a/tools/mota/gen_targets.py +++ b/tools/mota/gen_targets.py @@ -4,7 +4,7 @@ A target_id is sha2-256:4(pio_env_name); it travels in beacons / the .mota manifest as 4 bytes. This table lets a node (and motatool) print the human-readable env name for a target seen over the air, WITHOUT ever transmitting the string. The set of envs is resolved from PlatformIO (every env whose build_flags -include ENABLE_OTA), so it stays in sync with what actually ships OTA. +include ENABLE_OTA and do not include DISABLE_LORA_OTA), so explicit size/safety exclusions stay out. Run: ./meshcore/bin/python tools/mota/gen_targets.py # resolves via `pio project config` ./meshcore/bin/python tools/mota/gen_targets.py cfg.json # or reuse a cached config dump (faster) @@ -40,7 +40,7 @@ def ota_envs(cfg): for k, v in opts: if k == "build_flags": flags = " ".join(v) if isinstance(v, list) else str(v) - if "ENABLE_OTA" in flags: + if "ENABLE_OTA" in flags and "DISABLE_LORA_OTA" not in flags: envs.append(section[4:]) break return sorted(set(envs)) diff --git a/tools/mota/test_mota.py b/tools/mota/test_mota.py index 1faa2f51..9458493b 100644 --- a/tools/mota/test_mota.py +++ b/tools/mota/test_mota.py @@ -40,6 +40,17 @@ def test_target_id_for_env(): assert ml.target_id_for_env("RAK_4631_repeater") != ml.target_id_for_env("RAK_4631_companion_radio_usb") +def test_ota_target_generation_honors_explicit_disable(): + from gen_targets import ota_envs + + cfg = [ + ["env:enabled", [["build_flags", ["-D ENABLE_OTA=1"]]]], + ["env:disabled", [["build_flags", ["-D ENABLE_OTA=1", "-D DISABLE_LORA_OTA=1"]]]], + ["env:unrelated", [["build_flags", ["-D NRF52_PLATFORM"]]]], + ] + assert ota_envs(cfg) == ["enabled"] + + def test_hardware_id_for_env(): assert ml.hardware_id_for_env("RAK_4631_repeater") == "RAK_4631" assert ml.hardware_id_for_env("RAK_4631_companion_radio_usb") == "RAK_4631" diff --git a/variants/heltec_mesh_solar/platformio.ini b/variants/heltec_mesh_solar/platformio.ini index bcec0e50..4384e663 100644 --- a/variants/heltec_mesh_solar/platformio.ini +++ b/variants/heltec_mesh_solar/platformio.ini @@ -33,7 +33,9 @@ upload_protocol = nrfutil [env:Heltec_mesh_solar_repeater] extends = Heltec_mesh_solar +extra_scripts = ${nrf52_lora_ota.extra_scripts} build_src_filter = ${Heltec_mesh_solar.build_src_filter} + + +<../examples/simple_repeater> build_flags = @@ -43,6 +45,9 @@ build_flags = -D ADVERT_LON=0.0 -D ADMIN_PASSWORD='"password"' -D MAX_NEIGHBOURS=50 + -D ENABLE_OTA=1 + -D OTA_FLASH_STORE=1 + -D OTA_FOLDER_SERIAL ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1 diff --git a/variants/heltec_t1/platformio.ini b/variants/heltec_t1/platformio.ini index d5c3caf1..ebc855e2 100644 --- a/variants/heltec_t1/platformio.ini +++ b/variants/heltec_t1/platformio.ini @@ -29,7 +29,9 @@ upload_protocol = nrfutil [env:Heltec_t1_repeater] extends = Heltec_t1 +extra_scripts = ${nrf52_lora_ota.extra_scripts} build_src_filter = ${Heltec_t1.build_src_filter} + + +<../examples/simple_repeater> build_flags = @@ -39,6 +41,9 @@ build_flags = -D ADVERT_LON=0.0 -D ADMIN_PASSWORD='"password"' -D MAX_NEIGHBOURS=50 + -D ENABLE_OTA=1 + -D OTA_FLASH_STORE=1 + -D OTA_FOLDER_SERIAL ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1 diff --git a/variants/heltec_tower_v2/platformio.ini b/variants/heltec_tower_v2/platformio.ini index f029b7d4..b44c6c7d 100644 --- a/variants/heltec_tower_v2/platformio.ini +++ b/variants/heltec_tower_v2/platformio.ini @@ -27,7 +27,9 @@ upload_protocol = nrfutil [env:Heltec_tower_v2_repeater] extends = Heltec_tower_v2 +extra_scripts = ${nrf52_lora_ota.extra_scripts} build_src_filter = ${Heltec_tower_v2.build_src_filter} + + +<../examples/simple_repeater> build_flags = ${Heltec_tower_v2.build_flags} @@ -36,6 +38,9 @@ build_flags = -D ADVERT_LON=0.0 -D ADMIN_PASSWORD='"password"' -D MAX_NEIGHBOURS=50 + -D ENABLE_OTA=1 + -D OTA_FLASH_STORE=1 + -D OTA_FOLDER_SERIAL ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1 diff --git a/variants/keepteen_lt1/platformio.ini b/variants/keepteen_lt1/platformio.ini index 27cf809e..1d65f6bf 100644 --- a/variants/keepteen_lt1/platformio.ini +++ b/variants/keepteen_lt1/platformio.ini @@ -22,7 +22,9 @@ lib_deps= ${nrf52_base.lib_deps} [env:KeepteenLT1_repeater] extends = KeepteenLT1 +extra_scripts = ${nrf52_lora_ota.extra_scripts} build_src_filter = ${KeepteenLT1.build_src_filter} + + +<../examples/simple_repeater> + + @@ -34,6 +36,9 @@ build_flags = -D ADMIN_PASSWORD='"password"' -D MAX_NEIGHBOURS=50 -D DISPLAY_CLASS=SSD1306Display + -D ENABLE_OTA=1 + -D OTA_FLASH_STORE=1 + -D OTA_FOLDER_SERIAL ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1 lib_deps = ${KeepteenLT1.lib_deps} @@ -104,4 +109,4 @@ lib_deps = ${KeepteenLT1.lib_deps} [env:KeepteenLT1_kiss_modem] extends = KeepteenLT1 build_src_filter = ${KeepteenLT1.build_src_filter} - +<../examples/kiss_modem/> \ No newline at end of file + +<../examples/kiss_modem/> diff --git a/variants/lilygo_t_impulse_plus/platformio.ini b/variants/lilygo_t_impulse_plus/platformio.ini index 0ed5b9a4..5a9b51bb 100644 --- a/variants/lilygo_t_impulse_plus/platformio.ini +++ b/variants/lilygo_t_impulse_plus/platformio.ini @@ -30,13 +30,18 @@ lib_deps= ${nrf52_base.lib_deps} [env:LilyGo_T_Impulse_Plus_repeater] extends = LilyGo_T_Impulse_Plus +extra_scripts = ${nrf52_lora_ota.extra_scripts} build_src_filter = ${LilyGo_T_Impulse_Plus.build_src_filter} + + +<../examples/simple_repeater> build_flags = ${LilyGo_T_Impulse_Plus.build_flags} -D ADVERT_NAME='"T-Impulse-Plus Repeater"' -D ADMIN_PASSWORD='"password"' -D MAX_NEIGHBOURS=50 + -D ENABLE_OTA=1 + -D OTA_FLASH_STORE=1 + -D OTA_FOLDER_SERIAL ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1 lib_deps = ${LilyGo_T_Impulse_Plus.lib_deps} diff --git a/variants/mesh_pocket/platformio.ini b/variants/mesh_pocket/platformio.ini index 0d2a74ad..0d42b0bc 100644 --- a/variants/mesh_pocket/platformio.ini +++ b/variants/mesh_pocket/platformio.ini @@ -36,7 +36,9 @@ upload_protocol = nrfutil [env:Mesh_pocket_repeater] extends = Mesh_pocket +extra_scripts = ${nrf52_lora_ota.extra_scripts} build_src_filter = ${Mesh_pocket.build_src_filter} + + +<../examples/simple_repeater> build_flags = ${Mesh_pocket.build_flags} @@ -45,6 +47,9 @@ build_flags = -D ADVERT_LON=0.0 -D ADMIN_PASSWORD='"password"' -D MAX_NEIGHBOURS=50 + -D ENABLE_OTA=1 + -D OTA_FLASH_STORE=1 + -D OTA_FOLDER_SERIAL ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1 diff --git a/variants/minewsemi_me25ls01/platformio.ini b/variants/minewsemi_me25ls01/platformio.ini index 3468e072..5b90a86b 100644 --- a/variants/minewsemi_me25ls01/platformio.ini +++ b/variants/minewsemi_me25ls01/platformio.ini @@ -62,6 +62,7 @@ build_src_filter = ${me25ls01.build_src_filter} [env:Minewsemi_me25ls01_repeater] extends = me25ls01 +extra_scripts = ${nrf52_lora_ota.extra_scripts} build_flags = ${me25ls01.build_flags} -D MAX_CONTACTS=100 -D MAX_GROUP_CHANNELS=8 @@ -78,7 +79,11 @@ build_flags = ${me25ls01.build_flags} -D ADMIN_PASSWORD='"password"' -D MAX_NEIGHBOURS=50 -D DISPLAY_CLASS=NullDisplayDriver + -D ENABLE_OTA=1 + -D OTA_FLASH_STORE=1 + -D OTA_FOLDER_SERIAL build_src_filter = ${me25ls01.build_src_filter} + + +<../examples/simple_repeater> [env:Minewsemi_me25ls01_room_server] diff --git a/variants/nano_g2_ultra/platformio.ini b/variants/nano_g2_ultra/platformio.ini index e92acccf..cf3df08f 100644 --- a/variants/nano_g2_ultra/platformio.ini +++ b/variants/nano_g2_ultra/platformio.ini @@ -27,6 +27,7 @@ lib_deps = ${nrf52_base.lib_deps} [env:Nano_G2_Ultra_repeater] extends = Nano_G2_Ultra +extra_scripts = ${nrf52_lora_ota.extra_scripts} build_flags = ${Nano_G2_Ultra.build_flags} -D DISPLAY_CLASS=SH1106Display @@ -35,9 +36,13 @@ build_flags = -D ADVERT_LON=0.0 -D ADMIN_PASSWORD='"password"' -D MAX_NEIGHBOURS=50 + -D ENABLE_OTA=1 + -D OTA_FLASH_STORE=1 + -D OTA_FOLDER_SERIAL ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1 build_src_filter = ${Nano_G2_Ultra.build_src_filter} + + + +<../examples/simple_repeater> diff --git a/variants/rak3401/platformio.ini b/variants/rak3401/platformio.ini index 5eeb6a9d..fa53ba20 100644 --- a/variants/rak3401/platformio.ini +++ b/variants/rak3401/platformio.ini @@ -27,6 +27,7 @@ lib_deps = [env:RAK_3401_repeater] extends = rak3401 +extra_scripts = ${nrf52_lora_ota.extra_scripts} build_flags = ${rak3401.build_flags} -D DISPLAY_CLASS=SSD1306Display @@ -35,9 +36,13 @@ build_flags = -D ADVERT_LON=0.0 -D ADMIN_PASSWORD='"password"' -D MAX_NEIGHBOURS=50 + -D ENABLE_OTA=1 + -D OTA_FLASH_STORE=1 + -D OTA_FOLDER_SERIAL ;-D MESH_PACKET_LOGGING=1 ;-D MESH_DEBUG=1 build_src_filter = ${rak3401.build_src_filter} + + + +<../examples/simple_repeater> diff --git a/variants/rak4631/platformio.ini b/variants/rak4631/platformio.ini index 50613c5f..ded500e0 100644 --- a/variants/rak4631/platformio.ini +++ b/variants/rak4631/platformio.ini @@ -48,6 +48,7 @@ lib_deps = extends = rak4631 build_flags = ${rak4631.build_flags} + -UENABLE_OTA -D DISABLE_LORA_OTA=1 ; Cascade repeater image exceeds the safe nRF52 in-place OTA ceiling -D DISPLAY_CLASS=SSD1306Display -D ADVERT_NAME='"RAK4631 Repeater"' @@ -60,9 +61,50 @@ build_flags = ; -D MESH_DEBUG=1 build_src_filter = ${rak4631.build_src_filter} + - ; The OTA sources remain inherited, but build.sh removes ENABLE_OTA for this oversized role. + ; Shared sources remain inherited, but ENABLE_OTA is explicitly undefined for this oversized role. +<../examples/simple_repeater> +; Lean OTA target for space-constrained RAK4631 repeaters. This removes only optional external +; environmental/GPS sensor packages. RAK4631Board::getBattMilliVolts(), repeater telemetry, and +; battery.alert remain part of the board/repeater sources below. +[env:RAK_4631_repeater_no_external_sensors_lora_ota] +extends = rak4631 +extra_scripts = ${nrf52_lora_ota.extra_scripts} +build_flags = + ${rak4631.build_flags} + -UENV_INCLUDE_GPS + -UENV_INCLUDE_AHTX0 + -UENV_INCLUDE_BME280 + -UENV_INCLUDE_BMP280 + -UENV_INCLUDE_SHTC3 + -UENV_INCLUDE_SHT4X + -UENV_INCLUDE_LPS22HB + -UENV_INCLUDE_INA3221 + -UENV_INCLUDE_INA219 + -UENV_INCLUDE_INA226 + -UENV_INCLUDE_INA260 + -UENV_INCLUDE_MLX90614 + -UENV_INCLUDE_VL53L0X + -UENV_INCLUDE_BME680 + -UENV_INCLUDE_BMP085 + -UENV_INCLUDE_RAK12035 + -UENV_INCLUDE_BME680_BSEC + -D DISPLAY_CLASS=SSD1306Display + -D ADVERT_NAME='"RAK4631 LoRa OTA No Ext Sensors"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D MAX_NEIGHBOURS=50 +build_src_filter = ${nrf52_lora_ota.build_src_filter} + +<../variants/rak4631> + + + + + + + +<../examples/simple_repeater> +lib_deps = + ${nrf52_lora_ota.lib_deps} + adafruit/Adafruit SSD1306 @ ^2.5.13 + [env:RAK_4631_repeater_bridge_rs232_serial1] extends = rak4631 build_flags = diff --git a/variants/sensecap_solar/platformio.ini b/variants/sensecap_solar/platformio.ini index e478d2b9..fc49f4e1 100644 --- a/variants/sensecap_solar/platformio.ini +++ b/variants/sensecap_solar/platformio.ini @@ -39,6 +39,7 @@ lib_deps = [env:SenseCap_Solar_repeater] extends = SenseCap_Solar +extra_scripts = ${nrf52_lora_ota.extra_scripts} build_flags = ${SenseCap_Solar.build_flags} -D ADVERT_NAME='"SenseCap_Solar Repeater"' @@ -46,9 +47,13 @@ build_flags = -D ADVERT_LON=0.0 -D ADMIN_PASSWORD='"password"' -D MAX_NEIGHBOURS=50 + -D ENABLE_OTA=1 + -D OTA_FLASH_STORE=1 + -D OTA_FOLDER_SERIAL ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1 build_src_filter = ${SenseCap_Solar.build_src_filter} + + +<../examples/simple_repeater/*.cpp> [env:SenseCap_Solar_room_server] diff --git a/variants/wio_wm1110/platformio.ini b/variants/wio_wm1110/platformio.ini index e1255df2..c061aa3d 100644 --- a/variants/wio_wm1110/platformio.ini +++ b/variants/wio_wm1110/platformio.ini @@ -39,6 +39,7 @@ lib_deps = ${nrf52_base.lib_deps} [env:wio_wm1110_repeater] extends = wio_wm1110 +extra_scripts = ${nrf52_lora_ota.extra_scripts} build_flags = ${wio_wm1110.build_flags} -D ADVERT_NAME='"WM1110 Repeater"' @@ -46,9 +47,13 @@ build_flags = -D ADVERT_LON=0.0 -D ADMIN_PASSWORD='"password"' -D MAX_NEIGHBOURS=50 + -D ENABLE_OTA=1 + -D OTA_FLASH_STORE=1 + -D OTA_FOLDER_SERIAL ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1 build_src_filter = ${wio_wm1110.build_src_filter} + + +<../examples/simple_repeater/*.cpp> [env:wio_wm1110_room_server]