Neato Botvac Binding

in OpenHab 2.4 stable release, sending my Neato BotVac D7 Connected the command to clean, in the log I see:

Item 'NeatoCommand' received command clean

and immediatly after that:

[ERROR] [ab.binding.neato.internal.NeatoRobot] - Unknown service for houseCleaning: basic-4. Will not start house cleaning!

Ant suggestion?


It looks like Neato updated the API services as “basic-4” is not handled in the binding. Likely this is related to the new zone functionality.

I think this will require a code change to the binding to handle basic-4. Should also look to harden this code a little to try to use the latest known version of a service rather than just giving up when the robot reports a service version the binding doesn’t know about.

Can you enable DEBUG logging on org.openhab.binding.neato and then create an issue in github?

I may have time over the holidays to look into fixing this.

Ok hope to do it tomorrow.

Meanwhile, maybe this output from python helps:

{‘version’: 1, ‘reqId’: ‘1’, ‘result’: ‘ok’, ‘data’: {}, ‘error’: None, ‘alert’: None, ‘state’: 1, ‘action’: 0, ‘cleaning’: {‘category’: 0, ‘mode’: 1, ‘modifier’: 1, ‘navigationMode’: 1, ‘spotWidth’: 0, ‘spotHeight’: 0}, ‘details’: {‘isCharging’: False, ‘isDocked’: True, ‘isScheduleEnabled’: False, ‘dockHasBeenSeen’: False, ‘charge’: 100}, ‘availableCommands’: {‘start’: True, ‘stop’: False, ‘pause’: False, ‘resume’: False, ‘goToBase’: False}, ‘availableServices’: {‘findMe’: ‘basic-1’, ‘generalInfo’: ‘basic-1’, ‘houseCleaning’: ‘basic-3’, ‘IECTest’: ‘advanced-1’, ‘logCopy’: ‘basic-1’, ‘manualCleaning’: ‘basic-1’, ‘maps’: ‘macro-1’, ‘preferences’: ‘basic-1’, ‘schedule’: ‘basic-1’, ‘softwareUpdate’: ‘basic-1’, ‘spotCleaning’: ‘basic-3’, ‘wifi’: ‘basic-1’}, ‘meta’: {‘modelName’: ‘BotVacD7Connected’, ‘firmware’: ‘4.2.3-153’}}



I have two D3 robots. Both were detected and both show the rigth status, but only the second one will start cleaning, the first doesn’t start. From the logs I see that a different command seems to be sent to the different robots. Any idea why?

Robot 1

