homebridge-eliot-smart-control 1.6.1 → 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 CHANGED
@@ -6,13 +6,34 @@ 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
+
9
30
  ## [1.6.1] — 2026-09-21
10
31
 
11
32
  ### Added
12
33
 
13
34
  - **The plugin has an icon**: a photograph of the desk, square, at the top of
14
35
  the README and on the npm page. A copy sized for the Homebridge plugin icon
15
- request sits in `branding/` — Homebridge hosts those icons itself, so the
36
+ request sits in `docs/` — Homebridge hosts those icons itself, so the
16
37
  repository holds the source rather than the thing the UI reads.
17
38
 
18
39
  ## [1.6.0] — 2026-09-21
@@ -390,7 +411,8 @@ First release.
390
411
  verified against hardware, including the measured travel speed and stopping
391
412
  distance.
392
413
 
393
- [Unreleased]: https://github.com/rummeyer/homebridge-eliot-smart-control/compare/v1.6.1...HEAD
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
394
416
  [1.6.1]: https://github.com/rummeyer/homebridge-eliot-smart-control/compare/v1.6.0...v1.6.1
395
417
  [1.6.0]: https://github.com/rummeyer/homebridge-eliot-smart-control/compare/v1.5.2...v1.6.0
396
418
  [1.5.2]: https://github.com/rummeyer/homebridge-eliot-smart-control/compare/v1.5.1...v1.5.2
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/rummeyer/homebridge-eliot-smart-control/main/branding/icon.png" alt="" width="120" height="120">
2
+ <img src="https://raw.githubusercontent.com/rummeyer/homebridge-eliot-smart-control/main/docs/icon.png" alt="" width="120" height="120">
3
3
  </p>
4
4
 
5
5
  <h1 align="center">homebridge-eliot-smart-control</h1>
@@ -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` hold the button, `1` one touch |
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 = 1`). In hold mode the app repeats it, which is worth knowing
252
- before exposing that setting to anyone: turning one-touch off takes away the
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.1",
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",
@@ -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
- * It is also what broke GOTO_HEIGHT. `MOTION_MODE` (`0x19`) had `00` stored —
17
- * hold-to-move — while the box was running one-touch from some earlier reset.
18
- * The first reset performed here made the stored value live, and a single
19
- * GOTO_HEIGHT then moved the desk 10 mm and stopped, which is hold-mode doing
20
- * exactly what it says. So a value written here is a promise about the desk's
21
- * behaviour *after* its next reset, and this tool says so rather than
22
- * pretending the write took effect.
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 halten, 1 one-touch)');
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
  }