From 0a6f6ab2fad3522384d1a6146b28d29e65eea24a Mon Sep 17 00:00:00 2001 From: pyr0ball Date: Sun, 12 Jul 2026 00:39:52 -0700 Subject: [PATCH] feat: scaffold classic variant with hamburger nav and reused Sensors/Settings/Schedule pages --- firmware/components/display-classic.yaml | 245 +++++++++++++++++++++ firmware/waveshare-thermostat-classic.yaml | 52 +++++ 2 files changed, 297 insertions(+) create mode 100644 firmware/components/display-classic.yaml create mode 100644 firmware/waveshare-thermostat-classic.yaml diff --git a/firmware/components/display-classic.yaml b/firmware/components/display-classic.yaml new file mode 100644 index 0000000..3fbb09a --- /dev/null +++ b/firmware/components/display-classic.yaml @@ -0,0 +1,245 @@ +lvgl: + id: lvgl_comp + displays: + - lcd_display + touchscreens: + - touch_gt911 + pages: + - id: page_home + widgets: + - obj: + width: 100% + height: 510px + pad_all: 16 + border_width: 0 + outline_width: 0 + scrollable: false + layout: + type: flex + flex_flow: column + flex_align_cross: center + flex_align_track: center + flex_align_main: space_evenly + widgets: + - label: + id: home_temp_label + text: "-- °C" + text_font: montserrat_48 + - label: + id: home_mode_label + text: "Mode: --" + text_font: montserrat_28 + - label: + align: center + text: "Classic Home layout — coming in Task 3" + text_font: montserrat_16 + - id: page_sensors + widgets: + - obj: + width: 100% + height: 510px + pad_all: 16 + border_width: 0 + outline_width: 0 + scrollable: false + layout: + type: flex + flex_flow: column + flex_align_cross: center + flex_align_track: center + flex_align_main: space_evenly + widgets: + - label: + id: sensors_temp_label + text: "Temperature: -- °C" + text_font: montserrat_28 + - label: + id: sensors_humidity_label + text: "Humidity: -- %" + text_font: montserrat_28 + - label: + id: sensors_pressure_label + text: "Pressure: -- hPa" + text_font: montserrat_28 + - id: page_settings + widgets: + - obj: + width: 100% + height: 510px + pad_all: 16 + border_width: 0 + outline_width: 0 + scrollable: false + layout: + type: flex + flex_flow: column + flex_align_cross: center + flex_align_track: start + flex_align_main: start + widgets: + - label: + id: settings_ip_label + text: "IP: --" + text_font: montserrat_20 + - label: + id: settings_uptime_label + text: "Uptime: -- min" + text_font: montserrat_20 + - label: + text: "Manual relay override (bypasses thermostat):" + text_font: montserrat_16 + - obj: + width: 100% + height: size_content + border_width: 0 + outline_width: 0 + scrollable: false + layout: + type: flex + flex_flow: row_wrap + flex_align_cross: start + flex_align_track: start + flex_align_main: start + widgets: + - checkbox: + text: "Fan" + on_click: + switch.toggle: relay_fan + - checkbox: + text: "Cool 1" + on_click: + switch.toggle: relay_cool1 + - checkbox: + text: "Cool 2" + on_click: + switch.toggle: relay_cool2 + - checkbox: + text: "Heat 1" + on_click: + switch.toggle: relay_heat1 + - checkbox: + text: "Heat 2" + on_click: + switch.toggle: relay_heat2 + - id: page_schedule + widgets: + - obj: + width: 100% + height: 510px + pad_all: 16 + border_width: 0 + outline_width: 0 + scrollable: false + layout: + type: flex + flex_flow: column + flex_align_cross: center + flex_align_track: center + flex_align_main: space_evenly + widgets: + - label: + text: "Preset" + text_font: montserrat_28 + - obj: + width: 100% + height: size_content + border_width: 0 + outline_width: 0 + scrollable: false + layout: + type: flex + flex_flow: row + flex_align_cross: center + flex_align_track: center + flex_align_main: space_evenly + widgets: + - button: + width: 300px + height: 100px + on_click: + climate.control: + id: main_thermostat + preset: home + widgets: + - label: + text: "Home" + text_font: montserrat_28 + - button: + width: 300px + height: 100px + on_click: + climate.control: + id: main_thermostat + preset: away + widgets: + - label: + text: "Away" + text_font: montserrat_28 + - label: + text: "Time-based scheduling runs in Home Assistant, not on this device." + text_font: montserrat_16 + top_layer: + widgets: + - button: + id: hamburger_btn + align: top_left + x: 16 + y: 16 + width: 60px + height: 60px + radius: 8 + on_click: + lvgl.widget.show: nav_menu_overlay + widgets: + - label: + text: "=" + text_font: montserrat_28 + - obj: + id: nav_menu_overlay + hidden: true + align: top_left + x: 16 + y: 90px + width: 280px + height: size_content + pad_all: 8 + radius: 8 + layout: + type: flex + flex_flow: column + flex_align_cross: stretch + flex_align_track: start + flex_align_main: start + widgets: + - button: + on_click: + - lvgl.page.show: page_home + - lvgl.widget.hide: nav_menu_overlay + widgets: + - label: + text: "Home" + text_font: montserrat_20 + - button: + on_click: + - lvgl.page.show: page_sensors + - lvgl.widget.hide: nav_menu_overlay + widgets: + - label: + text: "Sensors" + text_font: montserrat_20 + - button: + on_click: + - lvgl.page.show: page_settings + - lvgl.widget.hide: nav_menu_overlay + widgets: + - label: + text: "Settings" + text_font: montserrat_20 + - button: + on_click: + - lvgl.page.show: page_schedule + - lvgl.widget.hide: nav_menu_overlay + widgets: + - label: + text: "Schedule" + text_font: montserrat_20 diff --git a/firmware/waveshare-thermostat-classic.yaml b/firmware/waveshare-thermostat-classic.yaml new file mode 100644 index 0000000..ee07455 --- /dev/null +++ b/firmware/waveshare-thermostat-classic.yaml @@ -0,0 +1,52 @@ +substitutions: + name: firecrest-classic + friendly_name: "Firecrest Classic" + +esphome: + name: ${name} + friendly_name: ${friendly_name} + platformio_options: + board_build.flash_mode: dio + +esp32: + board: esp32-s3-devkitc-1 + variant: esp32s3 + flash_size: 16MB + framework: + type: esp-idf + sdkconfig_options: + CONFIG_ESP32S3_DATA_CACHE_64KB: y + CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB: y + +psram: + mode: octal + speed: 80MHz + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + ap: + ssid: "${friendly_name} Fallback" + password: "thermostat1234" + +api: + encryption: + key: !secret ha_api_key + +ota: + - platform: esphome + password: !secret ota_password + +logger: + level: DEBUG + hardware_uart: UART0 # this board's "UART" USB-C port (used for flashing) also does log printing + # per Waveshare's docs — ESPHome defaults S3 boards to USB_SERIAL_JTAG, + # a different physical port, which is why logs went silent + +packages: + panel: !include components/panel.yaml + display: !include components/display-classic.yaml + sensors: !include components/sensors.yaml + relays: !include components/relays.yaml + climate: !include components/climate.yaml + diagnostics: !include components/diagnostics.yaml