This is an automated archive made by the Lemmit Bot.
The original was posted on /r/homeassistant by /u/souverainiste on 2026-03-29 14:11:36+00:00.
After a few days of BLE sniffing and way too many firmware iterations, I can now control my La-Z-Boy power recliner from Home Assistant using a $5 ESP32.
**The weird part:** La-Z-Boy chairs are BLE *centrals*, not peripherals. The chair connects to the remote, not the other way around. So the ESP32 has to impersonate the original remote โ spoof its MAC address, replicate the exact GATT service layout, and send commands as notifications.
**The painful part:** The chair hardcodes GATT handle positions after bonding. If your notify characteristic isn't at handle 0x000D, the chair connects, bonds, authenticates... and silently ignores every command. Getting the handles right required removing one characteristic from NimBLE's internal GATT service (a 6-line patch).
**What works:**
-
All motor controls (head, recline/feet, lumbar) with variable duration
-
Presets (Home, Flat, TV)
-
Saving custom presets (reverse-engineered the exact 3-packet hold timing)
-
MQTT integration โ full Home Assistant control
-
Serial commands for testing
**Protocol summary:**
-
Commands are 20-byte GATT notifications
-
Byte 0 = motor/preset ID, Byte 1 = action (0x09 press, 0x0A release, 0x03 hold)
-
Commands sent on two characteristics simultaneously (notify + bidirectional)
-
Save preset uses a precise 3-packet sequence: press at T=0, hold at T+2.0s, release at T+3.6s
GitHub: phdindota/la-z-boy-arduino-ble: Control your la-z-boy chair with an ESP32
Happy to answer questions. Would love to hear from anyone with newer (2025-2026) La-Z-Boy models to see if the protocol is the same.
https://preview.redd.it/9crz6b3srzrg1.jpg?width=6144&format=pjpg&auto=webp&s=3662c58b34a85e8316974d51b88562f49651e90e