Neato Botvac - D7 Connected multiple zones piston

  1. Description of the problem:
    I am trying to create a piston, that first cleans one zone, and when finished, then clean another zone and then another and so on. First, when I execute the piston, it seems that the Neato cleans with the deep navigation map setting, as it takes almost twice the time to clean a zone. I have tried to set the value to standard. It is a Neato Botvac - D7 Connected, any input?
    The main issue is, that I can’t get the Neato to clean one zone after the other. I am quite new to both Smartthings and webCoRE, so I have tried to search the forum to find other pistons to learn from. I have tried a lot of different designs, but I have not been able to get it to work with all three zones.

  2. Expected behavior:
    Clean zone (Switch 4), then zone (Switch 8), and then zone (Switch 14). Cleaning with CleaningMode ‘turbo’, NavigationMode ‘standard’ (same speed as if I used the Neato app), and PersistenMapMode ‘on’ (so with No-Go lines enabled).
    I tried to use Switch 22, 25, and 28 (virtual switches), to exit the repeat loop. Switch 16 is my Neato robot.
    My experience is that the [Neato Botvac - Roberta:status] is sometimes delayed, and that’s why I added some the wait.

  3. What is happening/not happening:
    The current version of the piston it cleans the first zone only, and it takes about 7 min., while it only takes about 4 min. for the same zone, if I run it via the Neato app.

  4. Snapshot:

  5. Logs (logging level set to Full):
    7/17/2020, 10:56:55 AM +79ms
    +1ms ╔Received event [Hjem].time/recovery = 1594976215079 with a delay of 0ms
    +45ms ║RunTime Analysis CS > 15ms > PS > 5ms > PE > 25ms > CE
    +48ms ║Runtime (44614 bytes) successfully initialized in 5ms (v0.3.110.20191009) (47ms)
    +49ms ║╔Execution stage started
    +50ms ║╚Execution stage complete. (1ms)
    +51ms ╚Event processed successfully (51ms)
    7/17/2020, 10:56:35 AM +199ms
    +1ms ╔Received event [Hjem].execute = recovery with a delay of 64ms
    +7531ms ║RunTime Analysis CS > 84ms > PS > 7419ms > PE > 28ms > CE
    +7532ms ║Piston waited at a semaphore for 7415ms
    +7534ms ║Runtime (44676 bytes) successfully initialized in 7419ms (v0.3.110.20191009) (7533ms)
    +7535ms ║╔Execution stage started
    +7545ms ║║Cancelling condition #5’s schedules…
    +7546ms ║║Condition #5 evaluated false (7ms)
    +7547ms ║║Cancelling condition #1’s schedules…
    +7548ms ║║Condition group #1 evaluated false (state changed) (8ms)
    +7550ms ║║Cannot set the piston state while in automatic mode. Please edit the piston settings to disable the automatic piston state if you want to manually control the state.
    +7552ms ║╚Execution stage complete. (17ms)
    +7553ms ╚Event processed successfully (7553ms)
    7/17/2020, 10:50:25 AM +706ms
    +1ms ╔Received event [Støvsug Alrum].switch = on with a delay of 63ms
    +45ms ║RunTime Analysis CS > 16ms > PS > 5ms > PE > 23ms > CE
    +47ms ║Runtime (44607 bytes) successfully initialized in 5ms (v0.3.110.20191009) (45ms)
    +48ms ║╔Execution stage started
    +55ms ║║Comparison (enum) on changes_to (string) on = true (0ms)
    +57ms ║║Cancelling condition #5’s schedules…
    +58ms ║║Condition #5 evaluated true (5ms)
    +59ms ║║Cancelling condition #1’s schedules…
    +59ms ║║Condition group #1 evaluated true (state changed) (7ms)
    +62ms ║║Cancelling statement #10’s schedules…
    +659ms ║║Executed physical command [Neato Botvac - Roberta].setCleaningMode([turbo]) (593ms)
    +660ms ║║Executed [Neato Botvac - Roberta].setCleaningMode (595ms)
    +704ms ║║Executed physical command [Neato Botvac - Roberta].setNavigationMode([standard]) (41ms)
    +705ms ║║Executed [Neato Botvac - Roberta].setNavigationMode (43ms)
    +737ms ║║Executed physical command [Neato Botvac - Roberta].setPersistentMapMode([on]) (28ms)
    +739ms ║║Executed [Neato Botvac - Roberta].setPersistentMapMode (30ms)
    +741ms ║║Cancelling statement #42’s schedules…
    +3981ms ║║Executed physical command [Clean Button Bryggers2].on() (3236ms)
    +3982ms ║║Executed [Clean Button Bryggers2].on (3237ms)
    +4004ms ║║Executed physical command [Støvsug Entre].on() (20ms)
    +4005ms ║║Executed [Støvsug Entre].on (22ms)
    +4008ms ║║Executed virtual command [Clean Button Bryggers2, Støvsug Entre].wait (0ms)
    +4009ms ║║Requesting a wake up for Fri, Jul 17 2020 @ 10:53:29 AM CEST (in 180.0s)
    +4013ms ║╚Execution stage complete. (3965ms)
    +4014ms ║Setting up scheduled job for Fri, Jul 17 2020 @ 10:53:29 AM CEST (in 179.996s)
    +4028ms ╚Event processed successfully (4028ms)


