github Hypfer/Valetudo 2025.08.0
Valetudo 2025.08.0

3 days ago
valetudo

2025.08.0

3000 words of meta and 1 new vendor

Valetudo 2025.8.0

Welcome back to another issue of my personal blog the Valetudo release notes.
This one is particularly chunky.

Defending Valetudo

Kicking things off with something meta, over two months ago, I found myself struggling very hard to continue building Valetudo due to a handful of people trying their very best to get me to struggle to continue building Valetudo.

To counteract that, quite desperately, I've decided to shine a light on it and let people know that that was happening.
You can find that post here: https://t.me/dust_announce/76

The TL;DR of the whole thing is that rejection hurts and personal growth might hurt too, so instead, some people choose to hurt others.
As a visceral mental model, think of the following:

Girl rejects Boy, then Boy first apologizes, sees that he doesn't get anywhere with that and thus proceeds to call her a slut, tries to turn the whole school against her, or, in extreme cases, do even worse things.

Whatever else comes to mind when you read this, e.g. weird lovebombing-style grandiose statements of affiliation and all, or finding others that got rejected to forge alliances, yes, that.
Yes, all of that.

The overall response to that post fortunately was overwhelmingly positive.
As said in the group, that did help me greatly, so thank you all again for caring.

That said, one event of emotional support only gets you so far and given the nature of the project and my outspoken disdain for dysfunction, such attacks will be a constant threat. Thus, as said in the post, you as a user can help the project greatly by speaking up if you see someone on the internet talking shit about it and/or me personally.

.. Unless that shit is warranted of course, in which case you should still speak up, but against me.
Though, please make sure that you have an actual factual reasonable point before you decide to do that.

Anyway, another thing that came from that was people asking me "When was the last time that you had fun with the project?".
So what I did was block the attackers, handed the defending over to the userbase (thank you, again) and then pondered where to go now.

The rest of the release notes are a result of that.

Valetudo Code of Conduct

Valetudo has a Code of Conduct now.

Honestly, I didn't think that I'd ever do this, because back when the topic of CoCs was new, I mostly just felt alienated by all of it.
We suddenly got these weirdly corporate and highly specific documents that no one actually read but everyone signed off, because HR (formerly known as Twitter) wanted so.

Most of the time, it didn't feel enforceable, and when I observed someone trying to invoke it, that usually was just bad faith retaliation for negative emotions. I was sometimes sceptical that the communicated goals were also the intended goals and, most importantly, that the means used to achieve those goals were actually suited to do so.

Granted, it is possible and likely that I am just privileged enough that I did not for the most part see all the negatives, CoCs possibly successfully removed. However, I did see the abuse of it, since at one point there even was a retaliatory PR to Valetudo, adding a CoC in response to being banned on the support channel for asking about unsupported robots.

But, as it should turn out, CoC as a concept does not necessarily mean the Contributor Covenant. That is just one idea of how a CoC could look like. One that is IMO not only primarily optimized for large, bureaucratic projects, but also IMO not sufficiently hardened against real-world attack scenarios.

It is possible to take the idea of a CoC and just make it your own. Use what you feel is good about it and come up with your own thing.
After all, that's what got us all the FOSS. People thinking "I'd like to build software this way" and then proceeding to just doing that.
Why should project governance be any different?

I did just that and you can now read it here and (continue to) act accordingly:
The Valetudo Code of Conduct

I am genuinely proud of that document. I believe it does fully encompass what I want Valetudo to be and that with only such few words.
It also still very prominently carries the ethical messages of other CoCs; just more conceptually high-level and less "list of things you're not allowed to do".

With it now existing for over two months, it does to me appear like it was the right choice. People start significantly fewer (successful) fights when you point to a rule compared to stating ad-hoc what went wrong.
... even though you're the one who wrote those rules.

I suppose it helps establish that something isn't personal/emotional and made up on the spot?
Maybe it better fits their mental model of the world? Thus requiring less energy put into comprehension?

