[RE-RELEASE] iRobot Scheduler

Starting a new thread for continued development/support of the iRobot Scheduler App. The original thread has discussion of prior development and issues.

iRobot Scheduler is an application and device that enables local execution and scheduling of Roomba and Brava cleaning tasks in assistance with a Raspberry Pi running Dorita980 and Rest980. This application and device works with ALL WiFi enabled Roomba and Braava devices.


  • Complete step-by-step instructions for RPi and Hubitat configuration
  • Control multiple Roomba/Brava devices from a single RPi using multiple iRobot Scheduler installations
  • Roomba/Brava Device auto-creation; Device named based on user config in iRobot app
  • Pushover Notifications Start/Stop/Full Bin/Dock-Charging/Error/Battery Died
  • Advanced Cleaning Schedule for up to 10 cleaning times per selected days
  • Presence Schedule - auto start, delay and auto-dock
  • Advanced Options for non-900+ series Roomba/Brava devices
  • Roomba 900+ Series cleaning settings and Map
  • CleanRooms support for i7/s9 devices - clean specific rooms on the map
  • Dynamic Dashboard Tile
  • AppWatchDog2 Support

Dynamic Dashboard Tile:

Device Information page:

Special thanks to @aaron for permission to use his code to continue development/support of this application.


I think I found a small bug (?) when using Braava Jet (M6). I get the sense that the vast majority of people use this for vacuuming, not mopping--perhaps the code just hasn't been put through its paces with a Braava. Or maybe I'm doing something stupid. :slight_smile:

Anyway, I noticed that, even though I've toggled "Notify when Braava's tank is empty?" to ON, I'm not getting any notification when the tank is empty (even when the iRobot app says the tank is empty). The mop device in HE changes the tank attribute to "missing" from "good". "Missing" seems like a misnomer because the tank isn't missing; it's just empty or very low on water.

FWIW, I have all the Notification toggles set to ON, except "notify when bin is full", since I presume that doesn't apply to a mop. I am getting the other normal notifications--e.g., "started cleaning", "stopped cleaning", "unknown state: stuck", etc.

As an aside, I noticed the UI says "pushover device" for notification. Does that mean I can't use other notification devices, like SMS/text? TIA....

To answer your last question, any device with capability notification can be used - I use the device created by the Hubitat mobile app to get push notifications.

When your Braava m6 mop reports tank missing (instead of empty), can you check the pi:3000/api/local/info/state JSON to see what the tankLvl and mopReady.tankPresent attributes show? It seems that the latter comes up false, so we declare the tank "missing" and don't check the level. I have an m6, but haven't used it much with Hubitat yet. Will see if I can reproduce the behavior on my end.

Sure will do. May not get to it for a couple days, but I'll revert then.

Thanks -- current code sends the "empty" notification (if enabled) when tankLvl is 0, but assumes the tankPresent is still true. It seems that the logic may need to be tweaked...

General reminder: if you have set a non-default port for the rest980 service on your rPi controlling your Braava, replace 3000 with the port you selected

I interpreted this to mean that I should go to a folder api/local/info/ on my rpi and look for a state JSON file. My pi noobness must be getting in the way because there is no api folder that I can find, unless it’s buried somewhere?

Sorry - this is an API exposed by rest980 - so you can put it in your browser address bar, replacing pi with the IP of your pi, and 3000 with your custom port (if not using the default). This would match the doritaIP and doritaPort you supplied in the App page

Duh, sorry. Checked the values for the situation where the Braava is docked with an empty tank:

The empty tank is definitely seated into the Braava, as per normal.

@dkilgore90, any thoughts on the above issue?

Sorry, not ignoring you on purpose. I took a look at that section of code (and played with my own Braava tank) - it seems like the original expectation/behavior was that it would report tankPresent: true with tankLevel:0.

However, yours clearly reports differently - and when the tank is removed, it reports false and 0 as well. My thought is to just combine the two as a state/notification of empty/missing

Hey, no worries. All good.

Yeah, your logic makes sense to me. I can setup a notification with RM using that logic or, if you prefer to integrate it into the app, I'm also happy to beta test for you/us. Either way is fine by me!

Changes made in app v1.5.1 -- take it for a spin!

1 Like

hi @dkilgore90 - I'm looking to install this with HPM, however I'm seeing two listings. Which one is this one with the latest and greatest?

I was going to assume the second one, however looking at your package manifest on you Git link, now I'm confused.

Thanks for letting me know!

Yes, the 2nd one should contain my latest code. I think HPM uses the author from the repository.json, but I'll update my packageManifest to avoid confusion

1 Like

Thanks, yeah in your app manifest I see "Aaron Ward" as the package author and David isn't mentioned anywhere, so was super confused which HPM package has the latest.

Ok. I've followed all of the instructions and have the server up and running on my Pi,

For the life of me I can't get the app to work, and am not seeing anything in the logs that I recognize as an issue.

Any thoughts?


Edit: Probably worth calling out I have the new "J+" rumba... not sure if things are different.

Not sure, you might be the first user with a J model...

The App tries to call - you can check this in your browser, should return a large JSON object.

Additionally, when you click Done on the App page, it will try to run this query - if it hits an error (which seems likely from what you pasted, it should generate an error log: Rest980 Server not available: $e - where $e is filled in with the actual exception hit

Looks like it, I don't think the two dependent libraries support the J yet, so that query gives me an empty JSON. :frowning:

No worries, I'll wait to see if those projects ever update to include J support, which I was lucky to have been gifted.

Did some reading on the dorita980 project that supports this App - seems the process to get the robot password for the mqtt connection changed in the latest firmware (which of course applies to the J series)...

Now it has to go through the cloud API, as discovery mode cannot be retriggered once the robot has connected to wifi. The developer of dorita980 implemented a new command for this, and documented it here: https://github.com/koalazak/dorita980#how-to-get-your-usernameblid-and-password

Give that a try, update the configuration on your pi, and relaunch the rest980 service -- see if we get any further

Note: the above method was only published a couple days ago, so you may need to update dorita980 on your pi

Download the Hubitat app