daikin-local-control 0.3.1 → 0.4.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.
Files changed (108) hide show
  1. package/DESIGN.md +113 -2
  2. package/README.md +129 -11
  3. package/UNSUPPORTED.md +41 -3
  4. package/dist/clients/classic.d.ts +2 -2
  5. package/dist/clients/classic.d.ts.map +1 -1
  6. package/dist/clients/classic.js +4 -4
  7. package/dist/clients/classic.js.map +1 -1
  8. package/dist/clients/client.d.ts +5 -1
  9. package/dist/clients/client.d.ts.map +1 -1
  10. package/dist/clients/dsiot.d.ts +3 -1
  11. package/dist/clients/dsiot.d.ts.map +1 -1
  12. package/dist/clients/dsiot.js +7 -2
  13. package/dist/clients/dsiot.js.map +1 -1
  14. package/dist/codecs/classic/capabilities.d.ts.map +1 -1
  15. package/dist/codecs/classic/capabilities.js +5 -11
  16. package/dist/codecs/classic/capabilities.js.map +1 -1
  17. package/dist/codecs/classic/extendedControl.d.ts.map +1 -1
  18. package/dist/codecs/classic/extendedControl.js +10 -19
  19. package/dist/codecs/classic/extendedControl.js.map +1 -1
  20. package/dist/codecs/classic/state.d.ts.map +1 -1
  21. package/dist/codecs/classic/state.js +36 -95
  22. package/dist/codecs/classic/state.js.map +1 -1
  23. package/dist/codecs/classic/tables.d.ts +32 -0
  24. package/dist/codecs/classic/tables.d.ts.map +1 -0
  25. package/dist/codecs/classic/tables.js +94 -0
  26. package/dist/codecs/classic/tables.js.map +1 -0
  27. package/dist/codecs/credentials.d.ts +3 -2
  28. package/dist/codecs/credentials.d.ts.map +1 -1
  29. package/dist/codecs/credentials.js +8 -3
  30. package/dist/codecs/credentials.js.map +1 -1
  31. package/dist/codecs/device.js +2 -2
  32. package/dist/codecs/device.js.map +1 -1
  33. package/dist/codecs/dsiot/capabilities.d.ts.map +1 -1
  34. package/dist/codecs/dsiot/capabilities.js +8 -15
  35. package/dist/codecs/dsiot/capabilities.js.map +1 -1
  36. package/dist/codecs/dsiot/device.d.ts.map +1 -1
  37. package/dist/codecs/dsiot/device.js +4 -8
  38. package/dist/codecs/dsiot/device.js.map +1 -1
  39. package/dist/codecs/dsiot/multireq.d.ts +0 -19
  40. package/dist/codecs/dsiot/multireq.d.ts.map +1 -1
  41. package/dist/codecs/dsiot/multireq.js +2 -25
  42. package/dist/codecs/dsiot/multireq.js.map +1 -1
  43. package/dist/codecs/dsiot/state.d.ts +6 -62
  44. package/dist/codecs/dsiot/state.d.ts.map +1 -1
  45. package/dist/codecs/dsiot/state.js +29 -148
  46. package/dist/codecs/dsiot/state.js.map +1 -1
  47. package/dist/codecs/dsiot/tables.d.ts +116 -0
  48. package/dist/codecs/dsiot/tables.d.ts.map +1 -0
  49. package/dist/codecs/dsiot/tables.js +185 -0
  50. package/dist/codecs/dsiot/tables.js.map +1 -0
  51. package/dist/discovery.d.ts +2 -1
  52. package/dist/discovery.d.ts.map +1 -1
  53. package/dist/discovery.js +9 -5
  54. package/dist/discovery.js.map +1 -1
  55. package/dist/factory.d.ts +7 -4
  56. package/dist/factory.d.ts.map +1 -1
  57. package/dist/factory.js +4 -2
  58. package/dist/factory.js.map +1 -1
  59. package/dist/index.d.ts +2 -0
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +2 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/models/state.d.ts +2 -3
  64. package/dist/models/state.d.ts.map +1 -1
  65. package/dist/simulators/classic.d.ts +61 -0
  66. package/dist/simulators/classic.d.ts.map +1 -0
  67. package/dist/simulators/classic.js +473 -0
  68. package/dist/simulators/classic.js.map +1 -0
  69. package/dist/simulators/dsiot.d.ts +49 -0
  70. package/dist/simulators/dsiot.d.ts.map +1 -0
  71. package/dist/simulators/dsiot.js +519 -0
  72. package/dist/simulators/dsiot.js.map +1 -0
  73. package/dist/simulators/index.d.ts +4 -0
  74. package/dist/simulators/index.d.ts.map +1 -0
  75. package/dist/simulators/index.js +3 -0
  76. package/dist/simulators/index.js.map +1 -0
  77. package/dist/simulators/simulator.d.ts +116 -0
  78. package/dist/simulators/simulator.d.ts.map +1 -0
  79. package/dist/simulators/simulator.js +141 -0
  80. package/dist/simulators/simulator.js.map +1 -0
  81. package/dist/transport.d.ts +6 -2
  82. package/dist/transport.d.ts.map +1 -1
  83. package/dist/transport.js +7 -2
  84. package/dist/transport.js.map +1 -1
  85. package/package.json +5 -2
  86. package/src/clients/classic.ts +8 -8
  87. package/src/clients/client.ts +6 -0
  88. package/src/clients/dsiot.ts +8 -1
  89. package/src/codecs/classic/capabilities.ts +8 -11
  90. package/src/codecs/classic/extendedControl.ts +14 -25
  91. package/src/codecs/classic/state.ts +49 -101
  92. package/src/codecs/classic/tables.ts +123 -0
  93. package/src/codecs/credentials.ts +11 -3
  94. package/src/codecs/device.ts +2 -2
  95. package/src/codecs/dsiot/capabilities.ts +10 -17
  96. package/src/codecs/dsiot/device.ts +4 -9
  97. package/src/codecs/dsiot/multireq.ts +2 -25
  98. package/src/codecs/dsiot/state.ts +57 -193
  99. package/src/codecs/dsiot/tables.ts +249 -0
  100. package/src/discovery.ts +9 -5
  101. package/src/factory.ts +7 -4
  102. package/src/index.ts +2 -0
  103. package/src/models/state.ts +2 -3
  104. package/src/simulators/classic.ts +635 -0
  105. package/src/simulators/dsiot.ts +736 -0
  106. package/src/simulators/index.ts +9 -0
  107. package/src/simulators/simulator.ts +281 -0
  108. package/src/transport.ts +10 -3