Still, weird. But what can you do. Guess that's just a limitation of the systems we live in (or happen to be).

So.. just hack them I guess.

The future of Dreame and Valetudo

I do not like Dreame much anymore.
This happened gradually and mostly unnoticed, however with the period of reflection now, it has become quite apparent.

Don't get me wrong. Their products are still objectively good. Maybe even the best right now.
But they've very much stopped respecting their customers.

  • I don't like their new brand image.
  • I don't like their new target audience.
  • I don't like their new pricing.
  • I don't like how far up market they've moved.
  • I don't like their hundreds of confusingly named permutations of robots that are all almost the same but also not.
  • I don't like their bait-and-switch practices with cheaper-to-build worse robots sharing almost the same name with a critically acclaimed robot.
  • I don't like how they let older models die without software updates even though the hardware is the same and could easily receive all those new features.
  • I don't like how little replacement parts are available.
  • I don't like their physical store in LA akin to an Apple Store.
  • I don't like how their official subreddit mod is using bad LLMs to confuse and coax gullible people with pure automated nonsense.

Dreame, according to Dreame, had 44% of Vacuum Robot sales in Germany in April 2025.
What am I even doing here?

Extrapolating from the current state, it is unlikely that we will see many more new Dreames being supported by Valetudo.
They are simply not fun anymore.

That said, of course, what is supported will stay supported, as supported means that I actually own the robot and thus I have an interest in keeping it working.

So where do we go from here?
We hack things.

A new Vendor

Here at Valetudo, we root (for) the underdogs. And one such unterhund is Midea.
Yes. The company that primarily builds air conditioners.

Midea has actually been at it for years now and they actually build their own stuff from the ground up instead of buying some ODM thing.

I've been looking at earlier models by them previously - also thanks again Marco Reps + Friend for letting me have a look at the S8+ -, however, the hardware of those earlier models was rather meh, so nothing came out of it. That, however, changed, and so did the brand they sell their robots under.

They're now sold as "Eureka"-brand robots and I got myself a J15 Pro Ultra.
I also annoyed Dennis quite a lot to also get a J15 Pro Ultra so that we could get to work.

And we did get to work.


It was great. It was fun.
It was like returning to earlier times.

eureka_j15pu

Some historical context

As you may or may not know, Valetudo always has been miio only. Anything supported by Valetudo was speaking miio.
Miio in this context meaning the "old" transport protocol of the Xiaomi MiHome ecosystem

It was however always clear that this was going to change at some point.
Case in point, literally years ago, Xiaomi switched to a new transport protocol named miot.
That could've already been the end of Valetudo (or at least required RE work that was beyond my capabilities at that point).

But instead, as what is frankly just a hackish workaround, since then, we have just been downgrading and patching the communication layer of the vendor firmwares.
This way, Valetudo could just keep on working, talking the old miio to the old miio_client interface.
Frankly, it is surprising and a testament to their architecture that this still works today.

It is however not just Xiaomi who moved on from early beginnings.
The Vendors themselves have long left the multi-vendor MiHome app and moved new robots to their own apps.
The reasons for that being unknown and subject to speculation only, with possible answers ranging from "features" to "control".

Fortunately for us, Dreame - even in their newest Dreamehome-exclusive robots - left all the MiHome handling logic in their firmwares,
even though, there is no way to actually use them with the Xiaomi Cloud.
So this way, the mentioned life support hack for Valetudo could be extended even longer by adding even more hack.
Thanks, Dreame!


Having seen the future, in hindsight, even with the MiHome cloud being a cloud, we did not know how good we had it.
Anything in there was somewhat "compatible" with each other - no matter the vendor.
And, most importantly, there were local interfaces.

While you still had to provision a device by binding it to your cloud account, once on your network, you could send it commands locally.
This was meh-ish for robot vacuums, since you did not get a map, but it was there.
You could do that. Once it was on your network, it could keep working (if only in a degraded state).

