logo elektroda
logo elektroda
X
logo elektroda

Custom remote control for Roomba hoovers - UART interface - control via WiFi

p.kaczmarek2  6 3348 Cool? (+15)
📢 Listen (AI):

TL;DR

  • A Roomba Open Interface modification adds WiFi and Home Assistant control to iRobot Roomba vacuums via the UART connector.
  • A BK7231N-based CB2S module runs OpenBeken, converts UART bytes, and drives web-panel buttons that send Roomba commands over the serial port.
  • The interface uses 115200 baud, and the command set is simple byte values like 8083, ad, 87, 86, 88, 8f, 07, and 85.
  • The setup worked on Roomba 780 hardware and was also tested on the 500 and 600 series, but 3.3V power and logic-level conversion are required.
Generated by the language model.
Roomba vacuum with attached WiFi module
The iRobot Roomba range of hoovers has a well-documented Roomba Open Interface allowing remote control of the hoover. I will present here the details of this interface and demonstrate an example made by us of integrating the device with an external WiFi module, also allowing connection to the Home Assistant. In the way shown here, you can add wireless connectivity to models that do not normally have it.

This modification will also give the possibility of, for example, automatic commands to the hoover at a given time, etc.

This topic was based on the Roomba 780 model, but the solution was also tested on the 500 and 600 series. It is worth mentioning here that not every Roomba model has WiFi from the factory, so it might make sense to play with it...
Table of Roomba vacuum models with information on release date, WiFi, navigation, and description.
Source of the table: https://en.wikipedia.org/wiki/Roomba


I made the modification with a colleague from the forum - @DeDaMrAz

The adventure begins, of course, with reading the documentation. Everything is available on the web, which makes the project shown here ideal fun for beginners. No need to play around with reverse engineering, yes as itself this sometimes I do .
We start by reading the introduction:
Screenshot of iRobot Roomba Open Interface documentation.
Then we learn the technical details.
So let's consider the connector offered to us by the hoover:
Diagram of Roomba connector with pin descriptions
We have here primarily a power supply and a UART serial port. This can be used, but the devil is in the details. The power supply here is far from the 3.3V required by our WiFi module. It would be tempting to put an LDO regulator here, for example an AMS1117-3.3V, but the WiFi module can draw quite a lot of current (even more than 100mA) and the regulator, even allowing for a high input voltage, could heat up. It would be better to proceed more efficiently - find some kind of step-down converter. The choice on the web is wide.
With the UART itself, there is a similar problem - if our WiFi module only supports 3.3V levels and not 5V, you will need to add a logic level converter. But again, this is no problem, there are ready-made modules for everything. Schematic:
Connection diagram for Roomba integration with CB25 module
(Small note - we connect RX to TX and TX to RX, send to receive and receive to send, unless someone has already swapped the labels in place before....)
Practice: Electronic modules and wires on a black background
In the photo above is a CB2S module with BK7231N as we have such in abundance. We run OpenBeken on it to be able to encode the UART without programming and compiling the batch.
The specific model of inverters and converters doesn't matter, we used an ADUM1201, which also isolates, but this is not needed here.
Here's a photo from testing, still without CB2S, but with our BK7231 development board ( translate NodeMCU ):
Image of the internal part of an iRobot Roomba vacuum with a NodeMCU LOLIN module installed. Close-up of an electronic module connected to an iRobot Roomba. Close-up of the internal connector of an iRobot Roomba vacuum modified for integration with a WiFi module.
For control, we also have several modes available, including a full mode, "Full Mode". It gives full control of the hoover, but I'll focus on that elsewhere...
Screenshot of Roomba Open Interface documentation describing device operation modes.
Now let's look at the more software side. We have the hardware ready to go. The UART here also has fairly standard settings, baud 115200, parity and stop bits as in most applications I encounter...
Serial port settings for the Roomba vacuum cleaner.

You still need to know what to send, and it's surprisingly simple:
Roomba Open Interface command reference section.
Yes, there are not even headers here, no packet lengths, no checksums.... we just send individual bytes. There's not much to discuss here.
It's certainly easy to do this on many platforms, but we chose OpenBeken . We already have OTAs, scripts, HA integrations ready there. We have written a simple script to create buttons on the HTTP panel to which we have plugged the upload. We have example scripts in this style on one of our documentation pages, more precisely on autoexec examples .
Into the script we have moved the basic commands responsible for control and operation of the hoover.

startDriver httpButtons

setButtonLabel 0 "ENABLE CONTROL"
setButtonColor 0 ORANGE
setButtonEnabled 0 1
setButtonCommand 0 "uartSendHex 8083"

setButtonLabel 1 "DISABLE CONTROL"
setButtonColor 1 ORANGE
setButtonEnabled 1 1
setButtonCommand 1 "uartSendHex ad"

