A compact ESP32 touchscreen that lives on your desk and shows real-time home telemetry without opening Home Assistant.
Create a dedicated desktop display providing at-a-glance access to critical smart home information, integrated directly with Home Assistant via ESPHome.
The display shows:
- Current time & date - Always visible clock display
- Real-time ComEd electricity pricing - 5-minute pricing updates
- Indoor office temperature - From SmartThings temperature sensor
- Outdoor "feels like" temperature - Via OpenWeatherMap integration
- HVAC action state - Current heating/cooling status
- Door status monitoring - Front, garage, and patio doors with color-coded status
- Touch-to-toggle backlight - Tap anywhere on screen to toggle display backlight
- Onboard LED control - LED exposed to Home Assistant for automations
Board: ESP32 2.4" TFT Touchscreen (ILI9341 + XPT2046)
You can grab the same board here: https://amzn.to/4cBAFZ0
Disclosure: I'm an Amazon affiliate, so I may earn from qualifying purchases.
- Display: 2.4" TFT LCD (320x240)
- Display Controller: ILI9341
- Touch Controller: XPT2046
- Microcontroller: ESP32-WROOM-32
- Connection: SPI interface
- Backlight: PWM-controlled LED
- Onboard LED: GPIO4
- ESPHome - Device firmware and configuration
- Home Assistant API - Native integration for entity imports
- OpenWeatherMap - Weather data integration
- SmartThings - Temperature sensor
- ComEd 5-minute pricing sensor - Real-time electricity rates
- Binary contact sensors - Door status monitoring
Everything is pulled live from Home Assistant via the native ESPHome API integration.
No MQTT. No polling hacks. Just direct entity imports.
Before you begin, ensure you have:
- Home Assistant installed and running
- ESPHome add-on or dashboard installed in Home Assistant
- The ESP32 board connected via USB or available on your network
- The following Home Assistant entities configured:
sensor.comed_5_minute_price- ComEd pricing sensorsensor.openweathermap_feels_like_temperature- OpenWeatherMap integrationsensor.smartthings_button_temperature- SmartThings temperature sensorclimate.great_room- HVAC/thermostat entity withhvac_actionattributebinary_sensor.front_entrance_contact- Front door sensorbinary_sensor.garage_entrance_contact- Garage door sensorbinary_sensor.patio_entrance_contact- Patio door sensor
Download and place these font files in the same directory as esp-display.yml:
Roboto-Bold.ttfRoboto-Medium.ttfRoboto-Regular.ttf
You can download Roboto fonts from Google Fonts.
Copy the example secrets file and fill in your credentials:
cp secrets.example.yaml secrets.yamlEdit secrets.yaml with your information:
api_encryption_key: "your-32-character-api-key-here"
wifi_ssid: "YourWiFiSSID"
wifi_password: "YourWiFiPassword"
ota_password: "YourOTAPassword"Note: The
secrets.yamlfile is in.gitignoreto protect your credentials from being committed to version control.
If your Home Assistant entity IDs differ from the defaults, edit esp-display.yml and update the entity_id values in the sensor, text_sensor, and binary_sensor sections to match your entities.
- Open the ESPHome dashboard in Home Assistant (Settings β Add-ons β ESPHome β Open Web UI)
- Click "+ NEW DEVICE"
- Click "SKIP" (we'll use the existing configuration)
- Upload the
esp-display.ymlfile - Upload the
secrets.yamlfile - Upload the three Roboto font files
- Click "INSTALL"
- Choose your installation method:
- Plug into this computer (for first-time USB install)
- Wirelessly (if already configured and on network)
# Install/compile and upload via USB
esphome run esp-display.yml
# Or upload wirelessly (after initial USB install)
esphome upload esp-display.ymlAfter successful installation:
- The device should be automatically discovered in Home Assistant
- Go to Settings β Devices & Services β Integrations
- Look for the ESPHome integration notification
- Click "CONFIGURE" and enter the API encryption key from your
secrets.yaml - The device will be added with entities:
light.display_backlight- Control display backlightlight.board_led- Control onboard LEDbutton.restart- Restart the devicesensor.wifi_signal- WiFi signal strengthsensor.uptime- Device uptime in hours
Edit the display: section in esp-display.yml to customize what's shown and how it's arranged. The lambda function uses the display's coordinate system (0,0 is top-left).
By default, the display updates every 5 seconds. Modify the update_interval parameter:
display:
- platform: ili9xxx
update_interval: 10s # Change to desired intervalIf touch input isn't accurate, modify the calibration values in the touchscreen: section:
touchscreen:
- platform: xpt2046
calibration:
x_min: 200 # Adjust these values
x_max: 3900
y_min: 200
y_max: 3900- Verify credentials in
secrets.yaml - Check that your WiFi network is 2.4GHz (ESP32 doesn't support 5GHz)
- Look for the fallback hotspot "Esphome05 Fallback Hotspot" and connect to check logs
- Verify the fonts are in the same directory as the YAML file
- Check ESPHome logs for compilation errors
- Ensure the display pins are correctly configured for your board
- Verify the entity IDs exist in Home Assistant
- Check that the entities are available (not "unavailable" or "unknown")
- Review the ESPHome logs for API connection issues
- Check the calibration values
- Verify interrupt_pin GPIO36 is not being used by another component
- Test with the light toggle functionality
This project is Unlicense licensed - see the LICENSE file for details.
- Built with ESPHome
- Integrated with Home Assistant
- Fonts from Google Fonts
