GeekMagic SmallTV Ultra — live Home Assistant dashboard (clock/weather, solar, alarm, lights) via ESPHome

I turned my GeekMagic SmallTV Ultra (the cheap little cube display, ESP12E/ESP8266, ST7789V 240×240) into a small live Home Assistant dashboard with ESPHome. Thought I’d share in case it’s useful to anyone else with one of these gathering dust.

What it does

  • Clock + today’s weather (condition icon, description, temperature) from any weather.* entity
  • 2 generic 2×2 grid pages — icon + primary/secondary value, wire up to any numeric sensor (solar/battery/grid/etc. in my case), with automatic W→kW / Wh→kWh scaling
  • Alarm page — big status icon + name for any alarm_control_panel entity (Alarmo, HA’s built-in Manual Alarm, etc.), with a small footer showing the last transition (Previous -> Current, who changed it, when) and best-effort trigger cause
  • Lights page — big bulb icon + how many lights are on and which ones
  • Burn-in protection (pixel-shift), rotation speed, and which pages are shown are all live-controllable from HA (normal number/switch entities), no reflash needed for day-to-day tweaks
  • Fully translatable — every on-screen string is a substitution, defaults to English

Repo (MIT licensed, with a GitHub Action that validates + compiles the config on every push): GitHub - zbuh/geekmagic-ultra-dashboard: ESPHome dashboard firmware for the GeekMagic SmallTV Ultra, driven live from Home Assistant · GitHub

The only thing you need to touch to make it yours is the substitutions: block at the top of the YAML (your entity IDs, icons, units) — the rest is generic.

Full disclosure
This was built with heavy assistance from Claude (Anthropic’s AI coding assistant) — I described what I wanted (features, layout tweaks, bug reports from real compiles/flashes) in plain language across a long back-and-forth, and Claude wrote/iterated on the ESPHome YAML and the C++ lambda helpers, including tracking down a couple of real build errors (duplicate font glyphs, template deduction issues) by actually compiling locally each time. I tested every iteration on the real device, reviewed the changes, and made the calls on layout/behavior/UX. Wanted to be upfront about that rather than pretend it was 100% hand-written — happy to answer questions about which parts were AI-assisted vs. not.

Feedback, issues, and PRs welcome.

1 Like