setButtonLabel 2 "START/STOP"
setButtonEnabled 2 1
setButtonCommand 2 "uartSendHex 87"

setButtonLabel 3 "SPOT"
setButtonEnabled 3 1
setButtonCommand 3 "uartSendHex 86"

setButtonLabel 4 "MAX CLEAN"
setButtonEnabled 4 1
setButtonCommand 4 "uartSendHex 88"

setButtonLabel 5 "SEEK DOCK"
setButtonEnabled 5 1
setButtonCommand 5 "uartSendHex 8f"

setButtonLabel 6 "RESET"
setButtonColor 6 RED
setButtonEnabled 6 1
setButtonCommand 6 "uartSendHex 07"

setButtonLabel 7 "POWER"
setButtonColor 7 RED
setButtonEnabled 7 1
setButtonCommand 7 "uartSendHex 85"

The script creates the following web panel:
Screenshot of a web interface for controlling an iRobot Roomba.

Of course the panel is accessible without any problem from a web browser.
It's time to fire up our hoover and see if it still works:
iRobot Roomba 780 vacuum cleaner with an attached WiFi module on top.
This is the final presentation:



Everything works satisfactorily. That's it for now, but that was just the first part of the topic. In the second I will try to expand on the topic. Among other things, we are planning to:
- parse the log from the device (baud 115200), here is an example fragment:

charger-wakeup
slept for 1 minutes 29 seconds

2011-02-18-1446-L   
r3_orion/branches/release-1.0:609 CLEAN

bootloader id: 4716 4A56 B82B FFFF 
assembly: 3.8
revision: 1
flash version: 10
flash info crc passed: 1

start-charge: 2011-02-18-1446-L   
do-charging-checking-fets @ minutes 7
bat:   min 7  sec 32  mV 16059  mA -8  tenths-deg-C 551  mAH 2696  state 1  
Charging FET test passed.
do-charging-wait-initial @ minutes 7
bat:   min 7  sec 33  mV 16059  mA -16  tenths-deg-C 482  mAH 2696  state 2  
bat:   min 7  sec 34  mV 16059  mA -8  tenths-deg-C 457  mAH 2696  state 2  
bat:   min 7  sec 35  mV 16059  mA -8  tenths-deg-C 448  mAH 2696  state 2  
bat:   min 7  sec 36  mV 16059  mA -8  tenths-deg-C 445  mAH 2696  state 2  
bat:   min 7  sec 37  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 38  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 39  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 40  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 41  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 42  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 43  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 44  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 45  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 46  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 47  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 48  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 49  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 50  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 51  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 52  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 53  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 54  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2  
bat:   min 7  sec 55  mV 16059  mA -8  tenths-deg-C 443  mAH 2696  state 2

- improve the current web panel (e.g. change button colours according to device status?)
- add integration with Home Assistant:
Roomba_test user interface with device information.
Of course I probably also don't need to mention that such a control can also be realised without problems on the ESP, in combination with OTA it can also be a nice toy. We simply used what we have at hand. Now the hoover works from the HA, although it will definitely be useful to get the aforementioned battery parameter reading. All in good time.
Has anyone also tried converting hoovers like this?
PS: Still for the inquisitive - a photo of the hoover without the housing:
Interior of iRobot Roomba vacuum cleaner showing electronic components
You can well see here the mentioned connector we use.

I am attaching the mentioned documentation, all the details of the protocol are described there.
Attachments:
  • Roomba_500_Series_SERVICE_Manual.pdf (1.78 MB) You must be logged in to download this attachment.
  • iRobot_Roomba_600_Open_Interface_Spec.pdf (1.55 MB) You must be logged in to download this attachment.

About Author
p.kaczmarek2
p.kaczmarek2 wrote 14416 posts with rating 12371 , helped 650 times. Been with us since 2014 year.

Comments

DeDaMrAz 31 May 2024 17:37

