@homebridge-plugins/homebridge-ecovacs 7.0.2 → 7.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -7
- package/README.md +4 -4
- package/config.schema.json +7 -6
- package/lib/homebridge-ui/public/index.html +39 -3
- package/lib/platform.js +6 -6
- package/lib/utils/custom-chars.js +34 -33
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -2,11 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to homebridge-ecovacs will be documented in this file.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## v7.2.0 (2025-07-13)
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
7
|
+
### Notable Changes
|
|
8
|
+
|
|
9
|
+
- fix custom plugin config modal styles in ui 5
|
|
10
|
+
- fix custom characteristics for hb 2
|
|
11
|
+
|
|
12
|
+
### Other Changes
|
|
13
|
+
|
|
14
|
+
- add `lint` step to build workflow
|
|
15
|
+
- add permissions to workflows
|
|
16
|
+
- improvements to the deprecate workflow
|
|
17
|
+
|
|
18
|
+
## v7.1.0 (2025-07-12)
|
|
19
|
+
|
|
20
|
+
### Notable Changes
|
|
21
|
+
|
|
22
|
+
- set `strictValidation` to `true` in the config schema file
|
|
23
|
+
|
|
24
|
+
### Other Changes
|
|
25
|
+
|
|
26
|
+
- github repo maintenance
|
|
10
27
|
|
|
11
28
|
## v7.0.2 (2025-07-11)
|
|
12
29
|
|
|
@@ -296,7 +313,7 @@ This project tries to adhere to [Semantic Versioning](http://semver.org/). In pr
|
|
|
296
313
|
|
|
297
314
|
- Ignore `Robot is operational` error in log
|
|
298
315
|
- Updated `ecovacs-deebot` library to v0.6.3
|
|
299
|
-
- Remove `node-machine-id` in favour of generating a client id based on
|
|
316
|
+
- Remove `node-machine-id` in favour of generating a client id based on Ecovacs username
|
|
300
317
|
|
|
301
318
|
## v4.1.0 (2021-08-30)
|
|
302
319
|
|
|
@@ -338,7 +355,7 @@ _Unpublished_
|
|
|
338
355
|
|
|
339
356
|
### Added
|
|
340
357
|
|
|
341
|
-
- Support for cleaning 'Spot Areas' customised in the
|
|
358
|
+
- Support for cleaning 'Spot Areas' customised in the Ecovacs app
|
|
342
359
|
|
|
343
360
|
## v3.3.1 (2021-07-18)
|
|
344
361
|
|
|
@@ -442,7 +459,7 @@ _Unpublished_
|
|
|
442
459
|
|
|
443
460
|
- Configuration settings per Deebot device
|
|
444
461
|
- Support for Chinese server login
|
|
445
|
-
- Enter your
|
|
462
|
+
- Enter your Ecovacs password as a base64 encoded string and use the option `encodedPassword` to let the plugin know
|
|
446
463
|
- More viewable information in the Homebridge plugin-ui:
|
|
447
464
|
- Device model, company and an image of your device in case you didn't know what it looked like
|
|
448
465
|
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
# homebridge-ecovacs
|
|
7
7
|
|
|
8
|
-
Homebridge plugin to integrate
|
|
8
|
+
Homebridge plugin to integrate Ecovacs Deebot or Yeedi devices into HomeKit
|
|
9
9
|
|
|
10
10
|
[](https://www.npmjs.com/package/@homebridge-plugins/homebridge-ecovacs)
|
|
11
11
|
[](https://github.com/homebridge-plugins/homebridge-ecovacs/wiki/Beta-Version)
|
|
@@ -20,8 +20,8 @@ Homebridge plugin to integrate ECOVACS Deebot or Yeedi devices into HomeKit
|
|
|
20
20
|
|
|
21
21
|
### Plugin Information
|
|
22
22
|
|
|
23
|
-
- This plugin allows you to view and control your
|
|
24
|
-
- requires your
|
|
23
|
+
- This plugin allows you to view and control your Ecovacs or Yeedi devices within HomeKit. The plugin:
|
|
24
|
+
- requires your Ecovacs or Yeedi credentials to function
|
|
25
25
|
- uses a cloud-based connection (i.e. requires the internet)
|
|
26
26
|
|
|
27
27
|
### Prerequisites
|
|
@@ -59,5 +59,5 @@ Homebridge plugin to integrate ECOVACS Deebot or Yeedi devices into HomeKit
|
|
|
59
59
|
|
|
60
60
|
### Disclaimer
|
|
61
61
|
|
|
62
|
-
- I am in no way affiliated with
|
|
62
|
+
- I am in no way affiliated with Ecovacs/Deebot/Yeedi and this plugin is a personal project that I maintain in my free time.
|
|
63
63
|
- Use this plugin entirely at your own risk - please see licence for more information.
|
package/config.schema.json
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
"pluginAlias": "Deebot",
|
|
3
3
|
"pluginType": "platform",
|
|
4
4
|
"singular": true,
|
|
5
|
+
"strictValidation": true,
|
|
5
6
|
"customUi": true,
|
|
6
7
|
"customUiPath": "./lib/homebridge-ui",
|
|
7
8
|
"headerDisplay": "<p align=\"center\"><img width=\"60%\" src=\"https://user-images.githubusercontent.com/43026681/101321841-f0eb5280-385d-11eb-8dd4-f57113f6e078.png\"></p><p align=\"center\">For help and support please visit our <a href=\"https://github.com/homebridge-plugins/homebridge-ecovacs/wiki\">GitHub Wiki</a>. We hope you find this plugin useful!</p>",
|
|
@@ -16,7 +17,7 @@
|
|
|
16
17
|
"useYeedi": {
|
|
17
18
|
"title": "Use Yeedi Login",
|
|
18
19
|
"type": "boolean",
|
|
19
|
-
"description": "Enable this for Yeedi login instead of
|
|
20
|
+
"description": "Enable this for Yeedi login instead of Ecovacs."
|
|
20
21
|
},
|
|
21
22
|
"countryCode": {
|
|
22
23
|
"title": "Country Code",
|
|
@@ -25,13 +26,13 @@
|
|
|
25
26
|
"required": true
|
|
26
27
|
},
|
|
27
28
|
"username": {
|
|
28
|
-
"title": "
|
|
29
|
+
"title": "Ecovacs/Yeedi Username",
|
|
29
30
|
"required": true,
|
|
30
31
|
"type": "string",
|
|
31
|
-
"description": "Your username, if your account is based in China you should use your
|
|
32
|
+
"description": "Your username, if your account is based in China you should use your Ecovacs ID."
|
|
32
33
|
},
|
|
33
34
|
"password": {
|
|
34
|
-
"title": "
|
|
35
|
+
"title": "Ecovacs/Yeedi Password",
|
|
35
36
|
"required": true,
|
|
36
37
|
"type": "string",
|
|
37
38
|
"description": "Your password, can also be a base64 encoded version of your password."
|
|
@@ -56,7 +57,7 @@
|
|
|
56
57
|
"deviceId": {
|
|
57
58
|
"title": "Device ID",
|
|
58
59
|
"type": "string",
|
|
59
|
-
"description": "
|
|
60
|
+
"description": "Ecovacs Device ID of the device these settings apply to, can be of format E2000000000000000000 or 11111111-aaaa-bbbb-2222-cccccccccccc."
|
|
60
61
|
},
|
|
61
62
|
"ignoreDevice": {
|
|
62
63
|
"type": "boolean",
|
|
@@ -70,7 +71,7 @@
|
|
|
70
71
|
"title": "Polling Interval",
|
|
71
72
|
"type": "integer",
|
|
72
73
|
"placeholder": 120,
|
|
73
|
-
"description": "An interval (in seconds) in which this device will refresh with
|
|
74
|
+
"description": "An interval (in seconds) in which this device will refresh with Ecovacs. Set to 0 to disable, otherwise must be 30 or more."
|
|
74
75
|
},
|
|
75
76
|
"hideMotionSensor": {
|
|
76
77
|
"title": "Hide Motion Sensor",
|
|
@@ -1,3 +1,39 @@
|
|
|
1
|
+
<style>
|
|
2
|
+
.dark-mode {
|
|
3
|
+
background-color: #242424;
|
|
4
|
+
color: lightgrey;
|
|
5
|
+
|
|
6
|
+
.form-control {
|
|
7
|
+
background-color: #333333 !important;
|
|
8
|
+
border: none !important;
|
|
9
|
+
color: #eeeeee !important;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
thead, tbody, tr {
|
|
13
|
+
border-style: hidden;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
th {
|
|
17
|
+
color: #eeeeee !important;
|
|
18
|
+
font-weight: 500 !important;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
select {
|
|
22
|
+
background-image:
|
|
23
|
+
linear-gradient(45deg, transparent 50%, gray 50%),
|
|
24
|
+
linear-gradient(135deg, gray 50%, transparent 50%),
|
|
25
|
+
linear-gradient(to right, #ccc, #ccc);
|
|
26
|
+
background-position:
|
|
27
|
+
calc(100% - 20px) calc(1em + 2px),
|
|
28
|
+
calc(100% - 15px) calc(1em + 2px),
|
|
29
|
+
calc(100% - 2.5em) 0.5em;
|
|
30
|
+
background-size:
|
|
31
|
+
5px 5px,
|
|
32
|
+
5px 5px,
|
|
33
|
+
1px 1.5em;
|
|
34
|
+
background-repeat: no-repeat;
|
|
35
|
+
}
|
|
36
|
+
</style>
|
|
1
37
|
<p class="text-center">
|
|
2
38
|
<img
|
|
3
39
|
src="https://user-images.githubusercontent.com/43026681/101321841-f0eb5280-385d-11eb-8dd4-f57113f6e078.png"
|
|
@@ -7,7 +43,7 @@
|
|
|
7
43
|
</p>
|
|
8
44
|
<div id="pageIntro" class="text-center" style="display: none;">
|
|
9
45
|
<p class="lead">Thank you for installing <strong>homebridge-ecovacs</strong></p>
|
|
10
|
-
<p>You will need to enter your
|
|
46
|
+
<p>You will need to enter your Ecovacs username, password and region on the next page</p>
|
|
11
47
|
<button type="button" class="btn btn-primary" id="introContinue">Continue →</button>
|
|
12
48
|
</div>
|
|
13
49
|
<div
|
|
@@ -28,7 +64,7 @@
|
|
|
28
64
|
<select class="form-control" id="deviceSelect"></select>
|
|
29
65
|
</div>
|
|
30
66
|
</form>
|
|
31
|
-
<table class="table w-100" id="deviceTable" style="display: none;">
|
|
67
|
+
<table class="table w-100 mt-3" id="deviceTable" style="display: none;">
|
|
32
68
|
<thead>
|
|
33
69
|
<tr class="table-active">
|
|
34
70
|
<th scope="col" style="width: 40%;">Device Name</th>
|
|
@@ -161,7 +197,7 @@
|
|
|
161
197
|
<h4>Disclaimer</h4>
|
|
162
198
|
<ul>
|
|
163
199
|
<li>
|
|
164
|
-
I am in no way affiliated with
|
|
200
|
+
I am in no way affiliated with Ecovacs and this plugin is a personal project that I maintain
|
|
165
201
|
in my free time.
|
|
166
202
|
</li>
|
|
167
203
|
<li>Use this plugin entirely at your own risk - please see licence for more information.</li>
|
package/lib/platform.js
CHANGED
|
@@ -363,7 +363,7 @@ export default class {
|
|
|
363
363
|
// Require any libraries that the accessory instances use
|
|
364
364
|
this.cusChar = new platformChars(this.api)
|
|
365
365
|
|
|
366
|
-
// Connect to
|
|
366
|
+
// Connect to Ecovacs/Yeedi
|
|
367
367
|
this.ecovacsAPI = new EcoVacsAPI(
|
|
368
368
|
EcoVacsAPI.getDeviceId(this.api.hap.uuid.generate(this.config.username)),
|
|
369
369
|
this.config.countryCode,
|
|
@@ -374,7 +374,7 @@ export default class {
|
|
|
374
374
|
// Display version of the ecovacs-deebot library in the log
|
|
375
375
|
this.log('%s v%s.', platformLang.ecovacsLibVersion, this.ecovacsAPI.getVersion())
|
|
376
376
|
|
|
377
|
-
// Attempt to log in to
|
|
377
|
+
// Attempt to log in to Ecovacs/Yeedi
|
|
378
378
|
try {
|
|
379
379
|
await this.ecovacsAPI.connect(this.config.username, EcoVacsAPI.md5(this.config.password))
|
|
380
380
|
} catch (err) {
|
|
@@ -393,7 +393,7 @@ export default class {
|
|
|
393
393
|
}
|
|
394
394
|
}
|
|
395
395
|
|
|
396
|
-
// Get a device list from
|
|
396
|
+
// Get a device list from Ecovacs/Yeedi
|
|
397
397
|
const deviceList = await this.ecovacsAPI.devices()
|
|
398
398
|
|
|
399
399
|
// Check the request for device list was successful
|
|
@@ -402,7 +402,7 @@ export default class {
|
|
|
402
402
|
}
|
|
403
403
|
|
|
404
404
|
// Initialise each device into Homebridge
|
|
405
|
-
this.log('[%s] %s.', deviceList.length, platformLang.deviceCount(this.config.useYeedi ? 'Yeedi' : '
|
|
405
|
+
this.log('[%s] %s.', deviceList.length, platformLang.deviceCount(this.config.useYeedi ? 'Yeedi' : 'Ecovacs'))
|
|
406
406
|
for (let i = 0; i < deviceList.length; i += 1) {
|
|
407
407
|
await this.initialiseDevice(deviceList[i])
|
|
408
408
|
}
|
|
@@ -429,7 +429,7 @@ export default class {
|
|
|
429
429
|
clearInterval(this.refreshIntervals[id])
|
|
430
430
|
})
|
|
431
431
|
|
|
432
|
-
// Disconnect from each
|
|
432
|
+
// Disconnect from each Ecovacs/Yeedi device
|
|
433
433
|
devicesInHB.forEach((accessory) => {
|
|
434
434
|
if (accessory.control?.is_ready) {
|
|
435
435
|
accessory.control.disconnect()
|
|
@@ -453,7 +453,7 @@ export default class {
|
|
|
453
453
|
return
|
|
454
454
|
}
|
|
455
455
|
|
|
456
|
-
// Load the device control information from
|
|
456
|
+
// Load the device control information from Ecovacs/Yeedi
|
|
457
457
|
const loadedDevice = this.ecovacsAPI.getVacBot(
|
|
458
458
|
this.ecovacsAPI.uid,
|
|
459
459
|
EcoVacsAPI.REALM,
|
|
@@ -1,50 +1,51 @@
|
|
|
1
|
-
import { inherits } from 'node:util'
|
|
2
|
-
|
|
3
1
|
export default class {
|
|
4
2
|
constructor(api) {
|
|
5
|
-
this.hapChar = api.hap.Characteristic
|
|
6
3
|
this.uuids = {
|
|
7
4
|
maxSpeed: 'E963F001-079E-48FF-8F27-9C2605A29F52',
|
|
8
5
|
predefinedArea: 'E963F002-079E-48FF-8F27-9C2605A29F52',
|
|
9
6
|
trueDetect: 'E963F003-079E-48FF-8F27-9C2605A29F52',
|
|
10
7
|
}
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
8
|
+
const uuids = this.uuids
|
|
9
|
+
|
|
10
|
+
this.MaxSpeed = class extends api.hap.Characteristic {
|
|
11
|
+
constructor() {
|
|
12
|
+
super('Max Speed', uuids.maxSpeed)
|
|
13
|
+
this.setProps({
|
|
14
|
+
format: api.hap.Formats.BOOL,
|
|
15
|
+
perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
|
|
16
|
+
})
|
|
17
|
+
this.value = this.getDefaultValue()
|
|
18
|
+
}
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
this.PredefinedArea =
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
21
|
+
this.PredefinedArea = class extends api.hap.Characteristic {
|
|
22
|
+
constructor() {
|
|
23
|
+
super('Predefined Area', uuids.predefinedArea)
|
|
24
|
+
this.setProps({
|
|
25
|
+
format: api.hap.Formats.UINT8,
|
|
26
|
+
perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
|
|
27
|
+
minValue: 0,
|
|
28
|
+
maxValue: 15,
|
|
29
|
+
minStep: 1,
|
|
30
|
+
validValues: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
|
|
31
|
+
})
|
|
32
|
+
this.value = this.getDefaultValue()
|
|
33
|
+
}
|
|
32
34
|
}
|
|
33
35
|
|
|
34
|
-
this.TrueDetect =
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
this.TrueDetect = class extends api.hap.Characteristic {
|
|
37
|
+
constructor() {
|
|
38
|
+
super('TrueDetect', uuids.trueDetect)
|
|
39
|
+
this.setProps({
|
|
40
|
+
format: api.hap.Formats.BOOL,
|
|
41
|
+
perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
|
|
42
|
+
})
|
|
43
|
+
this.value = this.getDefaultValue()
|
|
44
|
+
}
|
|
41
45
|
}
|
|
42
46
|
|
|
43
|
-
inherits(this.MaxSpeed, this.hapChar)
|
|
44
|
-
inherits(this.PredefinedArea, this.hapChar)
|
|
45
|
-
inherits(this.TrueDetect, this.hapChar)
|
|
46
|
-
this.MaxSpeed.UUID = this.uuids.maxSpeed
|
|
47
47
|
this.PredefinedArea.UUID = this.uuids.predefinedArea
|
|
48
48
|
this.TrueDetect.UUID = this.uuids.trueDetect
|
|
49
|
+
this.MaxSpeed.UUID = this.uuids.maxSpeed
|
|
49
50
|
}
|
|
50
51
|
}
|
package/package.json
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
"displayName": "Homebridge Ecovacs",
|
|
4
4
|
"alias": "Deebot",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"version": "7.0
|
|
7
|
-
"description": "Homebridge plugin to integrate
|
|
6
|
+
"version": "7.2.0",
|
|
7
|
+
"description": "Homebridge plugin to integrate Ecovacs Deebot devices into HomeKit.",
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "bwp91",
|
|
10
10
|
"email": "bwp91@icloud.com"
|
|
@@ -57,9 +57,9 @@
|
|
|
57
57
|
"node": "^20 || ^22 || ^24"
|
|
58
58
|
},
|
|
59
59
|
"scripts": {
|
|
60
|
-
"lint": "eslint . --
|
|
61
|
-
"
|
|
62
|
-
"
|
|
60
|
+
"lint": "eslint . --max-warnings=0",
|
|
61
|
+
"lint:fix": "npm run lint -- --fix",
|
|
62
|
+
"postinstall": "patch-package"
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
65
|
"@homebridge/plugin-ui-utils": "^2.1.0",
|