iRobot Roomba i7+ Configuration using Rest980

Hi @James_Huang,

there are two of each containers in the Repo to allow people with two robots or a robot and a bravva to run them both. You only need the rest980 and the php-nginx addons running for your deployment.

Are you running the HA native vacuum component also? I have found that these don’t play nice together and might explain why your getting blank output from the states page.

That was it! Removing the native vacuum component seems to have done the trick. Thanks.

1 Like

glad it worked… !

has also been added this to the FAQ so hopefully future people don’t have the same issue :+1:

ive just updated the repo to support ordered cleaning… check if out if you have a compatible model :slight_smile:

Hey @Syrius,

Thanks so much for creating this integration! I’m floored at the amount of work that must’ve gone into this, it’s great!

I’ve had it setup and working for a few days now, but I’ve just started having an issue I haven’t been able to figure out. I realized yesterday that one of my rooms had a wrong region_id, so I updated that but now I can’t trigger selective room cleaning from HA. Whenever I try, the iRobot app sends me a notification that “Roomba ended the job stuck”.

I can still trigger a full clean from HA, that works fine. I can also trigger selective room cleaning from the iRobot app and that works, but just not when I trigger a certain room from HA.

I’m using hass, when the issue occurs I’m not seeing anything that looks relevant in the logs, the rest960 logs just show the successful POST to /api/local/action/cleanRoom. The vacuum.log file just shows:
(0, 0, 0)
Finished

It seems like iRobot isn’t liking something about the cleanRoom API call, but I can’t figure out what the issue is. I triggered the same clean room command from both the iRobot app and HA and checked http://<ha>:3000/api/local/info/state after to see if there was any difference, here’s what those looked like:

Triggered clean_kitchen from iRobot app:

lastCommand
lastCommand: 

{
		command: "start",
		initiator: "rmtApp",
		time: 1594315408,
		ordered: 1,
		pmap_id: "0QH4S3TESiulP8qw_y0qhw",
		regions:  [
		 {
		region_id: "18",
		type: "rid"
		}
		],
		user_pmapv_id: "200702T030740”
},

Triggered clean_kitchen from HA:

lastCommand
lastCommand: 

{
		command: "start",
		initiator: "localApp",
		time: 1594315244,
		ordered: 0,
		pmap_id: "0QH4S3TESiulP8qw_y0qhw",
		regions:  [
		 {
		region_id: "18"
		}
		],
		user_pmapv_id: "200702T210426”
},

Any assistance you can provide will be greatly appreciated!

@jb2, these values should be the same

Which tells me that somehow the map has updated on the irobot app but not in the data available to the API.

I suggest edit the map from the app (add a block zone, save, delete it, save) and then the figures should hopefully realign!

Let me know!

Thank you!! This solved it for me, the integration is working beautifully now.

Thanks again for all your hard work on this.

EDIT: For anyone else reading, I should mention that this solved it for me by telling me the map_id values are supposed to be the same. Nothing I did got those values to match up again (i tried adding a block zone, renaming/deleting rooms and deleting the map), so I ended up just removing the Roomba from my account and set it up again from scratch.

well that’s frustrating that you had to delete/re-add to get it working… but good to know!

thanks for sharing! :+1: ive added this to the FAQ :slight_smile:

Just a thought on the maintenance. Shouldn’t that be triggered by run time hours not how many weeks it has been? With pets, kids, etc. our Roomba does not run on a schedule, but more of “When we kick it off” So the hours of runtime varies by week. I am thinking of updating the card to basically update a last done variable with the number of hours on the robot and then notify me on x hours of run time.

Hey @crzykidd, yeah I can appreciate that idea - let me know how you go!

I roughly based the maintenance schedule off what was recommended by iRobot moreso just to act as a reminder for me to maintain it.

need to get some projects done around the house for the wife then I will look at this option.

I just updated yaml files to the most recent version and I get an error on configuration check:
Error loading /config/configuration.yaml: Secret vacuum_notify not defined

edit: Hashing out the “Valid only for IOS users” parts fixed it.

