iRobot Roomba i7+ Configuration using Rest980

It does - I have the same model and have all the functionality i would in the app

I haven’t integrated any maps - which you can - because it just cleans everywhere on the first floor

image

1 Like

@KurtaPajama - I’m having the same issue with my e5.

If i go to 192.168.1.111:3000, it presents the following,

{"documentation":"https://github.com/koalazak/rest980","pong":"2022-09-22T22:03:17.269Z"}

but if I try 192.168.1.111:3000/api/local/info/state, i just get

{ }

Did you work out the cause? I think mine is a local network issue, which I’m currently troubleshooting.

Can anyone confirm what url i would use to make the same call to the cloud service ?

Hey all, was hoping someone might be able to help me out with an automation. I have everything setup and working so I can run selective room cleaning from the lovelace card.

What I’d like to do is have an automation run so that the vacuum starts cleaning a specific room when a contact sensor changes to the closed state. I’m not even sure where to begin so any pointers would be appreciated

Hello,

Same issue for me.

Florent

the Roomba Images (rest980 and rest980_2) are not linked to MQTT, these are separate. check the names in lovelace, and ensure the names are different for your vacuum and mop entities

connection refused typically means its no in the right mode, make sure are setting into pairing mode as notes here

are you using the seperate j7 image? it uses a different cipher

yes this integration still works, i have an i7+. the only thing outstanding is the live maps which was removed by irobot.

i have seen {} in the past when there is an existing connection to the robot, such as having the app open or the native vacuum controller etc - something that is using the service when rest980 tries to connect. also can try restarting the rest980 container sometimes fixes it, or even reboot your robot first, etc.

if you take the vacuum schedule automation found here and update the trigger for your contact sensor and remove/update the conditions - this should achieve what you want

same advise as above

1 Like

Hi, thanks for responding, I’ve checked and the Roomba app is not open, and a restart does not seem to fix it either…

Reminder, it presents the following via the ip:3000,

{"documentation":"https://github.com/koalazak/rest980","pong":"2022-09-30T08:03:17.269Z"}

but if I try any other API call, e.g 192.168.1.111:3000/api/local/info/state, i still just get an empty response, the console still shows, which seems positive if 200 is a success code ?

GET 200 0.540 ms - 89
GET /api/local/info/state 200 101.331 ms - 2
GET 200 0.541 ms - 89

Update, tried a couple of other commands, and noticed the following, which suggests connectivity on local, and maybe an issue with the BLID and Password, but i checked those details via the following and it’s correct…

docker run -it node sh -c "npm install -g dorita980 && get-roomba-password-cloud [email protected] PASSword"?

Here’s some extracts from the console logs…

WARNING: NODE_ENV value of 'production' did not match any deployment config file names.
WARNING: See https://github.com/lorenwest/node-config/wiki/Strict-Mode
GET / 200 10.738 ms - 89
GET / 200 3.806 ms - 89
GET /favicon.ico 304 2.795 ms - -
GET / 200 1.498 ms - 89
GET /api/local/info/state 304 104.809 ms - -
GET / 200 1.008 ms - 89
GET /api/cloud/info/state 404 3.472 ms - 136
Error: Endpoint not found.
    at /usr/src/app/app.js:62:13
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
    at /usr/src/app/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
    at next (/usr/src/app/node_modules/express/lib/router/index.js:275:10)
    at /usr/src/app/node_modules/express/lib/router/index.js:635:15
    at next (/usr/src/app/node_modules/express/lib/router/index.js:260:14)
    at Function.handle (/usr/src/app/node_modules/express/lib/router/index.js:174:3)
    at router (/usr/src/app/node_modules/express/lib/router/index.js:47:12)
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
    at /usr/src/app/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
    at next (/usr/src/app/node_modules/express/lib/router/index.js:275:10)
    at /usr/src/app/node_modules/express/lib/router/index.js:635:15
    at next (/usr/src/app/node_modules/express/lib/router/index.js:260:14)
    at jsonParser (/usr/src/app/node_modules/body-parser/lib/types/json.js:110:7)
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
    at /usr/src/app/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
GET / 200 0.534 ms - 89 

This command is the preferences GET

