Most handheld remotes for Home Assistant lean on Wi-Fi, and that choice bites twice: a device that stays associated drains its battery, while one that reconnects each time you pick it up makes you wait. This build sidesteps both problems. The handheld talks ESP-NOW to a bridge, which is any ESP32 running ESPHome that reaches Home Assistant over the native API, and the remote itself never joins Wi-Fi. It wakes in under 50 ms and runs 2 to 3 weeks per charge in real use.
The hardware is a fun read. All 20 keys sit on individual GPIOs rather than a matrix, and 18 of them land on RTC-capable pins so a press can wake the chip. A LIS2DH12 accelerometer on an RTC GPIO handles wake on pickup. The panel is a 2.0-inch 240x320 ST7789, fed by a 1000 mAh LiPo with USB-C charging and an IR blaster on board. Version two adds a TSOP75238 receiver for learning codes, a MAX17048 fuel gauge, an ICS-43434 microphone for push-to-talk with Assist, plus USB sense on an RTC pin with load-sharing charging.
Security is where it shines for me. Packets are AES-128-CCM encrypted with the remote's own key, the nonce mixes the sender's MAC, an epoch and a counter, and that counter lives in RTC memory with a flash lease, so a recorded press cannot be replayed. Pairing uses X25519 with HKDF and a six-digit code confirmed on both ends. Because ESPHome normally trims the mbedTLS AES-CCM and X25519 pieces as TLS-only, the maker wrote a custom component for the link.
One open question: whether the actual deep sleep current was measured to back the battery figure has not been answered. Beyond that, the maker publishes FEA drop-test results, and the kit at about $60 includes a populated, assembled and tested PCB; you print the case yourself from STLs, with no soldering.
Project by Paramworks. Watch it on their YouTube channel: