Skip to content

Loading Page ​

The loading page is displayed when the display starts up and shows the process of connecting to Home Assistant and synchronizing data. The code responsible for this page is located in the loading_page.yaml file. It's designed to improve user experience so users don't see empty widgets and placeholders during connection and synchronization with Home Assistant.

Functionality Overview ​

Main Tasks: ​

  • Display Home Assistant API connection status
  • Visualize data synchronization process
  • Smooth transition to main interface
  • Inform user about current system state

Visual Elements: ​

  • Home Assistant logo (top of screen)
  • Connection indicator with spinner
  • Synchronization progress bar
  • ESPHome logo (bottom of screen)

Component Structure ​

Main Container ​

yaml
- button:
    id: loading_page
    bg_color: color_slate_blue_gray
    width: 100%
    height: 100%
  • Type: Full-screen button container
  • Background color: color_slate_blue_gray
  • Size: 100% of screen
  • Purpose: Foundation for all loading elements

NOTE

Will be changed to obj to prevent color flashing when pressed

yaml
- image:
    y: 30
    align: TOP_MID
    src: ha_img
  • Offset: 30px from top
  • Position: Top of screen, centered
  • Source: ha_img (must be defined in image section)

API Connection Block ​

yaml
- obj:
    id: boot_homeassistant
    y: 180
    width: 300
    height: 100
    widgets:
      - label:
          id: boot_homeassistant_label
          text: "Connecting to API..."
      - spinner:
          id: boot_homeassistant_spiner
          spin_time: 2s
          arc_length: 60deg

Components:

  • Text label: Connection status
  • Spinner: Animated loading indicator
  • Dimensions: 300x100 px
  • Position: Center of screen

Synchronization Block ​

yaml
- obj:
    id: boot_synchronization
    hidden: true
    widgets:
      - label:
          id: boot_synchronization_label
          text: "Synchronization..."
      - bar:
          id: boot_synchronization_bar
          min_value: 0
          max_value: 100
          animated: true

Characteristics:

  • Initially hidden: hidden: true
  • Progress bar: From 0 to 100%
  • Animation: Smooth filling
  • Colors: color_steel_blue / color_misty_blue

Working Logic ​

Global Variables ​

yaml
globals:
  - id: ha_connected
    type: bool
    initial_value: 'false'
  • Purpose: Track connection state
  • Type: Boolean value
  • Initial value: false

Control Scripts ​

1️⃣ Boot Status Check ​

yaml
- id: check_boot_status
  then:
    - lambda: |-
        if (id(ha_connected)) {
          lv_obj_add_flag(id(boot_homeassistant), LV_OBJ_FLAG_HIDDEN);
          lv_obj_clear_flag(id(boot_synchronization), LV_OBJ_FLAG_HIDDEN);
          id(start_sync_animation).execute();
        }

Functions:

  • Hides connection block
  • Shows synchronization block
  • Starts progress animation

2️⃣ Synchronization Animation ​

yaml
- id: start_sync_animation
  then:
    - delay: 1s
    - lvgl.bar.update:
        id: boot_synchronization_bar
        value: 50
    - delay: 1s
    - lvgl.bar.update:
        id: boot_synchronization_bar
        value: 100
    - delay: 500ms
    - lvgl.widget.hide: loading_page

Stages:

  1. 1 second delay
  2. 50% progress
  3. 1 second delay
  4. 100% progress
  5. 500ms delay
  6. Hide loading page

3️⃣ Connection Handler ​

yaml
- id: on_ha_connected
  then:
    - lambda: |-
        if (!id(ha_connected)) {
          id(ha_connected) = true;
          lv_label_set_text(id(boot_homeassistant_label), "Home Assistant Connected!");
          lv_obj_add_flag(id(boot_homeassistant_spiner), LV_OBJ_FLAG_HIDDEN);
          id(check_boot_status).execute();
        }

Actions:

  • Sets connection flag
  • Changes text to "Connected!"
  • Hides spinner
  • Triggers status check

API Events ​

Client Connected ​

yaml
api:
  on_client_connected:
    - lambda: |-
        if (0 == client_info.find("Home Assistant ")) {
          id(on_ha_connected).execute();
        }
  • Trigger: API client connection
  • Condition: Client contains "Home Assistant "
  • Action: Execute connection script

Client Disconnected ​

yaml
on_client_disconnected:
  - lambda: |-
      if (0 == client_info.find("Home Assistant ")) {
        id(ha_connected) = false;
      }
  • Trigger: API client disconnection
  • Action: Reset connection flag

Styling ​

Color Scheme ​

ElementColorPurpose
Backgroundcolor_slate_blue_grayMain background
Textcolor_misty_blueText elements
Progress (background)color_steel_blueInactive bar part
Progress (indicator)color_misty_blueActive bar part
Spinnercolor_steel_blue / color_misty_blueLoading animation

Sizes and Positioning ​

yaml
# Main sizes
loading_page: 100% x 100%          # Full screen
boot_homeassistant: 300px x 100px  # Connection block
boot_synchronization: 300px x 60px # Synchronization block
spinner: 50px x 50px               # Spinner size

# Positions
ha_logo: TOP_MID, y: 30           # HA logo at top
connection_block: TOP_MID, y: 180 # Connection block
sync_block: TOP_MID, y: 180       # Synchronization block
esphome_logo: BOTTOM_MID, y: -30  # ESPHome logo at bottom

Configuration and Customization ​

Changing Animation Timing ​

yaml
# In start_sync_animation script
- delay: 2s  # Increase to 2 seconds
- lvgl.bar.update:
    id: boot_synchronization_bar
    value: 30  # First stage 30%
- delay: 1s
- lvgl.bar.update:
    id: boot_synchronization_bar
    value: 70  # Second stage 70%
- delay: 1s
- lvgl.bar.update:
    id: boot_synchronization_bar
    value: 100  # Completion

Changing Text Messages ​

yaml
# Custom messages
text: "Подключение к серверу..."     # Russian
text: "Conectando al servidor..."    # Spanish
text: "Connexion au serveur..."      # French

Replacing Images ​

yaml
# Adding custom logos
image:
  - file: "img/loading/custom_logo.png"
    id: custom_logo
    resize: 100x50

# Using in loading page
- image:
    src: custom_logo
    align: TOP_MID

Implementation Tips ​

Performance Optimization ​

  • Use optimized image sizes
  • Minimize animation complexity
  • Cache frequently used elements

User Experience ​

  • Keep loading times reasonable (2-4 seconds)
  • Provide clear status messages
  • Use smooth transitions between states

Error Handling ​

yaml
# Add timeout handling
- delay: 10s
- if:
    condition:
      lambda: 'return !id(ha_connected);'
    then:
      - lvgl.label.update:
          id: boot_homeassistant_label
          text: "Connection timeout. Retrying..."

Conclusion ​

The loading page provides:

  • Professional appearance — polished startup experience
  • User feedback — clear status communication
  • Smooth transitions — seamless interface flow
  • Error resilience — graceful handling of connection issues

Use this structure as a foundation and adapt it to your specific needs while maintaining good user experience principles.