homebridge-eliot-smart-control 1.6.0 → 1.6.2
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 +33 -1
- package/README.md +4 -0
- package/config.schema.json +1 -2
- package/docs/PROTOCOL.md +25 -4
- package/package.json +3 -1
- package/tools/set-setting.js +10 -8
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,36 @@ adheres to [semantic versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [1.6.2] — 2026-09-21
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- **The plugin declares the transport it speaks.** `supports-hap` in the
|
|
14
|
+
keywords, which is how Homebridge now expects a plugin to say whether it
|
|
15
|
+
publishes over HAP, Matter or both.
|
|
16
|
+
- **`required` in the settings schema is spelled the way JSON Schema spells
|
|
17
|
+
it** — an array on the object rather than `"required": true` on each field.
|
|
18
|
+
The Homebridge UI reads both; only one of them is valid JSON Schema.
|
|
19
|
+
- **The plugin icon lives in `docs/` and stays out of the npm package.** It is
|
|
20
|
+
loaded from GitHub where it is shown, so shipping 280 kB of photograph to
|
|
21
|
+
every install bought nothing.
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- **`MOTION_MODE` in the protocol reference had its two values swapped.** One
|
|
26
|
+
touch is `0` and hold-to-move is `1`, as the Eliot app's own command table
|
|
27
|
+
and its reader both have it. Nothing in the plugin writes or interprets that
|
|
28
|
+
setting, so this is documentation only.
|
|
29
|
+
|
|
30
|
+
## [1.6.1] — 2026-09-21
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
|
|
34
|
+
- **The plugin has an icon**: a photograph of the desk, square, at the top of
|
|
35
|
+
the README and on the npm page. A copy sized for the Homebridge plugin icon
|
|
36
|
+
request sits in `docs/` — Homebridge hosts those icons itself, so the
|
|
37
|
+
repository holds the source rather than the thing the UI reads.
|
|
38
|
+
|
|
9
39
|
## [1.6.0] — 2026-09-21
|
|
10
40
|
|
|
11
41
|
### Added
|
|
@@ -381,7 +411,9 @@ First release.
|
|
|
381
411
|
verified against hardware, including the measured travel speed and stopping
|
|
382
412
|
distance.
|
|
383
413
|
|
|
384
|
-
[Unreleased]: https://github.com/rummeyer/homebridge-eliot-smart-control/compare/v1.6.
|
|
414
|
+
[Unreleased]: https://github.com/rummeyer/homebridge-eliot-smart-control/compare/v1.6.2...HEAD
|
|
415
|
+
[1.6.2]: https://github.com/rummeyer/homebridge-eliot-smart-control/compare/v1.6.1...v1.6.2
|
|
416
|
+
[1.6.1]: https://github.com/rummeyer/homebridge-eliot-smart-control/compare/v1.6.0...v1.6.1
|
|
385
417
|
[1.6.0]: https://github.com/rummeyer/homebridge-eliot-smart-control/compare/v1.5.2...v1.6.0
|
|
386
418
|
[1.5.2]: https://github.com/rummeyer/homebridge-eliot-smart-control/compare/v1.5.1...v1.5.2
|
|
387
419
|
[1.5.1]: https://github.com/rummeyer/homebridge-eliot-smart-control/compare/v1.5.0...v1.5.1
|
package/README.md
CHANGED
package/config.schema.json
CHANGED
|
@@ -18,11 +18,11 @@
|
|
|
18
18
|
"type": "array",
|
|
19
19
|
"items": {
|
|
20
20
|
"type": "object",
|
|
21
|
+
"required": ["name", "mac"],
|
|
21
22
|
"properties": {
|
|
22
23
|
"name": {
|
|
23
24
|
"title": "Name",
|
|
24
25
|
"type": "string",
|
|
25
|
-
"required": true,
|
|
26
26
|
"default": "Desk",
|
|
27
27
|
"placeholder": "Desk",
|
|
28
28
|
"description": "What the desk is called in the Home app."
|
|
@@ -30,7 +30,6 @@
|
|
|
30
30
|
"mac": {
|
|
31
31
|
"title": "Dongle address",
|
|
32
32
|
"type": "string",
|
|
33
|
-
"required": true,
|
|
34
33
|
"placeholder": "E5:11:22:33:44:55",
|
|
35
34
|
"pattern": "^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$",
|
|
36
35
|
"description": "Bluetooth address of the Smart Dongle."
|
package/docs/PROTOCOL.md
CHANGED
|
@@ -237,7 +237,7 @@ step commands and could not stop it properly.
|
|
|
237
237
|
| `GOTO_HEIGHT` | `1B` | 2 | Drive to a height, big-endian millimetres. **Verified**: 802 → 900 mm against a target of 902, landing 2 mm out, on one command |
|
|
238
238
|
| `STOP` | `2B` | 0 | Stop now. **Verified**: sent 108 mm into a move, halted after 13 mm of coasting |
|
|
239
239
|
| `LOW_POWER` | `18` | 1 | `0` off, `1` on. **Verified stored**; takes effect only after a reset — see below |
|
|
240
|
-
| `MOTION_MODE` | `19` | 1 | `0`
|
|
240
|
+
| `MOTION_MODE` | `19` | 1 | `0` one touch, `1` hold the button. **Corrected 21.09.2026** — see below |
|
|
241
241
|
| `VELOCITY` | `13` | 1 | Travel speed; the app offers 28, 31, 35, 38, 40. **Verified stored**; found at 21, below anything the app offers — see below |
|
|
242
242
|
| `SENSITIVITY` | `1D` | 1 | Anti-collision: `1` high, `2` medium, `3` low |
|
|
243
243
|
| `LOCK` | `1F` | 1 | Child lock: `0` reads the state, `1` toggles it. **Verified** |
|
|
@@ -248,9 +248,30 @@ step commands and could not stop it properly.
|
|
|
248
248
|
| `CONNECT` | `FE` | 0 | **Reads the whole settings block.** Not decoration — see below |
|
|
249
249
|
|
|
250
250
|
`GOTO_HEIGHT` is only sent once when the desk is in one-touch mode
|
|
251
|
-
(`MOTION_MODE =
|
|
252
|
-
before exposing that setting to anyone: turning one-touch off
|
|
253
|
-
desk's ability to drive itself anywhere.
|
|
251
|
+
(`MOTION_MODE = 0`). In hold mode the app repeats it on an interval, which is
|
|
252
|
+
worth knowing before exposing that setting to anyone: turning one-touch off
|
|
253
|
+
takes away the desk's ability to drive itself anywhere.
|
|
254
|
+
|
|
255
|
+
**Correction, 21.09.2026.** This table had `MOTION_MODE` the wrong way round —
|
|
256
|
+
`0` as hold and `1` as one touch — and the sentence above inherited it. The
|
|
257
|
+
app's own command table has both frames written out, and the parameter and its
|
|
258
|
+
checksum settle it:
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
MOTION_PRESS: F1 F1 19 01 00 1A 7E one touch is 0
|
|
262
|
+
MOTION_HOLD: F1 F1 19 01 01 1B 7E hold is 1
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
Its reader agrees, in two places: `case '19'` maps `0` to `ONE_TOUCH` and `1`
|
|
266
|
+
to `CONSTANT_TOUCH`. Nothing here was measured against the control box — the
|
|
267
|
+
mapping is read out of the app, like the rest of this section, and writing
|
|
268
|
+
`0x19` to find out would cost a reset.
|
|
269
|
+
|
|
270
|
+
The wrong version was believed because it seemed to have been confirmed: with
|
|
271
|
+
`00` stored the desk moved 10 mm on a `GOTO_HEIGHT` and stopped, which looks
|
|
272
|
+
exactly like hold mode. That was the `SETTINGS` poll described below, not the
|
|
273
|
+
motion mode, and the same afternoon produced two other conclusions of the same
|
|
274
|
+
shape.
|
|
254
275
|
|
|
255
276
|
**The app writes to service `FF12`, characteristic `FF01`** — not the `FE60`
|
|
256
277
|
this dongle exposes. It targets an older generation. The frame layer is
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homebridge-eliot-smart-control",
|
|
3
3
|
"displayName": "Eliot Smart Control",
|
|
4
|
-
"version": "1.6.
|
|
4
|
+
"version": "1.6.2",
|
|
5
5
|
"description": "Homebridge plugin for the Eliot sit-stand desk with the Smart Dongle, over Bluetooth LE",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Oliver Rummeyer",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
"keywords": [
|
|
21
21
|
"homebridge-plugin",
|
|
22
|
+
"supports-hap",
|
|
22
23
|
"eliot",
|
|
23
24
|
"smartfurniture",
|
|
24
25
|
"standing-desk",
|
|
@@ -52,6 +53,7 @@
|
|
|
52
53
|
"homebridge-ui",
|
|
53
54
|
"tools",
|
|
54
55
|
"docs",
|
|
56
|
+
"!docs/*.png",
|
|
55
57
|
"config.schema.json",
|
|
56
58
|
"README.md",
|
|
57
59
|
"CHANGELOG.md",
|
package/tools/set-setting.js
CHANGED
|
@@ -13,13 +13,15 @@
|
|
|
13
13
|
* and velocity 28 were both stored, neither was in force, and the desk moved at
|
|
14
14
|
* 22.4 mm/s either way.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
16
|
+
* So a value written here is a promise about the desk's behaviour *after* its
|
|
17
|
+
* next reset, and this tool says so rather than pretending the write took
|
|
18
|
+
* effect.
|
|
19
|
+
*
|
|
20
|
+
* This header used to blame `MOTION_MODE` (`0x19`) for GOTO_HEIGHT moving the
|
|
21
|
+
* desk 10 mm and stopping: `00` was stored, `00` was read as hold-to-move, and
|
|
22
|
+
* the reset performed here was said to have made it live. Both halves were
|
|
23
|
+
* wrong. `00` is one touch, not hold — see docs/PROTOCOL.md — and the 10 mm
|
|
24
|
+
* was a 400 ms `SETTINGS` poll in the test tools cancelling every move.
|
|
23
25
|
*
|
|
24
26
|
* `--reset` sends `0x91`, which is the entry into reset mode. Verified on this
|
|
25
27
|
* hardware: the handset then shows RESET with a circle, and the reset happens
|
|
@@ -44,7 +46,7 @@ const HOLD = Number(arg('hold') ?? 45_000);
|
|
|
44
46
|
|
|
45
47
|
if (!/^([0-9A-F]{2}:){5}[0-9A-F]{2}$/.test(MAC) || !Number.isInteger(CODE) || !Number.isInteger(VALUE)) {
|
|
46
48
|
console.error('usage: node tools/set-setting.js <MAC> --code=0x19 --value=1 [--reset]');
|
|
47
|
-
console.error(' 0x13 velocity 0x18 low power 0x19 motion mode (0
|
|
49
|
+
console.error(' 0x13 velocity 0x18 low power 0x19 motion mode (0 one-touch, 1 halten)');
|
|
48
50
|
console.error(' 0x1d sensitivity 0x0e units');
|
|
49
51
|
process.exit(1);
|
|
50
52
|
}
|