Some more development on this topic. OBK can be useful to solve some issues with converting battery packs to Li-Ion by measuring new battery voltage and applying a "cutting" signal (basically telling... [Read more]

p.kaczmarek2 01 Jun 2024 13:00

The mentioned CB2S module together with additional boards (voltage level converter, step-down converter): https://obrazki.elektroda.pl/5653691300_1717239617_thumb.jpg https://obrazki.elektroda.pl/5160446700_1717239617_thumb.jpg... [Read more]

DeDaMrAz 01 Feb 2026 05:59

Since I've been playing around with a lot of UART based devices lately I decided to revisit this one and create a complete Roomba OBK driver - mostly because the protocol is simple and well documented.... [Read more]

DeDaMrAz 03 Feb 2026 08:45

Since I am the only one interested in this I'll power through it the only way I know - head first :) https://obrazki.elektroda.pl/4828433200_1770104709_thumb.jpg https://obrazki.ele... [Read more]

DeDaMrAz 08 Feb 2026 03:31

Progress report: https://obrazki.elektroda.pl/2777164800_1770518283_thumb.jpg https://obrazki.elektroda.pl/5451530600_1770517732_thumb.jpg https://obrazki.elektroda.pl/8569703600_1770517737_thumb.jpg... [Read more]

p.kaczmarek2 06 Mar 2026 17:58

Topic continued: [EN] Full integration of iRobot Roomba with Home Assistant - remote control without cloud [EN] Full integration of iRobot Roomba with Home Assistant - remote control without the... [Read more]

FAQ

TL;DR: At 115200 baud, the authors call Roomba’s UART protocol "well documented". This FAQ is for people adding local WiFi control to older Roomba 500–800 robots using a CB2S WiFi module, voltage conversion, and OpenBeken, so they can send raw command bytes and integrate with Home Assistant without cloud control. [#21099471]

Why it matters: It shows a practical way to upgrade older Roombas that lack factory WiFi, using documented serial control instead of reverse engineering.

Option Power method Serial side Best use in this thread
AMS1117-3.3V LDO Simple drop from Roomba supply Separate level shifting may still be needed Possible, but less efficient and may run hot with WiFi current spikes
Step-down converter More efficient 3.3V supply Pair with level converter if module is 3.3V-only Recommended approach for CB2S/OpenBeken builds
ADUM1201-based path Used with added boards Level shifting with isolation Worked in testing, though isolation was not required

Key insight: The hardest part is not the protocol. The thread shows that power conversion and voltage-level compatibility matter more than the Roomba command format, because commands are sent as plain raw bytes. [#21099471]

Quick Facts

  • The tested setup was built around a CB2S WiFi module with BK7231N, running OpenBeken to send UART commands and expose a web panel. [#21099471]
  • The Roomba UART settings shown were 115200 baud, with standard parity and stop-bit settings, making the serial side straightforward once wiring is correct. [#21099471]
  • The authors tested the method on Roomba 500, 600, and 700 series, and later stated that 500–800 robots should be supported by the nearly complete driver. [#21832379]
  • The WiFi module can draw more than 100 mA, which is why the thread recommends a step-down converter over an AMS1117-3.3V LDO for better efficiency and lower heat. [#21099471]
  • A sample serial log exposed battery and charger data such as 16059 mV, -8 mA, and 551 tenths-deg-C, showing that status parsing can improve dashboards and automation. [#21099471]

What is the Roomba Open Interface, and how does it let you control older iRobot Roomba models over UART?

The Roomba Open Interface is the robot’s documented serial control protocol exposed on its connector. "Roomba Open Interface" is a serial control protocol that exposes command bytes over the robot’s UART port, with simple raw-byte messaging and documented operating modes for movement, docking, power, and status access. In this thread, it was used on a Roomba 780 and also tested on 500 and 600 series units, so older models without factory WiFi can still be controlled remotely over UART. [#21099471]

How do you add WiFi control to a Roomba 500, 600, 700, or 800 series using a CB2S module and OpenBeken?

You add WiFi by bridging the Roomba UART to a CB2S module running OpenBeken and powering that module from a proper 3.3 V supply. 1. Take power and UART from the Roomba connector. 2. Add a step-down converter and, if needed, a logic level converter. 3. Flash OpenBeken on CB2S, then send Roomba command bytes from its web panel or Home Assistant. The thread first tested this on 500, 600, and 700 series units, and later reported expected support for 500–800 robots. [#21832379]

Why is a step-down converter recommended instead of an AMS1117-3.3V LDO when powering a WiFi module from the Roomba connector?

A step-down converter is recommended because the WiFi module can draw more than 100 mA and an AMS1117-3.3V LDO could heat up badly from the higher Roomba supply voltage. The authors explicitly said the Roomba connector power is “far from the 3.3V required” by the WiFi module, so a more efficient converter is the safer choice for sustained operation and current spikes. [#21099471]

How should RX and TX be wired between a Roomba UART port and a 3.3V WiFi module, and when is a logic level converter needed?

RX and TX must be crossed: Roomba TX goes to module RX, and Roomba RX goes to module TX. A logic level converter is needed when the WiFi module only supports 3.3 V serial levels and the Roomba side is at 5 V levels. The thread also warns that labels can already be swapped on some boards, so verify the actual signal direction before final wiring. [#21099471]

What UART settings does the Roomba Open Interface use, and what problems show up if the baud rate or serial format is wrong?

The setup shown uses 115200 baud with ordinary serial framing, matching what the author described as standard parity and stop-bit settings. If the baud rate or framing is wrong, raw-byte commands will not decode correctly and readable logs such as “charger-wakeup” or battery lines like “16059 mV” will turn into garbage or fail entirely. That breaks both control and telemetry parsing. [#21099471]

Which Roomba commands were used in the OpenBeken web panel for enable control, start/stop, spot, max clean, dock, reset, and power?

The OpenBeken panel used these raw command bytes: enable control 8083, start/stop 87, spot 86, max clean 88, dock 8f, reset 07, and power 85. It also defined disable control as ad. Those values were mapped directly to web buttons, so pressing a button sent the corresponding byte sequence over UART without any packet header or checksum layer. [#21099471]

How do you send Roomba Open Interface commands as raw bytes from OpenBeken with uartSendHex?

You send commands by calling uartSendHex with the exact hexadecimal byte sequence for the wanted Roomba action. In the thread, OpenBeken button definitions used commands like uartSendHex 8083 for enable control and uartSendHex 8f for docking. That worked because the Roomba protocol here does not require headers, packet lengths, or checksums for those commands; it accepts individual raw bytes. [#21099471]

What is OpenBeken, and why was it chosen for this Roomba WiFi remote project instead of writing custom firmware from scratch?

OpenBeken was chosen because it already provided OTA updates, scripting, HTTP buttons, and Home Assistant integration. "OpenBeken" is device firmware that runs on modules such as CB2S/BK7231N, adds web control and scripting, and lets users build UART automations without compiling custom code for each device. The authors said they picked it because “we already have OTAs, scripts, HA integrations ready there,” which cut development time significantly. [#21099471]

How does Full Mode in the Roomba protocol differ from the basic control modes, and what extra control does it unlock?

Full Mode gives full control of the robot, beyond the basic command set used for simple actions like clean, dock, reset, or power. The thread does not list every extra command, but it explicitly says Full Mode “gives full control of the hoover” and that the author planned to cover it separately. In practice here, the shown web panel stayed with basic raw-byte control rather than advanced mode-specific behavior. [#21099471]

AMS1117 LDO vs step-down converter for a Roomba WiFi mod: which is better for efficiency, heat, and current spikes from modules like CB2S?

The step-down converter is the better choice for this mod. The authors considered an AMS1117-3.3V LDO tempting, but rejected it because the WiFi module can pull more than 100 mA and the regulator could get hot with a high input voltage. A step-down converter wastes less power as heat and handles those current spikes more comfortably in a compact Roomba installation. [#21099471]

What is the ADUM1201 doing in this setup, and how is an isolated level shifter different from a simple logic level converter?

In this setup, the ADUM1201 was used as the serial interface device and also provided isolation, though the authors said isolation was not actually needed here. A simple logic level converter only changes voltage levels, such as 5 V to 3.3 V. An isolated device adds galvanic separation between sides, which can improve protection but also adds complexity that this Roomba mod did not require. [#21099471]

How can Home Assistant be integrated with an old Roomba through OpenBeken for local control without using the cloud?

Home Assistant can control the Roomba locally by sending OpenBeken-triggered UART commands through the WiFi bridge instead of using any vendor cloud. The thread shows the robot already working from HA and later points to a continuation topic titled “Full integration of iRobot Roomba with Home Assistant - remote control without cloud.” That makes the OpenBeken device the local control gateway between HA and the Roomba UART port. [#21855959]

What can be parsed from the Roomba serial log, such as battery voltage, charging state, and temperature, and how could that improve the web panel?

The serial log can expose battery voltage, current, temperature, charger events, and charging-state transitions. The sample log shows values like 16059 mV, -8 mA, 2696 mAH, and 551 tenths-deg-C, plus events such as “charger-wakeup” after 1 minute 29 seconds of sleep. Parsing those fields would let the web panel show live status and change button colors or states based on charging, faults, or battery condition. [#21099471]

How could OpenBeken help when converting a Roomba battery pack to Li-Ion, especially for ADC voltage measurement, temperature monitoring, and generating a 'battery full' cut-off signal?

OpenBeken could supervise a Li-Ion conversion by measuring pack voltage with ADC, checking temperature, and asserting a control signal that tells the Roomba the battery is full. The follow-up post says this idea needs both ADC battery measurement and temperature measurement for safety, and describes the work as still being in the data-collection stage. That makes OpenBeken the control layer rather than just a remote switch. [#21102287]

What have other people tried when converting older Roomba hoovers for WiFi or UART-based remote control, and which approaches worked best?

In this thread, no outside community build was documented as a finished alternative. The only clearly working approach shown used the Roomba UART connector, a CB2S or BK7231-based OpenBeken device, a step-down converter, and level conversion where needed. Later updates reported an almost complete dedicated OBK driver for 500–800 robots, so that path became the most mature approach discussed here. [#21832379]
Generated by the language model.
%}