My little room touchpads started as lighting controllers, but they are slowly turning into proper room controllers.
The hardware is a Guition JC3248W535, a 3.5 inch ESP32-S3 touch display, running ESPHome with LVGL. I printed a desktop enclosure I found on MakerWorld: Guition JC3248W535 3.5 ESP32 Desktop Enclosure.
I have these in every room in the house.
The latest version adds a page for controlling the aircon in that room. The aircon button opens a dedicated LVGL page with the current room temperature, set point, plus and minus controls, and cool, heat, and off buttons. The page times out and returns to the home screen; the original version used a one minute timeout, and the current code makes that timeout a per-room setting.
The project is built around shared ESPHome packages. There is a common hardware and screen setup for the ESP32-S3 touch display, a shared LVGL layout, reusable light buttons, and then small room-specific files that bind those widgets to the right Home Assistant entities.
packages:
common: !include common.yaml
aircon: !include
file: aircon-page.yaml
vars:
aircon_climate_entity_id: climate.heatpump_3_bedroom_ac
aircon_home_page_id: home
<<: !include
file: layout.yaml
vars:
button_widgets:
- <<: !include
file: light-button.yaml
vars:
uid: room_lamps
entity_id: light.bedroom_lamps
label: Room
- <<: !include
file: aircon-button.yaml
vars:
label: Aircon
The header shows time and weather data from Home Assistant.
The screen power logic checks the sun state, time of day, and whether the room lights are already on before deciding whether the display should wake normally or only for a few seconds.
The case is printed in PLA, which is slippery, so I stuck adhesive door buffers to the bottom to stop them sliding backwards when touched.
Original Mastodon posts: bedroom lighting controller feet and aircon page on the room touchpad.