1 Like

Thanks @strumf666!

Seems I did miss adding the vacuum.notify secret into the secrets file :frowning:

I have since updated this on the repo :+1:

1 Like

Hi @Syrius - first, this is amazing work. I can’t imagine the time and effort you put into building this out. I am relatively new to HA but am getting through things okay a few weeks in after a lot of research. However, after reading through this complete thread I am running into a few errors on map placement that some others have been experiencing. The issue comes into play when rotating angles of the lines. At 0 and 180 degrees the lines are appearing just fine (over a blank background) and I can offset as needed.

However, the closer the angle gets to 90° the lines become a complete 45 angle to the device icon and overlap into a straight line. The only difference in the photo below is the angle change in the image.php file. As you can see by the time it gets to 60° it is getting quite skewed and not displaying as it should at angle 0°. Any idea what is happening? I will continue to trouble shoot on my end as well. Thank you again, the rest of the features are working brilliantly, and I’ve been able to force my i7 to empty itself on docking since iRobot has broken that feature on my firmware.

Hi everyone,
i am trying to get the BLID and Password from my Roomba 650 with this addon but there is no password in the log.
It does show all the other data just fine, including the BLID, but nothing after the last } .

It does show these warnings so i am wondering if that is the issue ?

(node:18) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
(Use node --trace-deprecation ... to show where the warning was created)

The bot uses software 3.x, and i tried both with Version 2 and 3 in the config with no success.
I am using the latest HASSIO version on a RPi.
Thank you in advance.

Hi @Syrius - wanted to let you know I successfully implemented two floor cleaning today with my i7.

Your docs were extremely helpful! The only thing I had to adjust/add from your code is to split the input_text.vacuum_map from vacuum.yaml to point to the new !secret vacuum_map_0 and _1 as they were missing in your quick write up. Also your camera section has the camera tag twice which doesn’t load the second instance.

The lovelace card also works great and updates the floor that is currently being cleaned with the proper image .phps.

A few questions that came up as I worked through splitting my floors…

Are the sections “# Add/Remove Rooms for Ordered Cleaning” from vacuum.yaml required with your new “# Initiate Selective Room Clean Map” sections?

And, I feel like I need to address the vacuum_clear_image and vacuum_generate_image in the Shell Commands to include both of the vacuum maps, but my limited knowledge with programming is stopping me knowing how to do that. Should this be fixed?

Thanks again! And now to do this with the Braava Jet next. :slight_smile:

This is awesome work.
Btw, I’m using php-nginx docker container and had to do it differently:

The volume is not /app but /srv/www.

docker run -d --name php-nginx --restart=unless-stopped -p 4001:8080 -v /home/homeautomation/homeassistant/roomba:/srv/www webh
ippie/php-nginx:latest

Nevermind, it somehow worked a day later after a lot of tries. Wonderful addon thank you!

