@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 CHANGED
@@ -2,11 +2,28 @@
2
2
 
3
3
  All notable changes to homebridge-ecovacs will be documented in this file.
4
4
 
5
- This project tries to adhere to [Semantic Versioning](http://semver.org/). In practice, this means that the version number will be incremented based on the following:
5
+ ## v7.2.0 (2025-07-13)
6
6
 
7
- - `MAJOR` version when a minimum supported version of `homebridge` or `node` is increased to a new major version, or when a breaking change is made to the plugin config
8
- - `MINOR` version when a new device type is added, or when a new feature is added that is backwards-compatible
9
- - `PATCH` version when backwards-compatible bug fixes are implemented
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 ECOVACS username
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 ECOVACS app
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 ECOVACS password as a base64 encoded string and use the option `encodedPassword` to let the plugin know
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 ECOVACS Deebot or Yeedi devices into HomeKit
8
+ Homebridge plugin to integrate Ecovacs Deebot or Yeedi devices into HomeKit
9
9
 
10
10
  [![npm](https://img.shields.io/npm/v/@homebridge-plugins/homebridge-ecovacs/latest?label=latest)](https://www.npmjs.com/package/@homebridge-plugins/homebridge-ecovacs)
11
11
  [![npm](https://img.shields.io/npm/v/@homebridge-plugins/homebridge-ecovacs/beta?label=beta)](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 ECOVACS or Yeedi devices within HomeKit. The plugin:
24
- - requires your ECOVACS or Yeedi credentials to function
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 ECOVACS/Deebot/Yeedi and this plugin is a personal project that I maintain in my free time.
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.
@@ -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 ECOVACS."
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": "ECOVACS/Yeedi Username",
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 ECOVACS ID."
32
+ "description": "Your username, if your account is based in China you should use your Ecovacs ID."
32
33
  },
33
34
  "password": {
34
- "title": "ECOVACS/Yeedi Password",
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": "ECOVACS Device ID of the device these settings apply to, can be of format E2000000000000000000 or 11111111-aaaa-bbbb-2222-cccccccccccc."
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 ECOVACS. Set to 0 to disable, otherwise must be 30 or more."
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 ECOVACS username, password and region on the next page</p>
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 &rarr;</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 ECOVACS and this plugin is a personal project that I maintain
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 ECOVACS/Yeedi
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 ECOVACS/Yeedi
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 ECOVACS/Yeedi
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' : 'ECOVACS'))
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 ECOVACS/Yeedi device
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 ECOVACS/Yeedi
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 self = this
12
- this.MaxSpeed = function MaxSpeed() {
13
- self.hapChar.call(this, 'Max Speed', self.uuids.maxSpeed)
14
- this.setProps({
15
- format: api.hap.Formats.BOOL,
16
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
17
- })
18
- this.value = this.getDefaultValue()
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 = function PredefinedArea() {
22
- self.hapChar.call(this, 'Predefined Area', self.uuids.predefinedArea)
23
- this.setProps({
24
- format: api.hap.Formats.UINT8,
25
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
26
- minValue: 0,
27
- maxValue: 15,
28
- minStep: 1,
29
- validValues: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
30
- })
31
- this.value = this.getDefaultValue()
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 = function TrueDetect() {
35
- self.hapChar.call(this, 'TrueDetect', self.uuids.trueDetect)
36
- this.setProps({
37
- format: api.hap.Formats.BOOL,
38
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
39
- })
40
- this.value = this.getDefaultValue()
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.2",
7
- "description": "Homebridge plugin to integrate ECOVACS Deebot devices into HomeKit.",
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 . --fix",
61
- "postinstall": "patch-package",
62
- "rebuild": "rm -rf package-lock.json && rm -rf node_modules && npm install"
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",