@@ -0,0 +1,519 @@
1
+ import { DSIOT_ADAPTER_PATHS, DSIOT_ADAPTER_TYPE, DSIOT_COOLING_ONLY_MODEL_TYPE, DSIOT_EDGE_ROOT, DSIOT_EDGES, DSIOT_FAN_SPEED_CODES, DSIOT_FIXED_LOUVER_VALUES, DSIOT_HUMIDITY_OFF, DSIOT_HUMIDITY_SETTING_FLAGS, DSIOT_LOUVER_VALUES, DSIOT_MODE_PATHS, DSIOT_OFF, DSIOT_ON, DSIOT_OPERATING_MODE_CODES, DSIOT_OPERATIONS, DSIOT_PATHS, DSIOT_SPECIAL_MODE_PATHS, } from "../codecs/dsiot/tables.js";
2
+ import { startSimulator, unanswered, } from "./simulator.js";
3
+ // A DSIOT adapter (BRP084) as an HTTP server. It reads the adapter's leaves
4
+ // and codes from the codecs' tables and shares none of their functions: see
5
+ // DESIGN.md#simulators.
6
+ const MULTIREQ_PATH = "/dsiot/multireq";
7
+ const REBOOT_PATH = "/config/system/reboot";
8
+ const RSC_OK = 2000;
9
+ const RSC_UPDATED = 2004;
10
+ const RSC_UNAUTHORIZED = 4001;
11
+ // A node's `pt`: 1 for one that holds children, and 2 or 3 for a leaf. A
12
+ // special mode's leaf is 2 on a unit that takes the mode.
13
+ const NODE_TYPE = 1;
14
+ const WRITTEN_LEAF_TYPE = 2;
15
+ const REPORTED_LEAF_TYPE = 3;
16
+ // The `pt` inside a leaf's `md`. What it stands for is not known: see
17
+ // UNSUPPORTED.md.
18
+ const METADATA_TYPE = "b";
19
+ const INDOOR = `${DSIOT_EDGE_ROOT}/${DSIOT_EDGES.indoor}`;
20
+ const OUTDOOR = `${DSIOT_EDGE_ROOT}/${DSIOT_EDGES.outdoor}`;
21
+ // A leaf's address is the `to` of its resource, then its path. Of the
22
+ // `dgc_status` entities, `e_1003` is on the outdoor edge and the rest on the
23
+ // indoor one.
24
+ function statusAddress(path) {
25
+ return `${path.includes(".e_1003.") ? OUTDOOR : INDOOR}.${path}`;
26
+ }
27
+ function adapterAddress(path) {
28
+ return `${DSIOT_EDGE_ROOT}.${path}`;
29
+ }
30
+ // A `to` names one resource: an edge, then one property of it.
31
+ const RESOURCE_PATTERN = /^(\/dsiot\/edge(?:\/\w+)?)\.(\w+)$/;
32
+ // The leaves of a `dgc_status` tree hold hex bytes.
33
+ const STATUS_ADDRESS_PATTERN = /\.dgc_status\./;
34
+ // Sent with every change of power, as 00 turning on, 01 turning off and 02
35
+ // unchanged. The adapter takes it and reports no such leaf.
36
+ const POWER_TRANSITION_ADDRESS = statusAddress(DSIOT_PATHS.powerTransition);
37
+ const POWER_ADDRESS = statusAddress(DSIOT_PATHS.power);
38
+ const MODE_ADDRESS = statusAddress(DSIOT_PATHS.mode);
39
+ const MODEL_TYPE_ADDRESS = statusAddress(DSIOT_PATHS.modelType);
40
+ // A signed byte of whole degrees, a byte of percent, and two bytes of half
41
+ // degrees.
42
+ const INDOOR_TEMPERATURE_ADDRESS = statusAddress(DSIOT_PATHS.indoorTemperature);
43
+ const INDOOR_HUMIDITY_ADDRESS = statusAddress(DSIOT_PATHS.indoorHumidity);
44
+ const OUTDOOR_TEMPERATURE_ADDRESS = statusAddress(DSIOT_PATHS.outdoorTemperature);
45
+ const SPECIAL_MODE_ADDRESSES = {
46
+ powerful: statusAddress(DSIOT_SPECIAL_MODE_PATHS.powerful),
47
+ econo: statusAddress(DSIOT_SPECIAL_MODE_PATHS.econo),
48
+ streamer: statusAddress(DSIOT_SPECIAL_MODE_PATHS.streamer),
49
+ };
50
+ const ADAPTER_NAME_ADDRESS = adapterAddress(DSIOT_ADAPTER_PATHS.name);
51
+ const ADAPTER_MAC_ADDRESS = adapterAddress(DSIOT_ADAPTER_PATHS.macAddress);
52
+ const ADAPTER_VERSION_ADDRESS = adapterAddress(DSIOT_ADAPTER_PATHS.firmwareVersion);
53
+ // A louver leaf is three bytes, the low byte first.
54
+ const LOUVER_BYTES = 3;
55
+ // What `DSIOT_PATHS.modelType` holds on a heat pump.
56
+ const HEAT_PUMP_MODEL_TYPE = "00";
57
+ const modeLeaves = (mode) => {
58
+ const { setpoint, humidity, fanSpeed, vertical, horizontal } = DSIOT_MODE_PATHS[mode];
59
+ return {
60
+ fanSpeed: statusAddress(fanSpeed),
61
+ vertical: statusAddress(vertical),
62
+ horizontal: statusAddress(horizontal),
63
+ ...(setpoint === undefined
64
+ ? {}
65
+ : {
66
+ setpoint: {
67
+ address: statusAddress(setpoint.path),
68
+ bytes: setpoint.signed ? 1 : 2,
69
+ },
70
+ }),
71
+ ...(humidity === undefined
72
+ ? {}
73
+ : { humidityFlag: statusAddress(humidity.flag) }),
74
+ };
75
+ };
76
+ const MODE_LEAVES = {
77
+ auto: modeLeaves("auto"),
78
+ dehumidify: modeLeaves("dehumidify"),
79
+ cool: modeLeaves("cool"),
80
+ heat: modeLeaves("heat"),
81
+ fan: modeLeaves("fan"),
82
+ };
83
+ // The leaves a discovery reply carries, under the names a classic
84
+ // `basic_info` gives them.
85
+ const DISCOVERY_FIELD_ADDRESSES = {
86
+ reg: adapterAddress(DSIOT_ADAPTER_PATHS.region),
87
+ ver: ADAPTER_VERSION_ADDRESS,
88
+ mac: ADAPTER_MAC_ADDRESS,
89
+ adp_kind: adapterAddress(DSIOT_ADAPTER_PATHS.kind),
90
+ name: ADAPTER_NAME_ADDRESS,
91
+ };
92
+ // A read's `filter` lists what each leaf comes with. `pn` and `pt` come
93
+ // whatever it lists.
94
+ const FILTER_VALUE = "pv";
95
+ const FILTER_METADATA = "md";
96
+ /** Starts a DSIOT adapter on a free port, as a heat pump that is off, in
97
+ * cool at 24 °C. It answers `/dsiot/multireq` reads and writes and
98
+ * `/config/system/reboot`, over HTTP, and answers any other request with HTTP
99
+ * 501: UNSUPPORTED.md lists what it leaves out and where its answer is not
100
+ * known to be an adapter's. Call `stop` when done with it. */
101
+ export async function startDsiotSimulator(options = {}) {
102
+ const leaves = {
103
+ ...applyUnit(defaultLeaves(), options.unit ?? {}),
104
+ ...options.leaves,
105
+ };
106
+ const setState = (state) => applyState(leaves, state);
107
+ const setSensors = (sensors) => applySensors(leaves, sensors);
108
+ // Before the server starts, so a state that throws leaves nothing
109
+ // listening.
110
+ applyDeviceInfo(leaves, options.deviceInfo ?? {});
111
+ setState(options.state ?? {});
112
+ setSensors(options.sensors ?? {});
113
+ const read = (to) => {
114
+ if (typeof to !== "string") {
115
+ return undefined;
116
+ }
117
+ const [resource = "", query, ...rest] = to.split("?");
118
+ const filter = query?.startsWith("filter=")
119
+ ? query.slice("filter=".length).split(",")
120
+ : undefined;
121
+ const name = RESOURCE_PATTERN.exec(resource)?.[2];
122
+ if (name === undefined ||
123
+ rest.length > 0 ||
124
+ (query !== undefined && filter === undefined)) {
125
+ return undefined;
126
+ }
127
+ const root = { pn: name, pt: NODE_TYPE, pch: [] };
128
+ for (const [address, leaf] of Object.entries(leaves)) {
129
+ if (!address.startsWith(`${resource}.`)) {
130
+ continue;
131
+ }
132
+ const names = address.slice(resource.length + 1).split(".");
133
+ let node = root;
134
+ for (const child of names.slice(0, -1)) {
135
+ node = childNamed(node, child);
136
+ }
137
+ node.pch?.push({
138
+ pn: names.at(-1) ?? "",
139
+ pt: leaf.pt,
140
+ ...(filter?.includes(FILTER_VALUE) === false ? {} : { pv: leaf.pv }),
141
+ ...(leaf.md === undefined || filter?.includes(FILTER_METADATA) === false
142
+ ? {}
143
+ : { md: leaf.md }),
144
+ });
145
+ }
146
+ return root.pch?.length === 0 ? undefined : root;
147
+ };
148
+ // The addresses and values a write names, or `undefined` for a write the
149
+ // adapter is not known to take: one that names a leaf it does not report,
150
+ // or a tree that is not the resource in `to`.
151
+ const write = (to, content) => {
152
+ const resource = typeof to === "string" ? to : "";
153
+ const edge = RESOURCE_PATTERN.exec(resource)?.[1];
154
+ const changes = [];
155
+ if (edge === undefined || !collectValues(content, edge, changes)) {
156
+ return undefined;
157
+ }
158
+ return changes.every(([address]) => address.startsWith(`${resource}.`) &&
159
+ (address in leaves || address === POWER_TRANSITION_ADDRESS))
160
+ ? changes
161
+ : undefined;
162
+ };
163
+ const answer = (request) => {
164
+ const reboots = request.path === REBOOT_PATH && request.method === "POST";
165
+ const operation = request.path !== MULTIREQ_PATH
166
+ ? undefined
167
+ : request.method === "POST"
168
+ ? DSIOT_OPERATIONS.get
169
+ : request.method === "PUT"
170
+ ? DSIOT_OPERATIONS.update
171
+ : undefined;
172
+ if (!reboots && operation === undefined) {
173
+ return unanswered(request);
174
+ }
175
+ if (options.localPassword !== undefined &&
176
+ request.headers.authorization !== `Basic ${options.localPassword}`) {
177
+ return json({ responses: [{ rsc: RSC_UNAUTHORIZED }] });
178
+ }
179
+ if (reboots) {
180
+ return json({ rsc: RSC_OK });
181
+ }
182
+ const requests = parseRequests(request.body);
183
+ if (requests === undefined || requests.some(({ op }) => op !== operation)) {
184
+ return unanswered(request);
185
+ }
186
+ if (operation === DSIOT_OPERATIONS.get) {
187
+ const trees = requests.map(({ to }) => read(to));
188
+ return trees.includes(undefined)
189
+ ? unanswered(request)
190
+ : json({ responses: trees.map((pc) => ({ rsc: RSC_OK, pc })) });
191
+ }
192
+ const changes = requests.map(({ to, pc }) => write(to, pc));
193
+ if (changes.includes(undefined)) {
194
+ return unanswered(request);
195
+ }
196
+ for (const [address, value] of changes.flatMap((each) => each ?? [])) {
197
+ const leaf = leaves[address];
198
+ if (leaf !== undefined) {
199
+ leaf.pv = heldValue(address, leaf.pv, value);
200
+ }
201
+ }
202
+ return json({ responses: requests.map(() => ({ rsc: RSC_UPDATED })) });
203
+ };
204
+ // The discovery reply names these leaves as a classic `basic_info` does,
205
+ // and carries the name percent-encoded.
206
+ const discoveryFields = () => {
207
+ const fields = { type: DSIOT_ADAPTER_TYPE };
208
+ for (const [field, address] of Object.entries(DISCOVERY_FIELD_ADDRESSES)) {
209
+ const value = leaves[address]?.pv;
210
+ if (value !== undefined) {
211
+ fields[field] = field === "name" ? encodeURIComponent(value) : value;
212
+ }
213
+ }
214
+ fields.lpw_flag = options.localPassword === undefined ? "0" : "1";
215
+ return fields;
216
+ };
217
+ const server = await startSimulator(options, answer, discoveryFields);
218
+ return { ...server, leaves, setState, setSensors };
219
+ }
220
+ function hold(leaves, address, pv) {
221
+ const leaf = leaves[address];
222
+ if (leaf === undefined) {
223
+ throw new Error(`The simulated unit reports no leaf ${address} to set`);
224
+ }
225
+ leaf.pv = pv;
226
+ }
227
+ // `bytes` bytes of hex in upper case, the low byte first. A negative value is
228
+ // held as its two's complement.
229
+ function littleEndian(value, bytes) {
230
+ return Array.from({ length: bytes }, (_, index) => ((value >> (8 * index)) & 0xff).toString(16).toUpperCase().padStart(2, "0")).join("");
231
+ }
232
+ function halfDegrees(temperatureInC, bytes) {
233
+ return littleEndian(Math.round(temperatureInC * 2), bytes);
234
+ }
235
+ // Removes the leaves a unit without something does not report, and sets the
236
+ // ones that say what it has. A field `unit` leaves out is left as it is.
237
+ function applyUnit(leaves, unit) {
238
+ const modes = Object.values(MODE_LEAVES);
239
+ if (unit.coolingOnly !== undefined) {
240
+ hold(leaves, MODEL_TYPE_ADDRESS, unit.coolingOnly ? DSIOT_COOLING_ONLY_MODEL_TYPE : HEAT_PUMP_MODEL_TYPE);
241
+ }
242
+ if (unit.fan === false) {
243
+ for (const { fanSpeed } of modes) {
244
+ delete leaves[fanSpeed];
245
+ }
246
+ }
247
+ for (const { vertical, horizontal } of modes) {
248
+ if (unit.swing === "none") {
249
+ delete leaves[vertical];
250
+ }
251
+ if (unit.swing === "none" || unit.swing === "vertical") {
252
+ delete leaves[horizontal];
253
+ }
254
+ }
255
+ if (unit.specialModes !== undefined) {
256
+ for (const [mode, address] of Object.entries(SPECIAL_MODE_ADDRESSES)) {
257
+ if (!unit.specialModes.includes(mode)) {
258
+ delete leaves[address];
259
+ }
260
+ }
261
+ }
262
+ const limit = (mode, temperatures) => {
263
+ const setpoint = MODE_LEAVES[mode].setpoint;
264
+ const leaf = leaves[setpoint?.address ?? ""];
265
+ if (temperatures !== undefined && setpoint && leaf) {
266
+ leaf.md = {
267
+ pt: METADATA_TYPE,
268
+ mi: halfDegrees(temperatures.min, setpoint.bytes),
269
+ mx: halfDegrees(temperatures.max, setpoint.bytes),
270
+ };
271
+ }
272
+ };
273
+ limit("cool", unit.coolTemperaturesInC);
274
+ limit("heat", unit.heatTemperaturesInC);
275
+ return leaves;
276
+ }
277
+ // The name as plain text, the MAC address without its colons, and the
278
+ // version with underscores for its dots.
279
+ function applyDeviceInfo(leaves, info) {
280
+ if (info.name !== undefined) {
281
+ hold(leaves, ADAPTER_NAME_ADDRESS, info.name);
282
+ }
283
+ if (info.macAddress !== undefined) {
284
+ hold(leaves, ADAPTER_MAC_ADDRESS, info.macAddress.replaceAll(":", ""));
285
+ }
286
+ if (info.firmwareVersion !== undefined) {
287
+ hold(leaves, ADAPTER_VERSION_ADDRESS, info.firmwareVersion.replaceAll(".", "_"));
288
+ }
289
+ }
290
+ function applySensors(leaves, sensors) {
291
+ const read = (address, pv) => {
292
+ if (pv === null) {
293
+ delete leaves[address];
294
+ }
295
+ else if (pv !== undefined) {
296
+ leaves[address] = { pv, pt: REPORTED_LEAF_TYPE };
297
+ }
298
+ };
299
+ const whole = (value) => value == null ? value : littleEndian(Math.round(value), 1);
300
+ read(INDOOR_TEMPERATURE_ADDRESS, whole(sensors.indoorTemperatureInC));
301
+ read(INDOOR_HUMIDITY_ADDRESS, whole(sensors.indoorHumidityInPercent));
302
+ read(OUTDOOR_TEMPERATURE_ADDRESS, sensors.outdoorTemperatureInC == null
303
+ ? sensors.outdoorTemperatureInC
304
+ : halfDegrees(sensors.outdoorTemperatureInC, 2));
305
+ }
306
+ // Changes the leaves as the unit's remote control would: see
307
+ // `DaikinSimulator.setState`. Every setting but power and the special modes
308
+ // goes to the leaf of the mode the unit is then in.
309
+ function applyState(leaves, state) {
310
+ if (state.power != null) {
311
+ hold(leaves, POWER_ADDRESS, state.power ? DSIOT_ON : DSIOT_OFF);
312
+ }
313
+ if (state.mode != null) {
314
+ hold(leaves, MODE_ADDRESS, DSIOT_OPERATING_MODE_CODES[state.mode]);
315
+ }
316
+ if (state.specialModes != null) {
317
+ for (const [mode, address] of Object.entries(SPECIAL_MODE_ADDRESSES)) {
318
+ const on = state.specialModes.includes(mode);
319
+ if (on || address in leaves) {
320
+ hold(leaves, address, on ? DSIOT_ON : DSIOT_OFF);
321
+ }
322
+ }
323
+ }
324
+ const held = leaves[MODE_ADDRESS]?.pv;
325
+ const mode = Object.keys(DSIOT_OPERATING_MODE_CODES).find((each) => DSIOT_OPERATING_MODE_CODES[each] === held);
326
+ const { targetTemperatureInC, targetHumidity, fanSpeed, swingMode, verticalPosition, horizontalPosition, } = state;
327
+ if (mode === undefined) {
328
+ if ([
329
+ targetTemperatureInC,
330
+ targetHumidity,
331
+ fanSpeed,
332
+ swingMode,
333
+ verticalPosition,
334
+ horizontalPosition,
335
+ ].some((each) => each != null)) {
336
+ throw new Error(`The simulated unit is in a mode, ${held}, whose leaves are not known`);
337
+ }
338
+ return;
339
+ }
340
+ const { setpoint, humidityFlag, ...addresses } = MODE_LEAVES[mode];
341
+ const louver = (value) => littleEndian(value, LOUVER_BYTES);
342
+ if (targetTemperatureInC != null) {
343
+ if (setpoint === undefined) {
344
+ throw new Error(`The simulated unit has no setpoint in ${mode}`);
345
+ }
346
+ hold(leaves, setpoint.address, halfDegrees(targetTemperatureInC, setpoint.bytes));
347
+ }
348
+ if (targetHumidity != null) {
349
+ if (humidityFlag === undefined || typeof targetHumidity !== "string") {
350
+ throw new Error(humidityFlag === undefined
351
+ ? `The simulated unit has no humidity setting in ${mode}`
352
+ : "Set a humidity percentage in the simulator's leaves");
353
+ }
354
+ hold(leaves, humidityFlag, targetHumidity === "off"
355
+ ? DSIOT_HUMIDITY_OFF
356
+ : DSIOT_HUMIDITY_SETTING_FLAGS[targetHumidity]);
357
+ }
358
+ if (fanSpeed != null) {
359
+ hold(leaves, addresses.fanSpeed, DSIOT_FAN_SPEED_CODES[fanSpeed]);
360
+ }
361
+ if (swingMode != null) {
362
+ const swings = {
363
+ vertical: swingMode === "vertical" || swingMode === "both",
364
+ horizontal: swingMode === "horizontal" || swingMode === "both",
365
+ };
366
+ for (const axis of ["vertical", "horizontal"]) {
367
+ const address = addresses[axis];
368
+ // An axis that stops swinging stops, and one at a fixed position keeps
369
+ // it. A unit without the axis has nothing to stop.
370
+ if (swings[axis]) {
371
+ hold(leaves, address, louver(DSIOT_LOUVER_VALUES.swing));
372
+ }
373
+ else if (leaves[address]?.pv === louver(DSIOT_LOUVER_VALUES.swing)) {
374
+ hold(leaves, address, louver(DSIOT_LOUVER_VALUES.stop));
375
+ }
376
+ }
377
+ }
378
+ for (const [axis, position] of [
379
+ ["vertical", verticalPosition],
380
+ ["horizontal", horizontalPosition],
381
+ ]) {
382
+ if (position == null) {
383
+ continue;
384
+ }
385
+ const address = addresses[axis];
386
+ const rank = FIXED_POSITIONS.indexOf(position);
387
+ // A fixed position is the value at its rank among the fixed values the
388
+ // unit takes. Which value a horizontal one is, is not known.
389
+ const value = rank === -1
390
+ ? DSIOT_LOUVER_VALUES[position]
391
+ : axis === "vertical"
392
+ ? fixedLouverValues(leaves[address])[rank]
393
+ : undefined;
394
+ if (value === undefined) {
395
+ throw new Error(`The simulated unit takes no ${axis} louver ${position}`);
396
+ }
397
+ hold(leaves, address, louver(value));
398
+ }
399
+ }
400
+ const FIXED_POSITIONS = [
401
+ "position1",
402
+ "position2",
403
+ "position3",
404
+ "position4",
405
+ "position5",
406
+ ];
407
+ function fixedLouverValues(leaf) {
408
+ const bytes = leaf?.md?.mx?.match(/../g) ?? [];
409
+ const mask = Number.parseInt(bytes.reverse().join(""), 16);
410
+ return DSIOT_FIXED_LOUVER_VALUES.filter((value) => mask & (1 << value));
411
+ }
412
+ function json(body) {
413
+ return { statusCode: 200, body: JSON.stringify(body) };
414
+ }
415
+ function parseRequests(body) {
416
+ try {
417
+ const requests = JSON.parse(body)
418
+ ?.requests;
419
+ return Array.isArray(requests) &&
420
+ requests.length > 0 &&
421
+ requests.every((each) => typeof each === "object" && each !== null)
422
+ ? requests
423
+ : undefined;
424
+ }
425
+ catch {
426
+ return undefined;
427
+ }
428
+ }
429
+ function childNamed(parent, name) {
430
+ let child = parent.pch?.find((node) => node.pn === name);
431
+ if (child === undefined) {
432
+ child = { pn: name, pt: NODE_TYPE, pch: [] };
433
+ parent.pch?.push(child);
434
+ }
435
+ return child;
436
+ }
437
+ // Adds each leaf under `node` to `changes`, by its address. It returns false
438
+ // for a node that has neither children nor a string value.
439
+ function collectValues(node, parent, changes) {
440
+ const { pn, pv, pch } = (node ?? {});
441
+ if (typeof pn !== "string") {
442
+ return false;
443
+ }
444
+ const address = `${parent}.${pn}`;
445
+ if (Array.isArray(pch)) {
446
+ return (pch.length > 0 &&
447
+ pch.every((child) => collectValues(child, address, changes)));
448
+ }
449
+ if (typeof pv !== "string") {
450
+ return false;
451
+ }
452
+ changes.push([address, pv]);
453
+ return true;
454
+ }
455
+ // A write may carry a `dgc_status` value in lower case, and as its low bytes
456
+ // alone: a setpoint of two bytes is written as one, `30` for `3000`.
457
+ function heldValue(address, held, written) {
458
+ return STATUS_ADDRESS_PATTERN.test(address)
459
+ ? written.toUpperCase().padEnd(held.length, "0")
460
+ : written;
461
+ }
462
+ function defaultLeaves() {
463
+ const reported = (pv) => ({
464
+ pv,
465
+ pt: REPORTED_LEAF_TYPE,
466
+ });
467
+ const written = (pv, md) => ({
468
+ pv,
469
+ pt: WRITTEN_LEAF_TYPE,
470
+ ...(md === undefined ? {} : { md: { pt: METADATA_TYPE, ...md } }),
471
+ });
472
+ const setpoint = (mode, temperatureInC, minInC, maxInC) => {
473
+ const { address = "", bytes = 0 } = MODE_LEAVES[mode].setpoint ?? {};
474
+ return {
475
+ [address]: written(halfDegrees(temperatureInC, bytes), {
476
+ mi: halfDegrees(minInC, bytes),
477
+ mx: halfDegrees(maxInC, bytes),
478
+ }),
479
+ };
480
+ };
481
+ // The values each louver takes: stop and swing, and five fixed positions
482
+ // on the vertical one.
483
+ const louverMask = (...values) => littleEndian(values.reduce((mask, value) => mask | (1 << value), 0), 4);
484
+ const { stop, swing } = DSIOT_LOUVER_VALUES;
485
+ const stopped = littleEndian(stop, LOUVER_BYTES);
486
+ const leaves = {
487
+ [adapterAddress(DSIOT_ADAPTER_PATHS.kind)]: reported("4"),
488
+ [ADAPTER_VERSION_ADDRESS]: reported("2_8_0"),
489
+ [adapterAddress(DSIOT_ADAPTER_PATHS.region)]: reported("th"),
490
+ [ADAPTER_MAC_ADDRESS]: reported("02DA1C000002"),
491
+ [adapterAddress(DSIOT_ADAPTER_PATHS.scheduleTimer)]: reported("1"),
492
+ [adapterAddress(DSIOT_ADAPTER_PATHS.demandControl)]: reported("1"),
493
+ [adapterAddress(DSIOT_ADAPTER_PATHS.energyMonitoring)]: reported("1"),
494
+ [ADAPTER_NAME_ADDRESS]: written("Simulator"),
495
+ [statusAddress(DSIOT_PATHS.model)]: reported("0ABB"),
496
+ [MODEL_TYPE_ADDRESS]: reported(HEAT_PUMP_MODEL_TYPE),
497
+ [POWER_ADDRESS]: written(DSIOT_OFF),
498
+ [INDOOR_TEMPERATURE_ADDRESS]: reported("1A"),
499
+ [INDOOR_HUMIDITY_ADDRESS]: reported("37"),
500
+ [statusAddress(DSIOT_PATHS.energyMonitoring)]: reported(DSIOT_ON),
501
+ [SPECIAL_MODE_ADDRESSES.econo]: written(DSIOT_OFF),
502
+ [SPECIAL_MODE_ADDRESSES.streamer]: written(DSIOT_OFF),
503
+ [MODE_ADDRESS]: written(DSIOT_OPERATING_MODE_CODES.cool),
504
+ ...setpoint("cool", 24, 18, 32),
505
+ ...setpoint("heat", 25, 10, 30),
506
+ ...setpoint("auto", 25, 18, 30),
507
+ [OUTDOOR_TEMPERATURE_ADDRESS]: reported("3C00"),
508
+ [SPECIAL_MODE_ADDRESSES.powerful]: written(DSIOT_OFF),
509
+ };
510
+ for (const { fanSpeed, vertical, horizontal } of Object.values(MODE_LEAVES)) {
511
+ leaves[fanSpeed] = written(DSIOT_FAN_SPEED_CODES.auto);
512
+ leaves[vertical] = written(stopped, {
513
+ mx: louverMask(stop, 1, 2, 3, 4, 5, swing),
514
+ });
515
+ leaves[horizontal] = written(stopped, { mx: louverMask(stop, swing) });
516
+ }
517
+ return leaves;
518
+ }
519
+ //# sourceMappingURL=dsiot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsiot.js","sourceRoot":"","sources":["../../src/simulators/dsiot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./classic.js";
2
+ export * from "./dsiot.js";
3
+ export type { DaikinSimulator, DaikinSimulatorRequest, DaikinSimulatorTemperatures, DaikinSimulatorUnit, StartSimulatorOptions, } from "./simulator.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/simulators/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,2BAA2B,EAC3B,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./classic.js";
2
+ export * from "./dsiot.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/simulators/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}