GET /api/local/info/preferences 404 1.400 ms - 136
Error: Endpoint not found.
    at /usr/src/app/app.js:62:13
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
    at /usr/src/app/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
    at next (/usr/src/app/node_modules/express/lib/router/index.js:275:10)
    at /usr/src/app/node_modules/express/lib/router/index.js:635:15
    at next (/usr/src/app/node_modules/express/lib/router/index.js:260:14)
    at Function.handle (/usr/src/app/node_modules/express/lib/router/index.js:174:3)
    at router (/usr/src/app/node_modules/express/lib/router/index.js:47:12)
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
    at /usr/src/app/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
    at next (/usr/src/app/node_modules/express/lib/router/index.js:275:10)
    at /usr/src/app/node_modules/express/lib/router/index.js:635:15
    at next (/usr/src/app/node_modules/express/lib/router/index.js:260:14)
    at jsonParser (/usr/src/app/node_modules/body-parser/lib/types/json.js:110:7)
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
    at /usr/src/app/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
GET /api/cloud/info/preferences 404 0.739 ms - 136
Error: Endpoint not found.
    at /usr/src/app/app.js:62:13
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
    at /usr/src/app/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
    at next (/usr/src/app/node_modules/express/lib/router/index.js:275:10)
    at /usr/src/app/node_modules/express/lib/router/index.js:635:15
    at next (/usr/src/app/node_modules/express/lib/router/index.js:260:14)
    at Function.handle (/usr/src/app/node_modules/express/lib/router/index.js:174:3)
    at router (/usr/src/app/node_modules/express/lib/router/index.js:47:12)
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
    at /usr/src/app/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
    at next (/usr/src/app/node_modules/express/lib/router/index.js:275:10)
    at /usr/src/app/node_modules/express/lib/router/index.js:635:15
    at next (/usr/src/app/node_modules/express/lib/router/index.js:260:14)
    at jsonParser (/usr/src/app/node_modules/body-parser/lib/types/json.js:110:7)
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
    at /usr/src/app/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
GET / 200 1.181 ms - 89

Amazing, that’s just what I needed. Thanks so much :slight_smile:

Greetings everyone…

So I have a few issues…

I’ve got the docker container running and I can pull data (via the /api/local/info/state command) from the Roomba… (J7+) which is supposedly valid using the J7 docker image)… but its not creating the sensor.vacuum entry in home assistant. (which means I can’t get any card to work). But we are able to pull back some details on it… (interesting using v22 of the firmware rather than v2 or v3)

image

Also when going to the /map string, no map seems to be generated…

As I said, when checking in HA, the only sensors present are the ones for the docker container itself and not the vacuum.

Any ideas?

Hi, Thanks for your job.
I’ve installed your add-on rest980 directly on HA from the custom repository.
But after the installation, the add-on doesn’t run

The only thing in the log is :
[email protected] start /usr/src/app

node ./bin/www

I’ve configure the BILD, password etc.

For information, that the firmware for my roomba i7+
Robot “Le renifleur” (sku: i755840 SoftwareVer: lewis+22.29.3+2022-08-23-eb90240ea48+Firmware-Build+1832)

do you have any idea to run it correctly ?

Thank you

I’ve reinstalled the add-ons, and now i’ve this error.

[email protected] start /usr/src/app
node ./bin/www
/usr/src/app/node_modules/dorita980/lib/v2/cloud.js:7
throw new Error(‘Not implemented.’);
^
Error: Not implemented.
at dorita980 (/usr/src/app/node_modules/dorita980/lib/v2/cloud.js:7:9)
at new cloud (/usr/src/app/node_modules/dorita980/index.js:12:10)
at /usr/src/app/routes/api.js:33:46
at handleIP (/usr/src/app/routes/api.js:26:68)
at Object. (/usr/src/app/routes/api.js:27:1)
at Module._compile (module.js:577:32)
at Object.Module._extensions…js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object. (/usr/src/app/app.js:11:16)
at Module._compile (module.js:577:32)
at Object.Module._extensions…js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object. (/usr/src/app/bin/www:7:11)
at Module._compile (module.js:577:32)
npm ERR! Linux 5.15.72
npm ERR! argv “/usr/local/bin/node” “/usr/local/bin/npm” “start”
npm ERR! node v6.17.1
npm ERR! npm v3.10.10
npm ERR! code ELIFECYCLE
npm ERR! [email protected] start: node ./bin/www
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] start script ‘node ./bin/www’.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the rest980 package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! node ./bin/www
npm ERR! You can get information on how to open an issue for this project with:
npm ERR! npm bugs rest980
npm ERR! Or if that isn’t available, you can get their info via:
npm ERR! npm owner ls rest980
npm ERR! There is likely additional logging output above.
npm ERR! Please include the following file with any support request:
npm ERR! /usr/src/app/npm-debug.log