Nowadays, robots only allow you to provision them via a local interface with everything else going through the cloud,
not only affecting latency and reasonability, but also hard tethering the device to said cloud even more than in earlier days.

Moving beyond miio

Midea, even though sharing a two-letter prefix, is not miio. It is not adjacent to miio either.
Midea is something completely new.

Similar to how the other vendors are now doing it, the Midea cloud uses the standard technologies https and mqtts as transports.
While they are standard, they were something completely new for Valetudo.

Fortunately, them being standard and Valetudo being written in JS, all the parts to get things done were already available on npm.
You just needed to add glue:

First there is Aedes.
Aedes is a pure-js implementation of an mqtt broker, sharing libs with the mqtt client library already used.
I cannot overstate just how much easier the existence of Aedes made implementing that interface.
Just imagine what would have to be done if it didn't exist. You'd have to compile and vendor mosquitto, orchestrate and manage that process, deal with indirection through code you do not really control and all that.

Thank you, Aedes maintainers, for making my life so much easier!
(And also thank you, nodejs maintainers (among lots of others), for enabling the Aedes maintainers to do so.)

Even more interesting than that but on a similar note is node-forge, which enabled the s in mqtts and https.
node-forge is a pure-js implementation of everything TLS. This, as with Aedes, frees you from the need to compile and vendor OpenSSL, manage that process, run shell commands, etc., too making my life so much easier.

Furthermore, its origin story is insane and worth a read, implementing TLS in JS, bypassing the whole browser through utilization of Adobe Flash to gain access to raw sockets.
Take a look at it here: A JavaScript Implementation of TLS (Part 1/2)

And now, 15 years later, it unclouds vacuum robots - a use-case the author(s) probably could not ever have imagined.
This is a prime example for why you should just do weird shit.
Don't listen to people telling you that you should just use the browser's TLS.
Reimplement it in JS. Have fun!
(Maybe not use it in production in most-if-not-all use-cases)

The best part about this is that this was groundwork.
It did not just enable Valetudo to talk with Midea, but it has given it the infrastructure to grow beyond the limits of the space it basically fully exhausted.

There is a new world beyond miio waiting to be explored.

Hacking the Tedium

On the topic of exploring said worlds, another interesting detail about this journey is that LLMs not only supercharged it, but also probably enabled it.

As you may or may not be aware, I am at heart lazy and sometimes somewhat more of a suit than a dev.
I like putting in 1x and getting out 10x in return. I dislike the tedious chopping away at something, doing the same mundane thing for long periods of time with little visible progress.

There is so much more I could do with my limited time than just staring at Ghidra, pondering for weeks.
Not that I'd actually be using the time that way, but hypothetically I could.

LLMs are (please excuse the language) an absolute gamechanger here, as they are incredibly amazing at reducing the tedium by multiple orders of magnitude. Instead of staring at decompiled c++ gibberish for hours on end, sometimes having to even look at the asm to make sense of things, just copy-paste the whole thing into an LLM and ask it what is going on.

The LLM will get things wrong and will hallucinate, however, so will you (probably).

If you keep that in mind while using them and double-check its assumptions and claims through referencing the actual code, what took months becomes days. What was a large block with you having no idea how to slice it becomes digestible chunks.
And even if the content of one such logical chunk will be wrong, the actual chunking boundaries can be right and then you just have to figure out that one clearly defined problem.

So for me personally, if used this way, it's a great technology. I can only encourage you to try it yourself with the one reverse engineering project you wanted to do but never got yourself to actually pick up.
Chances are it will be just what you need to overcome inertia.

But, also, don't ever hand over the steering wheel.
.. And keep the shotgun loaded. The space around AI is still crawling with grifters, parasites, lunatics and people high on hype.

Where are we now?

So now, Valetudo has very experimental support for the Eureka J15 Pro Ultra.
While not fully done yet and not having seen the polish other implementations had, it is "good enough" to be released - experimentally.