2018-12-24 14:18:17.373 [DEBUG] [ab.binding.neato.internal.NeatoRobot] - Calling Neato WS with body: {"reqId":"1","cmd":"startC
2018-12-24 14:18:17.804 [DEBUG] [ab.binding.neato.internal.NeatoRobot] - Result from sendCommand: {"version":1,"reqId":"1","res
ult":"invalid_entry","data": {},"error":null,"alert":null,"state":1,"action":0,"cleaning": {"category":0,"mode":2,"modifier":1,
"navigationMode":1,"spotWidth":0,"spotHeight":0},"details": {"isCharging":false,"isDocked":true,"isScheduleEnabled":false,"dock
HasBeenSeen":false,"charge":96},"availableCommands": {"start":true,"stop":false,"pause":false,"resume":false,"goToBase":false},
"availableServices": {"generalInfo":"basic-1","houseCleaning":"basic-3","IECTest":"basic-1","logCopy":"basic-1","maps":"advance
": {"modelName":"BotVacD3Connected","firmware":"4.4.0-72"}} 

Robot 2

2018-12-24 14:18:04.681 [DEBUG] [ab.binding.neato.internal.NeatoRobot] - Calling Neato WS with body: {"reqId":"1","cmd":"startC
2018-12-24 14:18:06.087 [DEBUG] [ab.binding.neato.internal.NeatoRobot] - Result from sendCommand: {"version":1,"reqId":"1","res
ult":"ok","data": {},"error":null,"alert":null,"state":2,"action":1,"cleaning": {"category":2,"mode":1,"modifier":1,"navigation
Mode":1,"spotWidth":0,"spotHeight":0},"details": {"isCharging":false,"isDocked":true,"isScheduleEnabled":false,"dockHasBeenSeen
":false,"charge":97},"availableCommands": {"start":false,"stop":true,"pause":false,"resume":false,"goToBase":false},"availableS
ervices": {"generalInfo":"basic-1","houseCleaning":"basic-3","IECTest":"basic-1","logCopy":"basic-1","maps":"advanced-1","prefe
rences":"basic-1","schedule":"minimal-1","softwareUpdate":"basic-1","spotCleaning":"micro-2","wifi":"basic-1"},"meta": {"modelN

Seems like the getRobotState the backend is sending different results too… hmm…

Robot 1

2018-12-24 14:20:25.583 [DEBUG] [ab.binding.neato.internal.NeatoRobot] - Result from getRobotState: {“version”:1,“reqId”:“1”,“r
esult”:“ok”,“data”: {},“error”:null,“alert”:null,“state”:1,“action”:0,“cleaning”: {“category”:0,“mode”:2,“modifier”:1,“navigati
onMode”:1,“spotWidth”:0,“spotHeight”:0},“details”: {“isCharging”:false,“isDocked”:true,“isScheduleEnabled”:false,“dockHasBeenSe
en”:false,“charge”:96},“availableCommands”: {“start”:true,“stop”:false,“pause”:false,“resume”:false,“goToBase”:false},“availabl
eServices”: {“generalInfo”:“basic-1”,“houseCleaning”:“basic-3”,“IECTest”:“basic-1”,“logCopy”:“basic-1”,“maps”:“advanced-1”,“pre
ferences”:“basic-1”,“schedule”:“minimal-1”,“softwareUpdate”:“basic-1”,“spotCleaning”:“micro-2”,“wifi”:“basic-1”},“meta”: {“mode

Robot 2

2018-12-24 14:20:25.581 [DEBUG] [ab.binding.neato.internal.NeatoRobot] - Result from getRobotState: {“version”:1,“reqId”:“1”,“r
esult”:“ok”,“data”: {},“error”:null,“alert”:null,“state”:1,“action”:0,“cleaning”: {“category”:2,“mode”:1,“modifier”:1,“navigati
onMode”:1,“spotWidth”:0,“spotHeight”:0},“details”: {“isCharging”:false,“isDocked”:true,“isScheduleEnabled”:false,“dockHasBeenSe
en”:false,“charge”:97},“availableCommands”: {“start”:true,“stop”:false,“pause”:false,“resume”:false,“goToBase”:false},“availabl
eServices”: {“generalInfo”:“basic-1”,“houseCleaning”:“basic-3”,“IECTest”:“basic-1”,“logCopy”:“basic-1”,“maps”:“advanced-1”,“pre
ferences”:“basic-1”,“schedule”:“minimal-1”,“softwareUpdate”:“basic-1”,“spotCleaning”:“micro-2”,“wifi”:“basic-1”},“meta”: {“mode

Not sure why yet they are returning two different values, but it seems to break the API rules.

According to Neato:
category integer Required. Fixed to 2 for house cleaning.

category should always be “2” to start cleaning. Since you are passing back what you got from getRobotState, it seems to fail.

Now that I think about it, the getRobotState is likely the last mode which I used the robot in. So one was from a general house cleaning, the other was a scheduled cleaning. Maybe don’t use those values and always use 2 for category, allow the command to pick between ECO (1) and Turbo (2) for mode.


I just installed 2.4 and trying to get Neato botvac binding to work.

I have a few questions

  • I discovered the serial number on another computer, this means that the linked python file is not on my openhab server. Is this correct?

I don’t see a link between the item files and what is defined in things.

For a netatmo there is something like { channel = “netatmo:NAMain:home:inside:Co2” }
Don’t the items for neato also have to have such a link?

I had a problem with the map parts. I removed these from my item.file
yet the others also don’t see to work
when I reload my.things file

I see ‘neato:vacuumcleaner:dobby’ changed from ONLINE to UNINITIALIZED

so I know it was online before the thing file is reloaded

I assume my problem is in the items file.

I added { channel = “neato:vacuumcleaner::battery-level” } and that worked.
I’ll add that to the documentation

Hi @Alex65

Did you solve this? I’m using the same robot same OH version and getting the same error

Hi @jjlauterbach

Did you get time too fix this if so could you point me in the direction too fix my error

Hi, may I add my error messages at this place too?

Any ideas where my mistake could be?

2019-02-23 23:04:25.094 [WARN ] [rest.core.item.EnrichedItemDTOMapper] - Failed transforming the state 'INVALID' on item 'FannDammAction' with pattern 'MAP(': An error occurred while opening file.
2019-02-23 23:04:25.148 [WARN ] [rest.core.item.EnrichedItemDTOMapper] - Failed transforming the state 'NORMAL' on item 'FannDammModifier' with pattern 'MAP(': An error occurred while opening file.
2019-02-23 23:04:25.152 [WARN ] [rest.core.item.EnrichedItemDTOMapper] - Failed transforming the state 'IDLE' on item 'FannDammState' with pattern 'MAP(': An error occurred while opening file.
2019-02-23 23:04:25.175 [WARN ] [rest.core.item.EnrichedItemDTOMapper] - Failed transforming the state 'UNRECOGNIZED' on item 'FannDammCategory' with pattern 'MAP(': An error occurred while opening file.
2019-02-23 23:04:25.184 [WARN ] [rest.core.item.EnrichedItemDTOMapper] - Failed transforming the state 'TURBO' on item 'FannDammMode' with pattern 'MAP(': An error occurred while opening file.
2019-02-23 23:04:25.231 [WARN ] [rest.core.item.EnrichedItemDTOMapper] - Failed transforming the state 'ON' on item 'FannDammIsDocked' with pattern 'MAP(': An error occurred while opening file.

This error is because you need a map file. Create in the map directory with the contents below.

ui_error_navigation_noprogress=Navigation Issue
ui_alert_recovering_location=Recovering Location
ui_error_brush_overload=Brush Overload
ui_error_dust_bin_full=Dust Bin Full
ui_error_dust_bin_emptied=Dust Bin Emptied
ui_error_brush_stuck=Brush Stuck

// Curent state of the vacuum cleaner 



// Current or last cleaning mode 

// Modifier of current or last cleaning 

// Current or Last category of the cleaning 

I have tried the binding but getting below error. I have added the Botvac Neato Account and Vacuum Cleaner using PaperUI.
OH: 2.5.0.M1
OS: Linux

The Botvac is online based on the Neato app and I can start/stop it. The Account thing is also showing status ONLINE. The Neato Vacuum is showing status


Any Ideas?

2019-08-18 00:02:10.199 [DEBUG] [ab.binding.neato.internal.NeatoRobot] - Will get STATE for Robot OPS46216-884AEAFXXXXX
2019-08-18 00:02:10.201 [DEBUG] [ab.binding.neato.internal.NeatoRobot] - Calling Neato WS with body: {"reqId":"1","cmd":"getRobotState","params":{}}
2019-08-18 00:02:11.295 [DEBUG] [ab.binding.neato.internal.NeatoRobot] - Result from getRobotState: {"message":"Could not find robot_serial for specified vendor_name"}
2019-08-18 00:02:11.296 [ERROR] [ab.binding.neato.internal.NeatoRobot] - Error when getting Robot State. Error message: Could not find robot_serial for specified vendor_name
2019-08-18 00:02:11.297 [DEBUG] [.neato.internal.handler.NeatoHandler] - Error when refreshing state.
org.openhab.binding.neato.internal.CouldNotFindRobotException: Could not find robot_serial for specified vendor_name
        at org.openhab.binding.neato.internal.NeatoRobot.sendGetState( ~[?:?]
        at org.openhab.binding.neato.internal.handler.NeatoHandler.refreshStateAndUpdate( ~[?:?]
        at org.openhab.binding.neato.internal.handler.NeatoHandler.lambda$0( ~[?:?]
        at java.util.concurrent.Executors$ [?:?]
        at java.util.concurrent.FutureTask.runAndReset( [?:?]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301( [?:?]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ [?:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker( [?:?]
        at java.util.concurrent.ThreadPoolExecutor$ [?:?]
        at [?:?]

I had similar issue today. As I saw you have 2.5 binding version so basically it is the basis.

After installing a D7 today it worked but after some time same errors appeared.
My solution was to delete thing in paperui and let the binding find it again.
I found a difference in the security id … but even if I changed it manually it was not working. So let the system do the job :slight_smile:

Hi !
Does D7 connected accept commands from OH2 sitemap like:
“Clean zone 1 and 3” ?
Can I schedule such commands ?
Will it skip no-clean-zones and respect no-clean-lines specified in the app ??

Really thanks.

Nope, not yet.
All features you mentioned are App excl. atm.

Hi guy’s,

I just added a new option to neato binding.
The improvements Add option Clean with map to binding neato to launch clean with no-go line activated.
I don’t remove the old clean option because of legacy.

Here the Jar file if you want to try it before the merge :


Hey @Tukks

Thanks for this change…:slight_smile:

I can confirm that this works also with the D5 Model…

Thanks @Tukks

it’s working :slight_smile:

But one thing I noticed is, that the Robot is now cleaning very, very slowly, much slower then in care mode (set in neato app). The avg time for cleaning is 40min in Turbo-Mode and now, started by binding >1h for 50% of the whole space.

I checked the code on git and “clean with map” set navigation mode to 3 (deep).

In; Line161

else if ("cleanWithMap".equalsIgnoreCase(command)) {
            request.addParam("category", MAP.getCategory());
            request.addParam("mode", TURBO.getMode());
            request.addParam("navigationMode", DEEP.get

Is it possible to change the navigation mode manual to normal?

When I will have time I will think on a solution to set clean mode and speed mode.


I recently upgraded to 2.5.9 and cannot search for my Botvac D7 anymore.

In the console I get following:

  2020-10-05 17:26:36.816 [WARN ] [mmon.WrappedScheduledExecutorService] - Scheduled runnable ended with an exception: 
   java.lang.NullPointerException: null

at org.eclipse.smarthome.core.thing.ThingUID.<init>( ~[?:?]

at org.openhab.binding.neato.internal.discovery.NeatoAccountDiscoveryService.addThing( ~[?:?]

at org.openhab.binding.neato.internal.discovery.NeatoAccountDiscoveryService.findRobots( ~[?:?]

at org.openhab.binding.neato.internal.discovery.NeatoAccountDiscoveryService.lambda$0( ~[?:?]

at java.util.concurrent.Executors$ ~[?:?]

at ~[?:?]

at java.util.concurrent.ScheduledThreadPoolExecutor$ ~[?:?]

at java.util.concurrent.ThreadPoolExecutor.runWorker( [?:?]

at java.util.concurrent.ThreadPoolExecutor$ [?:?]

at [?:?]

Does anybody know what this means?

I have exactly the same with my Neato Botvac D5 Connected.
Same error, it appears after I connect to the Neato Account