feat: scaffold classic variant with hamburger nav and reused Sensors/Settings/Schedule pages

This commit is contained in:
pyr0ball 2026-07-12 00:39:52 -07:00
parent 2097779949
commit 0a6f6ab2fa
2 changed files with 297 additions and 0 deletions

View file

@ -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

View file

@ -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