As always, there is a new docs entry for it, containing everything you would want to know right now: Midea J15 Pro Ultra

And it's the same Valetudo that you and I are used to.
I love it.

To toot my own horn a bit, I was pleasantly surprised just how well Valetudo handled a Robot with 0 capabilities.
I was also unpleasantly surprised to see some old design decisions that did not make all that much sense. So I also had the opportunity for some cleanups.

Reflecting on this process and comparing it with the early steps of Valetudo on the Roborock S5, it is quite the contrast.
Back then, there was just an ext4 rootfs Ubuntu 14.04 you could ssh into and throw a binary on it, which then parsed some debug map ppm image files in a ramdisk.
Now, before you even have the chance to think about how to even send commands at all, you first need to stare at Ghidra for hours, figure out how to build and install read-only squashfs firmware packages, patch multiple core binaries and jump through a plethora of other hoops.

If IoT had been how it is now, Valetudo would not have happened.
Fortunately, it did, and through it, I was given this opportunity to develop the necessary skills.

Not just reverse engineering, but also people management, expectation management, personal growth and many many more things.
All that I would never have accomplished if I hadn't been interacting with so many different concepts, people, ideas and things through Valetudo.

So at this point I'd like to say:
Thank you, dear reader, for providing the context to create the space that enables me to connect with the world, to ponder and to grow 🪴

Returning to Midea:
Given that it is an entirely different firmware by an entirely different vendor, things will of course behave slightly differently.
Given that Midea is also very much trying to catch up with the big players, software quality is sometimes.. questionable and some jank does exist.

But, overall, it is mostly abstracted away. You install Valetudo. You get a robot like you'd expect it to be.
No surprises, just Valetudo.

As a bonus, the completely different map logic also leads to completely new map art:

face

What else is new?

On Home Assistant Deprecations

With this release, Valetudo's MQTT interface has been updated to advertise itself on MQTT in the slightly changed ways HA 2026.2 will make mandatory. Since Valetudo provides a standalone battery level entity since 2023, no breakage happened or is going to happen from this, as long as your version of Home Assistant isn't absurdly outdated.

So now for some rant on the same asymmetry and invisibility as always:

Please keep in mind that I myself, as the real person I am, use both Valetudo and Home Assistant daily.
I am seeing these messages probably even before you do.
I am reading most of the beta release notes of HA.

It makes no sense to create an issue or message me about this.
Time-wise it's far away and there is no reason to believe that I would not be aware of it.

The most charitable interpretation of what transpires regardless is that people - busy with their own lives - apply defaults from other projects operating under different models, leading to a misguided "attempt at helping" with little thought put into if it actually could help.

The less charitable interpretation would be "I see yellow box. I push elsewhere so that it stops being my problem."

However, whatever in that spectrum it might be, it doesn't matter much, as the end result of that sucks regardless.
And, even in the best case interpretation, it is still immensely taxing to handle the mental load of other people.

Writing this down in this context, rewording it many times to convey the message while taking out one's own emotions is immensely taxing.

It sucks.
If you can, please consider making it suck less. I'd be very glad.
It's 30 seconds for you or 30 seconds times 10,000 users for me.

Side-note:
This explicitly does not mean scaling up the capacity to handle people not caring through processes or manpower.
Managing dysfunction at scale is still managing dysfunction instead of resolving it.

New Capabilities

With there being a new implementation in Valetudo, there were also new overlaps of functionality.
Instead of implementing a quirk for the same thing available on multiple vendors, some of these quirks now graduated and became full capabilities:

capabilities

As you can see, I've created a custom icon for the Mop Extension.
I'm not yet 100% sure if it will stay that way, given that the actual information part (the mop sticking out) is quite small, but I also don't have any other ideas. Especially since there will be similar icons based on the same base shapes for other mop-related capabilities.

As Midea isn't done yet, I expect there to be more such cases in the near future.