Almost have it fully done but I can’t seem to get the start button to work, after manually starting it the stop/home won’t work either. Where should I start looking for issues? Its getting the status just fine just not the controls. Roomba model 980, firmware version is set to version 2 as well.

  - badges: []
    cards:
      - cards:
          - buttons:
              find: true
              start/stop: true
              blank: true
              stop: true
            clean_base: false
            entity: sensor.vacuum
            type: 'custom:roomba-vacuum-card'
          - entities:
              - style: |-
                  .text-divider {
                    padding: 0em;
                    margin: 0em;
                  } h2 {
                    font-size: 1em;
                    margin-block-start: 0em;
                    margin-block-end: 0em;
                  }
                text: Clean
                type: 'custom:text-divider-row'
              - color: '#40bf6a'
                due: true
                entity: sensor.vacuum_maint_clean_brushes
                severity:
                  - color: '#bfb540'
                    value: 0 days
                  - color: '#bf4060'
                    value: '-1 days'
                timeout: 10 days
                title: Brushes
                type: 'custom:check-button-card'
              - color: '#40bf6a'
                due: true
                entity: sensor.vacuum_maint_clean_contacts
                severity:
                  - color: '#bfb540'
                    value: 0 days
                  - color: '#bf4060'
                    value: '-3 days'
                timeout: 18 days
                title: Contacts
                type: 'custom:check-button-card'
              - color: '#40bf6a'
                due: true
                entity: sensor.vacuum_maint_clean_filter
                severity:
                  - color: '#bfb540'
                    value: 0 days
                  - color: '#bf4060'
                    value: '-10 days'
                timeout: 10 days
                title: Filter
                type: 'custom:check-button-card'
              - color: '#40bf6a'
                due: true
                entity: sensor.vacuum_maint_clean_wheel
                severity:
                  - color: '#bfb540'
                    value: 0 days
                  - color: '#bf4060'
                    value: '-3 days'
                timeout: 18 days
                title: Wheel
                type: 'custom:check-button-card'
              - color: '#40bf6a'
                due: true
                entity: sensor.vacuum_maint_clean_bin
                severity:
                  - color: '#bfb540'
                    value: 0 days
                  - color: '#bf4060'
                    value: '-3 days'
                timeout: 18 days
                title: Bin
                type: 'custom:check-button-card'
              - style: |-
                  .text-divider {
                    padding: 0em;
                    margin: 0em;
                  } h2 {
                    font-size: 1em;
                    margin-block-start: 0em;
                    margin-block-end: 0em;
                  }
                text: Replace
                type: 'custom:text-divider-row'
              - color: '#40bf6a'
                due: true
                entity: sensor.vacuum_maint_replace_brushes
                severity:
                  - color: '#bfb540'
                    value: 0 months
                  - color: '#bf4060'
                    value: '-4 months'
                timeout: 8 months
                title: Brushes
                type: 'custom:check-button-card'
              - color: '#40bf6a'
                due: true
                entity: sensor.vacuum_maint_replace_filter
                severity:
                  - color: '#bfb540'
                    value: 0 months
                  - color: '#bf4060'
                    value: '-1 months'
                timeout: 3 months
                title: Filter
                type: 'custom:check-button-card'
              - color: '#40bf6a'
                due: true
                entity: sensor.vacuum_maint_replace_wheel
                severity:
                  - color: '#bfb540'
                    value: 0 months
                  - color: '#bf4060'
                    value: '-4 months'
                timeout: 2 years
                title: Wheel
                type: 'custom:check-button-card'
            head:
              label: Maintenance
              type: section
            type: 'custom:fold-entity-row'
        type: vertical-stack
      - aspect_ratio: 0%
        camera_image: camera.roomba
        entities: []
        type: picture-glance
    icon: 'mdi:robot-vacuum'
    path: vacuum
    title: 'Vacuum '

*Edited with code

yeah the rotate config needs some revision… its on my list of things to fix :frowning:

glad the rest is working!

yes, the add/remove sections update input_text.vacuum_roomswith the appropriate order for the rooms, you can confirm this by opening a second HA window in dev tools and filter on this field. when you check/uncheck the input booleans, the order will update :slight_smile:

i would probably keep them separate pointing at each separate map instance, so that when swapping between floors, the map will reflect the “last” clean rather than being blank (if both blanked at same time). in saying that - did i actually end up splitting into two different log files? without going back over the original code, i think i kept it pointing at the same log file because i figure it would only be cleaning one floor at any one time.

is possible - can you please send me the full ouput for your split floor cleaning once finished? i want to “generalize” and add to the GH Repo to help future users :slight_smile:

in the config I change the environment variable NGINX_WEBROOT to point at /app which is tied to the /config/vacuum director as a volume

glad its working for you !

i would remove this config and just use the default - i also think i removed the find option in the card as its not implemented in rest/dorita. try with just specifying the card (and clean_base false) and see if that helps at all? then dev in chrome console if your seeing any errors pop up? (F12)

Done and I noticed some errors with the tab it was on so I added it to its own and the only errors I see are from custom header but I wouldn’t think its from that, I’m gonna disable it and see.