yes this integration still works, i have an i7+. the only thing outstanding is the live maps which was removed by irobot.

So do I understand clearly that the projected clean map isn’t working any longer?

the cloud endpoints arent exposed in rest980 - as replied in the GH Issue, try removing the cloud and keep alive envs and see if this brings it to life

unfortunately this add-on is not nice and fancy - you need to create this yourself using the steps outlined on the GH repository.

as noted in this thread, mapping coordinates have been removed from the api by iRobot. only Ahtohallan knows if it will be returned someday :smiley:

you need to follow the steps in the GH repository to manually configure the required sensors and automations.

you need to set the cloud ENV to off, as this isnt implemented in rest980

that is correct.

Trying to get this nice integration to work, however I don’t get info on visiting:
http://:/api/local/info/state

The LOG of rest980 also is pretty empty.

Hi Syrius,

Do you know if I can do something similar with an i4 on bassin or I bought the wrong one ?

Thanks

What commands do the buttons in the graphic issue?

I’m trying to automate the start and docking functions to a pico remote and am at a loss

Hello @Syrius ,
I have almost configure everything. I have something to solve with the map but I want to try a little bit by myself before asking support.

I want to ask something differente: can you give support on how can I start to clean a specific room (or two or three of them) by pressing a button outside your beatiful custom card? I think is’ something related to call the service automation trigger that start “automation.vacuum_clean_rooms” but I don’t know how to modify the code to change the input from dynamic rooms selection to a static one (a specific room).

I tried my best to explain what is my goal, hope to understand, if not I will try tyo explain better.
PS: already look at the FAQ and other spots but find nothing helpful to reach the goal.

Thank You!

Hello, I cannot display the plot of the roomba, the Vacuum Log Position automation does not start. In the sensor.vacuum, Location is n-a

Hi @Syrius,

In the documentation of the HA installation under Step 2 it says:

" NOTE Do not have iRobot App running on your phone when doing this !!!"

What is meant by this exactly:

  1. One should not operate the iRobot from the app on your phone while doing this
  2. One should not have installed the app and connected the iRobot with that app while doing this

It is a major difference in hassle to get this done. :slight_smile:

I hope you can eleborate on this for me and others.

Regards,
Wolk9, Martin

Hi,

I’ve been using this for over a year, and it seems to work correctly, but my logs are being filled with the following errors:

