From 749d1a9736a2e465b974652056af4ead6b66bc1e Mon Sep 17 00:00:00 2001 From: Brandon Harvey <8107750+bharvey88@users.noreply.github.com> Date: Wed, 10 Jun 2026 10:16:31 -0500 Subject: [PATCH 1/4] Add HTTP request OTA update system from R_PRO-1 Port the managed firmware update system from R_PRO-1 to all AIR-1 variants: - Add http_request OTA platform alongside the existing esphome OTA - Add update component pulling the firmware manifest from GitHub Pages - Add safe_mode for recovery from failed updates - Build and publish the BLE variant (firmware-ble) so BLE devices update from their own manifest instead of being converted to the factory firmware --- .github/workflows/build.yml | 3 ++- Integrations/ESPHome/AIR-1.yaml | 13 +++++++++++++ Integrations/ESPHome/AIR-1_BLE.yaml | 13 +++++++++++++ Integrations/ESPHome/AIR-1_Factory.yaml | 13 +++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a97fdfe..cc32322 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,8 @@ jobs: device-name: air-1 yaml-files: | Integrations/ESPHome/AIR-1_Factory.yaml - firmware-names: "1_Factory:firmware" + Integrations/ESPHome/AIR-1_BLE.yaml + firmware-names: "1_Factory:firmware,1_BLE:firmware-ble" core-yaml-path: Integrations/ESPHome/Core.yaml esphome-version: stable # Bypass check if manually triggered with bypass option diff --git a/Integrations/ESPHome/AIR-1.yaml b/Integrations/ESPHome/AIR-1.yaml index 454b4ce..33366e2 100644 --- a/Integrations/ESPHome/AIR-1.yaml +++ b/Integrations/ESPHome/AIR-1.yaml @@ -38,6 +38,19 @@ ota: - platform: esphome id: ota_esphome password: ${ota_password} + - platform: http_request + id: ota_managed + +http_request: + verify_ssl: true + +safe_mode: + +update: + - platform: http_request + id: update_http_request + name: Firmware Update + source: https://apolloautomation.github.io/AIR-1/firmware/manifest.json wifi: ap: diff --git a/Integrations/ESPHome/AIR-1_BLE.yaml b/Integrations/ESPHome/AIR-1_BLE.yaml index 424fd2f..0190710 100644 --- a/Integrations/ESPHome/AIR-1_BLE.yaml +++ b/Integrations/ESPHome/AIR-1_BLE.yaml @@ -35,6 +35,19 @@ ota: - platform: esphome password: ${ota_password} id: ota_esphome + - platform: http_request + id: ota_managed + +http_request: + verify_ssl: true + +safe_mode: + +update: + - platform: http_request + id: update_http_request + name: Firmware Update + source: https://apolloautomation.github.io/AIR-1/firmware-ble/manifest.json bluetooth_proxy: active: true diff --git a/Integrations/ESPHome/AIR-1_Factory.yaml b/Integrations/ESPHome/AIR-1_Factory.yaml index 0133d5c..09eaf1a 100644 --- a/Integrations/ESPHome/AIR-1_Factory.yaml +++ b/Integrations/ESPHome/AIR-1_Factory.yaml @@ -44,6 +44,19 @@ logger: ota: - platform: esphome id: ota_esphome + - platform: http_request + id: ota_managed + +http_request: + verify_ssl: true + +safe_mode: + +update: + - platform: http_request + id: update_http_request + name: Firmware Update + source: https://apolloautomation.github.io/AIR-1/firmware/manifest.json esp32_improv: authorizer: none From eb0ef6cdde0f6547cf7061116f37aa62cc90a47f Mon Sep 17 00:00:00 2001 From: Brandon Harvey <8107750+bharvey88@users.noreply.github.com> Date: Wed, 10 Jun 2026 21:52:55 -0500 Subject: [PATCH 2/4] Check for updates when WiFi connects The http_request update component polls every 6h and the first poll fires before the network is up, so a freshly booted device would not see an available update for 6 hours. Trigger a manifest check as soon as WiFi connects. --- Integrations/ESPHome/AIR-1.yaml | 2 ++ Integrations/ESPHome/AIR-1_BLE.yaml | 2 ++ Integrations/ESPHome/AIR-1_Factory.yaml | 2 ++ 3 files changed, 6 insertions(+) diff --git a/Integrations/ESPHome/AIR-1.yaml b/Integrations/ESPHome/AIR-1.yaml index 33366e2..50bfd86 100644 --- a/Integrations/ESPHome/AIR-1.yaml +++ b/Integrations/ESPHome/AIR-1.yaml @@ -53,6 +53,8 @@ update: source: https://apolloautomation.github.io/AIR-1/firmware/manifest.json wifi: + on_connect: + - component.update: update_http_request ap: ssid: "Apollo AIR1 Hotspot" diff --git a/Integrations/ESPHome/AIR-1_BLE.yaml b/Integrations/ESPHome/AIR-1_BLE.yaml index 0190710..40c5dbc 100644 --- a/Integrations/ESPHome/AIR-1_BLE.yaml +++ b/Integrations/ESPHome/AIR-1_BLE.yaml @@ -56,6 +56,8 @@ esp32_ble_tracker: active: false wifi: + on_connect: + - component.update: update_http_request ap: ssid: "Apollo AIR1 Hotspot" diff --git a/Integrations/ESPHome/AIR-1_Factory.yaml b/Integrations/ESPHome/AIR-1_Factory.yaml index 09eaf1a..42c7ae4 100644 --- a/Integrations/ESPHome/AIR-1_Factory.yaml +++ b/Integrations/ESPHome/AIR-1_Factory.yaml @@ -62,6 +62,8 @@ esp32_improv: authorizer: none wifi: + on_connect: + - component.update: update_http_request ap: ssid: "Apollo AIR1 Hotspot" From 3330a7975b2352ba164d4e48d73db56da0ea6892 Mon Sep 17 00:00:00 2001 From: Brandon Harvey <8107750+bharvey88@users.noreply.github.com> Date: Wed, 10 Jun 2026 21:52:55 -0500 Subject: [PATCH 3/4] Raise min_version to 2025.11.0 to match R_PRO-1's update-system floor --- Integrations/ESPHome/AIR-1.yaml | 2 +- Integrations/ESPHome/AIR-1_BLE.yaml | 2 +- Integrations/ESPHome/AIR-1_Factory.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Integrations/ESPHome/AIR-1.yaml b/Integrations/ESPHome/AIR-1.yaml index 50bfd86..479748c 100644 --- a/Integrations/ESPHome/AIR-1.yaml +++ b/Integrations/ESPHome/AIR-1.yaml @@ -7,7 +7,7 @@ esphome: name: "ApolloAutomation.AIR-1" version: "${version}" - min_version: 2025.2.0 + min_version: 2025.11.0 on_boot: priority: 500 then: diff --git a/Integrations/ESPHome/AIR-1_BLE.yaml b/Integrations/ESPHome/AIR-1_BLE.yaml index 40c5dbc..2f3ae53 100644 --- a/Integrations/ESPHome/AIR-1_BLE.yaml +++ b/Integrations/ESPHome/AIR-1_BLE.yaml @@ -7,7 +7,7 @@ esphome: name: "ApolloAutomation.AIR-1" version: "${version}" - min_version: 2025.2.0 + min_version: 2025.11.0 on_boot: priority: 500 then: diff --git a/Integrations/ESPHome/AIR-1_Factory.yaml b/Integrations/ESPHome/AIR-1_Factory.yaml index 42c7ae4..e3d1025 100644 --- a/Integrations/ESPHome/AIR-1_Factory.yaml +++ b/Integrations/ESPHome/AIR-1_Factory.yaml @@ -7,7 +7,7 @@ esphome: name: "ApolloAutomation.AIR-1" version: "${version}" - min_version: 2025.2.0 + min_version: 2025.11.0 on_boot: - priority: 500 then: From d3cf3923239d92613ad129b75467bd4a837469b5 Mon Sep 17 00:00:00 2001 From: Brandon Harvey <8107750+bharvey88@users.noreply.github.com> Date: Wed, 10 Jun 2026 22:33:54 -0500 Subject: [PATCH 4/4] Release notes: compact formatting for the HA update dialog Home Assistant shows only the first 255 characters of an ESPHome release summary, so boilerplate is expensive and ## headings render oversized in the update dialog: - Render category titles and What's Changed in bold instead of H2 - Drop the star-the-repo footer - Drop the Full Changelog line: it semver-truncates 4-part versions (always links ...X.Y.Z.1) - the shared build workflow now appends a correct compare link instead --- .github/release-drafter.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 8d00377..dc3f169 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -2,6 +2,7 @@ name-template: 'Release v$NEXT_PATCH_VERSION' tag-template: "$RESOLVED_VERSION" change-template: "- #$NUMBER $TITLE @$AUTHOR" sort-direction: ascending +category-template: '**$TITLE**' categories: - title: "🚨 Breaking changes" @@ -26,11 +27,9 @@ include-labels: no-changes-template: '- No changes' +# The shared build workflow appends a Full Changelog compare link to the +# release body (release-drafter cannot render 4-part version tags). template: | - ## What's Changed + **What's Changed** $CHANGES - - **Full Changelog**: https://github.com/ApolloAutomation/AIR-1/compare/$PREVIOUS_TAG...$RESOLVED_VERSION.1 - - Be sure to 🌟 this repository for updates! \ No newline at end of file