This repository was archived by the owner on Feb 5, 2026. It is now read-only.

L60 Support - #119

Open
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main
Open

L60 Support#119
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main

Conversation

@damianolombardo

Copy link
Copy Markdown

No description provided.

@hsemenenko

Copy link
Copy Markdown

I am getting the following error after entering my eufy username and password.

Unexpected exception: 'device'
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 141, in get_eufy_vacuums
device = tuya_client.get_device(item["device"]["id"])
~~~~^^^^^^^^^^
KeyError: 'device'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 185, in async_step_user
valid_data = await validate_input(self.hass, user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/robovac/config_flow.py", line 167, in validate_input
await hass.async_add_executor_job(get_eufy_vacuums, data)
File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/config/custom_components/robovac/config_flow.py", line 157, in get_eufy_vacuums
item["device"]["id"]
~~~~^^^^^^^^^^
KeyError: 'device'

@damianolombardo

Copy link
Copy Markdown
Author

Do you get that on the master branch too? I have tested this and have another person using this branch without this issue coming up?

@hsemenenko

Copy link
Copy Markdown

I do not get the same error on the master branch. It has also been reported by someone else here: #112 (comment)

By removing ["device"] from line 141 of config_flow.py the error goes away and I can connect to the vacuum. However, it shows the status incorrectly i.e. shows cleaning when docked.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Works fine here. Installed the branch from the PR, I have 2 L60's running here.
Maybe it's got something to do with that? Having a single or multiple Robovac devices?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Although I have seen in another PR here (https://github.com/CodeFoodPixels/robovac/pull/64/files#diff-1a399db0f45c880538b174870af4a32a874c68567066d843c79217af7f4613b3L135) that there are also changes to devices / device inside config_flow.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

I'm not a python developer, but want to help - what can I do to output the item array?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Ok, found it. Code is only executed on config. This is the structure from device_response:

{
"res_code": 1,
"message": "",
"devices": [
{
"id": "...",
...
},{
"id": "...",
}
]
}

So yes, the ["device"] should be removed. Also on lines 157 and 160.

kevinbird15 referenced this pull request in kevinbird15/robovac-ha-integration Sep 6, 2025
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@PixNyb

Copy link
Copy Markdown

Would this also include support for the L60 hybrid? Since this also does mopping i assume some additional changes are required. If not i'd be happy to pick it up as a separate PR

@Patrick762

Copy link
Copy Markdown

Maybe some base classes for the separate device classes could make sense

@Patrick762

Patrick762 commented Oct 29, 2025

Copy link
Copy Markdown

I get the following exception from the tuya part:

{'t': [...], 'success': False, 'errorCode': 'PERMISSION_DENIED', 'status': 'error', 'errorMsg': 'No access'}

Is there something else that changed?

Or does this need time after the initial device setup in the app?

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

13 participants

@damianolombardo@hsemenenko@temp@PixNyb@Patrick762@andrewthetechie@ultrathew@batesbw@atmezferix@luke2447@CodeFoodPixels@jbleyaert@maximoei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Feb 5, 2026. It is now read-only.

L60 Support - #119

Open
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main
Open

L60 Support#119
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main

Conversation

@damianolombardo

Copy link
Copy Markdown

No description provided.

@hsemenenko

Copy link
Copy Markdown

I am getting the following error after entering my eufy username and password.

Unexpected exception: 'device'
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 141, in get_eufy_vacuums
device = tuya_client.get_device(item["device"]["id"])
~~~~^^^^^^^^^^
KeyError: 'device'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 185, in async_step_user
valid_data = await validate_input(self.hass, user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/robovac/config_flow.py", line 167, in validate_input
await hass.async_add_executor_job(get_eufy_vacuums, data)
File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/config/custom_components/robovac/config_flow.py", line 157, in get_eufy_vacuums
item["device"]["id"]
~~~~^^^^^^^^^^
KeyError: 'device'

@damianolombardo

Copy link
Copy Markdown
Author

Do you get that on the master branch too? I have tested this and have another person using this branch without this issue coming up?

@hsemenenko

Copy link
Copy Markdown

I do not get the same error on the master branch. It has also been reported by someone else here: #112 (comment)

By removing ["device"] from line 141 of config_flow.py the error goes away and I can connect to the vacuum. However, it shows the status incorrectly i.e. shows cleaning when docked.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Works fine here. Installed the branch from the PR, I have 2 L60's running here.
Maybe it's got something to do with that? Having a single or multiple Robovac devices?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Although I have seen in another PR here (https://github.com/CodeFoodPixels/robovac/pull/64/files#diff-1a399db0f45c880538b174870af4a32a874c68567066d843c79217af7f4613b3L135) that there are also changes to devices / device inside config_flow.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

I'm not a python developer, but want to help - what can I do to output the item array?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Ok, found it. Code is only executed on config. This is the structure from device_response:

{
"res_code": 1,
"message": "",
"devices": [
{
"id": "...",
...
},{
"id": "...",
}
]
}

So yes, the ["device"] should be removed. Also on lines 157 and 160.

kevinbird15 referenced this pull request in kevinbird15/robovac-ha-integration Sep 6, 2025
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@PixNyb

Copy link
Copy Markdown

Would this also include support for the L60 hybrid? Since this also does mopping i assume some additional changes are required. If not i'd be happy to pick it up as a separate PR

@Patrick762

Copy link
Copy Markdown

Maybe some base classes for the separate device classes could make sense

@Patrick762

Patrick762 commented Oct 29, 2025

Copy link
Copy Markdown

I get the following exception from the tuya part:

{'t': [...], 'success': False, 'errorCode': 'PERMISSION_DENIED', 'status': 'error', 'errorMsg': 'No access'}

Is there something else that changed?

Or does this need time after the initial device setup in the app?

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

13 participants

@damianolombardo@hsemenenko@temp@PixNyb@Patrick762@andrewthetechie@ultrathew@batesbw@atmezferix@luke2447@CodeFoodPixels@jbleyaert@maximoei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Feb 5, 2026. It is now read-only.

L60 Support - #119

Open
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main
Open

L60 Support#119
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main

Conversation

@damianolombardo

Copy link
Copy Markdown

No description provided.

@hsemenenko

Copy link
Copy Markdown

I am getting the following error after entering my eufy username and password.

Unexpected exception: 'device'
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 141, in get_eufy_vacuums
device = tuya_client.get_device(item["device"]["id"])
~~~~^^^^^^^^^^
KeyError: 'device'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 185, in async_step_user
valid_data = await validate_input(self.hass, user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/robovac/config_flow.py", line 167, in validate_input
await hass.async_add_executor_job(get_eufy_vacuums, data)
File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/config/custom_components/robovac/config_flow.py", line 157, in get_eufy_vacuums
item["device"]["id"]
~~~~^^^^^^^^^^
KeyError: 'device'

@damianolombardo

Copy link
Copy Markdown
Author

Do you get that on the master branch too? I have tested this and have another person using this branch without this issue coming up?

@hsemenenko

Copy link
Copy Markdown

I do not get the same error on the master branch. It has also been reported by someone else here: #112 (comment)

By removing ["device"] from line 141 of config_flow.py the error goes away and I can connect to the vacuum. However, it shows the status incorrectly i.e. shows cleaning when docked.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Works fine here. Installed the branch from the PR, I have 2 L60's running here.
Maybe it's got something to do with that? Having a single or multiple Robovac devices?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Although I have seen in another PR here (https://github.com/CodeFoodPixels/robovac/pull/64/files#diff-1a399db0f45c880538b174870af4a32a874c68567066d843c79217af7f4613b3L135) that there are also changes to devices / device inside config_flow.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

I'm not a python developer, but want to help - what can I do to output the item array?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Ok, found it. Code is only executed on config. This is the structure from device_response:

{
"res_code": 1,
"message": "",
"devices": [
{
"id": "...",
...
},{
"id": "...",
}
]
}

So yes, the ["device"] should be removed. Also on lines 157 and 160.

kevinbird15 referenced this pull request in kevinbird15/robovac-ha-integration Sep 6, 2025
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@PixNyb

Copy link
Copy Markdown

Would this also include support for the L60 hybrid? Since this also does mopping i assume some additional changes are required. If not i'd be happy to pick it up as a separate PR

@Patrick762

Copy link
Copy Markdown

Maybe some base classes for the separate device classes could make sense

@Patrick762

Patrick762 commented Oct 29, 2025

Copy link
Copy Markdown

I get the following exception from the tuya part:

{'t': [...], 'success': False, 'errorCode': 'PERMISSION_DENIED', 'status': 'error', 'errorMsg': 'No access'}

Is there something else that changed?

Or does this need time after the initial device setup in the app?

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

13 participants

@damianolombardo@hsemenenko@temp@PixNyb@Patrick762@andrewthetechie@ultrathew@batesbw@atmezferix@luke2447@CodeFoodPixels@jbleyaert@maximoei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Feb 5, 2026. It is now read-only.

L60 Support - #119

Open
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main
Open

L60 Support#119
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main

Conversation

@damianolombardo

Copy link
Copy Markdown

No description provided.

@hsemenenko

Copy link
Copy Markdown

I am getting the following error after entering my eufy username and password.

Unexpected exception: 'device'
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 141, in get_eufy_vacuums
device = tuya_client.get_device(item["device"]["id"])
~~~~^^^^^^^^^^
KeyError: 'device'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 185, in async_step_user
valid_data = await validate_input(self.hass, user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/robovac/config_flow.py", line 167, in validate_input
await hass.async_add_executor_job(get_eufy_vacuums, data)
File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/config/custom_components/robovac/config_flow.py", line 157, in get_eufy_vacuums
item["device"]["id"]
~~~~^^^^^^^^^^
KeyError: 'device'

@damianolombardo

Copy link
Copy Markdown
Author

Do you get that on the master branch too? I have tested this and have another person using this branch without this issue coming up?

@hsemenenko

Copy link
Copy Markdown

I do not get the same error on the master branch. It has also been reported by someone else here: #112 (comment)

By removing ["device"] from line 141 of config_flow.py the error goes away and I can connect to the vacuum. However, it shows the status incorrectly i.e. shows cleaning when docked.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Works fine here. Installed the branch from the PR, I have 2 L60's running here.
Maybe it's got something to do with that? Having a single or multiple Robovac devices?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Although I have seen in another PR here (https://github.com/CodeFoodPixels/robovac/pull/64/files#diff-1a399db0f45c880538b174870af4a32a874c68567066d843c79217af7f4613b3L135) that there are also changes to devices / device inside config_flow.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

I'm not a python developer, but want to help - what can I do to output the item array?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Ok, found it. Code is only executed on config. This is the structure from device_response:

{
"res_code": 1,
"message": "",
"devices": [
{
"id": "...",
...
},{
"id": "...",
}
]
}

So yes, the ["device"] should be removed. Also on lines 157 and 160.

kevinbird15 referenced this pull request in kevinbird15/robovac-ha-integration Sep 6, 2025
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@PixNyb

Copy link
Copy Markdown

Would this also include support for the L60 hybrid? Since this also does mopping i assume some additional changes are required. If not i'd be happy to pick it up as a separate PR

@Patrick762

Copy link
Copy Markdown

Maybe some base classes for the separate device classes could make sense

@Patrick762

Patrick762 commented Oct 29, 2025

Copy link
Copy Markdown

I get the following exception from the tuya part:

{'t': [...], 'success': False, 'errorCode': 'PERMISSION_DENIED', 'status': 'error', 'errorMsg': 'No access'}

Is there something else that changed?

Or does this need time after the initial device setup in the app?

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

13 participants

@damianolombardo@hsemenenko@temp@PixNyb@Patrick762@andrewthetechie@ultrathew@batesbw@atmezferix@luke2447@CodeFoodPixels@jbleyaert@maximoei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Feb 5, 2026. It is now read-only.

L60 Support - #119

Open
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main
Open

L60 Support#119
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main

Conversation

@damianolombardo

Copy link
Copy Markdown

No description provided.

@hsemenenko

Copy link
Copy Markdown

I am getting the following error after entering my eufy username and password.

Unexpected exception: 'device'
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 141, in get_eufy_vacuums
device = tuya_client.get_device(item["device"]["id"])
~~~~^^^^^^^^^^
KeyError: 'device'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 185, in async_step_user
valid_data = await validate_input(self.hass, user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/robovac/config_flow.py", line 167, in validate_input
await hass.async_add_executor_job(get_eufy_vacuums, data)
File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/config/custom_components/robovac/config_flow.py", line 157, in get_eufy_vacuums
item["device"]["id"]
~~~~^^^^^^^^^^
KeyError: 'device'

@damianolombardo

Copy link
Copy Markdown
Author

Do you get that on the master branch too? I have tested this and have another person using this branch without this issue coming up?

@hsemenenko

Copy link
Copy Markdown

I do not get the same error on the master branch. It has also been reported by someone else here: #112 (comment)

By removing ["device"] from line 141 of config_flow.py the error goes away and I can connect to the vacuum. However, it shows the status incorrectly i.e. shows cleaning when docked.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Works fine here. Installed the branch from the PR, I have 2 L60's running here.
Maybe it's got something to do with that? Having a single or multiple Robovac devices?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Although I have seen in another PR here (https://github.com/CodeFoodPixels/robovac/pull/64/files#diff-1a399db0f45c880538b174870af4a32a874c68567066d843c79217af7f4613b3L135) that there are also changes to devices / device inside config_flow.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

I'm not a python developer, but want to help - what can I do to output the item array?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Ok, found it. Code is only executed on config. This is the structure from device_response:

{
"res_code": 1,
"message": "",
"devices": [
{
"id": "...",
...
},{
"id": "...",
}
]
}

So yes, the ["device"] should be removed. Also on lines 157 and 160.

kevinbird15 referenced this pull request in kevinbird15/robovac-ha-integration Sep 6, 2025
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@PixNyb

Copy link
Copy Markdown

Would this also include support for the L60 hybrid? Since this also does mopping i assume some additional changes are required. If not i'd be happy to pick it up as a separate PR

@Patrick762

Copy link
Copy Markdown

Maybe some base classes for the separate device classes could make sense

@Patrick762

Patrick762 commented Oct 29, 2025

Copy link
Copy Markdown

I get the following exception from the tuya part:

{'t': [...], 'success': False, 'errorCode': 'PERMISSION_DENIED', 'status': 'error', 'errorMsg': 'No access'}

Is there something else that changed?

Or does this need time after the initial device setup in the app?

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

13 participants

@damianolombardo@hsemenenko@temp@PixNyb@Patrick762@andrewthetechie@ultrathew@batesbw@atmezferix@luke2447@CodeFoodPixels@jbleyaert@maximoei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Feb 5, 2026. It is now read-only.

L60 Support - #119

Open
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main
Open

L60 Support#119
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main

Conversation

@damianolombardo

Copy link
Copy Markdown

No description provided.

@hsemenenko

Copy link
Copy Markdown

I am getting the following error after entering my eufy username and password.

Unexpected exception: 'device'
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 141, in get_eufy_vacuums
device = tuya_client.get_device(item["device"]["id"])
~~~~^^^^^^^^^^
KeyError: 'device'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 185, in async_step_user
valid_data = await validate_input(self.hass, user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/robovac/config_flow.py", line 167, in validate_input
await hass.async_add_executor_job(get_eufy_vacuums, data)
File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/config/custom_components/robovac/config_flow.py", line 157, in get_eufy_vacuums
item["device"]["id"]
~~~~^^^^^^^^^^
KeyError: 'device'

@damianolombardo

Copy link
Copy Markdown
Author

Do you get that on the master branch too? I have tested this and have another person using this branch without this issue coming up?

@hsemenenko

Copy link
Copy Markdown

I do not get the same error on the master branch. It has also been reported by someone else here: #112 (comment)

By removing ["device"] from line 141 of config_flow.py the error goes away and I can connect to the vacuum. However, it shows the status incorrectly i.e. shows cleaning when docked.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Works fine here. Installed the branch from the PR, I have 2 L60's running here.
Maybe it's got something to do with that? Having a single or multiple Robovac devices?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Although I have seen in another PR here (https://github.com/CodeFoodPixels/robovac/pull/64/files#diff-1a399db0f45c880538b174870af4a32a874c68567066d843c79217af7f4613b3L135) that there are also changes to devices / device inside config_flow.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

I'm not a python developer, but want to help - what can I do to output the item array?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Ok, found it. Code is only executed on config. This is the structure from device_response:

{
"res_code": 1,
"message": "",
"devices": [
{
"id": "...",
...
},{
"id": "...",
}
]
}

So yes, the ["device"] should be removed. Also on lines 157 and 160.

kevinbird15 referenced this pull request in kevinbird15/robovac-ha-integration Sep 6, 2025
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@PixNyb

Copy link
Copy Markdown

Would this also include support for the L60 hybrid? Since this also does mopping i assume some additional changes are required. If not i'd be happy to pick it up as a separate PR

@Patrick762

Copy link
Copy Markdown

Maybe some base classes for the separate device classes could make sense

@Patrick762

Patrick762 commented Oct 29, 2025

Copy link
Copy Markdown

I get the following exception from the tuya part:

{'t': [...], 'success': False, 'errorCode': 'PERMISSION_DENIED', 'status': 'error', 'errorMsg': 'No access'}

Is there something else that changed?

Or does this need time after the initial device setup in the app?

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

13 participants

@damianolombardo@hsemenenko@temp@PixNyb@Patrick762@andrewthetechie@ultrathew@batesbw@atmezferix@luke2447@CodeFoodPixels@jbleyaert@maximoei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Feb 5, 2026. It is now read-only.

L60 Support - #119

Open
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main
Open

L60 Support#119
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main

Conversation

@damianolombardo

Copy link
Copy Markdown

No description provided.

@hsemenenko

Copy link
Copy Markdown

I am getting the following error after entering my eufy username and password.

Unexpected exception: 'device'
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 141, in get_eufy_vacuums
device = tuya_client.get_device(item["device"]["id"])
~~~~^^^^^^^^^^
KeyError: 'device'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 185, in async_step_user
valid_data = await validate_input(self.hass, user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/robovac/config_flow.py", line 167, in validate_input
await hass.async_add_executor_job(get_eufy_vacuums, data)
File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/config/custom_components/robovac/config_flow.py", line 157, in get_eufy_vacuums
item["device"]["id"]
~~~~^^^^^^^^^^
KeyError: 'device'

@damianolombardo

Copy link
Copy Markdown
Author

Do you get that on the master branch too? I have tested this and have another person using this branch without this issue coming up?

@hsemenenko

Copy link
Copy Markdown

I do not get the same error on the master branch. It has also been reported by someone else here: #112 (comment)

By removing ["device"] from line 141 of config_flow.py the error goes away and I can connect to the vacuum. However, it shows the status incorrectly i.e. shows cleaning when docked.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Works fine here. Installed the branch from the PR, I have 2 L60's running here.
Maybe it's got something to do with that? Having a single or multiple Robovac devices?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Although I have seen in another PR here (https://github.com/CodeFoodPixels/robovac/pull/64/files#diff-1a399db0f45c880538b174870af4a32a874c68567066d843c79217af7f4613b3L135) that there are also changes to devices / device inside config_flow.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

I'm not a python developer, but want to help - what can I do to output the item array?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Ok, found it. Code is only executed on config. This is the structure from device_response:

{
"res_code": 1,
"message": "",
"devices": [
{
"id": "...",
...
},{
"id": "...",
}
]
}

So yes, the ["device"] should be removed. Also on lines 157 and 160.

kevinbird15 referenced this pull request in kevinbird15/robovac-ha-integration Sep 6, 2025
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@PixNyb

Copy link
Copy Markdown

Would this also include support for the L60 hybrid? Since this also does mopping i assume some additional changes are required. If not i'd be happy to pick it up as a separate PR

@Patrick762

Copy link
Copy Markdown

Maybe some base classes for the separate device classes could make sense

@Patrick762

Patrick762 commented Oct 29, 2025

Copy link
Copy Markdown

I get the following exception from the tuya part:

{'t': [...], 'success': False, 'errorCode': 'PERMISSION_DENIED', 'status': 'error', 'errorMsg': 'No access'}

Is there something else that changed?

Or does this need time after the initial device setup in the app?

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

13 participants

@damianolombardo@hsemenenko@temp@PixNyb@Patrick762@andrewthetechie@ultrathew@batesbw@atmezferix@luke2447@CodeFoodPixels@jbleyaert@maximoei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Feb 5, 2026. It is now read-only.

L60 Support - #119

Open
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main
Open

L60 Support#119
damianolombardo wants to merge 20 commits into
CodeFoodPixels:mainfrom
damianolombardo:main

Conversation

@damianolombardo

Copy link
Copy Markdown

No description provided.

@hsemenenko

Copy link
Copy Markdown

I am getting the following error after entering my eufy username and password.

Unexpected exception: 'device'
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 141, in get_eufy_vacuums
device = tuya_client.get_device(item["device"]["id"])
~~~~^^^^^^^^^^
KeyError: 'device'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/config/custom_components/robovac/config_flow.py", line 185, in async_step_user
valid_data = await validate_input(self.hass, user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/robovac/config_flow.py", line 167, in validate_input
await hass.async_add_executor_job(get_eufy_vacuums, data)
File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/config/custom_components/robovac/config_flow.py", line 157, in get_eufy_vacuums
item["device"]["id"]
~~~~^^^^^^^^^^
KeyError: 'device'

@damianolombardo

Copy link
Copy Markdown
Author

Do you get that on the master branch too? I have tested this and have another person using this branch without this issue coming up?

@hsemenenko

Copy link
Copy Markdown

I do not get the same error on the master branch. It has also been reported by someone else here: #112 (comment)

By removing ["device"] from line 141 of config_flow.py the error goes away and I can connect to the vacuum. However, it shows the status incorrectly i.e. shows cleaning when docked.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Works fine here. Installed the branch from the PR, I have 2 L60's running here.
Maybe it's got something to do with that? Having a single or multiple Robovac devices?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Although I have seen in another PR here (https://github.com/CodeFoodPixels/robovac/pull/64/files#diff-1a399db0f45c880538b174870af4a32a874c68567066d843c79217af7f4613b3L135) that there are also changes to devices / device inside config_flow.

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

I'm not a python developer, but want to help - what can I do to output the item array?

@temp

temp commented Jul 29, 2025

Copy link
Copy Markdown

Ok, found it. Code is only executed on config. This is the structure from device_response:

{
"res_code": 1,
"message": "",
"devices": [
{
"id": "...",
...
},{
"id": "...",
}
]
}

So yes, the ["device"] should be removed. Also on lines 157 and 160.

kevinbird15 referenced this pull request in kevinbird15/robovac-ha-integration Sep 6, 2025
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@PixNyb

Copy link
Copy Markdown

Would this also include support for the L60 hybrid? Since this also does mopping i assume some additional changes are required. If not i'd be happy to pick it up as a separate PR

@Patrick762

Copy link
Copy Markdown

Maybe some base classes for the separate device classes could make sense

@Patrick762

Patrick762 commented Oct 29, 2025

Copy link
Copy Markdown

I get the following exception from the tuya part:

{'t': [...], 'success': False, 'errorCode': 'PERMISSION_DENIED', 'status': 'error', 'errorMsg': 'No access'}

Is there something else that changed?

Or does this need time after the initial device setup in the app?

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

13 participants

@damianolombardo@hsemenenko@temp@PixNyb@Patrick762@andrewthetechie@ultrathew@batesbw@atmezferix@luke2447@CodeFoodPixels@jbleyaert@maximoei