diff --git a/.github/workflows/build-repeater-mqtt-firmwares.yml b/.github/workflows/build-repeater-mqtt-firmwares.yml new file mode 100644 index 0000000000..5bf0425ef0 --- /dev/null +++ b/.github/workflows/build-repeater-mqtt-firmwares.yml @@ -0,0 +1,43 @@ +name: Build Repeater MQTT Firmwares + +permissions: + contents: write + +on: + workflow_dispatch: + push: + tags: + - 'repeater-mqtt-*' + +jobs: + + build: + runs-on: ubuntu-latest + steps: + + - name: Clone Repo + uses: actions/checkout@v4 + + - name: Setup Build Environment + uses: ./.github/actions/setup-build-environment + + - name: Build Firmwares + env: + FIRMWARE_VERSION: ${{ env.GIT_TAG_VERSION }} + OUT_DIR: .prebuilt + run: /usr/bin/env bash build.sh build-repeater-mqtt-firmwares + + - name: Upload Workflow Artifacts + uses: actions/upload-artifact@v4 + with: + name: repeater-mqtt-firmwares + path: .prebuilt + + - name: Create Release + uses: softprops/action-gh-release@v2 + if: startsWith(github.ref, 'refs/tags/') + with: + name: Repeater MQTT Firmware ${{ env.GIT_TAG_VERSION }} + body: "" + draft: true + files: .prebuilt/* diff --git a/.github/workflows/build-roomserver-mqtt-firmwares.yml b/.github/workflows/build-roomserver-mqtt-firmwares.yml new file mode 100644 index 0000000000..d22b28a4fc --- /dev/null +++ b/.github/workflows/build-roomserver-mqtt-firmwares.yml @@ -0,0 +1,43 @@ +name: Build Room Server MQTT Firmwares + +permissions: + contents: write + +on: + workflow_dispatch: + push: + tags: + - 'room-server-mqtt-*' + +jobs: + + build: + runs-on: ubuntu-latest + steps: + + - name: Clone Repo + uses: actions/checkout@v4 + + - name: Setup Build Environment + uses: ./.github/actions/setup-build-environment + + - name: Build Firmwares + env: + FIRMWARE_VERSION: ${{ env.GIT_TAG_VERSION }} + OUT_DIR: .prebuilt + run: /usr/bin/env bash build.sh build-room-server-mqtt-firmwares + + - name: Upload Workflow Artifacts + uses: actions/upload-artifact@v4 + with: + name: room-server-mqtt-firmwares + path: .prebuilt + + - name: Create Release + uses: softprops/action-gh-release@v2 + if: startsWith(github.ref, 'refs/tags/') + with: + name: Room Server MQTT Firmware ${{ env.GIT_TAG_VERSION }} + body: "" + draft: true + files: .prebuilt/* diff --git a/.prebuilt/Heltec_T190_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin b/.prebuilt/Heltec_T190_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin new file mode 100644 index 0000000000..2dda1343bc Binary files /dev/null and b/.prebuilt/Heltec_T190_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin differ diff --git a/.prebuilt/Heltec_T190_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin b/.prebuilt/Heltec_T190_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin new file mode 100644 index 0000000000..dcd143828d Binary files /dev/null and b/.prebuilt/Heltec_T190_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin differ diff --git a/.prebuilt/Heltec_WSL3_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin b/.prebuilt/Heltec_WSL3_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin new file mode 100644 index 0000000000..a3a24f2906 Binary files /dev/null and b/.prebuilt/Heltec_WSL3_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin differ diff --git a/.prebuilt/Heltec_WSL3_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin b/.prebuilt/Heltec_WSL3_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin new file mode 100644 index 0000000000..57fb86e766 Binary files /dev/null and b/.prebuilt/Heltec_WSL3_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin differ diff --git a/.prebuilt/Heltec_v3_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin b/.prebuilt/Heltec_v3_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin new file mode 100644 index 0000000000..07c5c700bf Binary files /dev/null and b/.prebuilt/Heltec_v3_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin differ diff --git a/.prebuilt/Heltec_v3_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin b/.prebuilt/Heltec_v3_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin new file mode 100644 index 0000000000..0055026aa9 Binary files /dev/null and b/.prebuilt/Heltec_v3_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin differ diff --git a/.prebuilt/LilyGo_T3S3_sx1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin b/.prebuilt/LilyGo_T3S3_sx1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin new file mode 100644 index 0000000000..4e6ae902d6 Binary files /dev/null and b/.prebuilt/LilyGo_T3S3_sx1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin differ diff --git a/.prebuilt/LilyGo_T3S3_sx1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin b/.prebuilt/LilyGo_T3S3_sx1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin new file mode 100644 index 0000000000..dcfd04a764 Binary files /dev/null and b/.prebuilt/LilyGo_T3S3_sx1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin differ diff --git a/.prebuilt/LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin b/.prebuilt/LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin new file mode 100644 index 0000000000..3c88eb06af Binary files /dev/null and b/.prebuilt/LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin differ diff --git a/.prebuilt/LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin b/.prebuilt/LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin new file mode 100644 index 0000000000..b67bbd505d Binary files /dev/null and b/.prebuilt/LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin differ diff --git a/.prebuilt/RAK_3112_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin b/.prebuilt/RAK_3112_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin new file mode 100644 index 0000000000..4c4d7e7d47 Binary files /dev/null and b/.prebuilt/RAK_3112_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin differ diff --git a/.prebuilt/RAK_3112_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin b/.prebuilt/RAK_3112_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin new file mode 100644 index 0000000000..cfbb05ee10 Binary files /dev/null and b/.prebuilt/RAK_3112_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin differ diff --git a/.prebuilt/Station_G2_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin b/.prebuilt/Station_G2_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin new file mode 100644 index 0000000000..048d7fc418 Binary files /dev/null and b/.prebuilt/Station_G2_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin differ diff --git a/.prebuilt/Station_G2_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin b/.prebuilt/Station_G2_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin new file mode 100644 index 0000000000..ef3fa70cce Binary files /dev/null and b/.prebuilt/Station_G2_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin differ diff --git a/.prebuilt/T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin b/.prebuilt/T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin new file mode 100644 index 0000000000..49599c657b Binary files /dev/null and b/.prebuilt/T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin differ diff --git a/.prebuilt/T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin b/.prebuilt/T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin new file mode 100644 index 0000000000..b52189f99d Binary files /dev/null and b/.prebuilt/T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin differ diff --git a/.prebuilt/Tbeam_SX1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin b/.prebuilt/Tbeam_SX1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin new file mode 100644 index 0000000000..af445cbd22 Binary files /dev/null and b/.prebuilt/Tbeam_SX1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin differ diff --git a/.prebuilt/Tbeam_SX1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin b/.prebuilt/Tbeam_SX1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin new file mode 100644 index 0000000000..144b2a332d Binary files /dev/null and b/.prebuilt/Tbeam_SX1262_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin differ diff --git a/.prebuilt/Tbeam_SX1276_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin b/.prebuilt/Tbeam_SX1276_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin new file mode 100644 index 0000000000..8ce683ed4c Binary files /dev/null and b/.prebuilt/Tbeam_SX1276_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin differ diff --git a/.prebuilt/Tbeam_SX1276_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin b/.prebuilt/Tbeam_SX1276_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin new file mode 100644 index 0000000000..afda4c08e5 Binary files /dev/null and b/.prebuilt/Tbeam_SX1276_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin differ diff --git a/.prebuilt/Xiao_S3_WIO_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin b/.prebuilt/Xiao_S3_WIO_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin new file mode 100644 index 0000000000..9375d13c65 Binary files /dev/null and b/.prebuilt/Xiao_S3_WIO_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin differ diff --git a/.prebuilt/Xiao_S3_WIO_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin b/.prebuilt/Xiao_S3_WIO_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin new file mode 100644 index 0000000000..1d48b45de7 Binary files /dev/null and b/.prebuilt/Xiao_S3_WIO_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin differ diff --git a/.prebuilt/heltec_v4_expansionkit_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin b/.prebuilt/heltec_v4_expansionkit_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin new file mode 100644 index 0000000000..3fc1175e49 Binary files /dev/null and b/.prebuilt/heltec_v4_expansionkit_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin differ diff --git a/.prebuilt/heltec_v4_expansionkit_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin b/.prebuilt/heltec_v4_expansionkit_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin new file mode 100644 index 0000000000..53697ff780 Binary files /dev/null and b/.prebuilt/heltec_v4_expansionkit_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin differ diff --git a/.prebuilt/heltec_v4_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin b/.prebuilt/heltec_v4_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin new file mode 100644 index 0000000000..e931a342f2 Binary files /dev/null and b/.prebuilt/heltec_v4_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d-merged.bin differ diff --git a/.prebuilt/heltec_v4_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin b/.prebuilt/heltec_v4_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin new file mode 100644 index 0000000000..7f69534399 Binary files /dev/null and b/.prebuilt/heltec_v4_repeater_observer_mqtt-v1.15.0-dutchmeshcore.nl-ebb7801d.bin differ diff --git a/MQTT_IMPLEMENTATION.md b/MQTT_IMPLEMENTATION.md index c562179df8..8d5e1888f5 100644 --- a/MQTT_IMPLEMENTATION.md +++ b/MQTT_IMPLEMENTATION.md @@ -68,7 +68,7 @@ get mqtt.status **That's it!** The device will now: - Connect to WiFi automatically - Start uplinking mesh packets to configured MQTT brokers -- By default, publish to Let's Mesh Analyzer US (slot 1) and EU (slot 2) +- By default, publish to the DutchMeshCore presets: `dutchmeshcore-1` in slot 1 and `dutchmeshcore-2` in slot 2 - Use device name as MQTT origin (set automatically) --- @@ -108,13 +108,15 @@ The MQTT bridge uses a slot-based architecture with up to 6 concurrent connectio | `chimesh` | wss://mqtt.chimesh.org:443 | JWT (Ed25519) | WSS | | `meshat.se` | mqtts://mqtt.meshat.se:8883 | Username/password (fixed in firmware) | MQTT over TLS | | `eastidahomesh` | wss://broker.eastidahomesh.net:443 | None | WSS | +| `dutchmeshcore-1` | wss://collector1.dutchmeshcore.nl:443 | JWT (Ed25519) | WSS | +| `dutchmeshcore-2` | wss://collector2.dutchmeshcore.nl:443 | JWT (Ed25519) | WSS | | `coloradomesh` | wss://mqtt.meshcore.coloradomesh.org:1883 | JWT (Ed25519) | WSS | | `custom` | User-configured | Username/Password | MQTT or WSS | | `none` | (disabled) | — | — | **Default Configuration:** -- Slot 1: `analyzer-us` -- Slot 2: `analyzer-eu` +- Slot 1: `dutchmeshcore-1` (DutchMeshCore preset) +- Slot 2: `dutchmeshcore-2` (DutchMeshCore preset) - Slots 3-6: `none` **Memory Limits:** @@ -214,8 +216,8 @@ The MQTT bridge comes with the following defaults for fresh installs: - **RX Packets**: Enabled (uplink received packets) - **TX Packets**: `advert` by default (uplink this node's own adverts; set to `on` for all TX or `off` to disable) - **Status Interval**: 5 minutes (300000 ms) -- **Slot 1**: `analyzer-us` -- **Slot 2**: `analyzer-eu` +- **Slot 1**: `dutchmeshcore-1` (DutchMeshCore preset) +- **Slot 2**: `dutchmeshcore-2` (DutchMeshCore preset) - **Slots 3-6**: `none` (disabled) - **WiFi SSID**: (blank — must be configured) - **WiFi Password**: (blank — must be configured) @@ -255,6 +257,8 @@ Each slot (1-6) supports the following commands: - `set mqttN.preset chimesh` - Set slot N to ChicagolandMesh - `set mqttN.preset meshat.se` - Set slot N to Meshat.se - `set mqttN.preset eastidahomesh` - Set slot N to EastIdahoMesh (WSS/TLS, no auth; packets on `meshcore/{IATA}/{PUBLIC_KEY}/packets`) +- `set mqttN.preset dutchmeshcore-1` - Set slot N to DutchMeshcore-1 +- `set mqttN.preset dutchmeshcore-2` - Set slot N to DutchMeshcore-2 - `set mqttN.preset coloradomesh` - Set slot N to ColoradoMesh - `set mqttN.preset custom` - Set slot N to custom broker (configure server/port/username/password) - `set mqttN.preset none` - Disable slot N @@ -627,8 +631,8 @@ set repeat off ### Step 6: Verify Slot Configuration ``` -get mqtt1.preset # Should show: analyzer-us -get mqtt2.preset # Should show: analyzer-eu +get mqtt1.preset # Should show: dutchmeshcore-1 +get mqtt2.preset # Should show: dutchmeshcore-2 get mqtt3.preset # Should show: none ``` diff --git a/boards/heltec_t1.json b/boards/heltec_t1.json new file mode 100644 index 0000000000..53bfc79a46 --- /dev/null +++ b/boards/heltec_t1.json @@ -0,0 +1,61 @@ +{ + "build": { + "arduino": { + "ldscript": "nrf52840_s140_v6.ld" + }, + "core": "nRF5", + "cpu": "cortex-m4", + "extra_flags": "-DNRF52840_XXAA", + "f_cpu": "64000000L", + "hwids": [ + ["0x239A","0x8029"], + ["0x239A","0x0029"], + ["0x239A","0x002A"], + ["0x239A","0x802A"] + ], + "usb_product": "HT-n5262T1", + "mcu": "nrf52840", + "variant": "heltec_t1", + "bsp": { + "name": "adafruit" + }, + "softdevice": { + "sd_flags": "-DS140", + "sd_name": "s140", + "sd_version": "6.1.1", + "sd_fwid": "0x00B6" + }, + "bootloader": { + "settings_addr": "0xFF000" + } + }, + "connectivity": [ + "bluetooth" + ], + "debug": { + "jlink_device": "nRF52840_xxAA", + "svd_path": "nrf52840.svd", + "openocd_target": "nrf52.cfg" + }, + "frameworks": [ + "arduino" + ], + "name": "Heltec Mesh Node T1 Board", + "upload": { + "maximum_ram_size": 235520, + "maximum_size": 815104, + "speed": 115200, + "protocol": "nrfutil", + "protocols": [ + "jlink", + "nrfjprog", + "nrfutil", + "stlink" + ], + "use_1200bps_touch": true, + "require_upload_port": true, + "wait_for_upload_port": true + }, + "url": "https://heltec.org/", + "vendor": "Heltec" +} diff --git a/boards/lilygo_t_impulse_plus_nrf52840.json b/boards/lilygo_t_impulse_plus_nrf52840.json new file mode 100644 index 0000000000..bbe031cde1 --- /dev/null +++ b/boards/lilygo_t_impulse_plus_nrf52840.json @@ -0,0 +1,64 @@ +{ + "build": { + "arduino":{ + "ldscript": "nrf52840_s140_v6.ld" + }, + "core": "nRF5", + "cpu": "cortex-m4", + "extra_flags": "-DARDUINO_NRF52840_T_IMPULSE_PLUS -DNRF52840_XXAA", + "f_cpu": "64000000L", + "hwids": [ + [ + "0x239A", + "0x8029" + ] + ], + "usb_product": "T-Impulse-Plus-nRF52840", + "mcu": "nrf52840", + "variant": "t_impulse_plus_nrf52840", + "bsp": { + "name": "adafruit" + }, + "softdevice": { + "sd_flags": "-DS140", + "sd_name": "s140", + "sd_version": "6.1.1", + "sd_fwid": "0x00B6" + }, + "bootloader": { + "settings_addr": "0xFF000" + } + }, + "connectivity": [ + "bluetooth" + ], + "debug": { + "jlink_device": "nRF52840_xxAA", + "onboard_tools": [ + "jlink" + ], + "svd_path": "nrf52840.svd" + }, + "frameworks": [ + "arduino" + ], + "name": "Lilygo T-Impulse-Plus-nRF52840", + "upload": { + "maximum_ram_size": 248832, + "maximum_size": 815104, + "require_upload_port": true, + "speed": 115200, + "protocol": "nrfutil", + "protocols": [ + "jlink", + "nrfjprog", + "stlink", + "cmsis-dap", + "blackmagic" + ], + "use_1200bps_touch": true, + "wait_for_upload_port": true + }, + "url": "https://www.lilygo.cc/", + "vendor": "Lilygo" +} diff --git a/boards/station-g3-esp32.json b/boards/station-g3-esp32.json new file mode 100644 index 0000000000..abfe5eced9 --- /dev/null +++ b/boards/station-g3-esp32.json @@ -0,0 +1,43 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32s3_out.ld", + "memory_type": "qio_opi" + }, + "core": "esp32", + "extra_flags": [ + "-DBOARD_HAS_PSRAM", + "-DARDUINO_USB_CDC_ON_BOOT=1", + "-DARDUINO_USB_MODE=0", + "-DARDUINO_RUNNING_CORE=1", + "-DARDUINO_EVENT_RUNNING_CORE=0" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "hwids": [["0x303A", "0x1001"]], + "mcu": "esp32s3", + "variant": "esp32s3" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "default_tool": "esp-builtin", + "onboard_tools": ["esp-builtin"], + "openocd_target": "esp32s3.cfg" + }, + "frameworks": ["arduino", "espidf"], + "name": "Station G3 ESP32", + "upload": { + "flash_size": "16MB", + "maximum_ram_size": 327680, + "maximum_size": 16777216, + "use_1200bps_touch": true, + "wait_for_upload_port": true, + "require_upload_port": true, + "speed": 921600 + }, + "url": "https://wiki.bqvoy.com/en/devkits/station-g3", + "vendor": "BQ Consulting" +} diff --git a/build.sh b/build.sh index 0810682ad7..668971daa6 100755 --- a/build.sh +++ b/build.sh @@ -17,6 +17,8 @@ Commands: build-companion-firmwares: Build all companion firmwares for all build targets. build-repeater-firmwares: Build all repeater firmwares for all build targets. build-room-server-firmwares: Build all chat room server firmwares for all build targets. + build-repeater-mqtt-firmwares: Build all MQTT repeater observer firmwares for all build targets. + build-room-server-mqtt-firmwares: Build all MQTT room server observer firmwares for all build targets. Examples: Build firmware for the "RAK_4631_repeater" device target @@ -158,12 +160,12 @@ build_firmware() { python3 bin/uf2conv/uf2conv.py .pio/build/$1/firmware.hex -c -o .pio/build/$1/firmware.uf2 -f 0xADA52840 >/dev/null 2>&1 || true fi - # Copy any produced artifacts to out folder. - cp .pio/build/$1/firmware.bin out/${FIRMWARE_FILENAME}.bin 2>/dev/null || true - cp .pio/build/$1/firmware-merged.bin out/${FIRMWARE_FILENAME}-merged.bin 2>/dev/null || true - cp .pio/build/$1/firmware.hex out/${FIRMWARE_FILENAME}.hex 2>/dev/null || true - cp .pio/build/$1/firmware.uf2 out/${FIRMWARE_FILENAME}.uf2 2>/dev/null || true - cp .pio/build/$1/firmware.zip out/${FIRMWARE_FILENAME}.zip 2>/dev/null || true + # Copy any produced artifacts to output folder. + cp .pio/build/$1/firmware.bin "$OUT_DIR/${FIRMWARE_FILENAME}.bin" 2>/dev/null || true + cp .pio/build/$1/firmware-merged.bin "$OUT_DIR/${FIRMWARE_FILENAME}-merged.bin" 2>/dev/null || true + cp .pio/build/$1/firmware.hex "$OUT_DIR/${FIRMWARE_FILENAME}.hex" 2>/dev/null || true + cp .pio/build/$1/firmware.uf2 "$OUT_DIR/${FIRMWARE_FILENAME}.uf2" 2>/dev/null || true + cp .pio/build/$1/firmware.zip "$OUT_DIR/${FIRMWARE_FILENAME}.zip" 2>/dev/null || true } @@ -229,15 +231,28 @@ build_room_server_firmwares() { } +build_repeater_mqtt_firmwares() { + # build all MQTT repeater observer firmwares + build_all_firmwares_by_suffix "_repeater_observer_mqtt" +} + +build_room_server_mqtt_firmwares() { + # build all MQTT room server observer firmwares + build_all_firmwares_by_suffix "_room_server_observer_mqtt" +} + build_firmwares() { build_companion_firmwares build_repeater_firmwares build_room_server_firmwares } +# output directory — override with OUT_DIR env var (e.g. OUT_DIR=.prebuilt) +OUT_DIR="${OUT_DIR:-out}" + # clean build dir -rm -rf out -mkdir -p out +rm -rf "$OUT_DIR" +mkdir -p "$OUT_DIR" # handle script args if [[ $1 == "build-firmware" ]]; then @@ -265,4 +280,8 @@ elif [[ $1 == "build-repeater-firmwares" ]]; then build_repeater_firmwares elif [[ $1 == "build-room-server-firmwares" ]]; then build_room_server_firmwares +elif [[ $1 == "build-repeater-mqtt-firmwares" ]]; then + build_repeater_mqtt_firmwares +elif [[ $1 == "build-room-server-mqtt-firmwares" ]]; then + build_room_server_mqtt_firmwares fi diff --git a/docs/_stylesheets/extra.css b/docs/_stylesheets/extra.css index f9f75b120f..0262ffd0aa 100644 --- a/docs/_stylesheets/extra.css +++ b/docs/_stylesheets/extra.css @@ -1,8 +1,209 @@ :root { - --md-primary-fg-color: #1F2937; - --md-primary-fg-color--light: #1F2937; - --md-primary-fg-color--dark: #1F2937; - --md-accent-fg-color: #1F2937; + --dmc-bg: #060709; + --dmc-surface: rgba(14, 16, 20, .94); + --dmc-surface-2: rgba(22, 25, 31, .88); + --dmc-surface-3: rgba(255, 255, 255, .075); + --dmc-border: rgba(255, 255, 255, .14); + --dmc-accent: #1976e8; + --dmc-accent-2: #df2020; + --dmc-accent-rgb: 25, 118, 232; + --dmc-accent-2-rgb: 223, 32, 32; + --dmc-text: #e9edf4; + --dmc-muted: #b9c1cf; + --dmc-heading: #ffffff; + --dmc-panel-bg: + linear-gradient(135deg, rgba(255, 255, 255, .07), transparent 34%), + linear-gradient(180deg, rgba(22, 24, 29, .94), rgba(6, 7, 10, .95)); + --dmc-panel-soft-bg: + linear-gradient(135deg, rgba(255, 255, 255, .055), transparent 36%), + rgba(8, 10, 13, .80); + --dmc-panel-shadow: + inset 0 0 0 1px rgba(255, 255, 255, .035), + 0 18px 40px rgba(0, 0, 0, .28); + + --md-primary-fg-color: #030406; + --md-primary-fg-color--light: #16191f; + --md-primary-fg-color--dark: #030406; + --md-accent-fg-color: #1976e8; + --md-default-bg-color: #060709; + --md-default-fg-color: #e9edf4; + --md-default-fg-color--light: #b9c1cf; + --md-default-fg-color--lighter: rgba(185, 193, 207, .68); + --md-default-fg-color--lightest: rgba(185, 193, 207, .34); + --md-typeset-a-color: #74adff; + --md-code-bg-color: rgba(0, 0, 0, .34); + --md-code-fg-color: #e9edf4; + --md-code-hl-color: rgba(25, 118, 232, .18); + --md-border-color: var(--dmc-border); +} + +body { + background: + radial-gradient(circle at 18% 18%, rgba(var(--dmc-accent-2-rgb), .15), transparent 28%), + radial-gradient(circle at 82% 28%, rgba(var(--dmc-accent-rgb), .14), transparent 30%), + linear-gradient(180deg, #090b10 0%, #06070a 48%, #030304 100%); + color: var(--dmc-text); +} + +body::before { + content: ""; + pointer-events: none; + opacity: .28; + z-index: -1; + background-image: + linear-gradient(rgba(255, 255, 255, .035) 1px, transparent 1px), + linear-gradient(90deg, rgba(255, 255, 255, .025) 1px, transparent 1px); + background-size: 42px 42px; + position: fixed; + inset: 0; + mask-image: radial-gradient(circle, #000, transparent 82%); +} + +.md-header, +.md-tabs { + background: rgba(3, 4, 6, .88); + backdrop-filter: blur(16px); + box-shadow: 0 14px 35px rgba(0, 0, 0, .42); +} + +.md-header__title, +.md-header__topic, +.md-source__repository { + color: var(--dmc-heading); + letter-spacing: .04em; +} + +.md-logo img { + border-radius: 50%; + filter: drop-shadow(0 0 20px rgba(var(--dmc-accent-rgb), .25)); +} + +.md-search__form { + background: rgba(255, 255, 255, .055); + border: 1px solid var(--dmc-border); + border-radius: 8px; +} + +.md-search__form:hover, +.md-search__form:focus-within { + background: rgba(255, 255, 255, .075); + border-color: rgba(var(--dmc-accent-rgb), .55); +} + +.md-content__inner { + color: var(--dmc-text); +} + +.md-nav__title, +.md-nav__item .md-nav__link--active, +.md-nav__link[for]:focus, +.md-nav__link[for]:hover, +.md-nav__link:focus, +.md-nav__link:hover { + color: #ffffff; +} + +.md-nav__link--active { + background: linear-gradient(135deg, rgba(var(--dmc-accent-2-rgb), .35), rgba(var(--dmc-accent-rgb), .35)); + border-radius: 6px; +} + +.md-nav__link { + color: var(--dmc-muted); + transition: background .15s, color .15s; +} + +.md-nav__link:hover { + background: rgba(255, 255, 255, .055); + border-radius: 6px; +} + +.md-typeset { + color: var(--dmc-text); +} + +.md-typeset h1, +.md-typeset h2, +.md-typeset h3, +.md-typeset h4 { + color: var(--dmc-heading); + letter-spacing: 0; +} + +.md-typeset h1 { + font-weight: 800; +} + +.md-typeset h2 { + border-bottom: 1px solid var(--dmc-border); + padding-bottom: .35rem; +} + +.md-typeset a { + color: #74adff; + text-decoration: underline; + text-decoration-color: rgba(var(--dmc-accent-rgb), .45); + text-underline-offset: .14em; +} + +.md-typeset a:hover { + color: #ffffff; +} + +.md-typeset code, +.md-typeset pre { + border: 1px solid var(--dmc-border); +} + +.md-typeset pre > code { + background: + linear-gradient(135deg, rgba(255, 255, 255, .045), transparent 36%), + rgba(3, 4, 6, .88); +} + +.md-typeset code { + border-radius: 4px; +} + +.md-typeset table:not([class]) { + background: var(--dmc-panel-soft-bg); + border: 1px solid var(--dmc-border); + border-radius: 8px; + overflow: hidden; +} + +.md-typeset table:not([class]) th { + background: rgba(255, 255, 255, .075); + color: var(--dmc-heading); +} + +.md-typeset table:not([class]) td { + border-top-color: var(--dmc-border); +} + +.md-typeset blockquote { + background: rgba(var(--dmc-accent-rgb), .08); + border-left-color: var(--dmc-accent); + border-radius: 0 8px 8px 0; + color: var(--dmc-text); + padding: .7rem 1rem; +} + +.md-content__button { + color: var(--dmc-muted); +} + +.md-content__button:hover { + color: #ffffff; +} + +.md-footer { + background: rgba(3, 4, 6, .88); + border-top: 1px solid var(--dmc-border); +} + +.md-footer-meta { + background: transparent; } /* hide git repo version */ diff --git a/docs/cli_commands.md b/docs/cli_commands.md index c54038615a..f50914ebbe 100644 --- a/docs/cli_commands.md +++ b/docs/cli_commands.md @@ -19,6 +19,8 @@ This document provides an overview of CLI commands that can be sent to MeshCore - [GPS](#gps-when-gps-support-is-compiled-in) - [Sensors](#sensors-when-sensor-support-is-compiled-in) - [Bridge](#bridge-when-bridge-support-is-compiled-in) + - [MQTT Observer Firmware](#mqtt-observer-firmware-when-mqtt-bridge-support-is-compiled-in) + - [SNMP](#snmp-when-snmp-support-is-compiled-in) --- @@ -1034,6 +1036,300 @@ region save --- +### MQTT Observer Firmware (When MQTT bridge support is compiled in) + +MQTT observer builds add WiFi connectivity and MQTT packet uplinking to repeater and room server firmware. + +#### Quick first-time setup +**Usage:** +```bash +set radio 910.525,62.5,7,5 +set tx 22 +set name MyObserver +set mqtt.iata SEA +set wifi.ssid YourWiFiNetwork +set wifi.pwd YourWiFiPassword +reboot +``` + +**Optional receive-only observer:** +```bash +set repeat off +``` + +**Verify:** +```bash +get bridge.enabled +get mqtt.rx +get mqtt.tx +get mqtt.origin +get mqtt.iata +get mqtt1.preset +get mqtt2.preset +get mqtt.status +get wifi.status +``` + +--- + +#### View available MQTT presets +**Usage:** +- `get mqtt.presets` +- `get mqtt.presets ` + +**Parameters:** +- `start`: Optional index returned as `next:` when the preset list is paginated + +**Available presets include:** `analyzer-us`, `analyzer-eu`, `meshmapper`, `meshrank`, `waev`, `meshomatic`, `cascadiamesh`, `tennmesh`, `nashmesh`, `chimesh`, `meshat.se`, `eastidahomesh`, `dutchmeshcore-1`, `dutchmeshcore-2`, `coloradomesh`, `custom`, `none` + +--- + +#### View or change an MQTT slot preset +**Usage:** +- `get mqttN.preset` +- `set mqttN.preset ` + +**Parameters:** +- `N`: Slot number (`1`-`6`) +- `preset`: Preset name, such as `dutchmeshcore-1`, `dutchmeshcore-2`, `meshmapper`, `meshrank`, `custom`, or `none` + +**DutchMeshCore presets:** +- `set mqttN.preset dutchmeshcore-1`: Use `wss://collector1.dutchmeshcore.nl:443/mqtt` +- `set mqttN.preset dutchmeshcore-2`: Use `wss://collector2.dutchmeshcore.nl:443/mqtt` + +**Default for this firmware:** Slot 1 and slot 2 are DutchMeshCore presets. Slot 1 is `dutchmeshcore-1`, slot 2 is `dutchmeshcore-2`, and slots 3-6 are `none`. + +--- + +#### View or change custom MQTT slot settings +**Usage:** +- `get mqttN.server` +- `set mqttN.server ` +- `get mqttN.port` +- `set mqttN.port ` +- `get mqttN.username` +- `set mqttN.username ` +- `get mqttN.password` +- `set mqttN.password ` +- `get mqttN.token` +- `set mqttN.token ` +- `get mqttN.topic` +- `set mqttN.topic