2022-12-09 12:13:39.486 WARNING (MainThread) [homeassistant.helpers.template] Template variable warning: 'None' has no attribute 'notReady' when rendering '{% set mapper =  {
  0 : 'n-a',
  2 : 'Uneven Ground',
  15 : 'Low Battery',
  39 : 'Pending',
  48 : 'Path Blocked' } %}
{% set state =  state_attr('sensor.rest980', 'cleanMissionStatus')['notReady'] %} {{ mapper[state] if state in mapper else state }}'
2022-12-09 12:13:39.553 WARNING (MainThread) [homeassistant.helpers.template] Template variable warning: 'None' has no attribute 'error' when rendering '{% set mapper =  {
  0 : 'n-a',
  15 : 'Reboot Required',
  18 : 'Docking Issue'} %}
{% set state =  state_attr('sensor.rest980', 'cleanMissionStatus')['error'] %} {{ mapper[state] if state in mapper else state }}'
2022-12-09 12:13:39.557 ERROR (MainThread) [homeassistant.helpers.template] Template variable error: 'None' has no attribute 'split' when rendering '{% if state_attr('sensor.rest980', 'softwareVer') is defined %} {% set version = state_attr('sensor.rest980', 'softwareVer') %}
  {{ version.split('+')[1] }} 
{% else %}
  n-a
{% endif %}'
2022-12-09 12:13:39.564 WARNING (MainThread) [homeassistant.helpers.template] Template variable warning: 'None' has no attribute 'phase' when rendering '{% if state_attr('sensor.rest980', 'cleanMissionStatus')['phase'] == 'charge' and state_attr('sensor.rest980', 'batPct') == 100 %}
  Idle
{% elif state_attr('sensor.rest980', 'cleanMissionStatus')['cycle'] == 'none' and state_attr('sensor.rest980', 'cleanMissionStatus')['phase'] == 'stop' %}
  Stopped
{% else %} {% set mapper =  {
  'charge' : 'Charge',
  'run' : 'Run',
  'evac' : 'Empty',
  'stop' : 'Paused',
  'stuck' : 'Stuck',
  'hmUsrDock' : 'Sent Home',
  'hmMidMsn' : 'Mid Dock',
  'hmPostMsn' : 'Final Dock' } %}
{% set state =  state_attr('sensor.rest980', 'cleanMissionStatus')['phase'] %} {{ mapper[state] if state in mapper else state }} {% endif %}'
2022-12-09 12:13:39.571 WARNING (MainThread) [homeassistant.helpers.template] Template variable warning: 'None' has no attribute 'full' when rendering '{% set mapper =  {
  true : 'Full',
  false : 'Not Full' } %}
{% set state =  state_attr('sensor.rest980', 'bin')['full'] %} {{ mapper[state] if state in mapper else state }}'
2022-12-09 12:13:39.577 WARNING (MainThread) [homeassistant.helpers.template] Template variable warning: 'None' has no attribute 'present' when rendering '{% set mapper =  {
  true : 'Yes',
  false : 'No' } %}
{% set state =  state_attr('sensor.rest980', 'bin')['present'] %} {{ mapper[state] if state in mapper else state }}'
2022-12-09 12:13:39.589 WARNING (MainThread) [homeassistant.helpers.template] Template variable warning: 'None' has no attribute 'initiator' when rendering '{% set mapper =  {
  'schedule' : 'Scheduler',
  'rmtApp' : 'App',
  'manual' : 'Robot',
  'localApp' : 'HA' } %}
{% set state =  state_attr('sensor.rest980', 'cleanMissionStatus')['initiator'] %} {{ mapper[state] if state in mapper else state }}'
2022-12-09 12:13:39.603 ERROR (MainThread) [homeassistant.helpers.template_entity] TemplateError('UndefinedError: 'None' has no attribute 'notReady'') while processing template 'Template("{% if state_attr('sensor.rest980', 'cleanMissionStatus')['cycle'] == 'none' and state_attr('sensor.rest980', 'cleanMissionStatus')['notReady'] == 39 %}
  Pending
{% elif state_attr('sensor.rest980', 'cleanMissionStatus')['notReady'] > 0 %}
  Not Ready
{% else %} {% set mapper =  {
  'clean' : 'Clean',
  'quick' : 'Clean',
  'spot' : 'Spot',
  'evac' : 'Empty',
  'dock' : 'Dock',
  'train' : 'Train',
  'none' : 'Ready' } %}
{% set state =  state_attr('sensor.rest980', 'cleanMissionStatus')['cycle'] %} {{ mapper[state] if state in mapper else state }} {% endif %}")' for attribute '_attr_native_value' in entity 'sensor.vacuum'
2022-12-09 12:13:39.608 ERROR (MainThread) [homeassistant.helpers.template_entity] TemplateError('UndefinedError: 'None' has no attribute 'split'') while processing template 'Template("{% if state_attr('sensor.rest980', 'softwareVer') is defined %} {% set version = state_attr('sensor.rest980', 'softwareVer') %}
  {{ version.split('+')[1] }} 
{% else %}
  n-a
{% endif %}")' for attribute 'software_ver' in entity 'sensor.vacuum'

This is causing Home Assistant to hang, sometimes for hours at a time. Disabling the Rest980 Add-on prevents it happening.

Thanks

Guyan

are you hitting the ip address of your HA instance and the port defined in the rest980 app? there is no further expected output in the docker image log.

i am not sure sorry, if you can create maps in the irobot app and initiate jobs of specific rooms, then it should be possible using this solution

rest_command.vacuum_action

data contains - “command: < action >” being stop/start/dock depending on button.

i understand your question, you can manually kickoff a room with the following example code -

service: rest_command.vacuum_clean
data: {
 "ordered": 1,
 "pmap_id": "{{ state_attr('sensor.vacuum', 'pmap0_id') | string }}",
 "regions": [{"region_id": "32", "type": "rid"}]
}

as the pmapid can change, i call it using a template variable.
in the region section above, you can just hard set the region id for the room you want to clean

HTH.

mapping is broken.

the robot only supports a single connection at any one time, so sometimes if you have the app open, it will establish the connection and when you try get the credentials, it will fail.

basically, just close the app on your phone when getting the details, no need to uninstall.

there have been some revisions to the vacuum.yaml file - perhaps use notepad++ to compare your setup and ammend any changes - report back if you still have issues