Enabot EBO Integration (Camera with wheels)

After a lot of reverse engineering, I’ve got the EBO Air 2 working in Home Assistant — including live video, which I think is a first for the Air 2.

Repo: GitHub - Playcolors-co/ha-enabot: Home Assistant add-ons for Enabot EBO robots — control, telemetry & camera. EBO Air 2 (cloud/Agora, with H.265→H.264 video). Unofficial, community, contributions welcome. · GitHub (add the URL under Add-on Store → Repositories).

What works

  • Movement (analog vector + buttons), laser, speed, sleep, volume, TTS (“say”), return-to-base, patrol (with your saved routes)
  • Telemetry: battery, wifi, charging, SD storage, recording
  • Camera: the robot streams H.265 over Agora; the add-on decodes it and republishes it as RTSP for a Generic Camera
  • A raw MQTT command channel (ebo_air2/cmd) exposing the full opcode set — handy for automations or an AI agent
  • Entities via MQTT Discovery; runs as an amd64 add-on (HAOS on Proxmox/NUC)

How it works: the Air 2 is cloud-only for real-time, so the add-on replicates the app’s cloud flow (encrypted login → Agora RTM for control/telemetry + RTC for video). It uses your own Enabot credentials. Unofficial/independent — use at your own risk.

Feedback and testers very welcome. :folded_hands:

That is amazing! I just returned my Mini because I could not get it to work wirh the LAN bridge. Now I’ll look at getting the air 2, and see if I can figuee out fetching the credentials wirh Claude. Also amazing it can run on Home assistant. After I get it working i can block the robots connection to the outside internet correct?

Hi TradeMark. No you still need the Agora cloud connection from Enabot. I am now working in a fork to get all local. I will update you.

Can any of this be used with the Ebo Max to control home assistant with Ebo voice prompts?

Hi,

I’m trying to configure the EBO (Ebo Air 2 Plus) Home Assistant add-on following ebo/docs/GET-APP-KEYS.md, but it looks like the current version of the EBO HOME Android app has changed the way the application keys are stored.

I extracted base.apk from my own Android device and opened it in JADX.

The package is:


com.enabot.ebox.intl

I found:


com.enabot.lib_ebo.netWork.ServerEncryptHelper

but the two 16-character keys described in the documentation are no longer present there.

Following the references led me to:


com.enabot.lib.signature.SignatureHelper

where I see:


public static String bodyEncryptKeyS2 = "";
public static String headerAccessKeySecret = "";
public static String verificationCaptchaId = "";

static {
    System.loadLibrary("eboSignature");
    loadSingleResources();
}

private static native void loadSignatureResources(int flavor, boolean flag);
private static native void loadSingleResources();

I also confirmed that bodyEncryptKeyS2 is used as the AES key, for example:


new SecretKeySpec(
    SignatureHelper.bodyEncryptKeyS2.getBytes(StandardCharsets.UTF_8),
    ...
)

with:


AES/GCM/NoPadding

The Android installation is now split into:


base.apk
split_config.arm64_v8a.apk
split_config.xxhdpi.apk

and I found:


lib/arm64-v8a/libeboSignature.so

inside split_config.arm64_v8a.apk.

The strings:


bodyEncryptKeyS2
headerAccessKeySecret

are present in libeboSignature.so, but the actual values are not present as plain strings. It therefore appears that loadSingleResources() / loadSignatureResources() populate them from native code.

I would be very grateful for any help, advice, or guidance you can provide.
Thanks in advance!

On the current EBO HOME builds the signing key isn’t in the Java/DEX any more — it was moved into a native library (libeboSignature.so). That’s why a plain jadx search only turns up the AES payload_key, or nothing at all.

To get the sign_key on recent versions you have to go at the native side: hook the app’s signing routine at runtime with Frida (it’s what builds the x-ebo-sign header) and read the value from your own running app — or reverse libeboSignature.so in Ghidra/IDA.

I’ve just updated the extraction guide to cover exactly this — payload_key via jadx as before, sign_key via the native lib on recent builds: ha-enabot/ebo/docs/GET-APP-KEYS.md at 8bab413ddf0cdbe9ea82bb276abd55845e3314e3 · Playcolors-co/ha-enabot · GitHub (shipped in v0.26.102).

Which exact app version are you on? If the layout differs on yours I’ll adjust the guide.

It’s verified on the Air 2; the Max is a different cloud model I haven’t tested, so some of it may carry over but I can’t promise. If you try it and report back, I’m glad to help work out what works.

I haven’t actually got one yet. I didn’t want to lay out the expense if it couldn’t be made to work with HA.