Integration - Beatbot

Hello everyone,

I present to you Beatbot, a new external integration for Gladys that allows you to control and monitor Beatbot pool robots (AquaSense, Sora ranges…) and their cleaning station.

Beatbot for Gladys

What it does

For each robot in your Beatbot account, depending on what the robot offers:

  • Status: stopped, cleaning, paused, returning, charging, at base, error
  • Start / pause cleaning
  • Return to base (or to the waterline to retrieve it)
  • Battery and charging in progress
  • Cleaning mode (bottom, walls, waterline… with the names given by Beatbot)
  • Child safety and do not disturb (voice messages cut off)
  • A cloud / unreachable badge on each robot

The states arrive in real time (Beatbot event stream), with a complete reread every 10 minutes to catch up on any network outage.

Scenes (Gladys 5.1+)

Triggers:

  • Pool robot status changed (filter possible on the robot and the new status)
  • Pool cleaning finished, with the cycle duration and remaining battery
  • Pool robot fault: stuck robot, full basket, motor fault, water too cold… (filter possible on the faults that interest you)

Actions:

  • Start cleaning
  • Pause
  • Bring the robot back
  • Choose the cleaning mode

Some ideas:

  • « When cleaning is finished, send me a message with its duration »
  • « When the robot is stuck, alert me on Telegram »
  • « Every morning at 9 a.m., start wall cleaning »

Dashboard widget

The Pool robot widget displays the live battery, status, current fault, connection, mode, and duration of the last cleaning, with the Start, Pause, and Return buttons.

Prerequisites

  • Gladys 5.1.0 or newer
  • A Beatbot account with your robots already functional in the Beatbot app
  • Internet access: Beatbot robots are only controlled via the Beatbot cloud, there is no local control

Installation

  1. In Gladys: Integrations, search for Beatbot and install it.
  2. Configuration tab: click on Connect and log in on the Beatbot page. Your password is entered on Beatbot, it never goes through Gladys.
  3. The account region (Europe, North America, China) is detected automatically.
  4. Your robots appear in the Discovery tab: add them.

The Test connection button lists the robots found with their status and battery.

How it works

The integration uses the « open API » that Beatbot publishes for home automation, the same as their official Home Assistant integration. The code is a port of their official library beatbot-cloud-python.

Important: call for testers

This is a first version, tested with a fake Beatbot cloud (106 automatic tests), but not yet on a real robot. If you have a Beatbot, your feedback is very much appreciated.

The point to watch is the account connection:

  • the integration uses the public client identifier provided by Beatbot;
  • if the Beatbot login page displays an error on the return address (redirect_uri), report it here, with a screenshot if possible.

For a problem, please indicate:

  • the robot model;
  • your Gladys version;
  • the integration logs (they never contain your tokens).

Links

Happy swimming! :person_swimming:

Thanks @prohand
First feedback finally: the connect button does nothing, nothing happens, and nothing in the logs.

Question: why is there a home assistant in there?

Thanks @mutmut for the feedback!

  • Connecting does nothing: Gladys opens the Beatbot page in a new tab, and your browser probably blocked it as a pop-up (Safari on iPhone often does this). You can try again from a computer, or allow pop-ups (Settings → Apps → Safari → Block Pop-ups)? Which browser were you using?
  • Home Assistant: “home-assistant” is just the name of the public client ID that Beatbot publishes for its API. Home Assistant is not required.
  • Version 1.2.1 explains this in the setup screen and in the documentation. It also writes to the logs when you click Connect, and why a connection fails.
  • If the Beatbot page opens but displays an error on redirect_uri, let me know: that will mean that Beatbot does not yet accept Gladys’s return address.

So why not Gladys by default?

I’m checking on my computer because I was indeed on Safari/iOS.

Because we don’t choose this name: the client identifier must be created by Beatbot on its login server. Today, Beatbot only publishes one, home-assistant. With gladys, the Beatbot page would refuse the connection (unknown client).

The field remains modifiable: if Beatbot one day provides an identifier for Gladys, we enter it in OAuth Client Identifier, and I will set it as the default in a future version.

Tell me what the connection from the computer gives, especially if the Beatbot page displays an error on redirect_uri.

I understand about the identifier.

I just tested it on the computer and indeed a popup page opens for authorization.
If you make a mistake once during login (username and/or password), then the token is no longer valid.
I closed the page and clicked on Connect again in the integration, the popup page displays:


And it’s no longer possible to do anything, even by reloading the integration page and trying to reconnect.

The URL is:

https://oauth.beatbot.com/oauth2/authorize?response_type=code&client_id=home-assistant&redirect_uri=https%3A%2F%2Fmy.gladysassistant.com%2Fredirect%2Foauth&scope=device%3Ainfo&state=azerty&code_challenge=azerty&code_challenge_method=S256

