Current version: v3.5
A smart touch panel to control Home Assistant using an ESP32-2432S028R (CYD - Cheap Yellow Display).
- Multi-page display: 3 screens with 8-second auto-cycling
- Weather Page: Current conditions with animated weather icon, outdoor temperature, rain, wind, snow, frost, and real-time MΓ©tΓ©o-France alerts (yellow/orange/red vigilance)
- π§οΈ Rain forecast: 9 colored rectangles showing minute-by-minute forecast (0β55 min) with intuitive color coding (empty=dry, light/medium/dark blue = light/moderate/heavy rain)
- Sensors Page: Temperature and humidity from up to 4 zones in a 2x2 grid layout
- Media Page: Now Playing (Artist & Title) with automatic text wrapping and dynamic layout
- Dynamic Pagination: Dots indicator adjusts automatically (2/3/4 dots) based on active pages (Media/Printer hidden when unused)
- Printer Page: Real-time BambuLab status (file, progress, nozzle/bed temps, remaining time)
- Control menu: Touch-activated, 8 configurable buttons to control Home Assistant entities (covers, lights, 3D printer)
- Clean interface without header to maximize button space
- Visual feedback with colored icons (blue = active, grey = inactive)
- Full internationalization (EN/FR/ES) via dedicated language files
- Global header: Device name and date/time (DD/MM HH:MM) on data pages
- Responsive touch interface: Precise detection with XPT2046 calibration
- Secure connection: Encrypted API, password-protected OTA
- Modular architecture: Configuration split into separate files for easy maintenance
- Auto-return: Automatic return to display cycle after 10s menu inactivity
- ESP32-2432S028R (Cheap Yellow Display)
- ESP32 (240 MHz dual-core)
- ILI9342 320x240 TFT display
- XPT2046 touch controller
- Built-in RGB LED
- PWM backlight
cyd_HA/
βββ cyd_ha_refactored.yaml # β
Main file (USE THIS)
βββ cyd_ha/ # π Module subfolder
β βββ substitutions.yaml # βοΈ All user configuration
β βββ common.yaml # π¨ UI resources (fonts, colors, icons)
β βββ hardware.yaml # π§ Hardware config (SPI, touch, outputs)
β βββ sensors.yaml # π Home Assistant sensor integration
β βββ buttons.yaml # π Touch zone definitions
β βββ display_pages.yaml # π₯οΈ UI rendering logic
β βββ i18n/ # π Language packs
β βββ en.yaml
β βββ fr.yaml
β βββ es.yaml
βββ secrets.yaml # π Credentials (shared across ESPHome projects)
βββ secrets.yaml.example # π Secrets template
βββ materialdesignicons-webfont.ttf # π¨ Weather icon font
βββ CHANGELOG.md # π Version history
βββ README.md # π This file
- ESPHome installed
- Working Home Assistant with API enabled
- USB connection to ESP32
Create secrets.yaml (can be shared across all ESPHome projects):
# Global WiFi (shared)
wifi_ssid: "YOUR_SSID"
wifi_password: "YOUR_WIFI_PASSWORD"
# Project-specific secrets (prefixed with "cyd_ha")
cyd_ha_api_encryption_key: "YOUR_API_KEY"
cyd_ha_ota_password: "YOUR_OTA_PASSWORD"
cyd_ha_ap_ssid: "CYD HA Fallback Hotspot"
cyd_ha_ap_password: "CHANGE_ME_12345"All configuration is centralized in this file:
# βββ Device ββββββββββββββββββββββββββββββββββββββββββββββββββ
device_name: cydhapanel
device_friendly_name: CYD HA Panel
# βββ Location ββββββββββββββββββββββββββββββββββββββββββββββββ
location_name: Paris
# βββ Weather βββββββββββββββββββββββββββββββββββββββββββββββββ
weather_entity: weather.paris
rain_chance_entity: sensor.paris_rain_chance
# ... more entities
# βββ Media Player ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
media_player_entity: media_player.example
# βββ Sensor Blocks (up to 4) βββββββββββββββββββββββββββββββββ
sensor_bloc1_temp_entity: sensor.living_room_temperature
sensor_bloc1_hum_entity: sensor.living_room_humidity
sensor_bloc1_icon: hometemperature
# ... repeat for bloc2, bloc3, bloc4 (use sensor.none to disable)
# βββ Menu Buttons ββββββββββββββββββββββββββββββββββββββββββββ
btn1_service: cover.open_cover
btn1_entity: cover.living_room_blinds
# ... configure all 7 buttons# Compile and upload
esphome run cyd_ha_refactored.yamlOr use the helper script:
./esphome-build-upload.sh # OTA upload
./esphome-build-upload.sh -u # USB uploadEdit cyd_ha/common.yaml:
color:
- id: blue
hex: 'F39621' # Change this value (BGR format)- Find icon on Material Design Icons
- Add to
cyd_ha/common.yaml:
image:
- file: mdi:YOUR_ICON
id: my_icon
resize: 40x40
type: BINARYThe UI uses dedicated language packs.
Available packs: en.yaml, fr.yaml, es.yaml
Activate by uncommenting ONE line at the top of cyd_ha/substitutions.yaml:
<<: !include i18n/en.yaml # β English
# <<: !include i18n/fr.yaml
# <<: !include i18n/es.yamlTranslated keys:
- Page titles:
i18n_weather_title,i18n_sensors_title,i18n_printer_title - Menu buttons:
btn1_labeltobtn8_label - Sensor blocks:
sensor_bloc1_labeltosensor_bloc4_label - Rain messages:
i18n_next_rain_prefix,i18n_next_rain_none
- Check
secrets.yaml(correct SSID/password) - 5GHz WiFi is not supported (use 2.4GHz)
- Adjust calibration in
cyd_ha/hardware.yaml:
touchscreen:
calibration:
x_min: 280
x_max: 3860
y_min: 280
y_max: 3860- Verify
entity_idinsubstitutions.yamlmatches Home Assistant entities - Check API connection in Home Assistant
Home Assistant API
β
cyd_ha/sensors.yaml (import entities)
β
cyd_ha/display_pages.yaml (rendering with 8s auto-cycle)
β
ESP32 Display (ILI9342 - 320x240, 90Β° rotation)
Dynamic Pages with auto-cycling (8s):
βββββββββββββββββββββββββββββββββββββββ
β Page 0: Weather β
β - Large animated weather icon β
β - MΓ©tΓ©o-France alerts (π΄π π‘) β
β - Rain forecast: 9 colored bars β
β - "Next rain: X min" text β
β - Temp/Rain/Wind/Snow/Frost grid β
βββββββββββββββββββββββββββββββββββββββ€
β Page 1: Home Sensors β
β - 4 blocks in 2x2 grid β
β - Each: icon + label + temp + hum β
βββββββββββββββββββββββββββββββββββββββ€
β Page 2: BambuLab Printer β
β - Scrolling filename β
β - Progress bar with percentage β
β - Status / Time remaining / End β
β - Nozzle/Bed temperatures β
βββββββββββββββββββββββββββββββββββββββ
Touch anywhere β 8-button menu (10s timeout)
See CHANGELOG.md for version history.
To improve this project:
- Test on your hardware
- Report bugs via issues
- Suggest improvements
- Share your custom configurations
This project is licensed under the GNU General Public License v2.0. You are free to use, modify, and distribute this software under the terms of the GPL v2.
This project was inspired by the excellent tutorial from Aguacatec:
Made with β€οΈ for the Home Assistant community