What changed in Valetudo from 2025 to 2026
5 releases numbered after 2025.12.0 up to and including 2026.08.0, stable releases only. 2025.12.0 and 2026.08.0 are the newest stable releases of 2025 and 2026 we track; this page follows them as new ones ship.
33 changes across 5 releases
- Camera streaming support for local-only vacuum robot web interface with safeguards and ethics messaging
- dustsrc GStreamer source element for video capture from proprietary vendor firmware
- MPEG1-based video streaming using jsmpeg library for HTTP-only transmission without WebRTC
- Stylized 90s CRT-themed video renderer using WebGL to display camera feed
- Dedicated camera page in the web interface with fullscreen support
- Add map annotations feature to mark passable thresholds, curtains, ramps, and other elements the robot needs to be aware of on the map
- Support segment floor material type carpet with three variants: low-pile, high-pile, and carpet
- Expose Dock Components (Freshwater, Wastewater, Dustbin, Detergent) to Home Assistant via MQTT
- Support room cleaning via MQTT starting with Home Assistant 2026.5.2
- Add WASD keyboard controls to Manual Control UI
- Add ability to select between Joystick, D-Pad, or Keyboard Controls in Manual Control UI
- Dock component status view showing individual component status for supported robots
- Robot options grouped with sub-headers to improve UX on robots with large option lists
- MopDockMopDryingTimeControlCapability to control mop drying time in the mop dock
- AutoEmptyDockAutoEmptyDurationControlCapability to control auto empty duration of the auto empty dock
- CleanRouteControlCapability with context metadata properties to handle varying vendor implementations
- Support for Dreame L20 (MR813) robot
- Support for floor materials visualization on the map
- Camera streaming feature is disabled by default and hidden from menus when off to avoid persuasive dark patterns
- Video streaming uses HTTP instead of WebSockets for better reverse proxy compatibility
- Update Virtual Restrictions UI to use a grouped button layout, reducing from three rows to two
- Implement map annotations for Dreame robots starting with X/L40 Master/Ultra models, with thresholds available on older Dreames back to L10s Ultra
- Add Midea implementation for map annotations
- Update documentation framework from Jekyll to eleventy with improved styling and visual identity
- Valetudo can now replace itself with a cloned process instead of performing full system reboot during updates
- Replace default Roboto font with IBM Plex Sans for improved visual identity
- Redesign map view icons with multiple visual elements and subtle gradients instead of flat single-color circles
- Implement automatic mipmap generation and raster graphics rendering for SVG icons to improve performance
- Adjust red and purple colors of virtual restrictions to better fit the map visual language
- Display text on map within pill-shaped containers for improved visual consistency
- Improve zoom level handling so text and icons scale more sensibly at different zoom levels
Original release notes, newest first
The list above is our reading of these notes; the originals from Hypfer are here, one fold per release.
2026.08.0Valetudo 2026.08.0
Camera Streaming — Yes, really
I've put an em dash there as a jumpscare. If you didn't notice, I have bad news for you. You might've previously been exposed to AI writing without you even noticing.
(These release notes are quite inline-video-heavy, so for the best experience, I recommend reading them on github.)
Duststreaming
Why (only) now?
So while this always was a technically complex thing, the main blocker has always been an ethics one.
Because the software works and because a good Valetudo user is a self-sufficient invisible one, in my daily grind, I - for the most part - do not get to interact with you cool people. Instead, I get to experience the absolute worst consumer smarthome tech + foss has to offer, which historically made me quite hesitant to implement a technology with as much abuse potential as camera streaming on vacuum robots.
I did however eventually realize that letting this decision be guided by the most terrible of people in a sense means supporting these guys in making the world worse by stripping us of cool stuff. So I sat down and found a solution.
The feature now exists, but it comes with safeguards and a lecture that strips away any sort of plausible deniability for bad behavior. I cannot stop people from being shitty, but I think I’ve managed to ensure they'll at least feel bad about it when they are.
Additionally, I do believe that the messaging in there is genuinely useful and extends beyond just vacuum robots, but you tell me. You can of course also just skip it by typing skip.
Design notes
This whole "designing for better results" doesn't stop there, though.
It extends to the feature being built with non-adoption as the goal. When it is off, you will see no mention of it in the menus other than the toggle to turn it on.
This avoids the classic silicon valley thing of putting something disabled in front of you to make you feel like you're missing out - just so that you're to blame when you eventually do what they've funneled you into doing. With Valetudo, not having the spycam enabled is not just an option but the default people should hopefully gravitate towards.
But, when you decide to enable it, you get cool shit, which we - now that this is all out of the way - will now get into.
History
But first: History.
How do you even build camera streaming for a local-only vacuum robot webinterface on a custom proprietary vendor firmware?
Getting Video
Well, it starts with one thing. I don't know why the allwinner non-mainline kernel kept crashing. It did however matter how hard we tried.
"We" being @Vivia here, who decided to take a break from hacking on gstreamer at work to do some recreational gstreamer hacking vacation instead.
The solution is dustsrc, which is a source element that does v4l, but just enough v4l to not scare the kernel.
You can find her talk about it here: https://indico.freedesktop.org/event/11/contributions/516/
As you can see, that was 2025, so a lot of patience with me coming to terms with that ethics dilemma was involved. Thanks, Vivia!
Transmitting Video
So that's how we got frames, but how did we get them into the UI, given that Valetudo is http only, and with that cannot do webRTC. The answer is yet again some FOSS wizardry.
13 years ago, @phoboslab (which you probably know from other cool stuff like the quite okay image format) likely must've noticed that the mpeg1 patents had expired, meaning that one could just use the codec for whatever one likes. The "whatever one likes" then became a canvas/webGL based mpeg1 player in pure JS, which bypasses all of those limitations of "more modern" (and Google W3C-approved) ways of doing Video.
Now, 13 years later, it - in a vibe-mutilated form (sorry) - powers vacuum robot camera livestreaming.
And, since it's just http and no websockets, it should also just work with whatever reverse proxy setup you might be using. Though, I have not actually tested that, so you tell me.
Rendering Video
Because normal video players with their "buffering" loading spinners and HUDs and all are boring, the way video is shown in Valetudo is stylized, imitating a 90s CRT displaying an analog RF Signal.
The way this was implemented was - of course - LLMs, so whether it actually has more soul than a dreadful spinny circle is debatable, but the result nevertheless fills me with joy.
https://github.com/user-attachments/assets/45858dc4-f2e4-4c37-be88-8bbcda54cd2c
As you can see, it clearly intuitively conveys the connection and stream state, without actually telling you the connection and stream state. And it does so while also being fun.
I went for vibes but not necessarily full period correctness or accuracy, so if you're a shader wizard and better nostalgic hacker than me, feel free to open a PR to make it even more 90s CRT. I'm after all just a fake suit pretending to be a hacker by glueing together the stuff of other people into a product.
Cool, how do I use it?
So that's the renderer thingy. But where can you see it?
First of all, on a dedicated camera page. It's boring in the sense that it just shows the camera and you can click on it for fullscreen. You've already seen that one, so it's just shown briefly in the upcoming demo.
https://github.com/user-attachments/assets/99037a58-4249-4dec-8778-2e2c7f9e66e3
The next place is the manual controls view, which with that gains a live feed that shows you - with some lag for extra fun - where you're driving.
That works so well, I can't wait to see what people build/do with it.
https://github.com/user-attachments/assets/e78b6abd-0e54-43ee-8b39-d8224255d08c
Lastly, there's the spectator map, which combines video feed with map feed. On desktop, you get a PiP mode, where you can cycle through PiP window sizes like you'd expect from the usual game minimap UX. On mobile, you get a split view instead.
Valetudo-wise, that I think concludes everything that could sensibly be done with a video feed - with implementations I am very happy with, doing everything I would want them to do as a user.
The bigger picture
Here's the best part though: This could extend beyond Valetudo.
Because this is literally just local http with no cloud dependency, account requirement or app-only limitations, you can build stuff on top of this.
We had a bunch of ideas already while brainstorming.
For example, what about VRchat (VR meaning vacuum robot), where you have a warehouse with robots with bidirectional audio (remember: they have microphones), allowing people to connect and interact with one another through the bot avatars. Think metaverse but without the lizard.
All you need is like a queue proxy server in the cloud + some warehouse with bots. Less than 10k€ total for sure for a somewhat time-limited Art exhibit.
Or what about bot soccer using manual control? Or the vacuum robot racing league?
Or maybe something like botroulette, where you can give a stranger 5 min of time to drive around your home + some contact form afterwards.
Or - like shown earlier to demonstrate manual control - an impromptu rover thingy. Just pair the bot to your phone hotspot, then use the Valetudo UI on your phone to steer the robot somewhere outside without other wifi infrastructure.
There's so much stuff people could do just because this is not chained to a specific vendor-defined experience. Remember when computers were that? General computation devices instead of prebuilt experiences to consume?
Anyway. I would love to see people do cool shit with this. Have fun!
Some additional unordered thoughts
These did not fit into the narrative arc above, so here they are instead.
Mower cameras
I was at the local hardware store the other day and saw these mowers. Can you see why I found them interesting?
Their cameras point down to the ground, which is different from the vacuum robots which point straight forward - and with that see a lot more stuff not meant for their digital eyes.
IR cameras
Duststreamer also runs on the Roborock S8, which has this IR only cam. That was interesting, because it saw nothing (besides its own IR lasers) while indoors with LED lights only.
However, take it outside and it starts seeing things
And, if you take it back inside, all you need is an old incandescent bulb and its waste IR radiation to see:
Robot dashcam
Idk I just found this fun. I hope you'll find it fun too
https://github.com/user-attachments/assets/29619285-e8ef-4f95-93c9-47eeb7f3175e
The usual
If you like this release or Valetudo in general, you might want to consider donating:
https://github.com/sponsors/Hypfer
https://builder.dontvacuum.me/donations.txt
Autogenerated changelog
Features
- vendor.midea: Duststreaming
7ddc02e - vendor.roborock: Duststreaming
48545f2 - vendor.dreame: Duststreaming
90dc810 - ui: Duststreaming
d9fe988 - core: Duststreaming
fb39d93
Fixes
- ui: Harmonize secondary labels
5edb195 - vendor.dreame: The set of states that can be resumable extends beyond just docked
7a2e09b - vendor.dreame: Misc manual control improvements
064cb88 - vendor.midea: Fix semantic_slam_node crashlooping on J15 Max FW 558
ccda25e
Chores
- release: 2026.08.0
c249e72
2026.07.0Valetudo 2026.07.0
Map annotations, carpeted rooms and updated moderation
I've been using some downtime to clean up my shelf, which is basically the entirety of this release.
Map Annotations
Map annotations are the generic concept to house any kind of "there is something on the map the robot needs to be aware of, which might not be reliably auto-determined". For example, depending on firmware support, that could be a passable threshold, a curtain, a ramp or similar.
These things existing in the map make the firmware behave differently in some way relating to the location they're at. It might then take a specific path or trust its obstacle avoidance less or really anything like that.
This feature took me quite a while, not because the code would've been complicated, but because the concept should be easily adaptable to the future. At least as adaptable as something can reasonably be while trying to predict the future.
I again had fun designing some more custom icons, but I can't tell you more about that, because that happened 6-8 months ago and my memory of it is by now a bit fuzzy.
In said predicted future, there might be more map annotations. Though, as always and consequently, I will refrain from just mirroring the vendor app verbatim.
For example, Dreame has "non-passable thresholds" which, to my understanding, logically achieve the exact same as virtual walls. I can see why for UX they have them as a counterpart that exists in the same view, but also, for UX reasons, it's kinda dumb to have two different things that do exactly the same. .. or I am just missing something, but I did at least ask the support and they didn't know either.
What do we have?
For now, on Dreame, starting with the X/L40 Master/Ultra, we have thresholds, curtains and ramps. On older Dreames going back to the L10s Ultra, we only have thresholds.
Unfortunately, I have none of those things at home, so I cannot personally test those things much. I've already asked users to test the nightly build and heard back good results for thresholds and curtains, but ramps are still a big mystery.
So please, let me know if those ramps (and the other annotations) work for you.
What they should do is:
- For thresholds, the robot should be able to better climb them through being aware that they exist and driving accordingly
- For curtains, the robot should be able to clean below them through ignoring the "THERE IS A SOLID WALL" info it receives from its Lidar
- For ramps, the robot should take the designated path to reach an otherwise inaccessible area
https://github.com/user-attachments/assets/162c5323-2de5-43d4-acb6-d286f980b177
I also have the Midea implementation here, however, that has not seen any testing so far, so for this release, it's only Dreame. Also, no ramps there.
One thing I am not quite happy with yet are the visuals in the map. Especially the colors, but honestly everything. So if you have thoughts/ideas there, please let me know!
The only thing that will for sure stay is the wavieness of the curtain. A lot of tuning went into that.
Virtual Restrictions UI Cleanup
Since I had to implement this grouped button for the Map Annotations anyway, I've also updated the Virtual Restrictions UI to use it:
Much better. Still two rows, but not three.
Segment Floor Material Type Carpet
Staring at firmwares, I've noticed that Dreame has, for probably a few fw versions, supported setting the floor material of a segment to carpet. The existence of fully carpeted rooms has finally been acknowledged by big tile.
So now you can do that (if supported by your robot).
There are up to three types of carpet floor material. low-pile, high-pile and just carpet. I think the visualization turned out quite well.
Additionally, I've once again looked into why Dreame bots seem to not want to remember the segment material. I found another possible culprit, and, in my testing, it didn't happen anymore, however, you tell me.
Fingers crossed (again)
New Dreame Firmwares
As announced in dust_announce, new firmwares for the Dreame X/L40 Ultra/Master + the MOVA P10 Pro Ultra have been added to the dustbuilder. They come with an update to the obstacle avoidance model as well as probably logic changes.
What else is going on?
As with the last release, most of the meat is within this section.
Rooting all the things
Starting off with something non-Valetudo, I got a rootshell on my 2018 Bosch EBike's Nyon display:
This now exposes an API with data that should've been there in the stock firmware
So that's kinda cool and completely not ready to be shipped.
Now that I'm there, it's not all that difficult to pull off, but the way up to there took a while.
Anyway, I'm not exactly sure where to go with this. Lots of questions still to be asked and answered. But be advised: It's possible.
GLM-5.2 has been super useful there. Cool model. Can't wait to someday run this class of LLM at home on my own hardware.
Valetudo Moderation
The Telegram moderation bot Easterwave received some love now that Telegram allows for sending ephemeral messages that are only visible to a specific user. This way, the bot can now provide feedback to a user, which is the first component of a feedback loop.
Additionally, I've added some further regex patterns, which should reduce the amount of people I need to manually ban.
Combined, this might make people hate me less, because suddenly they have some feedback + it was a machine that did it. But also, and more importantly, less interrupts for me through stuff that is incorrect (rel: XKCD 386) and with that more unfragmented focus time.
On solving social problems with technical solutions
This is actually a fascinating topic, because common wisdom would tell you that you cannot solve a social problem with a technical solution. And that is true, but, interestingly, consumerist entitlement is so devoid of humanity and so formulaic and script-based that it actually starts being trivial to be countered with mere regexes.
This makes a lot of sense, because corporate processes are standardized to conserve energy and be optimized. So, consequently, the bypasses to them would also be standardized to conserve energy and be optimized. And, consequently to that, the bypass blocker can equally be standardized (and written as a simple regular expression) to conserve energy and be optimized.
For example, let us consider this regex:
/is there (?:a |any |some )?(?:particular )?reason/i
It is beautiful, because, within the context of FOSS like this, it basically exclusively triggers on bad faith. That arrangement of words is inherently unnatural, stilted and inauthentic, because it is an engineered wrapper to bypass corporate HR firewalls.
The actual message there is "I don't like this." or "I want something." or "I believe it should be different", but those real statements would be shunned when said like that. So instead, it gets wrapped into this "curious inquiry" standard issue wrapper.
"Dear sir, I was just wondering why you did this." [...] "I am outraged that you would act with this kind of hostility to a mere question"
You get the idea. Something something sea lion.
The purpose of the wrapper is to make any action other than compliance be an illegal move. And, if you as a FOSS maintainer (or really person in general) play by those rules, you either become a martyr or persona non grata.
If you take a peek at the code, you will find a bunch more of them. You might find that interesting. You might also occasionally find yourself using the same scripts. I do, at least. It is - after all - an environmental poison.
Which is also why some of those regexes will fire even though people aren't being actively malicious. We've just all absorbed the inherent maliciousness of our environment and, unfortunately, sometimes reproduce it without noticing.
Another good reason for having a bot deal with it instead of another human.
Positive outlook
To wrap this side-track up and go from discussing dont's to proposing do's, let's look at how to not trigger that mentioned example regex.
At its core, good faith communication would not try to hide the true motive but run with it. For example, a phrasing like the following would work better:
"I expected the thing to work like this, but instead it works like that. Now I'm wondering why that is"
As you can see, it succeeds through putting all the cards on the table right away, instead of trying to hold some back for later leverage. It approaches the other party with respect and at eye level, telling them exactly where one is coming from, what drives them, and what their true goals are.
This of course requires the goals to not be ones that would be shunned by society if put plainly, but that is the whole idea behind this exercise.
Anyway, for some reason, I regularly forget that I can just use software to solve issues I have, just to then rediscover that possibility and be full of joy. Not sure why. A very weird loop.
But also an important reminder that the game of social interactions is rigged against my people and playing by the rules will just get you into a bad place. Hence, you need to hack it, automate it and conserve energy for the things that matter.
I am curious what the future will bring there. Imagine your rooted cyberpunk implant running a bullshit filter in real time. Possibilities are endless and just limited by the fact that there are no such implants and this is all a pipe dream.
But one can dream. How would we even solve latency?
Some cool use of LLMs
I have learned through extensive exhaustion that my ramblings aren't always easy to decode for people. With the advent of LLMs though, I have found a great solution to that. I can use them as some kind of translator-ish machine. A translator that sometimes doesn't work at all - certainly not on autopilot - and if it does, it's still a lossy translation.
I have so far rather successfully used this tooling in a feedback loop to extract what makes its communication work and improve my own mental model, and, eventually, reduce my token spending. But, there is still some way to go, so, for your convenience, if that "the game" thing was a bit too obscure, Gemini did (I think) a good enough job at decoding my ramblings:
At its core, "The Game" is an unwritten, continuous negotiation over who has to spend cognitive and emotional energy. If we look at human social interaction as a distributed system, The Game is the protocol normal society uses to resolve conflicts, establish hierarchy, and allocate resources (the resource being attention and effort).
You all know this (possibly subconsciously), but not all of us are equally well equipped at birth to actually run this in hardware at scale. This is.. not ideal, because it presents this arbitrage opportunity, where great amounts of value can be extracted at a bargain through various known patterns such as exhaustion attacks, traps or just general force.
Anyway, cool prosthetics. The bot, but also LLMs. Don't let your pride (or "beauty standards") stop you from using one yourself if you should require one. And don't just sign up to a (metaphorical) subscription for it, please.
One more thing
That management book I found in a public bookshelf while on vacation told me that you should end with "one more thing" because Steve Jobs did it. So.. one more thing:
Expect new robots in the hopefully near-ish future. We've been finishing up most of that, but there are currently some infrastructure topics blocking the finalization.
We're now looking at 8GB eMMCs, which doesn't exactly bode well for the current dustbuilder deployment, given that everything is much larger. So yeah, this dumb shit is what slows you down. As always.
The usual
If you want to see Valetudo on more robots and/or like this release, you might want to consider donating:
https://github.com/sponsors/Hypfer
https://builder.dontvacuum.me/donations.txt
Autogenerated changelog
Features
- vendor.dreame: MapAnnotationsCapability
58446b8 - ui: MapAnnotationsCapability
49bee99 - core: MapAnnotationsCapability
f1db08b - ui: Reduce virtual restriction edit map button count using a unified add button
80a3c25 - vendor.dreame: Segment material type carpet
a975c3a - vendor.dreame: Map two more error codes
6889856 - core: Segment material type carpet
cdd6710 - vendor.dreame: Add fan speed turbo quirk
b4e3326 - vendor.midea: Various no-up handlers for stuff in J15Max FW 558
72226e9
Fixes
- vendor.dreame: Pass the mapId when saving segment material to maybe fix reverting material settings
e18dfcd - ui: Some client_structure cleanups
345dab4 - vendor.dreame: Fix Deep carpet cleaning quirk gracefully handling the firmware saying no
371812c - End logWriteStream instead of closing it
df740d9
Chores
2026.05.0Valetudo 2026.05.0
Some stuff you may find useful, lots of prose
The last release notes opened with
A surprising amount of relevant things has happened since the last release.
Unsurprisingly, for Valetudo features, that momentum was not kept up. But still, a lot of things happened. A lot of stuff always happens.
MQTT / Interfacing with Home Assistant
The meat of this release is in here.
Dock Components
As promised in the last release notes, Dock Components (Freshwater, Wastewater, Dustbin, Detergent) are now exposed to Home Assistant via MQTT (depending on your model of robot and Firmware of course).
This should make for some neat new automations.
Room Cleaning
Lately, the vacuum entity in Home Assistant gained the ability to start a cleanup on a selection of HA Areas.
Starting with HA 2026.5.2, thanks to @jbouwh, this can now be done via MQTT.
And, starting with this Valetudo release, thanks to @jhbruhn, it can be done with Valetudo.
I have slightly mixed feelings about this. I can see myself personally using this and it is objectively useful, but it also pushes Valetudo further down the stack and more into invisibility. That might possibly have negative long-term impacts, however, with my cries of "I exist" being as loud as they are, this might already be compensated for.
Manual Control UI/UX Improvements
Why did I not add WASD controls sooner? It's the obvious thing to do, so why didn't I?
It's fun!
Also, as you can see, you can now just select if you want a Joystick, the D-Pad or Keyboard Controls.
I remember someone asking for this at one point, because iirc their partner liked the D-Pad better or something like that? There you go.
Eternal life
One day, I woke up and thought
Hey, doesn't fork() + exec() mean that the process clones itself and then swaps out its internals with something else? Can you do that on yourself?
Answer being
Yes, that's execve()
Follow-up question being
Can I just patch my nodejs runtime to expose that to Valetudo?
Answer being
Someone beat me to it.
https://nodejs.org/docs/latest/api/process.html#processexecvefile-args-env NodeJS can do it since v22.15.0. Valetudo (at the time of writing) uses v22.18.0
So, if Valetudo senses that its time has come, it can now write down its last thoughts, then replace itself with a clone and just continue as if nothing ever happened. I take great joy out of building mini sci-fi horror stories.
But why?
There are currently two use-cases for this:
Updater
First one is the updater not doing a full system reboot. That's very nice, but might possibly expose some yet unseen side-effects.
We shall see. It could easily be deactivated and rebooting was fine, but this is quicker, less disruptive, and also fun and cool.
Failsafe
Second one being Valetudo no longer killing itself if it ever reaches 1/3 of system memory.
This hasn't happened since probably at least 5-6 years, however, with the Midea bots no longer rebooting nightly, after a Month of uptime, someone found no Valetudo on their bot.
Ideally, you would fix this at the root, but the root - at least as far as I can tell - is not to be found in my JS code, but might instead be in the runtime itself.
Replacing yourself with an identical clone with a memory implant is thus the next best thing to a solution to issues such as memory fragmentation or tiny leaks.
Docs
The docs have been redone framework-wise. Content stayed the same, but tech and design changed massively.
Gone is the old, outdated and stale Jekyll version. In is eleventy (a JS-based generator).
Additionally, styling was greatly improved and now embodies the somewhat distinct visual identity Valetudo eventually grew.
This broke a few permalinks, so if you're coming from a third-party guide, [clarkson laughing at you meme].
What else is going on?
Welcome to the more blog than usual section of the release notes.
Marstek Venus A
I bought a battery storage system for my solar setup. It comes with very attractive pricing (170-220€/kWh), is modular, expandable and has an ethernet interface.
It is also majorly broken and not for the faint of heart.
This thing is pain. Everything about it is pain. They've moved from single units to a modular architecture, but the firmware doesn't really support it.
Meaning that if you add a new battery module later, the system just breaks until you pray to the support, which is ignoring your tickets. So you instead contact the leaked email address of some random parent company employee and beg that they push an update via the cloud. And then it still doesn't work.
The ethernet port was a great upgrade up until the point it stopped negotiating at fast ethernet speeds and just dropping offline. Now, with the port in the switch forced to 10Mbit half-duplex, it works. Question is for how long.
But, I am now immersed deeply enough into its inner workings to not throw it into the trash. Thanks sunk cost.
First thing I started with was getting rid of the App. This sorta worked and produced Venuscontrol, which is a WebBluetooth reimplementation of said app.
It however doesn't do OTA Updates, and, as said above, you kinda need those if you want to do.. anything really.
If you're looking for something to hack, please, build a non-insane custom firmware for this thing. From my understanding, those aren't signed, so you can just flash something else if you want. But maybe double-check that.
If you do just want a thing that works without the cloud.. uh. well. I suppose you could buy just the Master with 0 Expansions. That should probably work and is attractively priced.
But I dunno.
BambiHeavy
After upgrading my living room from "Ikea galore" to "damn, you're 30 now. It is mid-century time.", it was time for a new TV. This was a great opportunity to again learn why local businesses are dying and how doing anything else than buying online is a bad idea.
But anyway, before the return odyssey, this gave me 18h with a Philips-branded OLED TV. The brand however no longer belongs to the dutch conglomerate but some Chinese corp called TPV Technology. Same goes for "Philips Hue" which is also not Philips but Signify (7.54% annual dividend yield, btw. Fairly consistently.)
This split appears to have eventually led to a fallout between those two new corps, ending with Philips Hue lights and Philips TVs no longer playing nice with each other.
Recently, possibly in an effort to improve margins, Philips TVs moved from Android TV to TitanOS, which is some.. startup? I dunno. It's some Linux thing, which is just customizing the SOC vendor SDK. Basically it's a Vacuum Robot with a screen.
Firmware updates were signed but not encrypted, so it was an interesting dive into the thing.
Learnings
- The OSD is just some HTML pages.
- The rest of the Firmware is just duct tape.
- The ambilight demos (I forgot to take pictures :( ) are just WebGL demos from random places on the web (including codepen).
- There was a 20€ Invoice PDF in that firmware, documenting the purchase of some background music to be used in said demos.
OLED, at least in that implementation, is bad tech. It can be super bright, but only if just a small object on screen is. If the whole screen has to display something bright, it auto-brightness-limits itself to "broken CCFL in a Thinkpad T60 waiting to be replaced".
There is an OSD option to disable that, but then it just switches to that low brightness at all time. Utterly useless.
Add to that that OLED can get sunburn (yes, really!) - meaning that you should not put it up in a room with windows - and you find yourself mentally cursing at the world, the shop, the salespeople and yourself for not just buying it online.
Of course, being the lokale Einzelhandel, you cannot just return the thing and get your money back. Instead, you have to buy something more expensive from the store.
So now I have some slightly used Sony Bravia 5, which was the only non-shit non-OLED TV they had in stock. It's alright I guess. Would've just been cheaper when bought online.
What to do about it
But anyway, the cool thing about the Philips-branded one was that Ambilight. Even having it for just 18h was enough to make me miss it. So I've pondered what to do.
Could do Hue entertainment, but that needs the proprietary Hue Bridge + the Hue Sync box between TV and content source. Could do Hyperion, but that needs you to usually have very little expectations when it comes to aesthetics. Could maybe.. solve it in software?
One cool thing that has happened is that someone reverse engineered the proprietary "Hue Entertainment" extension to the Zigbee protocol. That's their secret sauce that enables a light update rate up to 25 updates per second.
This also was implemented in Zigbee2Mqtt, meaning that if you have Hue lights that support Hue Entertainment, the only missing piece is transforming screen content into light commands. Thus, I figured that that might be a great test for Qwen3.6-27b and its abilities.
Now, there is BambiHeavy which does just that:
https://github.com/user-attachments/assets/a1db0c37-d7fc-4809-9c25-7f9363880586
It's alright. I'm mostly happy with it; apart from some minor tweaks to be done. All in all, Project Hail Mary looked great with it.
It is still vibecoded jank, but you may find that useful regardless. You may also find knowing that Z2M can do Hue entertainment useful, because Ambilight is just one use-case for that.
Someone please build a cool music visualizer. Maybe hook up squeezelite to it?
Hotline Valetudo
In my continuing efforts of pivoting from "building software" to "making performance art that somehow also does real useful things", I've felt like leaning in some more on the corporate satire.
Therefore, the Valetudo Premium Support System VPSS is now available via +495021 / 9039940.
For privacy reasons, caller ID suppression via prefixing with #31# is advised, but you do you.
You can also run it locally if you do not want to pay for calls to germany. It's exactly the thing committed to GitHub.
Hopefully you will have fun.
Also, equally hopefully, some entitled idiot will gloss over all communication in the docs, skip right to the premium support hotline, and end up in a hell of his own making. Please hold the line.
Meta
Qwen3.6-27b has been pretty much essential in all of these fun little hacking side-things.
It effectively substitutes the raw energy, free time and "this is all new and interesting"-boost I had ca 10 years ago (and now don't) with GPU compute.
I think with these open weights models, vibecoding is here and here to stay.
I suppose one will just have to make peace with that, the same way one will have to make peace with suddenly needing glasses, hearing aids, or really any kind of augmentation to compensate for biological reality being inadequate. Which, I suppose, is fine, if there is no rent-seeking cloud landlord middleman.
Custom firmware hearing aids when?
Actually, I have no idea how good or bad that specific market is. I'm just pulling this example out of thin air without having any knowledge about it. Please correct me in the comments.
Either way, I guess the aforementioned LLM assistance could actually have a positive impact in the development of such tech that people truly own themselves. If we use these tools correctly that is. And if we don't shut off our brain entirely.
It would also be nice if the entry fee wasn't multiple thousand euros of hardware, but that's going to change with time (I hope).
The slightly less usual
Speaking of entry fee to AI, I've been hitting the VRAM limits of my 24GB RTX 4090 pretty hard and pretty consistently.
So if you have something with more of that (and equal or greater compute) lying around (e.g. decommissioned server or whatever), my NAS would be happy to receive an upgrade.
Beside that, as usual:
If you like this release or Valetudo in general, you might want to consider donating:
https://github.com/sponsors/Hypfer
https://builder.dontvacuum.me/donations.txt
Autogenerated changelog
Features
- mqtt: Room cleaning for HA 2026.5 and up
6bdef9f - ui: WASD manual control
80cf405 - updater: Allow force updating to the same version for dev testing purposes
38b943a - Biblically accurate exception handling
b786064 - mqtt: Publish Dock Component Status to MQTT
5d905ec
Fixes
- vendor.dreame: Obstacle naming
149a205 - vendor.dreame: Add additional model IDs
6c51d72 - vendor.dreame: Disable postWriteDelay for manual control commands
8a93d60 - ui: Some map touch handling cleanup
e9998d2 - webserver: Remove obsolete express-list-endpoints
00c61e3
Refactoring
- docs: Migrate to eleventy + redesign
0cf7d72 - vendor.dreame: Send all communication through the miot helper
6fc711d - vendor.dreame: Central miot helper
a9a5ab3
Chores
2026.02.0Valetudo 2026.02.0
Features, Robots, Maintenance and everything in-between
A surprising amount of relevant things has happened since the last release. I'm not sure how, given the comparatively short time frame. But it did, so here's me talking about it.
Features
As said, a ton of stuff happened, but first, let's focus on what you as a user will see.
Dock Components
On robots that support it, the controls for the Dock have been updated with a status view for all the individual components:
This starts off collapsed and only renders expanded if there is something going on.
The icons are custom and were made in-house by our janitor that likes to go on long philosophical tangents.
In the next release, I'd like to expose these to MQTT for even better automations.
Robot Options
On the most recent supported robots, the list of options has grown to a size that was becoming actively harmful to the UX. Having dabbled in the vendor apps and done some market research however, it was clear that hiding everything in submenus would be worse, as those suffer from bad organic discoverability.
Thus, it's now both.
By grouping and introducing these sub-headers, the wall of text has been broken up into something a lot more mentally digestible.
New capabilities
Now that we have all this new free conceptual space + the idea of "discoverability" fresh in my mind, I've turned to the quirks and found some worthy of hoisting up into their own capability.
MopDockMopDryingTimeControlCapability
This one controls the mop drying time of the mop in the mop dock.
AutoEmptyDockAutoEmptyDurationControlCapability
This one controls the auto empty duration of the auto empty dock.
CleanRouteControlCapability
This one... was surprisingly hard, because of vendor behavior varying a lot more than you'd want it to for a unified capability. What might apply to "just mopping" on one vendor might be for all cleanup tasks on the other. Also, some options might be one-time toggles.
Fortunately though, the very extensible concept of capabilities having properties that are context metadata did provide the solution here.
New Bots
In the 2025.08 release notes, I wrote
Extrapolating from the current state, it is unlikely that we will see many more new Dreames being supported by Valetudo.
So what is this then? Well... did you spot the two modifiers in there? "many more" and "new".
While I am an ideological hardliner on principles, I'm not one on purity for the sake of purity. I do not need to shoot myself into the foot to "make a point" (usually unsuccessfully).
Truth be told, the method is the same for these bots. The research does carry over. These are just low-hanging fruit we shall pick, because why wouldn't you.
Dreame L20 (MR813)
I do not like this robot. It offends me.
This definitely is in part due to residual anger and memories of people pestering me, telling me how great it is and how it is of utmost importance to be supported. But it also is due to the robot itself.
"Sports Utility Vacuum" is the term @aep coined for it, and it fits perfectly. While it can do regular vacuum robot things, just like an SUV, it does so worse than a normal one.
Here's my list of gripes:
- The dock is positively ginormous for no benefit + at least my unit regularly struggles to dock properly.
- The robot itself is higher than it needs to be due to the mics in the tower bumper for the useless voice assistant feature (I think this bot started that?), meaning that it fits under less furniture
- The design was an overly complicated dead end due to various reasons beyond the choice of a different SoC
and 4. Due to that failed overengineered design + what I assume are contractual obligations, there are now two completely different bots both named L20, with only the second more-like-the-rest-of-the-lineup one being the one that is rootable.
The L20 Ultra is a monument to bad business decisions. I don't know which exactly and neither do I have solid proof, but the stench is hard to oversniff.
But anyway, the "L20" with extra quotes (the MR813 one) now is also supported by Valetudo.
If you buy the right one (and be very careful that you do based on its SN), it will work like the other bots. The win here is not this robot but an improved ability to source a supported robot.
Also it does run the same SW so on that side it's not all that different. Interestingly though, they've stripped miio from that firmware, but that was easy to fix through frankensteining something.
Why from that older bot only and not from e.g. the X40 is beyond me though.
Bonus (and also segue):
In some regions (not mine tho), there is also an L30, which is the L20 but with a water heater in the dock. Apparently, a knee-jerk reaction to Ecovacs releasing that feature first; taking away the crown of features from Dreame.
Same bot with minimal changes to its dock. New SKU. Purely reactive.
Dreame X30
I said segue. Why did I say segue
The Dreame X30 is a bot that did not really happen.
It was announced by Dreame, just so that they could then announce the X40 before the X30 was even available for purchase yet. This again was a knee-jerk reaction to Roborock releasing a new Flagship with an extending side brush; taking away the crown of features from Dreame.
So no one really bought this thing, because it was obsolete before it even launched.
Being close to an X40 (minus some suction, extending side brush, newer SW and a different front camera/LED assembly design), it is a good bot. You can still get it new for decent-ish prices.
Valetudo Home Assistant custom_component
A while back, I've announced that there were Valetudo Icons for Home Assistant. The solution there wasn't great and didn't fully work.
The only way to get it working properly is to have a full custom_component, which eventually was created. That thing sat dormant for a while but now comes with a feature a lot of you have been waiting for:
Once configured, it will enrich all discovered Valetudo Robots with an "Estimated Segment" sensor.
This is experimental, but I've heard from people that they're happy with it, so I suppose it works mostly reliably.
You can get it here: https://github.com/Hypfer/hass-valetudo
Goodbye Create React App
Valetudo's frontend used CRA, which was unmaintained since ~2022 and sunset in early 2025.
While it has served Valetudo well, it was also responsible for a ton of completely unused dependencies + npm audit constantly complaining about many vulnerabilities (none of them actually affecting Valetudo).
Getting rid of it was long overdue, but, the sheer amount of understanding of the tooling required to do so kept me from doing it. .. but then I remembered that LLMs are a thing now. They're like.. exactly the right tool for this job. They're boilerplate comprehension machines.
So with that tool assistance, I got to work and cleaned up the massive wall of incomprehensible gibberish post-eject down to a much more comprehensible 300 line webpack config that does only what Valetudo needs.
While I am fairly confident, it would not surprise me if this broke something more subtle, so if you spot something, please let me know.
Maintenance
Speaking of changes that might break things, with CRA gone, dependencies were bumped. React is now v19 and ExpressJS is v5.
React just worked, but ExpressJS caused some breakage that should be fixed now.
Same applies here. If you spot something, please let me know.
Misc
- Segment Names are now rendered larger than in the last release. Thx for the feedback on that
- After having an epiphany, I found a way of implementing Segment renaming on Midea, so that's available now
- Dreame bots that support it now have access to the "Carpets First" quirk, which will make them clean carpets first
- New firmware updates for Dreame X/L40 Master/Ultra + Mova P10 Pro Ultra are now available on the dustbuilder
- The UI was polished some more, with the Valetudo colors now being used everywhere
Docs
There's even more. No matter if you're a newcomer or a recurring user, both of these things will affect you.
We (this time not the royal but the me, Dennis et al.) have managed to get rid of the clunky and proprietary LiveSuit for rooting Dreames.
The docs have been updated with the new instructions utilizing the FOSS sunxi-tools.
A lot less headache will now hopefully be had.
Additionally, I have updated the buying supported robots docs page with actual guidance again. The LLM told me that it reads the vibe as "you've met an engineer at a bar and he rambles on about robots", which is what I was going for.
What else is going on?
With the Valetudog going superfast in the 2025.11.0 release notes, Valetudo itself is now going the speed limit:
@NKnusperer, the absolute madman, took his passion for Valetudo to the streets. Did you know that there is an aftermarket for custom in-door light projectors? Did you know that these services accept arbitrary images?
There was no other way this discovery could've went. 60€ well spent.
I also really like how it might as well pass as some kind of new EV startup, and with that a prototype car or whatever. Which, fair, is easy, given that Valetudo is tech and EV startups are tech, but it's still cool!
If you also have a cool and non-commercial idea, art assets can be found here: https://github.com/Hypfer/Valetudo/tree/master/assets
I, too, have been creative with Valetudo lately. I hope that you will like it.
The usual
If you like this release or Valetudo in general, you might want to consider donating:
https://github.com/sponsors/Hypfer
https://builder.dontvacuum.me/donations.txt
Autogenerated changelog
Features
- vendor.dreame: Carpet First quirk
4589bbc - vendor.dreame: Map additional error codes
158c678 - ui: Add support for xm files
8363770 - vendor.midea: Dustbag dock component
8e020ef - vendor.dreame: Add missing metadata
8c2fefe - vendor.midea: DockComponentStateAttribute
8d483b7 - vendor.dreame: DockComponentStateAttribute
d771b4c - ui: DockComponentStateAttribute
cc3c6a2 - core: DockComponentStateAttribute
eaaa1bd - ui: Peent
4798616 - vendor.midea: MapSegmentRenameCapability
e2045ba - vendor.dreame: L20 Ultra (MR813)
12abbd3 - vendor.midea: AutoEmptyDockAutoEmptyDurationControlCapability
bc2445d - vendor.roborock: AutoEmptyDockAutoEmptyDurationControlCapability
4da60ae - ui: AutoEmptyDockAutoEmptyDurationControlCapability
597bf57 - core: AutoEmptyDockAutoEmptyDurationControlCapability
448e3ad - vendor.midea: MopDockMopDryingTimeControlCapability
1366c97 - vendor.roborock: MopDockMopDryingTimeControlCapability
0344ba4 - vendor.dreame: MopDockMopDryingTimeControlCapability
b3e1527 - ui: MopDockMopDryingTimeControlCapability
e550f9e - core: MopDockMopDryingTimeControlCapability
fe4e164 - Replace IntensiveMoppingPathControlCapability with more generic CleanRouteControlCapability
b08a3d2 - ui: Increase segment label name font size
eb3bde0 - vendor.viomi: IntensiveMoppingPathControlCapability
6a8c5ef - vendor.dreame: IntensiveMoppingPathControlCapability
63a761e - vendor.roborock: IntensiveMoppingPathControlCapability
f2568bf - vendor.midea: IntensiveMoppingPathControlCapability
9e75fd4 - ui: IntensiveMoppingPathControlCapability
5b08538 - core: IntensiveMoppingPathControlCapability
3849905 - ui: Valetudo Genuine Advantage™
cac7960 - ui: Group robot options into categories with subheaders
2b03afc - vendor.dreame: X30 support
8928887 - vendor.dreame: L10 Ultra also supports material
99a91f6
Fixes
- ui: UX cleanup of sidebar nav
0c82159 - vendor.roborock: Fix initialization of supportedAttachments after refactor
92dd06d - ui: Prod build
414d959 - webserver: Use correct new expressjs 5 syntax for optional path parameters
5ec1f5a - ui: Don't break the layout
76650d9 - vendor.dreame: L10spuh FW 1633 does not have a mop consumable anymore
4280e9a - vendor.viomi: Wait even longer for the firmware to think
fd9ec50 - ui: Fix goto marker scaling and draw order
2a1fb8e
Refactoring
- ui: Inline useless env.js file
9c0d22a - ui: Eject from now-dead CRA
4713182 - ui: Get rid of heavy libs that were basically unused
4558f04 - Pull initialization of supportedAttachments into ValetudoRobot base class
3a8cb21 - ui: Pull valetudo colors to a central location
2035cbd
Chores
- release: 2026.02.0
e4c924f - Bump transient dependencies
c41ee88 - ui: Formatting
1881c4d - Downgrade uuid once more, as it still leads to a broken build
0f589c1 - Bump and reduce dependencies
faf4813 - Bump some dependencies
b6b3417 - Bump some dependencies
6e9293e - Update PR template
61472d3 - ui: Update hint
30f7f12
2026.01.0Valetudo 2026.01.0
Starting fresh into the next demi-decade
Kicking off 2026, Valetudo now comes with improved visuals. Don't worry, it's not YouTube. You can stop screaming. The soul is still here. I'm just iterating.
A new font
Most central to this is the new choice of font. Replacing the default material Roboto, Valetudo now uses IBM Plex Sans.
I really like that font. It is mostly Helvetica but IBM and with some twists and interesting visual features. Compared to Roboto, which is engineered to be in the background, IBM Plex Sans tells you that it exists and has something to show to you.
Beside the merits of the font itself, I think out of all corps, IBM is probably the most aligned with what Valetudo is. When I think IBM, I think massive Mainframes, sturdy Thinkpads and lasting substance. Serious business that didn't bother with petty nonsense like rebranding or new logos since the early 70s.
They are a corp and have skeletons in their basement for sure, but for the most part, they just do their thing, building their International Business Machines and keeping the world running. A refreshing contrast to the rest of big tech, currently at the forefront of dismantling democracy, turning everything into dysfunctional gambling, just being evil and generally setting things on fire.
Of course, I'm also writing this to invoke Cunningham's law and get someone to tell me about all the evil stuff IBM does, so that I can return to my cynical baseline.
Anyway. I think this gives Valetudo a more distinct visual identity, which fits the maturity and spirit of the project.
Improved icons
Being stuck sick at home and not attending 39C3, I still wanted to do something that isn't hacking vacuum robots for a change. Fortunately, I have this whole project that comes with many different hats I can wear, so I've decided to wear the design hat and take a vacation from Valetudo by working on Valetudo.
The map view always felt a bit like it was built by an engineer; possibly because it was built by an engineer. Therefore, I stared at it for a while and pondered why that is. 🔮
After investigating at what the vendors do and what makes their visual language tick, I noticed that my icons were just.. bland and flat. A unicolor gray circle on a gray background.
So the first thing I changed was to add more visual detail. Three circles are more interesting than one circle. Additionally, I've noticed that the vendors use slight gradients to give the icons presence in the space instead of appearing like someone layered cardboard cutouts on top of something. So I did that too, and indeed it suddenly starts feeling much better.
Just by looking at the comparisons, I could not tell you that there is a gradient now. It just feels.. better. So that is neat. As it should turn out however, Firefox got very unhappy rendering all those gradient-filled SVGs at 60fps.
I suppose that makes sense. Filling a simple shape with a single color is much less computationally expensive than calculating the color to fill with for each single pixel. It also doesn't help that the map renderer architecture is not at all following best practices on how to build performant 2d graphics.
So that came with a technical detour, adding automatic mipmap generation and letting the renderer use raster graphics instead, while still keeping the visual clarity of the SVGs.
While I was at it, I've also cleaned up some other performance issues. For example, also caused by the architecture, using shadows and blur on the canvas completely tanks performance due to.. idk I didn't care enough at this time. Something something very large things to draw.
Lastly, I've made the red and purple of virtual restrictions a bit less pure red and purple, as those didn't really fit the rest of the map.
Improved visuals
Beside icons, other visuals were also improved.
For example, text on the map now comes in these pills:
This greatly elevates the look from "meme-font Impact with black and white stroke" to "how all the other vendor apps are looking", which isn't always a correct goal, but this time it sure is.
Additionally, handling of zoomlevels was improved. The text now scales more sensibly and so do the icons. For some reason, past-me thought that icons must never get smaller than x pixels, leading to this abomination:
Now, new year new me 💅 is doing the sensible thing:
Don't ask me why it took me so long to realize that the previous thing was nonsense.
Floor Materials
Not all is just visual in this update, though this also comes with new visuals. After just going through backlogs of messages and generally looking around and assessing the situation, I've noticed that @xuefer apparently managed to draw floor materials in what I assume must be a private fork of Valetudo. (Which is great! Everyone should do it like that. It is FOSS precisely so that this can happen. People solving their own problems.)
This intrigued me, because I just never had an idea how to implement that. Seeing it being possible though made things finally click. Once that mental block is gone, it is actually surprisingly simple. All you need to do is render some pixels in a different color and then you get texture. So thank you @xuefer, for being a model citizen!
From a technical standpoint, this works by checking the coordinates of a pixel drawn, determining if according to the texture it should be accented, and if so, draw with an accented color. Simple stuff and super easy to extend with more textures.
So now, if your robot's firmware supports it, you can configure the floor material of a segment.
What is this good for, you wonder? That's where the next item comes in
FloorMaterialDirectionAwareNavigationControlCapability
That's a mouthful. If your firmware supports it, you can now tell the robot "these are wood planks and you will hurt them and possibly you if you don't clean them in paths aligned with them".
I don't have such flooring, nor would I want to have it the same way I do not need non-dishwasher-safe things in my life. But if you do, this will likely improve your experience.
What else is going on?
If you're reading this, you probably have a 3d printer, or are at the very least aware of their existence. What you may not know however is that we by now have similar machines for similar prices for embroidery.
@jhbruhn recently got one, but was unhappy that it required an account and the vendor app to use. So of course he did what we all should do when facing such tech: He liberated it through making it interoperable.
Using https://github.com/jhbruhn/respira you can now use the Brother PP-1 SKiTCH embroidery machine completely without the cloud.
If you or someone in your household might be interested in these crafts, now is the time to look into that.
I am unfortunately not a very artsy person, so I cannot really paint vivid pictures for you regarding what could all be done with that thing. I am great at being cynical though!
So one thing you could do is create counterfeits of work clothes, which may or may not allow someone with criminal energy to enter places they should not be in. Getting busted for being a darknet embroidery vendor will also most certainly get you onto some podcasts. Of course, please don't actually do that. Just because you don't see them behind your screen, doesn't mean that cybercrime would have no victims.
Putting that aside, I do think that there is real potential for ethical red-teaming here. You could easily manufacture the right clothing on-site in the trunk of your car. That also makes for a good story and gets you onto podcasts, but it does so by improving the world instead of harming it.
Maybe we as the hacker bubble could push for a bit more ethics and not reward criminals as much as we tend to sometimes do. Just some food for thought.
I will leave you with this perfectly cut clip from 39C3 I found on the internet (needs sound):
https://github.com/user-attachments/assets/f783baea-c897-426f-9ccb-e5a673a0bd10
Happy new year!
The usual
If you like this release or Valetudo in general, you might want to consider donating:
https://github.com/sponsors/Hypfer
https://builder.dontvacuum.me/donations.txt
Autogenerated changelog
Features
- ui: Update capability icons with new monochrome robot icon design
5004619 - ui: Improve some wording
d6cb9c3 - webserver: Lawful compliance
6638b23 - ui: Update robot icons to look less like a pokeball
386dbd8 - ui: Switch font to IBM Plex Sans
d0fa5a2 - ui: Improve label rendering for map structures
8fd17be - ui: General map polish including improvements to performance + UX + looks
6d54afa - ui: Improve map icons
05450c4 - vendor.midea: More quirks
8dfb08c - vendor.dreame: FloorMaterialDirectionAwareNavigationControlCapability
2c4717f - vendor.roborock: FloorMaterialDirectionAwareNavigationControlCapability + MapSegmentMaterialControlCapability
5c257a5 - ui: FloorMaterialDirectionAwareNavigationControlCapability
4005e0e - core: FloorMaterialDirectionAwareNavigationControlCapability
7db5b75 - webserver: Add another 404 page
3456363 - vendor.dreame: MapSegmentMaterialControlCapability
5273df1 - vendor.midea: MapSegmentMaterialControlCapability
93132c6 - ui: MapSegmentMaterialControlCapability
b13d796 - core: MapSegmentMaterialControlCapability
6a8dd6f
Fixes
- ui: Minor visual cleanup
4cbc004 - vendor.dreame: The latest L10spuh firmware uses the newer-style mop extension controls
04bac60