<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Neato | Antoine Weill--Duflos</title>
    <link>https://antoine.weill-duflos.fr/en/tag/neato/</link>
      <atom:link href="https://antoine.weill-duflos.fr/en/tag/neato/index.xml" rel="self" type="application/rss+xml" />
    <description>Neato</description>
    <generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Sun, 31 May 2026 00:00:00 +0000</lastBuildDate>
    <image>
      <url>https://antoine.weill-duflos.fr/media/icon_hu_d686267daab28486.png</url>
      <title>Neato</title>
      <link>https://antoine.weill-duflos.fr/en/tag/neato/</link>
    </image>
    
    <item>
      <title>OpenNeato Home Assistant Integration</title>
      <link>https://antoine.weill-duflos.fr/en/project/openneato/</link>
      <pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate>
      <guid>https://antoine.weill-duflos.fr/en/project/openneato/</guid>
      <description>&lt;p&gt;When Neato&amp;rsquo;s parent company Vorwerk shut down the cloud, perfectly good Botvac robot vacuums lost their app, their scheduling, and even parts of their error handling. &lt;a href=&#34;https://github.com/renjfk/OpenNeato&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;OpenNeato&lt;/a&gt; (the upstream project) brings them back with a small &lt;strong&gt;ESP32 wired to the robot&amp;rsquo;s debug serial port&lt;/strong&gt;, serving a local web UI over WiFi with no cloud, no app, and no account.&lt;/p&gt;
&lt;p&gt;My contribution is the &lt;strong&gt;Home Assistant&lt;/strong&gt; side. I run a &lt;a href=&#34;https://github.com/Leicas/OpenNeato&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;fork&lt;/a&gt; whose reason for existing is a &lt;strong&gt;HACS-installable custom integration&lt;/strong&gt;: it discovers the bridge on the LAN and exposes the robot as a first-class Home Assistant device, with no YAML.&lt;/p&gt;
&lt;p&gt;The integration polls the bridge&amp;rsquo;s local HTTP API every 5 seconds and gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;vacuum&lt;/strong&gt; entity (start/stop/pause/dock/locate/spot, battery, status, fan-speed presets, errors).&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;camera&lt;/strong&gt; entity that renders the &lt;strong&gt;LIDAR cleaning map&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sensors&lt;/strong&gt; for battery diagnostics (cycle count, voltage, temperature), brush and vacuum motor speeds, WiFi, and cleaning stats.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Switches and buttons&lt;/strong&gt; for motors and manual controls.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The ESP32 bridge firmware, web UI, and flash tool are the upstream project&amp;rsquo;s work; the firmware changes in my fork are minor endpoints to feed the integration. The result: my own Neato D6 now works at least as well as it did on the cloud, with more telemetry than the original app ever exposed.&lt;/p&gt;
&lt;p&gt;Full write-up: &lt;a href=&#34;../../post/openneato/&#34;&gt;Bringing a bricked Neato back to life&lt;/a&gt;. Both projects are open source under the MIT license.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bringing a Bricked Neato Back to Life: OpenNeato and a Home Assistant Integration</title>
      <link>https://antoine.weill-duflos.fr/en/post/openneato/</link>
      <pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate>
      <guid>https://antoine.weill-duflos.fr/en/post/openneato/</guid>
      <description>&lt;p&gt;















