homebridge-dyson-solarcycle-morph 1.7.0 → 1.7.1

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
@@ -5,6 +5,21 @@ All notable changes to this project are documented here.
5
5
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.7.1] — 2026-09-23
9
+
10
+ ### Changed
11
+
12
+ - **"Use this day" and "Apply the age adjustment" are always shown, above the
13
+ fields they govern**, instead of appearing only once a time or a year was
14
+ filled in — which left "Use this day" invisible until then. Because the
15
+ settings page now fills in the age switch's default on every light,
16
+ `ageAdjust` without `yearOfBirth` is ignored rather than refused.
17
+ - The README says a brightness change ends daylight tracking too, not only a
18
+ colour temperature, and has a new section, *How this was worked out*: the
19
+ decompiled Android app, the analysed iOS Bluetooth capture, and the
20
+ measurements on a real lamp behind what the plugin does. *Credits* now says
21
+ what came from the hass-dyson notes and what did not.
22
+
8
23
  ## [1.7.0] — 2026-09-23
9
24
 
10
25
  ### Changed
package/README.md CHANGED
@@ -130,9 +130,9 @@ towards a new level rather than jumping, and with Auto Brightness on it keeps
130
130
  adjusting to suit the room. Asking for 100% and seeing 88% is the lamp doing its
131
131
  job — turn Auto Brightness off if you would rather it stayed put.
132
132
 
133
- **Setting a colour temperature ends daylight tracking**, and the Daylight switch
134
- turns itself off when you do. That is the lamp's own behaviour, not something
135
- the plugin decides. Flip the switch back on to resume.
133
+ **Setting a brightness or a colour temperature ends daylight tracking**, and
134
+ the Daylight switch turns itself off when you do. That is the lamp's own
135
+ behaviour, not something the plugin decides. Flip the switch back on to resume.
136
136
 
137
137
  **The three mode switches work while the lamp is off**, though the lamp itself
138
138
  will not have them until it is lit — it takes none of the three while it is off.
@@ -160,10 +160,11 @@ Everything except the lights is optional.
160
160
  | **Lights → BLE MAC address** | Filled in by the scan |
161
161
  | **Lights → Serial number** | Filled in by the scan. Identifies the accessory, so changing it creates a new one |
162
162
  | **Lights → Latitude**, **Longitude** | Where the lamp stands, in decimal degrees. Optional; set both or neither |
163
- | **Lights → Year of birth** | Turns on the lamp's age adjustment. Optional |
164
- | **Lights → Apply the age adjustment** | The lamp's own switch for it. On by default |
163
+ | **Lights → Use this day** | Puts the two times below in the lamp. Off by default, and off they are ignored |
165
164
  | **Lights → Day starts at** | Optional. Replaces the real sunrise, as `HH:MM` |
166
165
  | **Lights → Day ends at** | Optional. Replaces the real sunset |
166
+ | **Lights → Apply the age adjustment** | The lamp's own switch for it. On by default; only used with a year of birth |
167
+ | **Lights → Year of birth** | Turns on the lamp's age adjustment. Optional |
167
168
  | **Lights → Expose daylight tracking** | The Daylight switch. On by default |
168
169
  | **Lights → Expose auto brightness** | The Auto Brightness switch. On by default |
169
170
  | **Lights → Expose movement mode** | The Movement switch. On by default |
@@ -232,13 +233,12 @@ the lamp. The example above shows every key at once, which no real config needs.
232
233
  | `adapter` | string | system default | e.g. `hci1` |
233
234
 
234
235
  **A light with something wrong with it is skipped, and the rest still load** —
235
- the message names the entry and the key. Three combinations are refused rather
236
- than half-applied, because half of any of them would quietly do the wrong thing:
236
+ the message names the entry and the key. Two combinations are refused rather
237
+ than half-applied, because half of either would quietly do the wrong thing:
237
238
 
238
239
  - `latitude` without `longitude`, or the other way round. A lamp told only its
239
240
  latitude would put itself on the Greenwich meridian and track the wrong sunset
240
241
  all year.
241
- - `ageAdjust` without `yearOfBirth`. There would be nothing to adjust for.
242
242
  - `customDay` on without both `dayStart` and `dayEnd`. With it off, the times are
243
243
  not checked at all, since they are not used.
244
244
 