Refactoring of the ConsumableStateAttribute

As said, working on a completely new robot implementation also gave me the chance to revisit some earlier design decisions, the ConsumableStateAttribute being one of them.
Why was it even part of the state instead of being fully encapsulated in the ConsumableMonitoringCapability?

The answer is that it was like that in the vendor implementation and I just copied it without questioning enough.
Now, with that vendor implementation outside my context window, this decision had to stand on its own - which it did not. Hence, cleanup.

For users of Home Assistant, you will notice nothing.
If however you're running a different home automation system or consume the REST API in other ways, this might be breaking for your setup.

Upgrade to Node V22

Having been using Node v20.10 since 2023-12, it was about time for an update.
For a moment, it almost looked like that would not be happening, as the built v22-based binary turned out larger than the
40 MB that the updater expects as the maximum size for Valetudo.

However, after staring at the nodejs git repo for a while, I found some options, tweaks and things I could do to trim down some of the size,
meaning that for now at least, no changes to the updater are necessary.

This release also enables pointer compression for the aarch64 build, leading to a bit less RAM usage.
Not that that would matter much, given that all supported 64-bit robots have 1GB RAM (or more).

It might happen that, especially on the lowmem armv7 build, the heap size will need tweaking due to the update.
I haven't seen any issues in my testing, but please let me know if you see something abnormal like Valetudo crashing, as it should very much not be doing that.

Valetudo AI

Following industry trends, Valetudo now has an AI assistant feature that may or may not be helpful depending on how you look at it.
There is no escape. It will be in your sidebar.

Closing thoughts

Someone on 4chan claimed that "the Valetudo dev is a schizo and his software is a backdoor".
To help that guy win his internet argument, with this release, I've obliged and added one.
Please let me know when you find it :)

The usual

There are a few new robots I'd like to look at, so 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

Appendix

Motivated by something you can discover in this very update, I found myself reading a book by Joseph Weizenbaum - self-declared heretic of technology - written in 1984.
It is called "Kurs auf den Eisberg - Die Verantwortung des Einzelnen und die Diktatur der Technik" and unfortunately seems to only be available in German. Fortunately, it is quite short and actually just an interview written down, meaning that it is accessible to simpletons like me who just learned how to read.

Anyway, there were many, many moments in there, where I questioned the print date of the thing.
Did we ever leave the 80s?

Recommended read.
ISBN: 9783492105415

Autogenerated changelog

Breaking Changes

  • Drop ConsumableStateAttribute in favor of ValetudoConsumable entity ddc9918

Features

  • vendor.midea: Midea ae1ac47
  • ui: Further improve UX of AI Assistant d575e2f
  • ui: Introduce Valetudo AI Assistant da4c8c4
  • vendor.dreame: CameraLightControlCapability cefa92b
  • core: CameraLightControlCapability 994c3f9
  • vendor.dreame: MopExtensionControlCapability 1189bd9
  • core: MopExtensionControlCapability ccc3073

Fixes

  • vendor.dreame: Minor change for newer firmwares eb21332
  • ui: Fix ValetudoSplash showing scrollbars with some specific browser window dimensions 47e129c
  • ui: Actually reading docs helps build better software 6bec34d
  • ui: Improve mobile UX of AI Assistant f6b08e6
  • ui: Only show AppBar Subheaders when there are items for it 453ac70
  • core: Remove ip from default config 3746d26
  • vendor.viomi: Remove redundant second emitMapUpdated on map reset f29592f
  • webserver: Fetching the map should not poll the state 81801d6
  • ui: Add feedback when saving virtual restrictions 69e47ab

Refactoring

  • mqtt: Simplify segment ID validation 649eb4e
  • core: Use native crypto.randomUUID where possible b456a2b
  • core: Move map polling orchestration logic into ValetudoRobot base class b12fb03

Chores

Don't miss a new Valetudo release

NewReleases is sending notifications on new releases.