And nothing explicit in the logs:

[2026-10-16T21:26:00.427Z] [INFO] Beatbot sign-in requested (Connect clicked)
[2026-10-17T08:15:38.298Z] [INFO] Beatbot sign-in requested (Connect clicked)
[2026-10-17T08:16:56.943Z] [INFO] Beatbot sign-in requested (Connect clicked)
[2026-10-17T08:19:25.959Z] [INFO] Beatbot sign-in requested (Connect clicked)

Thanks @mutmut, that’s exactly the feedback I needed!

What’s happening

  • The page « Whitelabel Error Page … status=400 » comes from the Beatbot login server, not from Gladys.
  • This server displays the login page before checking where the request comes from. It only checks after the login.
  • I think it rejects Gladys’s return address (my.gladysassistant.com) and only accepts the one from Home Assistant.
  • So it’s probably not your password: the error occurs once you’re logged in.

Why you’re stuck

  • You are now logged in to Beatbot. Each new attempt skips the login and immediately hits the error.
  • A private browsing window resets everything, but you’ll hit the same error again after logging in, as long as Beatbot hasn’t changed anything.

A question to confirm

  • During your 2nd attempt, was your password accepted just before the error page?

Small correction

  • In my previous message, I said that with a Gladys ID, the Beatbot page would refuse the connection. In fact, it would still display the login, and the error would occur after.

Next steps

Oh my god you’re faster than me, I also created an Issue at Beatbot but I messed up the repository and put it on the ha_beatbot :rofl: And when I tried to recreate it in the other repository you had already done it :sweat_smile:

Excellent question because I saw a page that told me (I think) that the token had expired, that’s all.
And so I closed that page and went back to Gladys.

:grinning_face_with_smiling_eyes: No worries about the issue on ha_beatbot, on the contrary: two requests mean more chances they’ll see it!

For the « expired token »: it’s probably the Beatbot login page that expired after the password error, not your account.

Can you do one last test to be sure?

  1. Open a private browsing window and go to your Gladys.
  2. Click on Connect, then log in to Beatbot on the first try, without any password error.
  3. Tell me what appears right after:
    • the page « Whitelabel Error Page … 400 »: it’s indeed Gladys’s return address that Beatbot is refusing. We’ll have to wait for their response;
    • something else: send me a screenshot.

Version 1.2.2 has been released. It doesn’t add anything new for the connection, but the documentation now explains this error and the private window trick.

Thanks again for the tests! :person_swimming:

in v1.2.1 and private window with the correct password:

EDIT: same in 1.2.2

Thanks @mutmut, great test! :+1:

The message has changed: with the correct password, Beatbot displays « Expired authorization request » instead of the 400 page. I think Beatbot only checks the request after login, denies it, and displays this message for lack of a better option. The 1.2.2 doesn’t change this: it only updates the documentation.

To be certain, can you do a final test? It compares Gladys with Home Assistant:

  1. Open a new private window.
  2. Paste this link. It’s exactly the same request as Gladys, except for the return address, which is that of Home Assistant:

https://oauth.beatbot.com/oauth2/authorize?response_type=code&client_id=home-assistant&redirect_uri=https%3A%2F%2Fmy.home-assistant.io%2Fredirect%2Foauth&scope=device%3Ainfo&state=testgladys123456&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWEIWjEZ6TBGM&code_challenge_method=S256

  1. Log in with the correct password.
  2. Tell me where you end up:
    • a my.home-assistant.io page with code= in the address: Beatbot accepts Home Assistant but not Gladys. It’s confirmed, and I add the proof to the request at Beatbot;
    • still « Expired authorization request »: the problem is elsewhere, and I’m digging.

This test is safe: the received code is useless without a secret key that no one has, and it expires immediately. Don’t copy the code on the forum, just the page name :wink:

Well done!


I didn’t do Allow.

We’re now waiting for Beatbot’s reply on your GitHub issue.

Thanks @mutmut, that’s the proof we needed! :bullseye:

With the Home Assistant return address, Beatbot correctly displays the “Authorize Home Assistant” page. With Gladys’s address, it shows “Authorization request expired.” So it’s confirmed: Beatbot simply rejects Gladys’s return address. Neither your account nor the integration is at fault.

You did the right thing by not clicking Authorize :+1:

I’m adding this proof to the GitHub request. Now we just have to wait for Beatbot to add Gladys’s address: it’s a simple setting on their end. I’ll let you know here as soon as they respond.

Back on GitHub:

Nothing left to wait for :slight_smile:

Very well and we still have a few months before we restart the robot :cold_face: