Off the cloud: LANovo on a Lenovo Smart Display and a JBL Link View, and 13 gadgets on ESPHome
I put LANovo, ygelfand's open-source replacement for Google Assistant, on a Lenovo Smart Display 10 and a JBL Link View, and moved 13 store-bought Tuya and other cloud gadgets to ESPHome. The unlock routes that worked, the step I made up that blacked out a screen, how to tell from the network which gadgets can come off the cloud, and the speaker that can't.
Two screens in my house used to work only through Google. Thirteen of the small gadgets came with a company's app and that company's cloud. Now all fifteen answer to Home Assistant on my own network.
Not everything came across: one speaker is still stuck, and I'll say why. There are others who want to run everything locally too, and what I needed was spread across forum threads, so this is what I did, what went wrong, and whose work it all rests on.
The software on the two displays isn't mine. LANovo is written by ygelfand and released as open source under the AGPL-3.0, with its docs at lanovo.link. I installed it and set it up; they built it. Everyone else this rests on is in the credits at the end.
Why bother
- A reset Google display may never set up again. Google's update server now answers "no update" to the Lenovo, so a stock unit that has been reset can never finish setup (reported by rafaelborja in the XDA guide thread). Mine still worked. One factory reset would have turned it into an ornament.
- Apps stop working. The pet feeder's app no longer works on current Android, so I couldn't set it up at all. It runs ESPHome now.
- Local keeps working when the internet doesn't. The displays and the gadgets talk to Home Assistant over my own network, so an internet outage doesn't stop them. The photo wallpaper still comes from a shared Google Photos album; that part is the only thing that needs the internet.
What LANovo is
From its README, read on 3 November 2026: LANovo is an open-source replacement for Google Assistant on the Lenovo Smart Display 7, 8 and 10, the JBL Link View and the Lenovo ThinkSmart View. Home Assistant finds it through the ESPHome native API, the same way it finds any ESPHome device.
It brings local wake words, Home Assistant's Assist, dashboards, photo wallpaper, an intercom (audio and video between LANovo displays), a Home Assistant media player, a Music Assistant player (Sendspin) and a Bluetooth proxy.
Its sister project from the same developer, EchoLocal, does the same for the Echo Dot (2nd gen) and the Echo Show 5 and Echo Show 8 (1st and 2nd gen).
LANovo was created on 2 October 2026, so it is about a month old, and I run version 0.0.6. It will change quickly. For how to install it, read its docs, not this post.
Before you touch either display
- Back up first, all of it. On the JBL I backed up all 49 small partitions over EDL (the chip's emergency download mode) before writing anything. EDL only lasted about 20 seconds at a time, even with both volume keys held, so I backed up in short passes. On the Lenovo I missed one, and it was the one I needed when the screen went black.
- Follow the published guide. For the Smart Display 8 and 10 it is the XDA thread that LANovo's docs point to.
- Flashing can brick a device. The JBL route below is weeks old.
The Lenovo Smart Display 10
The guide starts with an unlock. On mine, fastboot flashing unlock
answered "oem unlock is not allowed", and the newer unlock tool reported
success while changing nothing. The unit had Google's 2020 bootloader, and
the unlock only worked once older firmware was back on it.
What worked, from the night of 31 October until about 22:05 on 1 November:
- Flash the 2018 Google-signed stock firmware with its own flash-all script. Fastboot allows that while the bootloader is locked.
- Send the legacy unlock the moment fastboot appears.
- Flash the Android 8.1 debug firmware with its own flash-all.
- Run
lanovo install.
# Step 2: the legacy unlock, sent as soon as fastboot sees the display
fastboot oem at-unlock-vboot default_credentialFour things cost me time:
- The coloured spinning dots are not a failed boot. On the 8.1 debug firmware they are Google Assistant's setup loop. The XDA thread says so; I hadn't read that far.
- A Mac's newer mke2fs breaks the flash-all's "format userdata" step. Use the firmware's own userdata.img instead.
- adb only appeared with a USB-A to USB-C cable, and the USB-C plug flipped over. Data only worked one way up.
- The installer ended with "lanovod ctl did not answer". That was just the display switching networks. A reboot fixed it.
The step I made up
I improvised one step that night: I downgraded only the bootloader. The screen went black. Putting the 2020 bootloader back didn't help, because one of the parts it needs had been replaced and that was the partition I hadn't backed up. It stayed black until the full 2018 stock flash brought it back. The stock flash is what saved it, not anything clever. The lesson is the one above: back up first, and follow the published guide.
The JBL Link View
A retail JBL has no unlock credentials. oem unlock isn't allowed, and the
unlock tool finds no credentials that match the device. For a while that
looked like the end of it.
LANovo's developer, posting as mmmooo in the JBL Link View thread on XDA, found the way on 25 October: "retail unlock achieved … basically using demo unit's rom". On 2 November mine went like this:
- Back up over EDL, as above.
- Flash the 2018 JBL demo image with the 2018 flash-all. The image is in RYuhMine's Android Things archive on archive.org, linked from the XDA threads.
- Send the same legacy unlock.
- Flash the Lenovo's unified Android 8.1 debug firmware. It carries the JBL's touch driver, so the one firmware covers both.
- Run
adb disable-verity, then reboot. - Run
lanovo install.
It unlocked at 16:44 and was running LANovo by about 17:00. The one gotcha: the Mac's fastboot couldn't send a raw system image bigger than the bootloader's download size. Converting it to an Android sparse image fixed that.
My rule for the second display came from the first: follow the directions, don't make your own up. No black screen this time.
What the two displays do now
- A photo album as wallpaper.
- Home Assistant control from the screen.
- They call each other. A small bridge I built lets my house phone call either display, and either display call the phone. Audio only: LANovo has no SIP.
- One is also a Bluetooth proxy for Home Assistant, passive scanning only.
Google's apps are stashed on each device, not deleted.
What still doesn't work
- The doorbell popup. LANovo 0.0.6 needs a Reolink or ONVIF doorbell for its doorbell popup. Mine isn't one, so it gets no popup. My existing Home Assistant ring alerts carry on as before, and I've drafted a feature request.
- Google's big speaker. This one can't come off. There is no root, no custom firmware and nothing public. The only work I could find is on other models, and it starts with desoldering memory chips. So it stays a Cast speaker. That's less bad than it sounds: casting to it from Home Assistant is local network traffic, and an aux input can make it a plain amplifier.
Tuya and other cloud gadgets
Thirteen store-bought gadgets in the house now run ESPHome instead of the firmware they came with. By chip, 6 are ESP8266s and 7 are Beken BK7231N or BK7231T chips, which ESPHome runs on through LibreTiny. Among them are an IR blaster, two wall switches, a power board, two diffusers, a pedestal fan, a portable air conditioner, the pet feeder, a lamp, a floodlight and a bug zapper.
Four more Tuya devices, a door sensor, a plug and two sirens, run locally on their stock firmware through Home Assistant's localtuya integration, with no flashing at all. Tuya's Bluetooth locks still need Tuya's cloud: nothing local exists for them yet.
How to tell from the network, without opening anything
| What you check | What it tells you |
|---|---|
| The MAC address prefix | Espressif's prefix means an ESP8266. A Tuya prefix means a Beken chip. |
python -m tinytuya scan, protocol 3.1 | Old firmware. tuya-convert can flash it over Wi-Fi. |
python -m tinytuya scan, protocol 3.3 or 3.4 | Probably patched. |
Then unplug a candidate until you flash it. The app can update it in the background, and one update closes the door for good.
Three ways in
- tuya-convert, over Wi-Fi from a Raspberry Pi. No opening. The IR blaster went this way on 19 September 2026.
- tuya-cloudcutter, for Beken chips that have a profile. Also over Wi-Fi.
- Otherwise, a serial cable to the module. The pet feeder went this way on 9 October 2026.
Safety, plainly
- Never open or wire anything while it is connected to mains.
- Anything wired into the wall is a licensed electrician's job in South Australia.
- Flashing can brick a device.
What I'd tell anyone starting
- Check from the network before you open anything. The MAC prefix and a tinytuya scan tell you most of what you need.
- Unplug what you might flash. One background update can close the easy route for good.
- Back up before you write. Every small partition, in short passes if the mode doesn't last.
- Follow the published guide. The one step I made up is the one that blacked out a screen.
- Expect gaps. A month-old project won't do everything yet, and some hardware has no way out at all.
Credits
Apart from the small phone bridge, none of the software here is mine. These are the people and projects it rests on.
- LANovo and EchoLocal, by ygelfand. Docs at lanovo.link, and a Discord for questions. If it saves a screen of yours from the bin, buy them a coffee.
- The XDA threads: the Lenovo Smart Display 8 and 10 unlock guide and the JBL Link View thread, and everyone in them who posted what worked, rafaelborja and mmmooo among them.
- RYuhMine's Android Things firmware archive on archive.org: the Nougat IoT builds, where the 2018 JBL demo image is, and the Oreo builds.
- tuya-convert and tuya-cloudcutter, the two ways in that need no screwdriver.
- ESPHome, and LibreTiny, which runs ESPHome on the Beken chips.
- localtuya, for the Tuya devices that stay on their stock firmware, and tinytuya, for the scan.
If you'd rather not do it yourself
Most people who want everything local do it themselves, and the credits above are where I'd start. If you'd rather not, I can set up Home Assistant to run locally in your house as the half-day block: $350 for 4 hours, quoted before I start. Flashing your gadgets isn't part of it. More of how my own house runs is on the home automation page, and the first conversation is free: get in touch.