all my containers are running on a separate bridged network.
I had to create a separate “proxy-container” to get everything up and running.
Now its time to test
![]()
I have installed over a hundred ESPHome devices over the years using either ESPHome Web or ESPHome Flasher. Sometimes Balena or Etcher.
I went through the install new screen and waited for the compile to complete and received the instruction to use ESPHomeWeb to flash “office-4.factory.bin”. Problem is, I can’t find the bin file anywhere.
Advice??
Four updates in one day, are you serious with us now
Normally you would just hang the screen on USB, and flash directly with Tessera, what did you choose as the flash option? Download?
I chose download. My Home Assistant server is on an Intel NUC in my basement. It’s headless and I rarely have to go there. If I could find the bin file then flashing the ESP would be easy.
OTOH, I did compile the YAML file in esphome builder, but the screen never connected to Home Assistant.
[01:29:00]ESP-ROM:esp32s3-20210327
[01:29:00]Build:Mar 27 2021
[01:29:00]rst:0x1 (POWERON),boot:0x18 (SPI_FAST_FLASH_BOOT)
[01:29:00]SPIWP:0xee
[01:29:00]mode:DIO, clock div:1
[01:29:00]load:0x3fce2820,len:0x1140
[01:29:00]load:0x403c8700,len:0xcf0
[01:29:00]load:0x403cb700,len:0x2e90
[01:29:00]entry 0x403c8910
[01:29:00]I (24) boot: ESP-IDF v5.5.5 2nd stage bootloader
[01:29:00]I (25) boot: Multicore bootloader
[01:29:00]I (25) boot: chip revision: v0.2
[01:29:00]I (25) boot: efuse block revision: v1.3
[01:29:00]I (27) boot.esp32s3: Boot SPI Speed : 80MHz
[01:29:00]I (31) boot.esp32s3: SPI Mode : DIO
[01:29:00]I (35) boot.esp32s3: SPI Flash Size : 16MB
[01:29:00]I (39) boot: Enabling RNG early entropy source...
[01:29:00]I (43) boot: Partition Table:
[01:29:00]I (46) boot: ## Label Usage Type ST Offset Length
[01:29:00]I (52) boot: 0 otadata OTA data 01 00 00009000 00002000
[01:29:00]I (59) boot: 1 phy_init RF data 01 01 0000b000 00001000
[01:29:00]I (65) boot: 2 app0 OTA app 00 10 00010000 007c0000
[01:29:00]I (72) boot: 3 app1 OTA app 00 11 007d0000 007c0000
[01:29:00]I (78) boot: 4 nvs WiFi data 01 02 00f90000 00070000
[01:29:00]I (85) boot: End of partition table
[01:29:00]I (88) esp_image: segment 0: paddr=00010020 vaddr=3c150020 size=c01b8h (786872) map
[01:29:00]I (241) esp_image: segment 1: paddr=000d01e0 vaddr=3fc97100 size=05f20h ( 24352) load
[01:29:00]I (247) esp_image: segment 2: paddr=000d6108 vaddr=40374000 size=09f10h ( 40720) load
[01:29:00]I (257) esp_image: segment 3: paddr=000e0020 vaddr=42000020 size=142a7ch (1321596) map
[01:29:01]I (502) esp_image: segment 4: paddr=00222aa4 vaddr=4037df10 size=09118h ( 37144) load
[01:29:01]I (511) esp_image: segment 5: paddr=0022bbc4 vaddr=50000000 size=00020h ( 32) load
[01:29:01]I (519) boot: Loaded app from partition at offset 0x10000
[01:29:01]I (519) boot: Disabling RNG early entropy source...
[01:29:01][I][logger:127]: Log initialized
[01:29:01][I][app:060]: Running through setup()
[01:29:01][I][i2c:205]: Performing bus recovery
[01:29:02][W][component:290]: api set Warning flag: waiting for client connection
[01:29:02][I][app:117]: setup() finished successfully!
[01:29:02][W][component:290]: wifi set Warning flag: scanning for networks
[01:29:02][I][app:151]: ESPHome version 2026.9.0 compiled on 2026-09-29 01:22:18 -0400
[01:29:02][I][app:153]: Project maxgramser.esp_screen version 0.14.0
[01:29:02][I][app:158]: ESP32 Chip: ESP32-S3 rev0.2, 2 core(s)
[01:29:02][W][component:419]: lvgl took a long time for an operation (60 ms), max is 50 ms
[01:29:04][I][wifi:1486]: - 'Kaywinnet' (30:DE:4B:8D:A9:AA) ▂▄▆█
[01:29:04][I][wifi:1486]: - 'Kaywinnet' (50:91:E3:F1:47:8E) ▂▄▆█
[01:29:04][I][wifi:1486]: - 'Kaywinnet' (42:52:A1:D5:8B:7C) ▂▄▆█
[01:29:04][I][wifi:1486]: - 'Kaywinnet' (5C:E9:31:0F:E9:E4) ▂▄▆█
[01:29:04][I][wifi:1145]: Connecting to 'Kaywinnet' (30:DE:4B:8D:A9:AA) (priority 0, attempt 1/2 in phase SCAN_CONNECTING)...
[01:29:05][I][health:1243]: free_heap=93268
[01:29:05][I][health:1247]: loop_stack_min_free=11130
[01:29:05][I][health:1249]: kept_pages=0 pictures=0 B psram_free=5550524
[01:29:05][I][health:1257]: largest_block=51200
[01:29:05][I][health:1262]: min_free=90680
[01:29:06][I][wifi:1626]: Connected
[01:29:06][W][component:313]: wifi cleared Warning flag
[01:30:01][I][safe_mode:154]: Boot seems successful; resetting boot loop counter
[01:30:05][W][component:313]: api cleared Warning flag
[01:30:05][W][api.connection:2675]: 192.168.1.57 (192.168.1.57): Socket operation failed BAD_INDICATOR errno=11
[01:30:05][W][component:290]: api set Warning flag: waiting for client connection
[01:30:05][W][component:313]: api cleared Warning flag
[01:30:05][W][api.connection:2675]: 192.168.1.57 (192.168.1.57): Socket operation failed BAD_INDICATOR errno=11
[01:30:05][W][component:290]: api set Warning flag: waiting for client connection
[01:34:05][I][health:1243]: free_heap=93116
[01:34:05][I][health:1247]: loop_stack_min_free=11130
[01:34:05][I][health:1249]: kept_pages=0 pictures=0 B psram_free=5550524
[01:34:05][I][health:1257]: largest_block=51200
[01:34:05][I][health:1262]: min_free=78224
The file will surely be in your browsers download list??? if not click the 3 dots top left and click on firmware you will get the option to compile and download there.
Hi Max and everyone,
First, thank you for creating ESP Screens. It is a genuinely interesting and useful project, and I would love to get it working with my setup.
I’m seeing this warning:
WARNING Home Assistant temporarily unavailable (TimeoutError)
Home Assistant is running in a Microsoft Hyper-V virtual machine. It appears to be working normally: its logs show no related errors, and my other applications can connect to it.
I suspect this may be related to the Home Assistant network settings or the Hyper-V virtual switch, but I have not confirmed the cause. Could you advise which connection ESP Screens uses to reach Home Assistant and what I should check first? In particular, should I verify a specific URL, IP address, port, or network setting from where ESP Screens is running?
I can provide additional logs and configuration details if that would help diagnose it. Thank you for your work on this project and for any guidance you can offer.
Hey Pablo! Can you elaborate a bit more about the logs? And open a github issue with your setup? Than i can help you!
Hi Max! Thanks for your reply. I’m opening a GitHub issue with my Hyper-V setup and the relevant ESP Screens logs. I’ll share the issue link here once it’s posted.
Works now after manually compiling and uploading the YAML/BIN.
Is there a Dark Mode? The screen is so bright-white that room lights are unnecessary. I can’t imagine using this in a bedroom.
There is a dark mode in the screen settings. You should also be able to adjust the brightness in HA.
I’ve thought about doing this and how useful it would be a number of times. It’s good to see it’s been made ‘easier’ to achieve.
But then I thought, that device won’t be in reach when I sit down in a room next time I want to use it. Like having a light switch, inside each room door. Practical but often inconvenient.
I came to the conclusion, since I keep my phone with me, I may as well use that. You still create the room screens in HA and select the appropriate one for whatever room you are in.
Maybe, apart from the bathroom…
But, nice work.
![]()
I’m using it as a thermostat and I want others to be able to use it who don’t have access to my phone ![]()
As a bonus I can control Sonos/Spotify (among other stuff)
Ideal for that.
Horses for courses, as they say.
We have a Wiser heating system, controlled from their Wiser app on my phone. There’s only me and ‘her in doors’ at home. She doesn’t have a clue how the heating is controlled and doesn’t really care.
If I suddenly peg it, that will inevitably be a problem.
But other ‘stuff’ that is controlled by HA at home in that situation, will also be a problem. If something stops working and I’m not there…
Got myself a Guition ESP32-S3-4848S040 and installed Tessera. Unfortunately I’ve immediately run into two issues. One is that the Guiton isn’t detected by Tessera or ESPHome. Is there a reset button I need to press to allow the connection?
Second is that if I skip past the above issue and ask Tessera to build a downloadable file, it fails. Build log below. I’ve not made any changes myself and have just been clicking through the setup process
ESPHome: compile
INFO ESPHome 2026.9.0
INFO Reading configuration /homeassistant/esphome/master-bedroom-craigstchscreen.yaml...
INFO Updating https://github.com/MaxGramser/homeassistant_espscreen@main
INFO Updating https://github.com/MaxGramser/homeassistant_espscreen.git@main
WARNING The 'image:' configuration format is deprecated and will be removed in ESPHome 2027.1.0. Images are now platforms of the 'image' component. Replace your 'image:' block with:
image:
- platform: file
id: tessera_mark
file: https://raw.githubusercontent.com/MaxGramser/homeassistant_espscreen/main/fonts/tessera-mark.png
type: RGB565
transparency: alpha_channel
resize: 51x51
- platform: file
id: tessera_mark_bar
file: https://raw.githubusercontent.com/MaxGramser/homeassistant_espscreen/main/fonts/tessera-mark.png
type: RGB565
transparency: alpha_channel
resize: 24x24
INFO Checking 5 remote file(s) for updates
WARNING GPIO19 is used by the USB-Serial-JTAG interface. Using this pin as GPIO will conflict with USB-Serial-JTAG.
WARNING GPIO20 is used by the USB-Serial-JTAG interface. Using this pin as GPIO will conflict with USB-Serial-JTAG.
WARNING GPIO20 is used by the USB-Serial-JTAG interface. Using this pin as GPIO will conflict with USB-Serial-JTAG.
WARNING The top-level 'online_image:' configuration is deprecated and will be removed in ESPHome 2027.1.0. 'online_image' is now a platform of the 'image' component. Replace your 'online_image:' block with:
image:
- platform: online_image
id: camera_image
url: http://127.0.0.1/camera.bmp
format: BMP
type: RGB565
buffer_size: 16384
on_download_finished:
- lambda: runtime_tiles::camera_loaded(false, cached);
on_error:
- lambda: runtime_tiles::camera_failed(false);
- platform: online_image
id: alert_image
url: http://127.0.0.1/camera.bmp
format: BMP
type: RGB565
buffer_size: 16384
on_download_finished:
- lambda: runtime_tiles::camera_loaded(true, cached);
on_error:
- lambda: runtime_tiles::camera_failed(true);
- platform: online_image
id: tile_image
url: http://127.0.0.1/camera.bmp
format: BMP
type: RGB565
buffer_size: 16384
on_download_finished:
- lambda: runtime_tiles::live_loaded(cached);
on_error:
- lambda: runtime_tiles::live_failed();
WARNING 'ota' password wastes significant flash and RAM (about 3.5 KB and 60 bytes plus the password on the heap): the device already offers encryption with the 'api' encryption key, which authenticates any uploader that takes it, and a password only matters for uploaders without encryption support; remove 'password' and add 'encryption' under 'ota' so uploads use the key and encryption is required
INFO Generating C++ source...
INFO Setting CONFIG_LWIP_MAX_SOCKETS to 12 (TCP=6 [api=3, captive_portal=3], UDP=3 [captive_portal=1, mdns=2], TCP_LISTEN=3 [api=1, ota=1, web_server_base=1])
INFO Detected timezone 'Europe/London'
INFO LVGL will use software rotation
WARNING esphome->platformio_options->build_flags is deprecated; use esphome->build_flags instead. Support for it will be removed in 2026.12.0.
INFO Compiling app... Build path: /data/build/master-bedroom-craigstchscreen/master-bedroom-craigstchscreen
INFO Build configuration is up to date
INFO Checking ESP-IDF 5.5.5 framework ...
INFO Checking ESP-IDF 5.5.5 framework installation ...
INFO Checking ESP-IDF 5.5.5 Python environment ...
Executing action: all (aliases: build)
Running ninja in directory /data/build/master-bedroom-touchschcreen/master-bedroom-touchscreen/build
Executing "ninja -j 4 all"...
[0/2] Re-checking globbed directories...
[1/11] Performing build step for 'bootloader'
[1/1] cd /data/build/master-bedroom-touchscreen/master-bedroom-touchscreen/build/bootloader/esp-idf/esptool_py && /data/idf/penvs/5.5.5/bin/python /data/idf/frameworks/5.5.5/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 /data/build/master-bedroom-touchscreenmaster-bedroom-touchscreen/build/bootloader/bootloader.bin
Bootloader binary size 0x4d20 bytes. 0x32e0 bytes (40%) free.
[2/11] No install step for 'bootloader'
[3/11] Completed 'bootloader'
[4/11] Building CXX object esp-idf/src/CMakeFiles/__idf_src.dir/main.cpp.obj
FAILED: [code=1] esp-idf/src/CMakeFiles/__idf_src.dir/main.cpp.obj
ccache /data/idf/tools/xtensa-esp-elf/esp-14.2.0_20260121/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++ @esp-idf/src/CMakeFiles/__idf_src.dir/main.cpp.obj.rsp -MD -MT esp-idf/src/CMakeFiles/__idf_src.dir/main.cpp.obj -MF esp-idf/src/CMakeFiles/__idf_src.dir/main.cpp.obj.d -o esp-idf/src/CMakeFiles/__idf_src.dir/main.cpp.obj -c /data/build/master-bedroom-touchscreen/master-bedroom-touchscreen/src/main.cpp
In file included from ../src/esphome.h:173,
from ../src/main.cpp:3:
../src/esphome/components/smart_display/runtime_tiles.h: In function 'void runtime_tiles::alert_key(lv_obj_t*, lv_obj_t*, uint32_t)':
../src/esphome/components/smart_display/runtime_tiles.h:8155:76: warning: bitwise operation between different enumeration types 'lv_part_t' and 'lv_state_t' is deprecated [-Wdeprecated-enum-enum-conversion]
8155 | lv_obj_remove_local_style_prop(button, LV_STYLE_BG_COLOR, LV_PART_MAIN | LV_STATE_DEFAULT);
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
../src/esphome/components/smart_display/runtime_tiles.h:8156:76: warning: bitwise operation between different enumeration types 'lv_part_t' and 'lv_state_t' is deprecated [-Wdeprecated-enum-enum-conversion]
8156 | lv_obj_remove_local_style_prop(button, LV_STYLE_BG_COLOR, LV_PART_MAIN | LV_STATE_PRESSED);
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
../src/esphome/components/smart_display/runtime_tiles.h:8157:88: warning: bitwise operation between different enumeration types 'lv_part_t' and 'lv_state_t' is deprecated [-Wdeprecated-enum-enum-conversion]
8157 | if (label) lv_obj_remove_local_style_prop(label, LV_STYLE_TEXT_COLOR, LV_PART_MAIN | LV_STATE_DEFAULT);
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
../src/esphome/components/smart_display/runtime_tiles.h:8160:67: warning: bitwise operation between different enumeration types 'lv_part_t' and 'lv_state_t' is deprecated [-Wdeprecated-enum-enum-conversion]
8160 | lv_obj_set_style_bg_color(button, theme::rgb(key), LV_PART_MAIN | LV_STATE_DEFAULT);
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
../src/esphome/components/smart_display/runtime_tiles.h:8161:87: warning: bitwise operation between different enumeration types 'lv_part_t' and 'lv_state_t' is deprecated [-Wdeprecated-enum-enum-conversion]
8161 | lv_obj_set_style_bg_color(button, theme::rgb(theme::key_pressed(key)), LV_PART_MAIN | LV_STATE_PRESSED);
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
../src/esphome/components/smart_display/runtime_tiles.h:8162:96: warning: bitwise operation between different enumeration types 'lv_part_t' and 'lv_state_t' is deprecated [-Wdeprecated-enum-enum-conversion]
8162 | if (label) lv_obj_set_style_text_color(label, theme::rgb(theme::key_text(key)), LV_PART_MAIN | LV_STATE_DEFAULT);
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
xtensa-esp-elf-g++: fatal error: Killed signal terminated program cc1plus
compilation terminated.
ninja: build stopped: subcommand failed.
ninja failed with exit code 1, output of the command is in the /data/build/master-bedroom-touchscreen/master-bedroom-touchscreen/build/log/idf_py_stderr_output_17330 and /data/build/master-bedroom-touchscreen/master-bedroom-touchscreen/build/log/idf_py_stdout_output_17330
ESPHome compile failed; see the log.
Hi, if you use your HA and phone just to replace light switches and/or mainly control stuff it’s definitely a waste of money, no matter how cheap these are.
But, to create for instance a thermostat and/or control your house for particular situations that are hard to automate or give control to visitors/house sitters/parents babysitting/… this can be useful if you already opened your house to HA.
It all depends on your particular setup and use case and that’s the beauty of HA: everything is possible in a private way and it’s not costing an arm and a leg for just a small display compared to other solutions.
Can you open an issue on GitHub, that’s the lost I work am and look at! Thanks!
Hey, thanks for the log! Your screen and its config are fine. The problem is this line:
[code]
fatal error: Killed signal terminated program cc1plus
[/code]
Your Home Assistant machine ran out of memory while building the firmware. By default ESPHome compiles 4 files at the same time, and one of the files in this firmware is quite large. You can fix it in one of two ways.
**Option 1: build one file at a time (easiest)**
1. In Home Assistant, open **ESPHome Device Builder**.
2. On your screen’s card, click **EDIT**.
3. Near the top you’ll see an **esphome:** section with **name:** and **friendly_name:**. Add one line under them, with the same indent:
[code]
esphome:
name: …
friendly_name: …
compile_process_limit: 1
[/code]
4. Click **SAVE**, then **INSTALL** and choose **Wirelessly**.
The build will be slower, but it uses much less memory. If it still fails, stop any heavy add-ons while it builds.
**Option 2: build on your computer**
1. Install Python, then open a terminal and run: **pip install esphome**
2. Make a folder and copy these three files into it from the **esphome** folder of your Home Assistant config: your screen’s **.yaml**, its **.local.yaml**, and **secrets.yaml**.
3. In that folder, run: **esphome run your-screen.yaml**. When it asks how to upload, pick the screen’s network address (OTA).
Let me know how it goes!
The procedure is usually like this: When the display is connected to USB press AND hold the boot button. Then press and release the reset button and after that release the boot button. Now the display should appear in the list of USB devices.