diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fc3003358d..fdd26aaa76 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -76,9 +76,13 @@ jobs: run: pip install -r requirements.txt - name: Build firmware - run: pio run -e ${{ matrix.environment }} + env: + BUILD_ENV: ${{ matrix.environment }} + run: pio run -e "$BUILD_ENV" - name: Get artifact name from bin filename id: artifact_name + env: + BUILD_ENV: ${{ matrix.environment }} run: | bin=$(ls build_output/release/*.bin 2>/dev/null | head -1) if [ -n "$bin" ]; then @@ -87,7 +91,7 @@ jobs: release_name=$(echo "$base" | sed 's/^[^_]*_[^_]*_//') echo "name=firmware-$release_name" >> $GITHUB_OUTPUT else - echo "name=firmware-${{ matrix.environment }}" >> $GITHUB_OUTPUT + echo "name=firmware-${BUILD_ENV}" >> $GITHUB_OUTPUT fi - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/usermods.yml b/.github/workflows/usermods.yml index 24eda32ece..93305c843d 100644 --- a/.github/workflows/usermods.yml +++ b/.github/workflows/usermods.yml @@ -4,6 +4,9 @@ on: pull_request: paths: - usermods/** + push: + paths: + - usermods/** env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true @@ -12,36 +15,60 @@ jobs: get_usermod_envs: # Only run for pull requests from forks (not from branches within wled/WLED) - if: github.event.pull_request.head.repo.full_name != github.repository + if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository name: Gather Usermods runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 with: - python-version: '3.12' - cache: 'pip' - - name: Install PlatformIO - run: pip install -r requirements.txt - - name: Get default environments + fetch-depth: 0 + - name: Get changed usermod build matrix id: envs + env: + BASE_SHA: ${{ github.event.pull_request.base.sha }} run: | - echo "usermods=$(find usermods/ -name library.json | xargs dirname | xargs -n 1 basename | jq -R | grep -v PWM_fan | grep -v BME68X_v2| grep -v pixels_dice_tray | jq --slurp -c)" >> $GITHUB_OUTPUT + # Usermods whose directories changed in this PR + changed=$(git diff --name-only "$BASE_SHA" HEAD \ + | grep '^usermods/' | cut -d/ -f2 | sort -u || true) + + # Shared override defining the standard build environments + default_ini="usermods/platformio_override.usermods.ini" + + matrix='[]' + for mod in $changed; do + # Skip usermods known to be incompatible + case "$mod" in BME68X_v2|pixels_dice_tray) continue ;; esac + # Only build usermods that ship a library.json + [ -f "usermods/$mod/library.json" ] || continue + + # A usermod may provide its own build environments via a sample override; + # otherwise the standard environments from the shared override are used. + # Either way, the env list comes from the ini file rather than being + # duplicated here. + sample="usermods/$mod/platformio_override.ini.sample" + [ -f "$sample" ] && ini="$sample" || ini="$default_ini" + envs=$(grep -oE '^\[env:[^]]+\]' "$ini" | sed 's/^\[env:\(.*\)\]$/\1/') + + for env in $envs; do + matrix=$(echo "$matrix" | jq --arg u "$mod" --arg e "$env" -c '. + [{usermod: $u, env: $e}]') + done + done + echo "matrix=$matrix" >> $GITHUB_OUTPUT outputs: - usermods: ${{ steps.envs.outputs.usermods }} + matrix: ${{ steps.envs.outputs.matrix }} build: # Only run for pull requests from forks (not from branches within wled/WLED) - if: github.event.pull_request.head.repo.full_name != github.repository - name: Build Enviornments + # Skip when no buildable usermods were found (e.g. only non-library changes) + if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository && needs.get_usermod_envs.outputs.matrix != '[]' + name: Build (${{ matrix.usermod }} / ${{ matrix.env }}) runs-on: ubuntu-latest needs: get_usermod_envs strategy: fail-fast: false matrix: - usermod: ${{ fromJSON(needs.get_usermod_envs.outputs.usermods) }} - environment: [usermods_esp32, usermods_esp32c3, usermods_esp32s2, usermods_esp32s3] + include: ${{ fromJSON(needs.get_usermod_envs.outputs.matrix) }} steps: - uses: actions/checkout@v4 - name: Set up Node.js @@ -57,8 +84,8 @@ jobs: ~/.platformio/.cache ~/.buildcache build_output - key: pio-${{ runner.os }}-${{ matrix.environment }}-${{ hashFiles('platformio.ini', 'pio-scripts/output_bins.py') }}-${{ hashFiles('wled00/**', 'usermods/**') }} - restore-keys: pio-${{ runner.os }}-${{ matrix.environment }}-${{ hashFiles('platformio.ini', 'pio-scripts/output_bins.py') }}- + key: pio-${{ runner.os }}-${{ matrix.env }}-${{ hashFiles('platformio.ini', 'pio-scripts/output_bins.py') }}-${{ hashFiles('wled00/**', 'usermods/**') }} + restore-keys: pio-${{ runner.os }}-${{ matrix.env }}-${{ hashFiles('platformio.ini', 'pio-scripts/output_bins.py') }}- - name: Set up Python uses: actions/setup-python@v5 with: @@ -66,12 +93,23 @@ jobs: cache: 'pip' - name: Install PlatformIO run: pip install -r requirements.txt - - name: Add usermods environment + - name: Configure build environment + env: + USERMOD: ${{ matrix.usermod }} run: | - cp -v usermods/platformio_override.usermods.ini platformio_override.ini - echo >> platformio_override.ini - echo "custom_usermods = ${{ matrix.usermod }}" >> platformio_override.ini + # Use the usermod's own override when it provides one, otherwise apply + # the shared usermods override with this usermod enabled. + sample="usermods/${USERMOD}/platformio_override.ini.sample" + if [ -f "$sample" ]; then + cp -v "$sample" platformio_override.ini + else + cp -v usermods/platformio_override.usermods.ini platformio_override.ini + echo >> platformio_override.ini + echo "custom_usermods = ${USERMOD}" >> platformio_override.ini + fi cat platformio_override.ini - name: Build firmware - run: pio run -e ${{ matrix.environment }} + env: + BUILD_ENV: ${{ matrix.env }} + run: pio run -e "$BUILD_ENV" diff --git a/platformio.ini b/platformio.ini index 637cd46483..d764bc286e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -776,7 +776,7 @@ platform = ${esp32_idf_V4.platform} platform_packages = ${esp32_idf_V4.platform_packages} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} ${esp32_idf_V4.build_flags} -D WLED_RELEASE_NAME=\"ESP32_USERMODS\" - -DTOUCH_CS=9 -DWLED_USE_SD_SPI ;; help a few usermods that require special flags to compile + -DTOUCH_CS=9 lib_deps = ${esp32_idf_V4.lib_deps} monitor_filters = esp32_exception_decoder board_build.flash_mode = dio diff --git a/platformio_override.sample.ini b/platformio_override.sample.ini index 956262b970..484005bad8 100644 --- a/platformio_override.sample.ini +++ b/platformio_override.sample.ini @@ -518,42 +518,15 @@ lib_deps = ${esp8266.lib_deps} # ------------------------------------------------------------------------------ # EleksTube-IPS +# See usermods/EleksTube_IPS/platformio_override.ini.sample # ------------------------------------------------------------------------------ -[env:elekstube_ips] -extends = esp32 ;; use default esp32 platform -board = esp32dev -upload_speed = 921600 -custom_usermods = ${env:esp32dev.custom_usermods} RTC EleksTube_IPS -build_flags = ${common.build_flags} ${esp32.build_flags} -D WLED_DISABLE_BROWNOUT_DET -D WLED_DISABLE_INFRARED - -D DATA_PINS=12 - -D RLYPIN=27 - -D BTNPIN=34 - -D PIXEL_COUNTS=6 - # Display config - -D ST7789_DRIVER - -D TFT_WIDTH=135 - -D TFT_HEIGHT=240 - -D CGRAM_OFFSET - -D TFT_SDA_READ - -D TFT_MOSI=23 - -D TFT_SCLK=18 - -D TFT_DC=25 - -D TFT_RST=26 - -D SPI_FREQUENCY=40000000 - -D USER_SETUP_LOADED -monitor_filters = esp32_exception_decoder # ------------------------------------------------------------------------------ # Usermod examples # ------------------------------------------------------------------------------ -# 433MHz RF remote example for esp32dev -[env:esp32dev_usermod_RF433] -extends = env:esp32dev -custom_usermods = - ${env:esp32dev.custom_usermods} - RF433 +# 433MHz RF remote example: see usermods/usermod_v2_RF433/platformio_override.ini.sample # External usermod from a git repository. # The library's `library.json` must include `"build": {"libArchive": false}`. diff --git a/usermods/AHT10_v2/platformio_override.ini b/usermods/AHT10_v2/platformio_override.ini deleted file mode 100644 index 74dcd659bb..0000000000 --- a/usermods/AHT10_v2/platformio_override.ini +++ /dev/null @@ -1,5 +0,0 @@ -[env:aht10_example] -extends = env:esp32dev -build_flags = - ${common.build_flags} ${esp32.build_flags} - ; -D USERMOD_AHT10_DEBUG ; -- add a debug status to the info modal diff --git a/usermods/DHT/platformio_override.ini b/usermods/DHT/platformio_override.ini.sample similarity index 65% rename from usermods/DHT/platformio_override.ini rename to usermods/DHT/platformio_override.ini.sample index 6ec2fb9992..c991d3d831 100644 --- a/usermods/DHT/platformio_override.ini +++ b/usermods/DHT/platformio_override.ini.sample @@ -8,13 +8,13 @@ ; USERMOD_DHT_MQTT - publish measurements to the MQTT broker ; USERMOD_DHT_STATS - For debug, report delay stats -[env:d1_mini_usermod_dht_C] -extends = env:d1_mini -custom_usermods = ${env:d1_mini.custom_usermods} DHT -build_flags = ${env:d1_mini.build_flags} -D USERMOD_DHT_CELSIUS +[env:esp8266_2m_usermod_dht_C] +extends = env:esp8266_2m +custom_usermods = ${env:esp8266_2m.custom_usermods} DHT +build_flags = ${env:esp8266_2m.build_flags} -D USERMOD_DHT_CELSIUS -[env:custom32_LEDPIN_16_usermod_dht_C] -extends = env:custom32_LEDPIN_16 -custom_usermods = ${env:custom32_LEDPIN_16.custom_usermods} DHT -build_flags = ${env:custom32_LEDPIN_16.build_flags} -D USERMOD_DHT_CELSIUS -D USERMOD_DHT_STATS +[env:esp32dev_LEDPIN_16_usermod_dht_C] +extends = env:esp32dev +custom_usermods = ${env:esp32dev.custom_usermods} DHT +build_flags = ${env:esp32dev.build_flags} -D LEDPIN=16 -D USERMOD_DHT_CELSIUS -D USERMOD_DHT_STATS diff --git a/usermods/INA226_v2/platformio_override.ini b/usermods/INA226_v2/platformio_override.ini deleted file mode 100644 index 9968cbf721..0000000000 --- a/usermods/INA226_v2/platformio_override.ini +++ /dev/null @@ -1,6 +0,0 @@ -[env:ina226_example] -extends = env:esp32dev -custom_usermods = ${env:esp32dev.custom_usermods} INA226_v2 -build_flags = - ${env:esp32dev.build_flags} - ; -D USERMOD_INA226_DEBUG ; -- add a debug status to the info modal diff --git a/usermods/PWM_fan/platformio_override.ini.sample b/usermods/PWM_fan/platformio_override.ini.sample new file mode 100644 index 0000000000..864f87d0a2 --- /dev/null +++ b/usermods/PWM_fan/platformio_override.ini.sample @@ -0,0 +1,38 @@ +# CI sample override file: this usermod has dependencies. +# Based on the CI standard but adds the Temperature usermod too. + +[platformio] +default_envs = usermods_esp32, usermods_esp32c3, usermods_esp32s2, usermods_esp32s3 + +[env:usermods_esp32] +extends = env:esp32dev +custom_usermods = ${usermods.custom_usermods} +board_build.partitions = ${esp32.extreme_partitions} ; We're gonna need a bigger boat +build_flags = ${env:esp32dev.build_flags} -D WLED_DEBUG + + +[env:usermods_esp32c3] +extends = env:esp32c3dev +board = esp32-c3-devkitm-1 +custom_usermods = ${usermods.custom_usermods} +board_build.partitions = ${esp32.extreme_partitions} ; We're gonna need a bigger boat +build_flags = ${env:esp32c3dev.build_flags} -D WLED_DEBUG + + +[env:usermods_esp32s2] +extends = env:lolin_s2_mini +custom_usermods = ${usermods.custom_usermods} +board_build.partitions = ${esp32.extreme_partitions} ; We're gonna need a bigger boat +build_flags = ${env:lolin_s2_mini.build_flags} -D WLED_DEBUG + + +[env:usermods_esp32s3] +extends = env:esp32s3dev_16MB_opi +custom_usermods = ${usermods.custom_usermods} +board_build.partitions = ${esp32.extreme_partitions} ; We're gonna need a bigger boat +build_flags = ${env:esp32s3dev_16MB_opi.build_flags} -D WLED_DEBUG + + +[usermods] +custom_usermods = PWM_fan + Temperature diff --git a/usermods/SN_Photoresistor/platformio_override.ini b/usermods/SN_Photoresistor/platformio_override.ini.sample similarity index 72% rename from usermods/SN_Photoresistor/platformio_override.ini rename to usermods/SN_Photoresistor/platformio_override.ini.sample index 91bc5de2a6..d0588ded5c 100644 --- a/usermods/SN_Photoresistor/platformio_override.ini +++ b/usermods/SN_Photoresistor/platformio_override.ini.sample @@ -1,6 +1,5 @@ ; Options ; ------- -; USERMOD_SN_PHOTORESISTOR - define this to have this user mod included wled00\usermods_list.cpp ; USERMOD_SN_PHOTORESISTOR_MEASUREMENT_INTERVAL - the number of milliseconds between measurements, defaults to 60 seconds ; USERMOD_SN_PHOTORESISTOR_FIRST_MEASUREMENT_AT - the number of milliseconds after boot to take first measurement, defaults to 20 seconds ; USERMOD_SN_PHOTORESISTOR_REFERENCE_VOLTAGE - the voltage supplied to the sensor, defaults to 5v @@ -8,9 +7,10 @@ ; USERMOD_SN_PHOTORESISTOR_RESISTOR_VALUE - the resistor size, defaults to 10000.0 (10K hms) ; USERMOD_SN_PHOTORESISTOR_OFFSET_VALUE - the offset value to report on, defaults to 25 ; -[env:usermod_sn_photoresistor_d1_mini] -extends = env:d1_mini +[env:usermod_sn_photoresistor_esp8266_2m] +extends = env:esp8266_2m +custom_usermods = ${env:esp8266_2m.custom_usermods} SN_Photoresistor build_flags = - ${common.build_flags_esp8266} - -D USERMOD_SN_PHOTORESISTOR -lib_deps = ${env.lib_deps} + ${env:esp8266_2m.build_flags} + -D USERMOD_SN_PHOTORESISTOR_MEASUREMENT_INTERVAL=60 +lib_deps = ${env:esp8266_2m.lib_deps} diff --git a/usermods/TTGO-T-Display/platformio_override.ini b/usermods/TTGO-T-Display/platformio_override.ini deleted file mode 100644 index 7e42d9a54a..0000000000 --- a/usermods/TTGO-T-Display/platformio_override.ini +++ /dev/null @@ -1,8 +0,0 @@ -[env:esp32dev] -build_flags = ${common.build_flags_esp32} -; PIN defines - uncomment and change, if needed: -; -D LEDPIN=2 - -D BTNPIN=35 -; -D IRPIN=4 -; -D RLYPIN=12 -; -D RLYMDE=1 diff --git a/usermods/Temperature/platformio_override.ini b/usermods/Temperature/platformio_override.ini deleted file mode 100644 index a53b5974d9..0000000000 --- a/usermods/Temperature/platformio_override.ini +++ /dev/null @@ -1,5 +0,0 @@ -; Options -; ------- -; USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL - the number of milliseconds between measurements, defaults to 60 seconds -; - diff --git a/usermods/pixels_dice_tray/platformio_override.ini.sample b/usermods/pixels_dice_tray/platformio_override.ini.sample index 6b4fa7768e..f51c2190b3 100644 --- a/usermods/pixels_dice_tray/platformio_override.ini.sample +++ b/usermods/pixels_dice_tray/platformio_override.ini.sample @@ -13,7 +13,7 @@ board_build.partitions = ${esp32.large_partitions} board_build.f_flash = 80000000L board_build.flash_mode = qio monitor_filters = esp32_exception_decoder -build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=T-QT-PRO-8MB +build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=\"T-QT-PRO-8MB_dice\" -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 -D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_MODE=1 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB") @@ -75,7 +75,7 @@ board_build.partitions = ${esp32.large_partitions} board_build.f_flash = 80000000L board_build.flash_mode = qio monitor_filters = esp32_exception_decoder -build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=ESP32-S3_8MB_qspi +build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=\"ESP32-S3_8MB_qspi_dice\" -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 -D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_MODE=1 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB") @@ -105,7 +105,7 @@ lib_deps = ${esp32s3.lib_deps} # https://github.com/wled-dev/WLED/issues/1382 ; [env:esp32dev_dice] ; extends = env:esp32dev -; build_flags = ${common.build_flags} ${esp32.build_flags} -D WLED_RELEASE_NAME=ESP32 +; build_flags = ${common.build_flags} ${esp32.build_flags} -D WLED_RELEASE_NAME=\"ESP32_dice\" ; ; Enable Pixels dice mod ; -D USERMOD_PIXELS_DICE_TRAY ; lib_deps = ${esp32.lib_deps} diff --git a/usermods/platformio_override.usermods.ini b/usermods/platformio_override.usermods.ini index fbcb9d3d0c..ab193520d5 100644 --- a/usermods/platformio_override.usermods.ini +++ b/usermods/platformio_override.usermods.ini @@ -3,36 +3,31 @@ default_envs = usermods_esp32, usermods_esp32c3, usermods_esp32s2, usermods_esp3 [env:usermods_esp32] extends = env:esp32dev -build_flags = ${env:esp32dev.build_flags} - -DTOUCH_CS=9 -D WLED_USE_SD_SPI ;; help a few usermods that require special flags to compile custom_usermods = ${usermods.custom_usermods} board_build.partitions = ${esp32.extreme_partitions} ; We're gonna need a bigger boat +build_flags = ${env:esp32dev.build_flags} -D WLED_DEBUG [env:usermods_esp32c3] extends = env:esp32c3dev -build_flags = ${env:esp32c3dev.build_flags} - -DTOUCH_CS=9 -D WLED_USE_SD_SPI ;; help a few usermods that require special flags to compile board = esp32-c3-devkitm-1 custom_usermods = ${usermods.custom_usermods} board_build.partitions = ${esp32.extreme_partitions} ; We're gonna need a bigger boat +build_flags = ${env:esp32c3dev.build_flags} -D WLED_DEBUG [env:usermods_esp32s2] extends = env:lolin_s2_mini -build_flags = ${env:lolin_s2_mini.build_flags} - -DTOUCH_CS=9 -D WLED_USE_SD_SPI ;; help a few usermods that require special flags to compile custom_usermods = ${usermods.custom_usermods} board_build.partitions = ${esp32.extreme_partitions} ; We're gonna need a bigger boat +build_flags = ${env:lolin_s2_mini.build_flags} -D WLED_DEBUG [env:usermods_esp32s3] extends = env:esp32s3dev_16MB_opi -build_flags = ${env:esp32s3dev_16MB_opi.build_flags} - -DTOUCH_CS=9 -D WLED_USE_SD_SPI ;; help a few usermods that require special flags to compile - -D WLED_DEBUG ;; try to catch broken DEBUG_PRINT statements custom_usermods = ${usermods.custom_usermods} board_build.partitions = ${esp32.extreme_partitions} ; We're gonna need a bigger boat +build_flags = ${env:esp32s3dev_16MB_opi.build_flags} -D WLED_DEBUG diff --git a/usermods/sht/sht.cpp b/usermods/sht/sht.cpp index e1eb9e885f..f7f4be4bab 100644 --- a/usermods/sht/sht.cpp +++ b/usermods/sht/sht.cpp @@ -143,7 +143,13 @@ void ShtUsermod::appendDeviceToMqttDiscoveryMessage(JsonDocument& root) { device[F("ids")] = escapedMac.c_str(); device[F("name")] = serverDescription; device[F("sw")] = versionString; + // AI: below section was generated by an AI + #ifdef ARDUINO_ARCH_ESP32 device[F("mdl")] = ESP.getChipModel(); + #else + device[F("mdl")] = F("ESP8266"); + #endif + // AI: end device[F("mf")] = F("espressif"); } diff --git a/usermods/usermod_v2_four_line_display_ALT/platformio_override.sample.ini b/usermods/usermod_v2_four_line_display_ALT/platformio_override.ini.sample similarity index 50% rename from usermods/usermod_v2_four_line_display_ALT/platformio_override.sample.ini rename to usermods/usermod_v2_four_line_display_ALT/platformio_override.ini.sample index f4fa8c9d8b..ef0e00848f 100644 --- a/usermods/usermod_v2_four_line_display_ALT/platformio_override.sample.ini +++ b/usermods/usermod_v2_four_line_display_ALT/platformio_override.ini.sample @@ -2,10 +2,10 @@ default_envs = esp32dev_fld [env:esp32dev_fld] -extends = env:esp32dev_V4 -custom_usermods = ${env:esp32dev_V4.custom_usermods} four_line_display_ALT +extends = env:esp32dev +custom_usermods = ${env:esp32dev.custom_usermods} four_line_display_ALT build_flags = - ${env:esp32dev_V4.build_flags} + ${env:esp32dev.build_flags} -D FLD_TYPE=SH1106 -D I2CSCLPIN=27 -D I2CSDAPIN=26 diff --git a/usermods/usermod_v2_rotary_encoder_ui_ALT/platformio_override.sample.ini b/usermods/usermod_v2_rotary_encoder_ui_ALT/platformio_override.ini.sample similarity index 58% rename from usermods/usermod_v2_rotary_encoder_ui_ALT/platformio_override.sample.ini rename to usermods/usermod_v2_rotary_encoder_ui_ALT/platformio_override.ini.sample index 2511d2fa38..c943bdbe25 100644 --- a/usermods/usermod_v2_rotary_encoder_ui_ALT/platformio_override.sample.ini +++ b/usermods/usermod_v2_rotary_encoder_ui_ALT/platformio_override.ini.sample @@ -2,10 +2,10 @@ default_envs = esp32dev_re [env:esp32dev_re] -extends = env:esp32dev_V4 -custom_usermods = ${env:esp32dev_V4.custom_usermods} rotary_encoder_ui_ALT +extends = env:esp32dev +custom_usermods = ${env:esp32dev.custom_usermods} rotary_encoder_ui_ALT build_flags = - ${env:esp32dev_V4.build_flags} + ${env:esp32dev.build_flags} -D USERMOD_ROTARY_ENCODER_GPIO=INPUT -D ENCODER_DT_PIN=21 -D ENCODER_CLK_PIN=23