I don’t know anything about this device but a few observations about your piston and the logs:

  • You said it is taking 7 minutes but should take 4 to do the first zone. Your wait, however, only gives 3 minutes so it won’t be ready when it drops into the following statements and none of those Wille ver execute.
  • According to the logs, it sets the wakeup for 3 minutes but never executes and then does a recovery after 6 minutes, Not sure why it is not waking up at the 3 minute wait.
  • Does your robot need to recharge? Seems like what you need is a loop that waits for the ready. Something like:
    while switch 16 status is not ‘ready’
    wait 2 minutes
    end while
    Then you will ensure it is ready before moving to the next block.
    -With all the waits, you will need to set TCP to never wherever you have a wait to keep the piston progressing properly.


Hi @guxdude,

Thanks for your feedback. I appreciate it.

  • I receive a cleaning summary in the Neato app, with the cleaning time. There the cleaning time is approx. 7 min. when executing the piston, and only about 4 min. when using the app. This is similar to the time I experience.

  • I am not sure I understand - but I just saw an additional log approx. one hour later:
    7/17/2020, 12:05:50 PM +721ms
    +1ms ╔Received event [Støvsug Alrum].switch = off with a delay of 47ms
    +52ms ║RunTime Analysis CS > 15ms > PS > 4ms > PE > 33ms > CE
    +55ms ║Runtime (44607 bytes) successfully initialized in 4ms (v0.3.110.20191009) (53ms)
    +56ms ║╔Execution stage started
    +65ms ║║Comparison (enum) off changes_to (string) on = false (1ms)
    +67ms ║║Condition #5 evaluated false (5ms)
    +68ms ║║Condition group #1 evaluated false (state did not change) (7ms)
    +72ms ║║Cannot set the piston state while in automatic mode. Please edit the piston settings to disable the automatic piston state if you want to manually control the state.
    +75ms ║╚Execution stage complete. (18ms)
    +76ms ╚Event processed successfully (76ms)

  • It has plenty of battery, so it does not need to recharge between cleaning zones. Would it be something like this I should try?

What is TCP? Sorry, I’m new.


Yes, that will work. I suggest putting that between each of the zones so it waits for the previous zone to complete.

Sorry, I should have spelled it out: Task Cancellation Policy. If you click on the ‘with’ and then click on the settings gear icon, you will see that as something you can change. Whenever you have a wait and you want to force continuation upon return, set TCP to ‘never cancel tasks’.

Side Note: This error comes from your exit statement as it is trying to set the piston state to whatever message you provide. You can safely ignore this or go to the piston settings and change automatic state to off. If you disable the automatic piston state, then you might can add some set piston state commands at strategic points in your piston (like just before each wait) to provide you an understanding of where the piston is at in execution (cleaning zone 1, cleaning zone 2, done, etc.)