freeathome-local-api-client 1.7.0 → 1.8.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/dist/index.js +1 -789
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -756
- package/dist/index.mjs.map +1 -1
- package/package.json +30 -19
package/dist/index.js
CHANGED
|
@@ -1,790 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/index.ts
|
|
21
|
-
var index_exports = {};
|
|
22
|
-
__export(index_exports, {
|
|
23
|
-
SystemAccessPoint: () => SystemAccessPoint,
|
|
24
|
-
VirtualDeviceType: () => VirtualDeviceType2,
|
|
25
|
-
isChannel: () => isChannel,
|
|
26
|
-
isConfiguration: () => isConfiguration,
|
|
27
|
-
isDevice: () => isDevice,
|
|
28
|
-
isDeviceList: () => isDeviceList,
|
|
29
|
-
isDeviceResponse: () => isDeviceResponse,
|
|
30
|
-
isGetDataPointResponse: () => isGetDataPointResponse,
|
|
31
|
-
isSetDataPointResponse: () => isSetDataPointResponse,
|
|
32
|
-
isVirtualDevice: () => isVirtualDevice,
|
|
33
|
-
isVirtualDeviceResponse: () => isVirtualDeviceResponse,
|
|
34
|
-
isWebSocketMessage: () => isWebSocketMessage
|
|
35
|
-
});
|
|
36
|
-
module.exports = __toCommonJS(index_exports);
|
|
37
|
-
|
|
38
|
-
// src/model/validation/channel-ti.ts
|
|
39
|
-
var import_ts_interface_checker = require("ts-interface-checker");
|
|
40
|
-
var Channel = (0, import_ts_interface_checker.iface)([], {
|
|
41
|
-
displayName: (0, import_ts_interface_checker.opt)("string"),
|
|
42
|
-
functionID: (0, import_ts_interface_checker.opt)("string"),
|
|
43
|
-
room: (0, import_ts_interface_checker.opt)("string"),
|
|
44
|
-
floor: (0, import_ts_interface_checker.opt)("string"),
|
|
45
|
-
inputs: (0, import_ts_interface_checker.opt)(
|
|
46
|
-
(0, import_ts_interface_checker.iface)([], {
|
|
47
|
-
[import_ts_interface_checker.indexKey]: "InOutPut"
|
|
48
|
-
})
|
|
49
|
-
),
|
|
50
|
-
outputs: (0, import_ts_interface_checker.opt)(
|
|
51
|
-
(0, import_ts_interface_checker.iface)([], {
|
|
52
|
-
[import_ts_interface_checker.indexKey]: "InOutPut"
|
|
53
|
-
})
|
|
54
|
-
),
|
|
55
|
-
parameters: (0, import_ts_interface_checker.opt)(
|
|
56
|
-
(0, import_ts_interface_checker.iface)([], {
|
|
57
|
-
[import_ts_interface_checker.indexKey]: "string"
|
|
58
|
-
})
|
|
59
|
-
),
|
|
60
|
-
type: (0, import_ts_interface_checker.opt)("string")
|
|
61
|
-
});
|
|
62
|
-
var ChannelTypeSuite = {
|
|
63
|
-
Channel
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
// src/model/validation/configuration-ti.ts
|
|
67
|
-
var import_ts_interface_checker2 = require("ts-interface-checker");
|
|
68
|
-
var Configuration = (0, import_ts_interface_checker2.iface)([], {
|
|
69
|
-
[import_ts_interface_checker2.indexKey]: "SysAP"
|
|
70
|
-
});
|
|
71
|
-
var ConfigurationTypeSuite = {
|
|
72
|
-
Configuration
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
// src/model/validation/device-ti.ts
|
|
76
|
-
var import_ts_interface_checker3 = require("ts-interface-checker");
|
|
77
|
-
var Device = (0, import_ts_interface_checker3.iface)([], {
|
|
78
|
-
displayName: (0, import_ts_interface_checker3.opt)("string"),
|
|
79
|
-
room: (0, import_ts_interface_checker3.opt)("string"),
|
|
80
|
-
floor: (0, import_ts_interface_checker3.opt)("string"),
|
|
81
|
-
interface: (0, import_ts_interface_checker3.opt)("string"),
|
|
82
|
-
nativeId: (0, import_ts_interface_checker3.opt)("string"),
|
|
83
|
-
channels: (0, import_ts_interface_checker3.opt)(
|
|
84
|
-
(0, import_ts_interface_checker3.iface)([], {
|
|
85
|
-
[import_ts_interface_checker3.indexKey]: "Channel"
|
|
86
|
-
})
|
|
87
|
-
),
|
|
88
|
-
parameters: (0, import_ts_interface_checker3.opt)(
|
|
89
|
-
(0, import_ts_interface_checker3.iface)([], {
|
|
90
|
-
[import_ts_interface_checker3.indexKey]: "string"
|
|
91
|
-
})
|
|
92
|
-
)
|
|
93
|
-
});
|
|
94
|
-
var DeviceTypeSuite = {
|
|
95
|
-
Device
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
// src/model/validation/device-list-ti.ts
|
|
99
|
-
var import_ts_interface_checker4 = require("ts-interface-checker");
|
|
100
|
-
var DeviceList = (0, import_ts_interface_checker4.iface)([], {
|
|
101
|
-
[import_ts_interface_checker4.indexKey]: (0, import_ts_interface_checker4.array)("string")
|
|
102
|
-
});
|
|
103
|
-
var DeviceListTypeSuite = {
|
|
104
|
-
DeviceList
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
// src/model/validation/device-response-ti.ts
|
|
108
|
-
var import_ts_interface_checker5 = require("ts-interface-checker");
|
|
109
|
-
var DeviceResponse = (0, import_ts_interface_checker5.iface)([], {
|
|
110
|
-
[import_ts_interface_checker5.indexKey]: (0, import_ts_interface_checker5.iface)([], {
|
|
111
|
-
devices: "Devices"
|
|
112
|
-
})
|
|
113
|
-
});
|
|
114
|
-
var DeviceResponseTypeSuite = {
|
|
115
|
-
DeviceResponse
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
// src/model/validation/devices-ti.ts
|
|
119
|
-
var import_ts_interface_checker6 = require("ts-interface-checker");
|
|
120
|
-
var Devices = (0, import_ts_interface_checker6.iface)([], {
|
|
121
|
-
[import_ts_interface_checker6.indexKey]: "Device"
|
|
122
|
-
});
|
|
123
|
-
var DevicesTypeSuite = {
|
|
124
|
-
Devices
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
// src/model/validation/error-ti.ts
|
|
128
|
-
var import_ts_interface_checker7 = require("ts-interface-checker");
|
|
129
|
-
var Error2 = (0, import_ts_interface_checker7.iface)([], {
|
|
130
|
-
code: "string",
|
|
131
|
-
detail: "string",
|
|
132
|
-
title: "string"
|
|
133
|
-
});
|
|
134
|
-
var ErrorTypeSuite = {
|
|
135
|
-
Error: Error2
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
// src/model/validation/floors-ti.ts
|
|
139
|
-
var import_ts_interface_checker8 = require("ts-interface-checker");
|
|
140
|
-
var Floors = (0, import_ts_interface_checker8.iface)([], {
|
|
141
|
-
[import_ts_interface_checker8.indexKey]: (0, import_ts_interface_checker8.iface)([], {
|
|
142
|
-
name: "string",
|
|
143
|
-
rooms: "Rooms"
|
|
144
|
-
})
|
|
145
|
-
});
|
|
146
|
-
var FloorsTypeSuite = {
|
|
147
|
-
Floors
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
// src/model/validation/get-data-point-response-ti.ts
|
|
151
|
-
var import_ts_interface_checker9 = require("ts-interface-checker");
|
|
152
|
-
var GetDataPointResponse = (0, import_ts_interface_checker9.iface)([], {
|
|
153
|
-
[import_ts_interface_checker9.indexKey]: (0, import_ts_interface_checker9.iface)([], {
|
|
154
|
-
values: (0, import_ts_interface_checker9.array)("string")
|
|
155
|
-
})
|
|
156
|
-
});
|
|
157
|
-
var GetDataPointResponseTypeSuite = {
|
|
158
|
-
GetDataPointResponse
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
// src/model/validation/in-out-put-ti.ts
|
|
162
|
-
var import_ts_interface_checker10 = require("ts-interface-checker");
|
|
163
|
-
var InOutPut = (0, import_ts_interface_checker10.iface)([], {
|
|
164
|
-
value: (0, import_ts_interface_checker10.opt)("string"),
|
|
165
|
-
pairingID: (0, import_ts_interface_checker10.opt)("number")
|
|
166
|
-
});
|
|
167
|
-
var InOutPutTypeSuite = {
|
|
168
|
-
InOutPut
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
// src/model/validation/rooms-ti.ts
|
|
172
|
-
var import_ts_interface_checker11 = require("ts-interface-checker");
|
|
173
|
-
var Rooms = (0, import_ts_interface_checker11.iface)([], {
|
|
174
|
-
[import_ts_interface_checker11.indexKey]: (0, import_ts_interface_checker11.iface)([], {
|
|
175
|
-
name: "string"
|
|
176
|
-
})
|
|
177
|
-
});
|
|
178
|
-
var RoomsTypeSuite = {
|
|
179
|
-
Rooms
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
// src/model/validation/scenes-triggered-ti.ts
|
|
183
|
-
var import_ts_interface_checker12 = require("ts-interface-checker");
|
|
184
|
-
var ScenesTriggered = (0, import_ts_interface_checker12.iface)([], {
|
|
185
|
-
[import_ts_interface_checker12.indexKey]: (0, import_ts_interface_checker12.iface)([], {
|
|
186
|
-
channels: (0, import_ts_interface_checker12.iface)([], {
|
|
187
|
-
[import_ts_interface_checker12.indexKey]: (0, import_ts_interface_checker12.iface)([], {
|
|
188
|
-
outputs: (0, import_ts_interface_checker12.iface)([], {
|
|
189
|
-
[import_ts_interface_checker12.indexKey]: (0, import_ts_interface_checker12.iface)([], {
|
|
190
|
-
value: "string",
|
|
191
|
-
pairingID: "number"
|
|
192
|
-
})
|
|
193
|
-
})
|
|
194
|
-
})
|
|
195
|
-
})
|
|
196
|
-
})
|
|
197
|
-
});
|
|
198
|
-
var ScenesTriggeredTypeSuite = {
|
|
199
|
-
ScenesTriggered
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
// src/model/validation/set-data-point-response-ti.ts
|
|
203
|
-
var import_ts_interface_checker13 = require("ts-interface-checker");
|
|
204
|
-
var SetDataPointResponse = (0, import_ts_interface_checker13.iface)([], {
|
|
205
|
-
[import_ts_interface_checker13.indexKey]: (0, import_ts_interface_checker13.iface)([], {
|
|
206
|
-
[import_ts_interface_checker13.indexKey]: "string"
|
|
207
|
-
})
|
|
208
|
-
});
|
|
209
|
-
var SetDataPointResponseTypeSuite = {
|
|
210
|
-
SetDataPointResponse
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
// src/model/validation/sys-ap-ti.ts
|
|
214
|
-
var import_ts_interface_checker14 = require("ts-interface-checker");
|
|
215
|
-
var SysAP = (0, import_ts_interface_checker14.iface)([], {
|
|
216
|
-
devices: "Devices",
|
|
217
|
-
floorplan: (0, import_ts_interface_checker14.iface)([], {
|
|
218
|
-
floors: "Floors"
|
|
219
|
-
}),
|
|
220
|
-
sysapName: "string",
|
|
221
|
-
users: "Users",
|
|
222
|
-
error: (0, import_ts_interface_checker14.opt)("Error")
|
|
223
|
-
});
|
|
224
|
-
var SysApTypeSuite = {
|
|
225
|
-
SysAP
|
|
226
|
-
};
|
|
227
|
-
|
|
228
|
-
// src/model/validation/users-ti.ts
|
|
229
|
-
var import_ts_interface_checker15 = require("ts-interface-checker");
|
|
230
|
-
var Users = (0, import_ts_interface_checker15.iface)([], {
|
|
231
|
-
[import_ts_interface_checker15.indexKey]: (0, import_ts_interface_checker15.iface)([], {
|
|
232
|
-
enabled: "boolean",
|
|
233
|
-
flags: (0, import_ts_interface_checker15.array)("string"),
|
|
234
|
-
grantedPermissions: (0, import_ts_interface_checker15.array)("string"),
|
|
235
|
-
jid: "string",
|
|
236
|
-
name: "string",
|
|
237
|
-
requestedPermissions: (0, import_ts_interface_checker15.array)("string"),
|
|
238
|
-
role: "string"
|
|
239
|
-
})
|
|
240
|
-
});
|
|
241
|
-
var UsersTypeSuite = {
|
|
242
|
-
Users
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
// src/model/validation/virtual-device-ti.ts
|
|
246
|
-
var import_ts_interface_checker16 = require("ts-interface-checker");
|
|
247
|
-
var VirtualDevice = (0, import_ts_interface_checker16.iface)([], {
|
|
248
|
-
type: "VirtualDeviceType",
|
|
249
|
-
properties: (0, import_ts_interface_checker16.opt)(
|
|
250
|
-
(0, import_ts_interface_checker16.iface)([], {
|
|
251
|
-
ttl: (0, import_ts_interface_checker16.opt)("string"),
|
|
252
|
-
displayname: (0, import_ts_interface_checker16.opt)("string"),
|
|
253
|
-
flavor: (0, import_ts_interface_checker16.opt)("string"),
|
|
254
|
-
capabilities: (0, import_ts_interface_checker16.opt)((0, import_ts_interface_checker16.array)("number"))
|
|
255
|
-
})
|
|
256
|
-
)
|
|
257
|
-
});
|
|
258
|
-
var VirtualDeviceType = (0, import_ts_interface_checker16.enumtype)({
|
|
259
|
-
BinarySensor: "BinarySensor",
|
|
260
|
-
BlindActuator: "BlindActuator",
|
|
261
|
-
SwitchingActuator: "SwitchingActuator",
|
|
262
|
-
CeilingFanActuator: "CeilingFanActuator",
|
|
263
|
-
RTC: "RTC",
|
|
264
|
-
DimActuator: "DimActuator",
|
|
265
|
-
EVCharging: "evcharging",
|
|
266
|
-
WindowSensor: "WindowSensor",
|
|
267
|
-
SimpleDoorlock: "simple_doorlock",
|
|
268
|
-
ShutterActuator: "ShutterActuator",
|
|
269
|
-
WeatherStation: "WeatherStation",
|
|
270
|
-
WeatherTemperatureSensor: "Weather-TemperatureSensor",
|
|
271
|
-
WeatherWindSensor: "Weather-WindSensor",
|
|
272
|
-
WeatherBrightnessSensor: "Weather-BrightnessSensor",
|
|
273
|
-
WeatherRainSensor: "Weather-RainSensor",
|
|
274
|
-
WindowActuator: "WindowActuator",
|
|
275
|
-
CODetector: "CODetector",
|
|
276
|
-
FireDetector: "FireDetector",
|
|
277
|
-
KNXSwitchSensor: "KNX-SwitchSensor",
|
|
278
|
-
MediaPlayer: "MediaPlayer",
|
|
279
|
-
EnergyBattery: "EnergyBattery",
|
|
280
|
-
EnergyInverter: "EnergyInverter",
|
|
281
|
-
EnergyMeter: "EnergyMeter",
|
|
282
|
-
EnergyInverterBattery: "EnergyInverterBattery",
|
|
283
|
-
EnergyInverterMeter: "EnergyInverterMeter",
|
|
284
|
-
EnergyInverterMeterBattery: "EnergyInverterMeterBattery",
|
|
285
|
-
EnergyMeterBattery: "EnergyMeterBattery",
|
|
286
|
-
AirQualityCO2: "AirQualityCO2",
|
|
287
|
-
AirQualityCO: "AirQualityCO",
|
|
288
|
-
AirQualityFull: "AirQualityFull",
|
|
289
|
-
AirQualityHumidity: "AirQualityHumidity",
|
|
290
|
-
AirQualityNO2: "AirQualityNO2",
|
|
291
|
-
AirQualityO3: "AirQualityO3",
|
|
292
|
-
AirQualityPM10: "AirQualityPM10",
|
|
293
|
-
AirQualityPM25: "AirQualityPM25",
|
|
294
|
-
AirQualityPressure: "AirQualityPressure",
|
|
295
|
-
AirQualityTemperature: "AirQualityTemperature",
|
|
296
|
-
AirQualityVOC: "AirQualityVOC",
|
|
297
|
-
EnergyMeterV2: "EnergyMeterv2",
|
|
298
|
-
HomeApplianceLaundry: "HomeAppliance-Laundry",
|
|
299
|
-
HVAC: "HVAC",
|
|
300
|
-
SplitUnit: "SplitUnit"
|
|
301
|
-
});
|
|
302
|
-
var VirtualDeviceTypeSuite = {
|
|
303
|
-
VirtualDevice,
|
|
304
|
-
VirtualDeviceType
|
|
305
|
-
};
|
|
306
|
-
|
|
307
|
-
// src/model/validation/virtual-device-response-ti.ts
|
|
308
|
-
var import_ts_interface_checker17 = require("ts-interface-checker");
|
|
309
|
-
var VirtualDeviceResponse = (0, import_ts_interface_checker17.iface)([], {
|
|
310
|
-
[import_ts_interface_checker17.indexKey]: (0, import_ts_interface_checker17.iface)([], {
|
|
311
|
-
devices: (0, import_ts_interface_checker17.iface)([], {
|
|
312
|
-
[import_ts_interface_checker17.indexKey]: (0, import_ts_interface_checker17.iface)([], {
|
|
313
|
-
serial: "string"
|
|
314
|
-
})
|
|
315
|
-
})
|
|
316
|
-
})
|
|
317
|
-
});
|
|
318
|
-
var VirtualDeviceResponseTypeSuite = {
|
|
319
|
-
VirtualDeviceResponse
|
|
320
|
-
};
|
|
321
|
-
|
|
322
|
-
// src/model/validation/websocket-message-ti.ts
|
|
323
|
-
var import_ts_interface_checker18 = require("ts-interface-checker");
|
|
324
|
-
var WebSocketMessage = (0, import_ts_interface_checker18.iface)([], {
|
|
325
|
-
[import_ts_interface_checker18.indexKey]: (0, import_ts_interface_checker18.iface)([], {
|
|
326
|
-
datapoints: (0, import_ts_interface_checker18.iface)([], {
|
|
327
|
-
[import_ts_interface_checker18.indexKey]: "string"
|
|
328
|
-
}),
|
|
329
|
-
devices: "Devices",
|
|
330
|
-
devicesAdded: (0, import_ts_interface_checker18.array)("string"),
|
|
331
|
-
devicesRemoved: (0, import_ts_interface_checker18.array)("string"),
|
|
332
|
-
scenesTriggered: "ScenesTriggered",
|
|
333
|
-
parameters: (0, import_ts_interface_checker18.opt)(
|
|
334
|
-
(0, import_ts_interface_checker18.iface)([], {
|
|
335
|
-
[import_ts_interface_checker18.indexKey]: "string"
|
|
336
|
-
})
|
|
337
|
-
)
|
|
338
|
-
})
|
|
339
|
-
});
|
|
340
|
-
var WebSocketMessageTypeSuite = {
|
|
341
|
-
WebSocketMessage
|
|
342
|
-
};
|
|
343
|
-
|
|
344
|
-
// src/model/validator.ts
|
|
345
|
-
var import_ts_interface_checker19 = require("ts-interface-checker");
|
|
346
|
-
var { Channel: Channel2 } = (0, import_ts_interface_checker19.createCheckers)(ChannelTypeSuite, InOutPutTypeSuite);
|
|
347
|
-
var { Configuration: Configuration2 } = (0, import_ts_interface_checker19.createCheckers)(
|
|
348
|
-
ConfigurationTypeSuite,
|
|
349
|
-
DevicesTypeSuite,
|
|
350
|
-
DeviceTypeSuite,
|
|
351
|
-
ChannelTypeSuite,
|
|
352
|
-
InOutPutTypeSuite,
|
|
353
|
-
FloorsTypeSuite,
|
|
354
|
-
RoomsTypeSuite,
|
|
355
|
-
SysApTypeSuite,
|
|
356
|
-
UsersTypeSuite,
|
|
357
|
-
ErrorTypeSuite
|
|
358
|
-
);
|
|
359
|
-
var { Device: Device2 } = (0, import_ts_interface_checker19.createCheckers)(
|
|
360
|
-
DeviceTypeSuite,
|
|
361
|
-
ChannelTypeSuite,
|
|
362
|
-
InOutPutTypeSuite
|
|
363
|
-
);
|
|
364
|
-
var { DeviceList: DeviceList2 } = (0, import_ts_interface_checker19.createCheckers)(DeviceListTypeSuite);
|
|
365
|
-
var { DeviceResponse: DeviceResponse2 } = (0, import_ts_interface_checker19.createCheckers)(
|
|
366
|
-
DeviceResponseTypeSuite,
|
|
367
|
-
DevicesTypeSuite,
|
|
368
|
-
DeviceTypeSuite,
|
|
369
|
-
ChannelTypeSuite,
|
|
370
|
-
InOutPutTypeSuite
|
|
371
|
-
);
|
|
372
|
-
var { GetDataPointResponse: GetDataPointResponse2 } = (0, import_ts_interface_checker19.createCheckers)(GetDataPointResponseTypeSuite);
|
|
373
|
-
var { SetDataPointResponse: SetDataPointResponse2 } = (0, import_ts_interface_checker19.createCheckers)(SetDataPointResponseTypeSuite);
|
|
374
|
-
var { VirtualDevice: VirtualDevice2 } = (0, import_ts_interface_checker19.createCheckers)(VirtualDeviceTypeSuite);
|
|
375
|
-
var { VirtualDeviceResponse: VirtualDeviceResponse2 } = (0, import_ts_interface_checker19.createCheckers)(
|
|
376
|
-
VirtualDeviceResponseTypeSuite
|
|
377
|
-
);
|
|
378
|
-
var { WebSocketMessage: WebSocketMessage2 } = (0, import_ts_interface_checker19.createCheckers)(
|
|
379
|
-
WebSocketMessageTypeSuite,
|
|
380
|
-
DevicesTypeSuite,
|
|
381
|
-
DeviceTypeSuite,
|
|
382
|
-
ChannelTypeSuite,
|
|
383
|
-
InOutPutTypeSuite,
|
|
384
|
-
ScenesTriggeredTypeSuite
|
|
385
|
-
);
|
|
386
|
-
function check(obj, checker, logger, verbose) {
|
|
387
|
-
if (verbose) {
|
|
388
|
-
try {
|
|
389
|
-
checker.check(obj);
|
|
390
|
-
return true;
|
|
391
|
-
} catch (error) {
|
|
392
|
-
logger.error("Object validation failed!", error);
|
|
393
|
-
return false;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
return checker.test(obj);
|
|
397
|
-
}
|
|
398
|
-
function isWebSocketMessage(obj, logger, verbose = false) {
|
|
399
|
-
return check(obj, WebSocketMessage2, logger, verbose);
|
|
400
|
-
}
|
|
401
|
-
function isConfiguration(obj, logger, verbose = false) {
|
|
402
|
-
return check(obj, Configuration2, logger, verbose);
|
|
403
|
-
}
|
|
404
|
-
function isDeviceList(obj, logger, verbose = false) {
|
|
405
|
-
return check(obj, DeviceList2, logger, verbose);
|
|
406
|
-
}
|
|
407
|
-
function isDeviceResponse(obj, logger, verbose = false) {
|
|
408
|
-
return check(obj, DeviceResponse2, logger, verbose);
|
|
409
|
-
}
|
|
410
|
-
function isGetDataPointResponse(obj, logger, verbose = false) {
|
|
411
|
-
return check(obj, GetDataPointResponse2, logger, verbose);
|
|
412
|
-
}
|
|
413
|
-
function isSetDataPointResponse(obj, logger, verbose = false) {
|
|
414
|
-
return check(obj, SetDataPointResponse2, logger, verbose);
|
|
415
|
-
}
|
|
416
|
-
function isVirtualDevice(obj, logger, verbose = false) {
|
|
417
|
-
return check(obj, VirtualDevice2, logger, verbose);
|
|
418
|
-
}
|
|
419
|
-
function isVirtualDeviceResponse(obj, logger, verbose = false) {
|
|
420
|
-
return check(obj, VirtualDeviceResponse2, logger, verbose);
|
|
421
|
-
}
|
|
422
|
-
function isChannel(obj, logger, verbose = false) {
|
|
423
|
-
return check(obj, Channel2, logger, verbose);
|
|
424
|
-
}
|
|
425
|
-
function isDevice(obj, logger, verbose = false) {
|
|
426
|
-
return check(obj, Device2, logger, verbose);
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
// src/model/virtual-device.ts
|
|
430
|
-
var VirtualDeviceType2 = /* @__PURE__ */ ((VirtualDeviceType3) => {
|
|
431
|
-
VirtualDeviceType3["BinarySensor"] = "BinarySensor";
|
|
432
|
-
VirtualDeviceType3["BlindActuator"] = "BlindActuator";
|
|
433
|
-
VirtualDeviceType3["SwitchingActuator"] = "SwitchingActuator";
|
|
434
|
-
VirtualDeviceType3["CeilingFanActuator"] = "CeilingFanActuator";
|
|
435
|
-
VirtualDeviceType3["RTC"] = "RTC";
|
|
436
|
-
VirtualDeviceType3["DimActuator"] = "DimActuator";
|
|
437
|
-
VirtualDeviceType3["EVCharging"] = "evcharging";
|
|
438
|
-
VirtualDeviceType3["WindowSensor"] = "WindowSensor";
|
|
439
|
-
VirtualDeviceType3["SimpleDoorlock"] = "simple_doorlock";
|
|
440
|
-
VirtualDeviceType3["ShutterActuator"] = "ShutterActuator";
|
|
441
|
-
VirtualDeviceType3["WeatherStation"] = "WeatherStation";
|
|
442
|
-
VirtualDeviceType3["WeatherTemperatureSensor"] = "Weather-TemperatureSensor";
|
|
443
|
-
VirtualDeviceType3["WeatherWindSensor"] = "Weather-WindSensor";
|
|
444
|
-
VirtualDeviceType3["WeatherBrightnessSensor"] = "Weather-BrightnessSensor";
|
|
445
|
-
VirtualDeviceType3["WeatherRainSensor"] = "Weather-RainSensor";
|
|
446
|
-
VirtualDeviceType3["WindowActuator"] = "WindowActuator";
|
|
447
|
-
VirtualDeviceType3["CODetector"] = "CODetector";
|
|
448
|
-
VirtualDeviceType3["FireDetector"] = "FireDetector";
|
|
449
|
-
VirtualDeviceType3["KNXSwitchSensor"] = "KNX-SwitchSensor";
|
|
450
|
-
VirtualDeviceType3["MediaPlayer"] = "MediaPlayer";
|
|
451
|
-
VirtualDeviceType3["EnergyBattery"] = "EnergyBattery";
|
|
452
|
-
VirtualDeviceType3["EnergyInverter"] = "EnergyInverter";
|
|
453
|
-
VirtualDeviceType3["EnergyMeter"] = "EnergyMeter";
|
|
454
|
-
VirtualDeviceType3["EnergyInverterBattery"] = "EnergyInverterBattery";
|
|
455
|
-
VirtualDeviceType3["EnergyInverterMeter"] = "EnergyInverterMeter";
|
|
456
|
-
VirtualDeviceType3["EnergyInverterMeterBattery"] = "EnergyInverterMeterBattery";
|
|
457
|
-
VirtualDeviceType3["EnergyMeterBattery"] = "EnergyMeterBattery";
|
|
458
|
-
VirtualDeviceType3["AirQualityCO2"] = "AirQualityCO2";
|
|
459
|
-
VirtualDeviceType3["AirQualityCO"] = "AirQualityCO";
|
|
460
|
-
VirtualDeviceType3["AirQualityFull"] = "AirQualityFull";
|
|
461
|
-
VirtualDeviceType3["AirQualityHumidity"] = "AirQualityHumidity";
|
|
462
|
-
VirtualDeviceType3["AirQualityNO2"] = "AirQualityNO2";
|
|
463
|
-
VirtualDeviceType3["AirQualityO3"] = "AirQualityO3";
|
|
464
|
-
VirtualDeviceType3["AirQualityPM10"] = "AirQualityPM10";
|
|
465
|
-
VirtualDeviceType3["AirQualityPM25"] = "AirQualityPM25";
|
|
466
|
-
VirtualDeviceType3["AirQualityPressure"] = "AirQualityPressure";
|
|
467
|
-
VirtualDeviceType3["AirQualityTemperature"] = "AirQualityTemperature";
|
|
468
|
-
VirtualDeviceType3["AirQualityVOC"] = "AirQualityVOC";
|
|
469
|
-
VirtualDeviceType3["EnergyMeterV2"] = "EnergyMeterv2";
|
|
470
|
-
VirtualDeviceType3["HomeApplianceLaundry"] = "HomeAppliance-Laundry";
|
|
471
|
-
VirtualDeviceType3["HVAC"] = "HVAC";
|
|
472
|
-
VirtualDeviceType3["SplitUnit"] = "SplitUnit";
|
|
473
|
-
return VirtualDeviceType3;
|
|
474
|
-
})(VirtualDeviceType2 || {});
|
|
475
|
-
|
|
476
|
-
// src/system-access-point.ts
|
|
477
|
-
var import_events = require("events");
|
|
478
|
-
var import_rxjs = require("rxjs");
|
|
479
|
-
var import_ws = require("ws");
|
|
480
|
-
var SystemAccessPoint = class extends import_events.EventEmitter {
|
|
481
|
-
/**
|
|
482
|
-
* Constructs a new SystemAccessPoint instance
|
|
483
|
-
*
|
|
484
|
-
* @constructor
|
|
485
|
-
* @param hostName {string} The system access point host name.
|
|
486
|
-
* @param userName {string} The user name that shall be used to authenticate with the system access point.
|
|
487
|
-
* @param password {string} The password that shall be used to authenticate with the system access point.
|
|
488
|
-
* @param tlsEnabled {boolean} Determines whether the communication with the system access point shall be protected by TLS.
|
|
489
|
-
* @param verboseErrors {boolean} Determines whether verbose error messages shall be used, for example for message validation.
|
|
490
|
-
* @param logger {Logger} The logger instance to be used. If no explicit implementation is provided, the this.logger will be used for logging.
|
|
491
|
-
*/
|
|
492
|
-
constructor(hostName, userName, password, tlsEnabled = true, verboseErrors = false, logger = console, scheduler) {
|
|
493
|
-
super();
|
|
494
|
-
this.hostName = hostName;
|
|
495
|
-
this.userName = userName;
|
|
496
|
-
this.password = password;
|
|
497
|
-
this.tlsEnabled = tlsEnabled;
|
|
498
|
-
this.verboseErrors = verboseErrors;
|
|
499
|
-
this.logger = logger;
|
|
500
|
-
this.scheduler = scheduler;
|
|
501
|
-
this.basicAuthKey = Buffer.from(`${userName}:${password}`, "utf8").toString(
|
|
502
|
-
"base64"
|
|
503
|
-
);
|
|
504
|
-
}
|
|
505
|
-
/** The basic authentication key used for requests. */
|
|
506
|
-
basicAuthKey;
|
|
507
|
-
webSocket;
|
|
508
|
-
webSocketMessageSubject = new import_rxjs.Subject();
|
|
509
|
-
webSocketKeepaliveTimerReset$ = new import_rxjs.Subject();
|
|
510
|
-
webSocketKeepaliveTimer$ = this.webSocketKeepaliveTimerReset$.pipe(
|
|
511
|
-
(0, import_rxjs.switchMap)(
|
|
512
|
-
() => (0, import_rxjs.interval)(3e4, this.scheduler).pipe(
|
|
513
|
-
(0, import_rxjs.takeUntil)(this.webSocketKeepaliveTimerReset$)
|
|
514
|
-
)
|
|
515
|
-
)
|
|
516
|
-
);
|
|
517
|
-
webSocketKeepaliveSubscription;
|
|
518
|
-
/**
|
|
519
|
-
* Connects to the System Access Point web socket.
|
|
520
|
-
* @param certificateVerification {boolean} Determines whether the TLS certificate presented by the server will be verified.
|
|
521
|
-
*/
|
|
522
|
-
connectWebSocket(certificateVerification = true) {
|
|
523
|
-
if (this.webSocket && this.webSocket.readyState === import_ws.WebSocket.OPEN) {
|
|
524
|
-
throw new Error("Web socket is already connected");
|
|
525
|
-
}
|
|
526
|
-
this.webSocket = this.createWebSocket(certificateVerification);
|
|
527
|
-
this.webSocketKeepaliveSubscription?.unsubscribe();
|
|
528
|
-
this.webSocketKeepaliveSubscription = void 0;
|
|
529
|
-
this.webSocketKeepaliveSubscription = this.webSocketKeepaliveTimer$.subscribe(() => {
|
|
530
|
-
if (!(this.webSocket && this.webSocket.readyState === import_ws.WebSocket.OPEN))
|
|
531
|
-
return;
|
|
532
|
-
this.logger.log("keepalive timer expired, sending ping message...");
|
|
533
|
-
this.webSocket.ping();
|
|
534
|
-
});
|
|
535
|
-
this.webSocketKeepaliveTimerReset$.next();
|
|
536
|
-
}
|
|
537
|
-
/**
|
|
538
|
-
* Creates a new virtual device.
|
|
539
|
-
* @param sysApUuid {string} The UUID identifying the system access point.
|
|
540
|
-
* @param deviceSerial {string} The serial number to be assigned to the device.
|
|
541
|
-
* @param virtualDevice {VirtualDevice} The virtual device to be created.
|
|
542
|
-
* @returns {Promise.<VirtualDeviceResponse>} The response to the virtual device request.
|
|
543
|
-
*/
|
|
544
|
-
async createVirtualDevice(sysApUuid, deviceSerial, virtualDevice) {
|
|
545
|
-
const response = await this.fetchDataViaRest(
|
|
546
|
-
"PUT",
|
|
547
|
-
`virtualdevice/${sysApUuid}/${deviceSerial}`,
|
|
548
|
-
JSON.stringify(virtualDevice)
|
|
549
|
-
);
|
|
550
|
-
return this.processRestResponse(response, isVirtualDeviceResponse);
|
|
551
|
-
}
|
|
552
|
-
createWebSocket(certificateVerification) {
|
|
553
|
-
if (this.tlsEnabled && !certificateVerification) {
|
|
554
|
-
this.logger.warn(
|
|
555
|
-
"TLS certificate verification is disabled! This poses a security risk, activating certificate verification is strictly recommended."
|
|
556
|
-
);
|
|
557
|
-
}
|
|
558
|
-
const url = `${this.tlsEnabled ? "wss" : "ws"}://${this.hostName}/fhapi/v1/api/ws`;
|
|
559
|
-
const options = {
|
|
560
|
-
rejectUnauthorized: this.tlsEnabled && certificateVerification,
|
|
561
|
-
headers: {
|
|
562
|
-
Authorization: `Basic ${this.basicAuthKey}`
|
|
563
|
-
}
|
|
564
|
-
};
|
|
565
|
-
const webSocket = new import_ws.WebSocket(url, options);
|
|
566
|
-
webSocket.on("error", (error) => {
|
|
567
|
-
this.emit("websocket-error", error);
|
|
568
|
-
this.logger.error("Error received", error);
|
|
569
|
-
});
|
|
570
|
-
webSocket.on("ping", (data) => {
|
|
571
|
-
this.emit("websocket-ping", data);
|
|
572
|
-
this.logger.debug("Ping received", data.toString("ascii"));
|
|
573
|
-
this.webSocketKeepaliveTimerReset$.next();
|
|
574
|
-
webSocket.pong(data);
|
|
575
|
-
this.logger.debug("Pong sent", data.toString("ascii"));
|
|
576
|
-
});
|
|
577
|
-
webSocket.on("pong", (data) => {
|
|
578
|
-
this.emit("websocket-pong", data);
|
|
579
|
-
this.logger.debug("Pong received", data.toString("ascii"));
|
|
580
|
-
});
|
|
581
|
-
webSocket.on("unexpected-response", (request, response) => {
|
|
582
|
-
this.emit("websocket-unexpected-response", request, response);
|
|
583
|
-
this.logger.error("Unexpected response received");
|
|
584
|
-
});
|
|
585
|
-
webSocket.on("upgrade", (request) => {
|
|
586
|
-
this.emit("websocket-upgrade", request);
|
|
587
|
-
this.logger.debug("Upgrade request received");
|
|
588
|
-
});
|
|
589
|
-
webSocket.on("open", () => {
|
|
590
|
-
this.emit("websocket-open");
|
|
591
|
-
this.logger.log("Connection opened");
|
|
592
|
-
});
|
|
593
|
-
webSocket.on("close", (code, reason) => {
|
|
594
|
-
this.emit("websocket-close", code, reason);
|
|
595
|
-
this.logger.log("Connection closed");
|
|
596
|
-
this.webSocketKeepaliveSubscription?.unsubscribe();
|
|
597
|
-
this.webSocketKeepaliveSubscription = void 0;
|
|
598
|
-
});
|
|
599
|
-
webSocket.on("message", (data, isBinary) => {
|
|
600
|
-
this.emit("websocket-message", data, isBinary);
|
|
601
|
-
this.webSocketKeepaliveTimerReset$.next();
|
|
602
|
-
this.processWebSocketMessage(data, isBinary);
|
|
603
|
-
});
|
|
604
|
-
return webSocket;
|
|
605
|
-
}
|
|
606
|
-
/**
|
|
607
|
-
* Disconnects from the System Access Point web socket.
|
|
608
|
-
* @param force {boolean} Determines whether or not the connection will be closed forcibly.
|
|
609
|
-
*/
|
|
610
|
-
disconnectWebSocket(force = false) {
|
|
611
|
-
if (!this.webSocket || this.webSocket.readyState === import_ws.WebSocket.CLOSED) {
|
|
612
|
-
throw new Error("Web socket is not open");
|
|
613
|
-
}
|
|
614
|
-
if (force) {
|
|
615
|
-
this.webSocket.terminate();
|
|
616
|
-
} else {
|
|
617
|
-
this.webSocket.close();
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
/**
|
|
621
|
-
* Gets the configuration from the system access point.
|
|
622
|
-
* @returns {Promise.<Configuration>} The system access point configuration.
|
|
623
|
-
*/
|
|
624
|
-
async getConfiguration() {
|
|
625
|
-
const response = await this.fetchDataViaRest(
|
|
626
|
-
"GET",
|
|
627
|
-
"configuration"
|
|
628
|
-
);
|
|
629
|
-
return this.processRestResponse(response, isConfiguration);
|
|
630
|
-
}
|
|
631
|
-
/**
|
|
632
|
-
* Gets the device list from the system access point.
|
|
633
|
-
* @returns {Promise.<DeviceList>} The requested device list.
|
|
634
|
-
*/
|
|
635
|
-
async getDeviceList() {
|
|
636
|
-
const response = await this.fetchDataViaRest("GET", "devicelist");
|
|
637
|
-
return this.processRestResponse(response, isDeviceList);
|
|
638
|
-
}
|
|
639
|
-
/**
|
|
640
|
-
* Gets the specified device from the system access point.
|
|
641
|
-
* @param sysApUuid {string} The UUID identifying the system access point.
|
|
642
|
-
* @param deviceSerial {string} The device serial number.
|
|
643
|
-
* @returns {Promise.<DeviceResponse>} The response to the device request.
|
|
644
|
-
*/
|
|
645
|
-
async getDevice(sysApUuid, deviceSerial) {
|
|
646
|
-
const response = await this.fetchDataViaRest(
|
|
647
|
-
"GET",
|
|
648
|
-
`device/${sysApUuid}/${deviceSerial}`
|
|
649
|
-
);
|
|
650
|
-
return this.processRestResponse(response, isDeviceResponse);
|
|
651
|
-
}
|
|
652
|
-
/**
|
|
653
|
-
* Gets the specified data point from the system access point.
|
|
654
|
-
* @param sysApUuid {string} The UUID idenfifying the system access point.
|
|
655
|
-
* @param deviceSerial {string} The device serial number.
|
|
656
|
-
* @param channel {string} The channel identifier.
|
|
657
|
-
* @param dataPoint {string} The datapoint identifier.
|
|
658
|
-
* @returns {Promise.<GetDataPointResponse>} The response to the get data point request.
|
|
659
|
-
*/
|
|
660
|
-
async getDatapoint(sysApUuid, deviceSerial, channel, dataPoint) {
|
|
661
|
-
const response = await this.fetchDataViaRest(
|
|
662
|
-
"GET",
|
|
663
|
-
`datapoint/${sysApUuid}/${deviceSerial}.${channel}.${dataPoint}`
|
|
664
|
-
);
|
|
665
|
-
return this.processRestResponse(response, isGetDataPointResponse);
|
|
666
|
-
}
|
|
667
|
-
/**
|
|
668
|
-
* Gets the web socket messages.
|
|
669
|
-
* @returns {Observable.<WebSocketMessage>} An observable that is updated with the messages received from the web socket.
|
|
670
|
-
*/
|
|
671
|
-
getWebSocketMessages() {
|
|
672
|
-
return this.webSocketMessageSubject.asObservable();
|
|
673
|
-
}
|
|
674
|
-
/**
|
|
675
|
-
* Sets a new value for the specificed data point.
|
|
676
|
-
* @param sysApUuid {string} The UUID idenfifying the system access point.
|
|
677
|
-
* @param deviceSerial {string} The device serial number.
|
|
678
|
-
* @param channel {string} The channel identifier.
|
|
679
|
-
* @param dataPoint {string} The datapoint identifier.
|
|
680
|
-
* @param value {string} The new value to be set.
|
|
681
|
-
* @returns {Promise.<SetDataPointResponse>} The response to the set data point request.
|
|
682
|
-
*/
|
|
683
|
-
async setDatapoint(sysApUuid, deviceSerial, channel, dataPoint, value) {
|
|
684
|
-
const response = await this.fetchDataViaRest(
|
|
685
|
-
"PUT",
|
|
686
|
-
`datapoint/${sysApUuid}/${deviceSerial}.${channel}.${dataPoint}`,
|
|
687
|
-
value
|
|
688
|
-
);
|
|
689
|
-
return this.processRestResponse(response, isSetDataPointResponse);
|
|
690
|
-
}
|
|
691
|
-
/**
|
|
692
|
-
* Triggeres the given action for the specified proxy device. Please note that this method is part of the experimental API!
|
|
693
|
-
* @param sysApUuid {string} The UUID idenfifying the system access point.
|
|
694
|
-
* @param deviceClass {string} The device class.
|
|
695
|
-
* @param deviceSerial {string} The device serial number.
|
|
696
|
-
* @param action {string} The action to be triggered.
|
|
697
|
-
* @returns {Promise.<DeviceResponse>} The response to the request.
|
|
698
|
-
*/
|
|
699
|
-
async triggerProxyDevice(sysApUuid, deviceClass, deviceSerial, action) {
|
|
700
|
-
const response = await this.fetchDataViaRest(
|
|
701
|
-
"GET",
|
|
702
|
-
`proxydevice/${sysApUuid}/${deviceClass}/${deviceSerial}/action/${action}`
|
|
703
|
-
);
|
|
704
|
-
return this.processRestResponse(response, isDeviceResponse);
|
|
705
|
-
}
|
|
706
|
-
/**
|
|
707
|
-
* Sets the given value for the specified proxy device. Please note that this method is part of the experimental API!
|
|
708
|
-
* @param sysApUuid {string} The UUID idenfifying the system access point.
|
|
709
|
-
* @param deviceClass {string} The device class.
|
|
710
|
-
* @param deviceSerial {string} The device serial number.
|
|
711
|
-
* @param value {string} The value to be set.
|
|
712
|
-
* @returns {Promise.<DeviceResponse>} The response to the request.
|
|
713
|
-
*/
|
|
714
|
-
async setProxyDeviceValue(sysApUuid, deviceClass, deviceSerial, value) {
|
|
715
|
-
const response = await this.fetchDataViaRest(
|
|
716
|
-
"PUT",
|
|
717
|
-
`proxydevice/${sysApUuid}/${deviceClass}/${deviceSerial}/value/${value}`
|
|
718
|
-
);
|
|
719
|
-
return this.processRestResponse(response, isDeviceResponse);
|
|
720
|
-
}
|
|
721
|
-
async fetchDataViaRest(method, route, body = void 0) {
|
|
722
|
-
const info = `${this.tlsEnabled ? "https" : "http"}://${this.hostName}/fhapi/v1/api/rest/${route}`;
|
|
723
|
-
const init = {
|
|
724
|
-
method,
|
|
725
|
-
headers: {
|
|
726
|
-
Authorization: `Basic ${this.basicAuthKey}`
|
|
727
|
-
},
|
|
728
|
-
body
|
|
729
|
-
};
|
|
730
|
-
return fetch(info, init);
|
|
731
|
-
}
|
|
732
|
-
async processRestResponse(response, typeGuard) {
|
|
733
|
-
let body;
|
|
734
|
-
let message;
|
|
735
|
-
switch (response.status) {
|
|
736
|
-
case 200:
|
|
737
|
-
body = await response.json();
|
|
738
|
-
if (!typeGuard(body, this.logger, this.verboseErrors)) {
|
|
739
|
-
message = "Received message has an unexpected type!";
|
|
740
|
-
this.logger.error(message, body);
|
|
741
|
-
throw new Error(message);
|
|
742
|
-
}
|
|
743
|
-
return body;
|
|
744
|
-
case 401:
|
|
745
|
-
message = "Authentication information is missing or invalid.";
|
|
746
|
-
this.logger.error(message);
|
|
747
|
-
throw new Error(message);
|
|
748
|
-
case 502:
|
|
749
|
-
message = await response.text();
|
|
750
|
-
this.logger.error(message);
|
|
751
|
-
throw new Error(message);
|
|
752
|
-
default:
|
|
753
|
-
message = `Received HTTP ${response.status} status code unexpectedly: ${await response.text()}`;
|
|
754
|
-
this.logger.error(message);
|
|
755
|
-
throw new Error(message);
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
processWebSocketMessage(data, isBinary) {
|
|
759
|
-
if (isBinary) {
|
|
760
|
-
this.logger.warn(
|
|
761
|
-
"Binary message received. Binary messages are not processed."
|
|
762
|
-
);
|
|
763
|
-
return;
|
|
764
|
-
}
|
|
765
|
-
this.logger.debug("Message received");
|
|
766
|
-
const serialized = data.toString();
|
|
767
|
-
const message = JSON.parse(serialized);
|
|
768
|
-
if (isWebSocketMessage(message, this.logger, this.verboseErrors)) {
|
|
769
|
-
this.webSocketMessageSubject.next(message);
|
|
770
|
-
return;
|
|
771
|
-
}
|
|
772
|
-
this.logger.error("Received message has an unexpected type!", serialized);
|
|
773
|
-
}
|
|
774
|
-
};
|
|
775
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
776
|
-
0 && (module.exports = {
|
|
777
|
-
SystemAccessPoint,
|
|
778
|
-
VirtualDeviceType,
|
|
779
|
-
isChannel,
|
|
780
|
-
isConfiguration,
|
|
781
|
-
isDevice,
|
|
782
|
-
isDeviceList,
|
|
783
|
-
isDeviceResponse,
|
|
784
|
-
isGetDataPointResponse,
|
|
785
|
-
isSetDataPointResponse,
|
|
786
|
-
isVirtualDevice,
|
|
787
|
-
isVirtualDeviceResponse,
|
|
788
|
-
isWebSocketMessage
|
|
789
|
-
});
|
|
1
|
+
"use strict";var U=Object.defineProperty;var ue=Object.getOwnPropertyDescriptor;var ge=Object.getOwnPropertyNames;var ye=Object.prototype.hasOwnProperty;var me=(n,s)=>{for(var e in s)U(n,e,{get:s[e],enumerable:!0})},le=(n,s,e,p)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of ge(s))!ye.call(n,o)&&o!==e&&U(n,o,{get:()=>s[o],enumerable:!(p=ue(s,o))||p.enumerable});return n};var fe=n=>le(U({},"__esModule",{value:!0}),n);var He={};me(He,{SystemAccessPoint:()=>N,VirtualDeviceType:()=>se,isChannel:()=>ae,isConfiguration:()=>$,isDevice:()=>pe,isDeviceList:()=>K,isDeviceResponse:()=>A,isGetDataPointResponse:()=>B,isSetDataPointResponse:()=>F,isVirtualDevice:()=>ne,isVirtualDeviceResponse:()=>G,isWebSocketMessage:()=>L});module.exports=fe(He);var c=require("ts-interface-checker"),Se=(0,c.iface)([],{displayName:(0,c.opt)("string"),functionID:(0,c.opt)("string"),room:(0,c.opt)("string"),floor:(0,c.opt)("string"),inputs:(0,c.opt)((0,c.iface)([],{[c.indexKey]:"InOutPut"})),outputs:(0,c.opt)((0,c.iface)([],{[c.indexKey]:"InOutPut"})),parameters:(0,c.opt)((0,c.iface)([],{[c.indexKey]:"string"})),type:(0,c.opt)("string")}),b={Channel:Se};var O=require("ts-interface-checker"),he=(0,O.iface)([],{[O.indexKey]:"SysAP"}),j={Configuration:he};var u=require("ts-interface-checker"),de=(0,u.iface)([],{displayName:(0,u.opt)("string"),room:(0,u.opt)("string"),floor:(0,u.opt)("string"),interface:(0,u.opt)("string"),nativeId:(0,u.opt)("string"),channels:(0,u.opt)((0,u.iface)([],{[u.indexKey]:"Channel"})),parameters:(0,u.opt)((0,u.iface)([],{[u.indexKey]:"string"}))}),x={Device:de};var D=require("ts-interface-checker"),ve=(0,D.iface)([],{[D.indexKey]:(0,D.array)("string")}),H={DeviceList:ve};var T=require("ts-interface-checker"),be=(0,T.iface)([],{[T.indexKey]:(0,T.iface)([],{devices:"Devices"})}),V={DeviceResponse:be};var Q=require("ts-interface-checker"),ke=(0,Q.iface)([],{[Q.indexKey]:"Device"}),P={Devices:ke};var oe=require("ts-interface-checker"),Re=(0,oe.iface)([],{code:"string",detail:"string",title:"string"}),q={Error:Re};var I=require("ts-interface-checker"),xe=(0,I.iface)([],{[I.indexKey]:(0,I.iface)([],{name:"string",rooms:"Rooms"})}),z={Floors:xe};var k=require("ts-interface-checker"),De=(0,k.iface)([],{[k.indexKey]:(0,k.iface)([],{values:(0,k.array)("string")})}),X={GetDataPointResponse:De};var E=require("ts-interface-checker"),we=(0,E.iface)([],{value:(0,E.opt)("string"),pairingID:(0,E.opt)("number")}),R={InOutPut:we};var C=require("ts-interface-checker"),Ae=(0,C.iface)([],{[C.indexKey]:(0,C.iface)([],{name:"string"})}),J={Rooms:Ae};var m=require("ts-interface-checker"),Te=(0,m.iface)([],{[m.indexKey]:(0,m.iface)([],{channels:(0,m.iface)([],{[m.indexKey]:(0,m.iface)([],{outputs:(0,m.iface)([],{[m.indexKey]:(0,m.iface)([],{value:"string",pairingID:"number"})})})})})}),_={ScenesTriggered:Te};var w=require("ts-interface-checker"),Pe=(0,w.iface)([],{[w.indexKey]:(0,w.iface)([],{[w.indexKey]:"string"})}),Y={SetDataPointResponse:Pe};var M=require("ts-interface-checker"),Ie=(0,M.iface)([],{devices:"Devices",floorplan:(0,M.iface)([],{floors:"Floors"}),sysapName:"string",users:"Users",error:(0,M.opt)("Error")}),Z={SysAP:Ie};var h=require("ts-interface-checker"),Ee=(0,h.iface)([],{[h.indexKey]:(0,h.iface)([],{enabled:"boolean",flags:(0,h.array)("string"),grantedPermissions:(0,h.array)("string"),jid:"string",name:"string",requestedPermissions:(0,h.array)("string"),role:"string"})}),ee={Users:Ee};var y=require("ts-interface-checker"),Ce=(0,y.iface)([],{type:"VirtualDeviceType",properties:(0,y.opt)((0,y.iface)([],{ttl:(0,y.opt)("string"),displayname:(0,y.opt)("string"),flavor:(0,y.opt)("string"),capabilities:(0,y.opt)((0,y.array)("number"))}))}),Me=(0,y.enumtype)({BinarySensor:"BinarySensor",BlindActuator:"BlindActuator",SwitchingActuator:"SwitchingActuator",CeilingFanActuator:"CeilingFanActuator",RTC:"RTC",DimActuator:"DimActuator",EVCharging:"evcharging",WindowSensor:"WindowSensor",SimpleDoorlock:"simple_doorlock",ShutterActuator:"ShutterActuator",WeatherStation:"WeatherStation",WeatherTemperatureSensor:"Weather-TemperatureSensor",WeatherWindSensor:"Weather-WindSensor",WeatherBrightnessSensor:"Weather-BrightnessSensor",WeatherRainSensor:"Weather-RainSensor",WindowActuator:"WindowActuator",CODetector:"CODetector",FireDetector:"FireDetector",KNXSwitchSensor:"KNX-SwitchSensor",MediaPlayer:"MediaPlayer",EnergyBattery:"EnergyBattery",EnergyInverter:"EnergyInverter",EnergyMeter:"EnergyMeter",EnergyInverterBattery:"EnergyInverterBattery",EnergyInverterMeter:"EnergyInverterMeter",EnergyInverterMeterBattery:"EnergyInverterMeterBattery",EnergyMeterBattery:"EnergyMeterBattery",AirQualityCO2:"AirQualityCO2",AirQualityCO:"AirQualityCO",AirQualityFull:"AirQualityFull",AirQualityHumidity:"AirQualityHumidity",AirQualityNO2:"AirQualityNO2",AirQualityO3:"AirQualityO3",AirQualityPM10:"AirQualityPM10",AirQualityPM25:"AirQualityPM25",AirQualityPressure:"AirQualityPressure",AirQualityTemperature:"AirQualityTemperature",AirQualityVOC:"AirQualityVOC",EnergyMeterV2:"EnergyMeterv2",HomeApplianceLaundry:"HomeAppliance-Laundry",HVAC:"HVAC",SplitUnit:"SplitUnit"}),te={VirtualDevice:Ce,VirtualDeviceType:Me};var v=require("ts-interface-checker"),We=(0,v.iface)([],{[v.indexKey]:(0,v.iface)([],{devices:(0,v.iface)([],{[v.indexKey]:(0,v.iface)([],{serial:"string"})})})}),re={VirtualDeviceResponse:We};var g=require("ts-interface-checker"),Oe=(0,g.iface)([],{[g.indexKey]:(0,g.iface)([],{datapoints:(0,g.iface)([],{[g.indexKey]:"string"}),devices:"Devices",devicesAdded:(0,g.array)("string"),devicesRemoved:(0,g.array)("string"),scenesTriggered:"ScenesTriggered",parameters:(0,g.opt)((0,g.iface)([],{[g.indexKey]:"string"}))})}),ie={WebSocketMessage:Oe};var l=require("ts-interface-checker");var se=(t=>(t.BinarySensor="BinarySensor",t.BlindActuator="BlindActuator",t.SwitchingActuator="SwitchingActuator",t.CeilingFanActuator="CeilingFanActuator",t.RTC="RTC",t.DimActuator="DimActuator",t.EVCharging="evcharging",t.WindowSensor="WindowSensor",t.SimpleDoorlock="simple_doorlock",t.ShutterActuator="ShutterActuator",t.WeatherStation="WeatherStation",t.WeatherTemperatureSensor="Weather-TemperatureSensor",t.WeatherWindSensor="Weather-WindSensor",t.WeatherBrightnessSensor="Weather-BrightnessSensor",t.WeatherRainSensor="Weather-RainSensor",t.WindowActuator="WindowActuator",t.CODetector="CODetector",t.FireDetector="FireDetector",t.KNXSwitchSensor="KNX-SwitchSensor",t.MediaPlayer="MediaPlayer",t.EnergyBattery="EnergyBattery",t.EnergyInverter="EnergyInverter",t.EnergyMeter="EnergyMeter",t.EnergyInverterBattery="EnergyInverterBattery",t.EnergyInverterMeter="EnergyInverterMeter",t.EnergyInverterMeterBattery="EnergyInverterMeterBattery",t.EnergyMeterBattery="EnergyMeterBattery",t.AirQualityCO2="AirQualityCO2",t.AirQualityCO="AirQualityCO",t.AirQualityFull="AirQualityFull",t.AirQualityHumidity="AirQualityHumidity",t.AirQualityNO2="AirQualityNO2",t.AirQualityO3="AirQualityO3",t.AirQualityPM10="AirQualityPM10",t.AirQualityPM25="AirQualityPM25",t.AirQualityPressure="AirQualityPressure",t.AirQualityTemperature="AirQualityTemperature",t.AirQualityVOC="AirQualityVOC",t.EnergyMeterV2="EnergyMeterv2",t.HomeApplianceLaundry="HomeAppliance-Laundry",t.HVAC="HVAC",t.SplitUnit="SplitUnit",t))(se||{});var{Channel:Qe}=(0,l.createCheckers)(b,R),{Configuration:Le}=(0,l.createCheckers)(j,P,x,b,R,z,J,Z,ee,q),{Device:$e}=(0,l.createCheckers)(x,b,R),{DeviceList:Ke}=(0,l.createCheckers)(H),{DeviceResponse:Be}=(0,l.createCheckers)(V,P,x,b,R),{GetDataPointResponse:Fe}=(0,l.createCheckers)(X),{SetDataPointResponse:Ge}=(0,l.createCheckers)(Y),{VirtualDevice:Ne}=(0,l.createCheckers)(te),{VirtualDeviceResponse:Ue}=(0,l.createCheckers)(re),{WebSocketMessage:je}=(0,l.createCheckers)(ie,P,x,b,R,_);function f(n,s,e,p){if(p)try{return s.check(n),!0}catch(o){return e.error("Object validation failed!",o),!1}return s.test(n)}function L(n,s,e=!1){return f(n,je,s,e)}function $(n,s,e=!1){return f(n,Le,s,e)}function K(n,s,e=!1){return f(n,Ke,s,e)}function A(n,s,e=!1){return f(n,Be,s,e)}function B(n,s,e=!1){return f(n,Fe,s,e)}function F(n,s,e=!1){return f(n,Ge,s,e)}function ne(n,s,e=!1){return f(n,Ne,s,e)}function G(n,s,e=!1){return f(n,Ue,s,e)}function ae(n,s,e=!1){return f(n,Qe,s,e)}function pe(n,s,e=!1){return f(n,$e,s,e)}var ce=require("events"),d=require("rxjs"),W=require("ws");var N=class extends ce.EventEmitter{constructor(e,p,o,i=!0,a=!1,S=console,Ve){super();this.hostName=e;this.userName=p;this.password=o;this.tlsEnabled=i;this.verboseErrors=a;this.logger=S;this.scheduler=Ve;this.basicAuthKey=Buffer.from(`${p}:${o}`,"utf8").toString("base64")}basicAuthKey;webSocket;webSocketMessageSubject=new d.Subject;webSocketKeepaliveTimerReset$=new d.Subject;webSocketKeepaliveTimer$=this.webSocketKeepaliveTimerReset$.pipe((0,d.switchMap)(()=>(0,d.interval)(3e4,this.scheduler).pipe((0,d.takeUntil)(this.webSocketKeepaliveTimerReset$))));webSocketKeepaliveSubscription;connectWebSocket(e=!0){if(this.webSocket&&this.webSocket.readyState===W.WebSocket.OPEN)throw new Error("Web socket is already connected");this.webSocket=this.createWebSocket(e),this.webSocketKeepaliveSubscription?.unsubscribe(),this.webSocketKeepaliveSubscription=void 0,this.webSocketKeepaliveSubscription=this.webSocketKeepaliveTimer$.subscribe(()=>{this.webSocket&&this.webSocket.readyState===W.WebSocket.OPEN&&(this.logger.log("keepalive timer expired, sending ping message..."),this.webSocket.ping())}),this.webSocketKeepaliveTimerReset$.next()}async createVirtualDevice(e,p,o){let i=await this.fetchDataViaRest("PUT",`virtualdevice/${e}/${p}`,JSON.stringify(o));return this.processRestResponse(i,G)}createWebSocket(e){this.tlsEnabled&&!e&&this.logger.warn("TLS certificate verification is disabled! This poses a security risk, activating certificate verification is strictly recommended.");let p=`${this.tlsEnabled?"wss":"ws"}://${this.hostName}/fhapi/v1/api/ws`,o={rejectUnauthorized:this.tlsEnabled&&e,headers:{Authorization:`Basic ${this.basicAuthKey}`}},i=new W.WebSocket(p,o);return i.on("error",a=>{this.emit("websocket-error",a),this.logger.error("Error received",a)}),i.on("ping",a=>{this.emit("websocket-ping",a),this.logger.debug("Ping received",a.toString("ascii")),this.webSocketKeepaliveTimerReset$.next(),i.pong(a),this.logger.debug("Pong sent",a.toString("ascii"))}),i.on("pong",a=>{this.emit("websocket-pong",a),this.logger.debug("Pong received",a.toString("ascii"))}),i.on("unexpected-response",(a,S)=>{this.emit("websocket-unexpected-response",a,S),this.logger.error("Unexpected response received")}),i.on("upgrade",a=>{this.emit("websocket-upgrade",a),this.logger.debug("Upgrade request received")}),i.on("open",()=>{this.emit("websocket-open"),this.logger.log("Connection opened")}),i.on("close",(a,S)=>{this.emit("websocket-close",a,S),this.logger.log("Connection closed"),this.webSocketKeepaliveSubscription?.unsubscribe(),this.webSocketKeepaliveSubscription=void 0}),i.on("message",(a,S)=>{this.emit("websocket-message",a,S),this.webSocketKeepaliveTimerReset$.next(),this.processWebSocketMessage(a,S)}),i}disconnectWebSocket(e=!1){if(!this.webSocket||this.webSocket.readyState===W.WebSocket.CLOSED)throw new Error("Web socket is not open");e?this.webSocket.terminate():this.webSocket.close()}async getConfiguration(){let e=await this.fetchDataViaRest("GET","configuration");return this.processRestResponse(e,$)}async getDeviceList(){let e=await this.fetchDataViaRest("GET","devicelist");return this.processRestResponse(e,K)}async getDevice(e,p){let o=await this.fetchDataViaRest("GET",`device/${e}/${p}`);return this.processRestResponse(o,A)}async getDatapoint(e,p,o,i){let a=await this.fetchDataViaRest("GET",`datapoint/${e}/${p}.${o}.${i}`);return this.processRestResponse(a,B)}getWebSocketMessages(){return this.webSocketMessageSubject.asObservable()}async setDatapoint(e,p,o,i,a){let S=await this.fetchDataViaRest("PUT",`datapoint/${e}/${p}.${o}.${i}`,a);return this.processRestResponse(S,F)}async triggerProxyDevice(e,p,o,i){let a=await this.fetchDataViaRest("GET",`proxydevice/${e}/${p}/${o}/action/${i}`);return this.processRestResponse(a,A)}async setProxyDeviceValue(e,p,o,i){let a=await this.fetchDataViaRest("PUT",`proxydevice/${e}/${p}/${o}/value/${i}`);return this.processRestResponse(a,A)}async fetchDataViaRest(e,p,o){let i=`${this.tlsEnabled?"https":"http"}://${this.hostName}/fhapi/v1/api/rest/${p}`,a={method:e,headers:{Authorization:`Basic ${this.basicAuthKey}`},body:o};return fetch(i,a)}async processRestResponse(e,p){let o,i;switch(e.status){case 200:if(o=await e.json(),!p(o,this.logger,this.verboseErrors))throw i="Received message has an unexpected type!",this.logger.error(i,o),new Error(i);return o;case 401:throw i="Authentication information is missing or invalid.",this.logger.error(i),new Error(i);case 502:throw i=await e.text(),this.logger.error(i),new Error(i);default:throw i=`Received HTTP ${e.status} status code unexpectedly: ${await e.text()}`,this.logger.error(i),new Error(i)}}processWebSocketMessage(e,p){if(p){this.logger.warn("Binary message received. Binary messages are not processed.");return}this.logger.debug("Message received");let o=e.toString(),i=JSON.parse(o);if(L(i,this.logger,this.verboseErrors)){this.webSocketMessageSubject.next(i);return}this.logger.error("Received message has an unexpected type!",o)}};0&&(module.exports={SystemAccessPoint,VirtualDeviceType,isChannel,isConfiguration,isDevice,isDeviceList,isDeviceResponse,isGetDataPointResponse,isSetDataPointResponse,isVirtualDevice,isVirtualDeviceResponse,isWebSocketMessage});
|
|
790
2
|
//# sourceMappingURL=index.js.map
|