&lt;figure  id=&#34;figure-my-actual-neato-d6-with-the-top-shell-off-the-round-lidar-turret-at-the-top-the-mainboard-and-its-ribbon-cables-on-the-left-the-brush-bay-with-its-neato-genuine-label-in-the-middle-this-is-where-the-esp32-goes-the-cloud-is-gone-the-robot-is-not&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img alt=&#34;A Neato Botvac robot vacuum opened up on a lap, top shell removed, showing the round black LIDAR turret at the top, the green mainboard with ribbon cables and coloured wires on the left, a metal motor on the right, and a &amp;ldquo;neato genuine&amp;rdquo; label in the middle brush bay&#34; srcset=&#34;
               /en/post/openneato/featured_hu_e4cd35aae0249ad2.webp 400w,
               /en/post/openneato/featured_hu_697befa0fee38392.webp 760w,
               /en/post/openneato/featured_hu_3db8ccf948f0dd67.webp 1200w&#34;
               src=&#34;https://antoine.weill-duflos.fr/en/post/openneato/featured_hu_e4cd35aae0249ad2.webp&#34;
               width=&#34;760&#34;
               height=&#34;573&#34;
               loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      My actual Neato D6 with the top shell off: the round LIDAR turret at the top, the mainboard and its ribbon cables on the left, the brush bay with its &amp;rsquo;neato genuine&amp;rsquo; label in the middle. This is where the ESP32 goes. The cloud is gone. The robot is not.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;I was a Neato fan from early on. Back when robot vacuums mostly bumped around at random, Neato shipped models with a &lt;strong&gt;LIDAR&lt;/strong&gt; turret on top, which gave them genuinely smarter navigation than the Roombas of the day: they mapped the room and cleaned it in deliberate lines instead of pinballing. I owned several over the years and happily recommended them to friends. The one I still run is a &lt;strong&gt;Neato Botvac D6&lt;/strong&gt;, and I have used it as my daily vacuum for years.&lt;/p&gt;
