daikin-local-control 0.3.0 → 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.
- package/DESIGN.md +113 -2
- package/README.md +131 -13
- package/UNSUPPORTED.md +42 -4
- package/dist/clients/classic.d.ts +2 -2
- package/dist/clients/classic.d.ts.map +1 -1
- package/dist/clients/classic.js +4 -4
- package/dist/clients/classic.js.map +1 -1
- package/dist/clients/client.d.ts +6 -2
- package/dist/clients/client.d.ts.map +1 -1
- package/dist/clients/dsiot.d.ts +3 -1
- package/dist/clients/dsiot.d.ts.map +1 -1
- package/dist/clients/dsiot.js +11 -3
- package/dist/clients/dsiot.js.map +1 -1
- package/dist/codecs/classic/capabilities.d.ts.map +1 -1
- package/dist/codecs/classic/capabilities.js +5 -11
- package/dist/codecs/classic/capabilities.js.map +1 -1
- package/dist/codecs/classic/extendedControl.d.ts.map +1 -1
- package/dist/codecs/classic/extendedControl.js +10 -19
- package/dist/codecs/classic/extendedControl.js.map +1 -1
- package/dist/codecs/classic/state.d.ts.map +1 -1
- package/dist/codecs/classic/state.js +36 -95
- package/dist/codecs/classic/state.js.map +1 -1
- package/dist/codecs/classic/tables.d.ts +32 -0
- package/dist/codecs/classic/tables.d.ts.map +1 -0
- package/dist/codecs/classic/tables.js +94 -0
- package/dist/codecs/classic/tables.js.map +1 -0
- package/dist/codecs/credentials.d.ts +3 -2
- package/dist/codecs/credentials.d.ts.map +1 -1
- package/dist/codecs/credentials.js +8 -3
- package/dist/codecs/credentials.js.map +1 -1
- package/dist/codecs/device.d.ts +2 -1
- package/dist/codecs/device.d.ts.map +1 -1
- package/dist/codecs/device.js +7 -6
- package/dist/codecs/device.js.map +1 -1
- package/dist/codecs/dsiot/capabilities.d.ts.map +1 -1
- package/dist/codecs/dsiot/capabilities.js +8 -15
- package/dist/codecs/dsiot/capabilities.js.map +1 -1
- package/dist/codecs/dsiot/device.d.ts +4 -2
- package/dist/codecs/dsiot/device.d.ts.map +1 -1
- package/dist/codecs/dsiot/device.js +8 -8
- package/dist/codecs/dsiot/device.js.map +1 -1
- package/dist/codecs/dsiot/multireq.d.ts +0 -18
- package/dist/codecs/dsiot/multireq.d.ts.map +1 -1
- package/dist/codecs/dsiot/multireq.js +2 -24
- package/dist/codecs/dsiot/multireq.js.map +1 -1
- package/dist/codecs/dsiot/state.d.ts +6 -62
- package/dist/codecs/dsiot/state.d.ts.map +1 -1
- package/dist/codecs/dsiot/state.js +29 -148
- package/dist/codecs/dsiot/state.js.map +1 -1
- package/dist/codecs/dsiot/tables.d.ts +116 -0
- package/dist/codecs/dsiot/tables.d.ts.map +1 -0
- package/dist/codecs/dsiot/tables.js +185 -0
- package/dist/codecs/dsiot/tables.js.map +1 -0
- package/dist/discovery.d.ts +2 -1
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +9 -5
- package/dist/discovery.js.map +1 -1
- package/dist/factory.d.ts +7 -4
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +4 -2
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/models/device.d.ts +3 -1
- package/dist/models/device.d.ts.map +1 -1
- package/dist/models/state.d.ts +2 -3
- package/dist/models/state.d.ts.map +1 -1
- package/dist/simulators/classic.d.ts +61 -0
- package/dist/simulators/classic.d.ts.map +1 -0
- package/dist/simulators/classic.js +473 -0
- package/dist/simulators/classic.js.map +1 -0
- package/dist/simulators/dsiot.d.ts +49 -0
- package/dist/simulators/dsiot.d.ts.map +1 -0
- package/dist/simulators/dsiot.js +519 -0
- package/dist/simulators/dsiot.js.map +1 -0
- package/dist/simulators/index.d.ts +4 -0
- package/dist/simulators/index.d.ts.map +1 -0
- package/dist/simulators/index.js +3 -0
- package/dist/simulators/index.js.map +1 -0
- package/dist/simulators/simulator.d.ts +116 -0
- package/dist/simulators/simulator.d.ts.map +1 -0
- package/dist/simulators/simulator.js +141 -0
- package/dist/simulators/simulator.js.map +1 -0
- package/dist/transport.d.ts +6 -2
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +7 -2
- package/dist/transport.js.map +1 -1
- package/package.json +5 -2
- package/src/clients/classic.ts +8 -8
- package/src/clients/client.ts +7 -1
- package/src/clients/dsiot.ts +12 -2
- package/src/codecs/classic/capabilities.ts +8 -11
- package/src/codecs/classic/extendedControl.ts +14 -25
- package/src/codecs/classic/state.ts +49 -101
- package/src/codecs/classic/tables.ts +123 -0
- package/src/codecs/credentials.ts +11 -3
- package/src/codecs/device.ts +8 -7
- package/src/codecs/dsiot/capabilities.ts +10 -17
- package/src/codecs/dsiot/device.ts +8 -9
- package/src/codecs/dsiot/multireq.ts +2 -24
- package/src/codecs/dsiot/state.ts +57 -193
- package/src/codecs/dsiot/tables.ts +249 -0
- package/src/discovery.ts +9 -5
- package/src/factory.ts +7 -4
- package/src/index.ts +2 -0
- package/src/models/device.ts +3 -1
- package/src/models/state.ts +2 -3
- package/src/simulators/classic.ts +635 -0
- package/src/simulators/dsiot.ts +736 -0
- package/src/simulators/index.ts +9 -0
- package/src/simulators/simulator.ts +281 -0
- 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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/simulators/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
|