homebridge-dyson-solarcycle-morph 1.7.0 → 1.7.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 +23 -0
- package/README.md +64 -14
- package/config.schema.json +5 -11
- package/dist/config.d.ts +2 -2
- package/dist/config.js +3 -3
- package/dist/config.js.map +1 -1
- package/package.json +5 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,29 @@ 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.2] — 2026-09-23
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **A Buy Me a Coffee funding link** (buymeacoffee.com/rummeyer), next to
|
|
13
|
+
GitHub Sponsors and PayPal in `package.json` and `.github/FUNDING.yml`. No
|
|
14
|
+
behaviour changes.
|
|
15
|
+
|
|
16
|
+
## [1.7.1] — 2026-09-23
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- **"Use this day" and "Apply the age adjustment" are always shown, above the
|
|
21
|
+
fields they govern**, instead of appearing only once a time or a year was
|
|
22
|
+
filled in — which left "Use this day" invisible until then. Because the
|
|
23
|
+
settings page now fills in the age switch's default on every light,
|
|
24
|
+
`ageAdjust` without `yearOfBirth` is ignored rather than refused.
|
|
25
|
+
- The README says a brightness change ends daylight tracking too, not only a
|
|
26
|
+
colour temperature, and has a new section, *How this was worked out*: the
|
|
27
|
+
decompiled Android app, the analysed iOS Bluetooth capture, and the
|
|
28
|
+
measurements on a real lamp behind what the plugin does. *Credits* now says
|
|
29
|
+
what came from the hass-dyson notes and what did not.
|
|
30
|
+
|
|
8
31
|
## [1.7.0] — 2026-09-23
|
|
9
32
|
|
|
10
33
|
### 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
|
|
134
|
-
turns itself off when you do. That is the lamp's own
|
|
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 →
|
|
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.
|
|
236
|
-
than half-applied, because half of
|
|
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**,
|
|
316
|
-
|
|
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
|
|
502
|
-
|
|
503
|
-
[cmgrayb/hass-dyson](https://github.com/cmgrayb/hass-dyson)
|
|
504
|
-
|
|
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
|
|
package/config.schema.json
CHANGED
|
@@ -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\"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
|
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
|
-
|
|
82
|
-
|
|
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)) {
|
package/dist/config.js.map
CHANGED
|
@@ -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.
|
|
4
|
+
"version": "1.7.2",
|
|
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",
|
|
@@ -71,6 +71,10 @@
|
|
|
71
71
|
{
|
|
72
72
|
"type": "paypal",
|
|
73
73
|
"url": "https://paypal.me/rummeyer"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"type": "buymeacoffee",
|
|
77
|
+
"url": "https://buymeacoffee.com/rummeyer"
|
|
74
78
|
}
|
|
75
79
|
],
|
|
76
80
|
"type": "module"
|