&lt;p&gt;It was never completely trouble-free. Now and then it gets stuck or eats a cable, and it has far fewer tricks than the new camera-based robots that analyse a whole room. But it is a good machine, and I kept it going: new brushes a few times, a fresh battery. Mechanically, it still works.&lt;/p&gt;
&lt;h2 id=&#34;the-day-it-became-a-brick&#34;&gt;The day it became a brick&lt;/h2&gt;
&lt;p&gt;A few months ago, the servers were switched off. Neato had been wound down by its parent company Vorwerk back in 2023, and the cloud that the app depended on was &lt;a href=&#34;https://www.heise.de/en/news/Vorwerk-subsidiary-Neato-shuts-down-cloud-server-hoovers-lose-functions-10748987.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;shut off for good&lt;/a&gt;. Overnight, the app became useless. Worse, the robot leaned on the cloud for more than scheduling: even some of its error handling round-tripped through the server. So a perfectly functional, recently re-batteried vacuum turned into an expensive brick. It would still do a single manual clean if you pressed the button, but everything that made it smart was gone.&lt;/p&gt;
&lt;p&gt;This is the part of the connected-hardware bargain nobody signs up for: the mechanics outlast the company, and the company takes the brains with it when it leaves.&lt;/p&gt;
&lt;h2 id=&#34;the-community-fix-talk-to-the-robot-directly&#34;&gt;The community fix: talk to the robot directly&lt;/h2&gt;
&lt;p&gt;It turns out these robots have a &lt;strong&gt;debug serial port&lt;/strong&gt; on the mainboard, and the cleaning behaviour is driven by simple serial commands. So the community fix is delightfully direct: wire a small &lt;strong&gt;ESP32&lt;/strong&gt; onto that port and drive the robot yourself, with no cloud in the loop at all.&lt;/p&gt;
&lt;p&gt;A few projects grew out of that idea. The one that worked best for me is &lt;strong&gt;&lt;a href=&#34;https://github.com/renjfk/OpenNeato&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;OpenNeato&lt;/a&gt;&lt;/strong&gt;, an open-source replacement for Neato&amp;rsquo;s dead cloud and app. The ESP32 talks to the Botvac (D3 to D7) over UART and serves a &lt;strong&gt;local web UI&lt;/strong&gt; over WiFi. No cloud, no app, no account. It does scheduling, manual driving, a live LIDAR map, cleaning history, and push notifications through &lt;a href=&#34;https://ntfy.sh&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ntfy&lt;/a&gt;. All of it runs on a board that costs a few dollars and lives inside the robot.&lt;/p&gt;
&lt;p&gt;The hardware side is conceptually simple: open the robot, find the serial header, pick up power and the serial TX/RX with a handful of wires to the ESP32, and route them back out. In practice, opening a Botvac is the fiddly part. I did not have a screwdriver fine enough for the screws, so I gently drilled out a bit of the plastic to reach them. Not elegant, but it worked, and the robot went back together cleanly in the end. That is my actual D6 opened up in the photo at the top of this post, LIDAR turret and all. Once it is buttoned up, the only outward sign is a small bundle of wires near the seam.&lt;/p&gt;
&lt;h2 id=&#34;the-one-thing-it-was-missing&#34;&gt;The one thing it was missing&lt;/h2&gt;
&lt;p&gt;OpenNeato&amp;rsquo;s web UI is great, and the ntfy notifications are a nice touch. But I run my whole house through &lt;strong&gt;Home Assistant&lt;/strong&gt;, and that is where I want the vacuum to live: on my dashboards, in my automations, next to every other device. OpenNeato did not have a Home Assistant integration.&lt;/p&gt;
&lt;p&gt;The good news was that the firmware already exposed everything over a clean local HTTP API (&lt;code&gt;/api/*&lt;/code&gt;). All the data and all the controls were right there. What was missing was the &lt;strong&gt;glue&lt;/strong&gt;: a Home Assistant integration that speaks that API and presents the robot as a proper HA device.&lt;/p&gt;
&lt;p&gt;So I built it.&lt;/p&gt;
&lt;h2 id=&#34;what-i-built-the-home-assistant-integration&#34;&gt;What I built: the Home Assistant integration&lt;/h2&gt;
&lt;p&gt;I made a &lt;a href=&#34;https://github.com/Leicas/OpenNeato&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;fork of OpenNeato&lt;/a&gt; whose whole reason for existing is the Home Assistant side. It ships a &lt;strong&gt;HACS-installable custom integration&lt;/strong&gt; that discovers the bridge on your network by IP or hostname and exposes the robot as a single, first-class HA device. No YAML, no extra add-on, no cloud round-trip. The integration polls the local API every 5 seconds over your LAN.&lt;/p&gt;
&lt;p&gt;The robot shows up with the full set of entities you would want:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;vacuum&lt;/strong&gt; entity with start, stop, pause, return-to-dock, locate, and spot-clean, plus battery level, status, fan-speed presets (Eco, Auto, Intense), and error reporting. It works with the standard Home Assistant vacuum cards out of the box.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;camera&lt;/strong&gt; entity that renders the &lt;strong&gt;LIDAR cleaning map&lt;/strong&gt;, so I can see where the robot has been right on my dashboard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sensors&lt;/strong&gt; for the things the old app never bothered to surface: battery level and detailed battery diagnostics (cycle count, voltage, temperature), brush and vacuum motor speeds, WiFi signal, cleaning stats, and more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Switches and buttons&lt;/strong&gt; for the motors, manual error clearing, and the other controls the firmware exposes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The firmware changes in the fork are deliberately minor (a few extra endpoints to feed the integration, like &lt;code&gt;/api/sensors&lt;/code&gt; and some hardening of &lt;code&gt;/api/history&lt;/code&gt;). The ESP32 bridge firmware, the web UI, and the flash tool are the work of the upstream project; my contribution is the Home Assistant layer on top.&lt;/p&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-the-openneato-web-ui-which-runs-entirely-on-the-esp32-the-home-assistant-integration-speaks-the-same-local-api-this-dashboard-uses&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img alt=&#34;The OpenNeato web dashboard on a dark theme, showing robot status, battery level, cleaning state, WiFi signal, and storage usage&#34; srcset=&#34;
               /en/post/openneato/dashboard_hu_a1d8c48d76e60a30.webp 400w,
               /en/post/openneato/dashboard_hu_2ae2c6e0b86d0ed4.webp 760w,
               /en/post/openneato/dashboard_hu_bfaac61cdff3d58d.webp 1200w&#34;
               src=&#34;https://antoine.weill-duflos.fr/en/post/openneato/dashboard_hu_a1d8c48d76e60a30.webp&#34;
               width=&#34;350&#34;
               height=&#34;760&#34;
               loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      The OpenNeato web UI, which runs entirely on the ESP32. The Home Assistant integration speaks the same local API this dashboard uses.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;A nice detail of the underlying project: the web frontend is gzipped and embedded directly into the firmware binary, so a single over-the-air update ships both the firmware and the UI together. And the LIDAR map you get in the web UI is the same data the Home Assistant camera entity renders.&lt;/p&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-the-lidar-map-from-a-cleaning-session-in-home-assistant-this-becomes-a-camera-entity-you-can-drop-straight-onto-a-vacuum-card&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img alt=&#34;A LIDAR cleaning map rendered as a coverage outline showing the shape of the cleaned rooms&#34; srcset=&#34;
               /en/post/openneato/clean-map_hu_d75a3a376b22fab0.webp 400w,
               /en/post/openneato/clean-map_hu_10711dbf5960964a.webp 760w,
               /en/post/openneato/clean-map_hu_eef043c0e94f9d8d.webp 1200w&#34;
               src=&#34;https://antoine.weill-duflos.fr/en/post/openneato/clean-map_hu_d75a3a376b22fab0.webp&#34;
               width=&#34;350&#34;
               height=&#34;760&#34;
               loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      The LIDAR map from a cleaning session. In Home Assistant this becomes a camera entity you can drop straight onto a vacuum card.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&#34;installing-it&#34;&gt;Installing it&lt;/h2&gt;
&lt;p&gt;For anyone with a stranded Neato and a Home Assistant box, the integration install is the easy part:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In HACS, add the fork as a &lt;strong&gt;custom repository&lt;/strong&gt;: &lt;code&gt;https://github.com/Leicas/OpenNeato&lt;/code&gt; (category: Integration).&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;OpenNeato&lt;/strong&gt; in HACS and install it, then restart Home Assistant.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings, Devices &amp;amp; Services, Add Integration, OpenNeato&lt;/strong&gt; and enter the bridge hostname or IP (for example &lt;code&gt;neato.local&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It needs firmware &lt;code&gt;1.0+&lt;/code&gt; on the ESP32; the battery diagnostics need a slightly newer build. Everything is local-polling, so nothing leaves your network.&lt;/p&gt;
&lt;h2 id=&#34;the-result-better-than-the-cloud-it-replaced&#34;&gt;The result: better than the cloud it replaced&lt;/h2&gt;
&lt;p&gt;Since I started running this, my vacuum works at least as well as it did before, and honestly better. I get push notifications when a clean finishes or an error happens. I can see the battery state, the brush rotation speeds, the cleaning history, and the map, all inside Home Assistant. That is more information than the original Neato app ever gave me, on a robot the manufacturer had effectively declared dead.&lt;/p&gt;
&lt;p&gt;There is something very satisfying about that. The hardware was always fine. What failed was a business decision and a server bill. A few dollars of ESP32, an open-source project, and a bit of integration glue were enough to take the robot back.&lt;/p&gt;
&lt;h2 id=&#34;links-and-credit&#34;&gt;Links and credit&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Upstream project:&lt;/strong&gt; &lt;a href=&#34;https://github.com/renjfk/OpenNeato&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;renjfk/OpenNeato&lt;/a&gt;, the ESP32 bridge firmware, web UI, and flash tool. If you only want the standalone web UI, use this directly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;My Home Assistant fork:&lt;/strong&gt; &lt;a href=&#34;https://github.com/Leicas/OpenNeato&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Leicas/OpenNeato&lt;/a&gt;, with the HACS-installable Home Assistant integration. Use this if you run Home Assistant and want the robot as a first-class device.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notifications:&lt;/strong&gt; &lt;a href=&#34;https://ntfy.sh&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ntfy&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both the upstream project and my fork are open source under the MIT license, and both are still early beta, so expect a few rough edges. If your Neato is sitting in a closet because the app stopped working, it does not have to stay there.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