@@ -312,8 +312,8 @@ are used:
312
312
  ```
313
313
 
314
314
  With `customDay` off, which is the default, the times are ignored and can stay
315
- filled in for later. On the settings page the switch is **Use this day**, and it
316
- appears once either time is filled in.
315
+ filled in for later. On the settings page the switch is **Use this day**, just
316
+ above the two times.
317
317
 
318
318
  The lamp keeps its warm-to-cool-to-warm shape and fits it between those two
319
319
  times instead of the sun's, and falls back to a softer, warmer baseline once the
@@ -496,12 +496,62 @@ The protocol, including where a real lamp disagreed with the published notes, is
496
496
  written up in [docs/PROTOCOL.md](docs/PROTOCOL.md). Building, testing and
497
497
  releasing are in [CONTRIBUTING.md](CONTRIBUTING.md).
498
498
 
499
+ ## How this was worked out
500
+
501
+ Dyson publishes nothing about this lamp, and the published notes this plugin
502
+ started from turned out to be the beginning rather than the answer. Most of
503
+ what the plugin does had to be found out, and much of it the slow way:
504
+
505
+ - **The MyDyson Android app was decompiled and read**, class by obfuscated
506
+ class. Its identifiers change from one class to the next, and it builds its
507
+ Bluetooth UUIDs at runtime from four-digit fragments, so searching it for a
508
+ UUID finds nothing. Its routing table for messages looks complete and is not:
509
+ the message that sets the lamp's clock is built elsewhere, and missing it cost
510
+ two days.
511
+ - **The iOS app's Bluetooth traffic was captured and analysed.** An iPhone
512
+ records it in a sysdiagnose once Apple's Bluetooth logging profile is
513
+ installed. Its packet log was parsed directly, message by message, and put
514
+ side by side with what this plugin sends. That is where the clock message
515
+ (`0x80`) and attribute subscriptions (`0x96`) came from. Neither appears in
516
+ the notes this started from.
517
+ - **Everything was measured against a real lamp**, from a Raspberry Pi, with
518
+ test builds put onto it as prereleases. Connection reliability was measured
519
+ over repeated runs, which is why the plugin makes four quick attempts rather
520
+ than one clever one: one succeeds about two times in three, four together
521
+ above 98%. The 150 ms gap between writes has a 100 ms measurement behind
522
+ it. The whole attribute range `0x2000`–`0x2040` was read one attribute at a
523
+ time. Daylight tracking was checked against a NOAA sunrise calculation,
524
+ across deliberate power cuts and overnight, and by watching a sunrise from
525
+ the lamp's log.
526
+ - **Where the lamp and the published notes disagreed, the lamp won.** They
527
+ place everything under one Bluetooth service where this lamp uses three,
528
+ call the encryption AES-GCM where it is AES-CBC with an HMAC, require
529
+ acknowledged writes the lamp does not even offer, and describe a motion
530
+ sensor that never reports motion.
531
+ - **The lamp does not always tell the truth.** For some settings it confirms a
532
+ write and throws the value away, so the plugin reads those settings back
533
+ rather than trusting the reply. Why the lamp would not keep a location took
534
+ two days, dozens of refused writes, and eight theories that were tested and
535
+ dropped: write order, the app's timing, a beacon exchange, a hidden set-up
536
+ flag. It turned out that nobody had told it the time.
537
+
538
+ The findings, including the wrong turns, are in
539
+ [docs/PROTOCOL.md](docs/PROTOCOL.md), so nobody has to take the same wrong
540
+ turns again.
541
+
499
542
  ## Credits
500
543
 
501
- The BLE protocol was reverse-engineered from the MyDyson Android app by
502
- **S-Termi** and documented in
503
- [cmgrayb/hass-dyson](https://github.com/cmgrayb/hass-dyson). This plugin is an
504
- independent TypeScript implementation, cross-checked against that reference.
544
+ The starting point was the BLE notes by **S-Termi**, reverse-engineered from the
545
+ MyDyson Android app and published in
546
+ [cmgrayb/hass-dyson](https://github.com/cmgrayb/hass-dyson): the handshake, the
547
+ message framing and the main control characteristics, enough to get a
548
+ connection going and the light switching. Most of the rest — the clock, the
549
+ location and the day, the attribute channel and its acknowledgements,
550
+ subscriptions, the presets, age adjustment, and every correction to those
551
+ notes — came from reading the decompiled Android app again, analysing the iOS
552
+ app's Bluetooth traffic, and measuring a real lamp; see
553
+ [How this was worked out](#how-this-was-worked-out). This plugin is an
554
+ independent TypeScript implementation.
505
555
 
506
556
  Not affiliated with or endorsed by Dyson.
507
557
 
@@ -87,7 +87,7 @@
87
87
  "type": "string",
88
88
  "pattern": "^([01]?[0-9]|2[0-3]):[0-5][0-9]$",
89
89
  "placeholder": "08:00",
90
- "description": "Optional. Replaces the real sunrise for this lamp — daylight tracking then begins here instead. Only used while \"Use this day\" below is on."
90
+ "description": "Optional. Replaces the real sunrise for this lamp — daylight tracking then begins here instead. Only used while \"Use this day\" above is on."
91
91
  },
92
92
  "dayEnd": {
93
93
  "title": "Day ends at",
@@ -100,10 +100,7 @@
100
100
  "title": "Use this day",
101
101
  "type": "boolean",
102
102
  "default": false,
103
- "condition": {
104
- "functionBody": "return model.lights && model.lights[arrayIndices[0]] && (model.lights[arrayIndices[0]].dayStart || model.lights[arrayIndices[0]].dayEnd);"
105
- },
106
- "description": "Puts the two times above in the lamp. Off, they are ignored and the lamp's day is not touched. Turning it off does not undo a day already written: the lamp keeps it until the MyDyson app sets it back."
103
+ "description": "Puts the two times below in the lamp. Off, they are ignored and the lamp's day is not touched. Turning it off does not undo a day already written: the lamp keeps it until the MyDyson app sets it back."
107
104
  },
108
105
  "yearOfBirth": {
109
106
  "title": "Year of birth",
@@ -116,10 +113,7 @@
116
113
  "title": "Apply the age adjustment",
117
114
  "type": "boolean",
118
115
  "default": true,
119
- "condition": {
120
- "functionBody": "return model.lights && model.lights[arrayIndices[0]] && model.lights[arrayIndices[0]].yearOfBirth;"
121
- },
122
- "description": "The lamp’s own switch for it. Turning this off leaves the year in place but stops the lamp acting on it."
116
+ "description": "The lamp’s own switch for the age adjustment. Only used when a year of birth is set below. Turning it off leaves the year in the lamp but stops it acting on it."
123
117
  },
124
118
  "daylightSwitch": {
125
119
  "title": "Expose daylight tracking",
@@ -177,11 +171,11 @@
177
171
  "lights[].serial",
178
172
  "lights[].latitude",
179
173
  "lights[].longitude",
174
+ "lights[].customDay",
180
175
  "lights[].dayStart",
181
176
  "lights[].dayEnd",
182
- "lights[].customDay",
183
- "lights[].yearOfBirth",
184
177
  "lights[].ageAdjust",
178
+ "lights[].yearOfBirth",
185
179
  "lights[].daylightSwitch",
186
180
  "lights[].autoBrightnessSwitch",
187
181
  "lights[].movementSwitch",
package/dist/config.d.ts CHANGED
@@ -70,8 +70,8 @@ export interface LightConfig {
70
70
  yearOfBirth?: number;
71
71
  /**
72
72
  * Whether the lamp applies the age adjustment. Only consulted when
73
- * {@link yearOfBirth} is set, and on by default when it is: a year with the
74
- * adjustment off does nothing at all.
73
+ * {@link yearOfBirth} is set, and ignored otherwise; on by default, since a
74
+ * year with the adjustment off does nothing at all.
75
75
  */
76
76
  ageAdjust?: boolean;
77
77
  }
package/dist/config.js CHANGED
@@ -78,9 +78,9 @@ export function validateLightConfig(light, index) {
78
78
  `(got ${JSON.stringify(light.yearOfBirth)})`);
79
79
  }
80
80
  }
81
- else if (light.ageAdjust !== undefined) {
82
- problems.push(`${where} sets ageAdjust with no yearOfBirth — there is nothing to adjust for`);
83
- }
81
+ // ageAdjust without a year is not refused: the settings page shows the switch
82
+ // on every light and fills in its default, so it is there whether or not
83
+ // anyone meant it, and with no year it is simply not used.
84
84
  for (const [field, limit] of [['latitude', 90], ['longitude', 180]]) {
85
85
  const value = light[field];
86
86
  if (value !== undefined && (typeof value !== 'number' || !Number.isFinite(value) || Math.abs(value) > limit)) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "homebridge-dyson-solarcycle-morph",
3
3
  "displayName": "Dyson Solarcycle Morph",
4
- "version": "1.7.0",
4
+ "version": "1.7.1",
5
5
  "description": "Homebridge plugin for the Bluetooth LE controlled Dyson Solarcycle/Lightcycle Morph desk light",
6
6
  "license": "MIT",
7
7
  "author": "Oliver Rummeyer",