Neato Botvac Binding

Hi,
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?

Thanks

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:

print(robot.state)
{‘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’}}

Thanks

Hello,

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
leaning","params":{"mode":2,"navigationMode":1,"category":0}}                                                                  
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
d-1","preferences":"basic-1","schedule":"minimal-1","softwareUpdate":"basic-1","spotCleaning":"micro-2","wifi":"basic-1"},"meta
": {"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
leaning","params":{"mode":1,"navigationMode":1,"category":2}}                                                                  
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
ame":"BotVacD3Connected","firmware":"4.4.0-72"}}  

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
lName”:“BotVacD3Connected”,“firmware”:“4.4.0-72”}}

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
lName”:“BotVacD3Connected”,“firmware”:“4.4.0-72”}}

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.

Thoughts?

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(neato-sv.map):%s': 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(neato-sv.map):%s': 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(neato-sv.map):%s': 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(neato-sv.map):%s': 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(neato-sv.map):%s': 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(neato-sv.map):%s': An error occurred while opening file.

This error is because you need a map file. Create neato-sv.map 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 
INVALID=Invalid
IDLE=Idle
BUSY=Busy
PAUSED=Paused
ERROR=Error

ON=Yes
OFF=No

IEC TEST=Iec Test

// Current or last cleaning mode 
MODE-ECO=Eco
CLEAN-MODE-TURBO=Turbo

// Modifier of current or last cleaning 
CLEAN-MODIFIER-NORMAL=Normal
CLEAN-MODIFIER-DOUBLE=Double

// Current or Last category of the cleaning 
CLEAN-CATEGORY-HOUSE=House Cleaning
CLEAN-CATEGORY-SPOT=Spot Cleaning
CLEAN-CATEGORY-MANUAL=Manual Cleaning
NULL=NULL
-=NA
=NA

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

OFFLINE - COMMUNICATION_ERROR

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(NeatoRobot.java:198) ~[?:?]
        at org.openhab.binding.neato.internal.handler.NeatoHandler.refreshStateAndUpdate(NeatoHandler.java:117) ~[?:?]
        at org.openhab.binding.neato.internal.handler.NeatoHandler.lambda$0(NeatoHandler.java:131) ~[?:?]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:?]
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [?:?]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [?:?]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [?:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:?]
        at java.lang.Thread.run(Thread.java:748) [?:?]

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.
Alex

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 :
https://drive.google.com/file/d/1fq3nA9TZVP7VeLMZK0oefbWnCt4zZxiw/view?usp=sharing

2 Likes

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 NeatoRobot.java; Line161

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

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

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

2 Likes

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>(ThingUID.java:54) ~[?:?]

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

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

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

at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[?:?]

at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]

at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[?:?]

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

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]

at java.lang.Thread.run(Thread.java:834) [?:?]

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