freeathome-local-api-client 1.6.0 → 1.7.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/README.md +3 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -13
package/README.md
CHANGED
|
@@ -4,11 +4,13 @@ A client library for the BUSCH-JAEGER free@home local API implemented in TypeScr
|
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|
[](https://codecov.io/gh/pgerke/freeathome-local-api-client)
|
|
7
|
-
[](https://sonarcloud.io/summary/new_code?id=pgerke_freeathome-local-api-client)
|
|
8
8
|

|
|
9
9
|

|
|
10
10
|

|
|
11
11
|
|
|
12
|
+
If you are using Golang, feel free to check out the Go implementation of this library [here](https://github.com/pgerke/freeathome)!
|
|
13
|
+
|
|
12
14
|
## Installation
|
|
13
15
|
|
|
14
16
|
You can install the package from npmjs.com:
|
package/dist/index.js
CHANGED
|
@@ -524,12 +524,15 @@ var SystemAccessPoint = class extends import_events.EventEmitter {
|
|
|
524
524
|
throw new Error("Web socket is already connected");
|
|
525
525
|
}
|
|
526
526
|
this.webSocket = this.createWebSocket(certificateVerification);
|
|
527
|
+
this.webSocketKeepaliveSubscription?.unsubscribe();
|
|
528
|
+
this.webSocketKeepaliveSubscription = void 0;
|
|
527
529
|
this.webSocketKeepaliveSubscription = this.webSocketKeepaliveTimer$.subscribe(() => {
|
|
528
530
|
if (!(this.webSocket && this.webSocket.readyState === import_ws.WebSocket.OPEN))
|
|
529
531
|
return;
|
|
530
532
|
this.logger.log("keepalive timer expired, sending ping message...");
|
|
531
533
|
this.webSocket.ping();
|
|
532
534
|
});
|
|
535
|
+
this.webSocketKeepaliveTimerReset$.next();
|
|
533
536
|
}
|
|
534
537
|
/**
|
|
535
538
|
* Creates a new virtual device.
|
|
@@ -567,6 +570,9 @@ var SystemAccessPoint = class extends import_events.EventEmitter {
|
|
|
567
570
|
webSocket.on("ping", (data) => {
|
|
568
571
|
this.emit("websocket-ping", data);
|
|
569
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"));
|
|
570
576
|
});
|
|
571
577
|
webSocket.on("pong", (data) => {
|
|
572
578
|
this.emit("websocket-pong", data);
|
|
@@ -587,6 +593,8 @@ var SystemAccessPoint = class extends import_events.EventEmitter {
|
|
|
587
593
|
webSocket.on("close", (code, reason) => {
|
|
588
594
|
this.emit("websocket-close", code, reason);
|
|
589
595
|
this.logger.log("Connection closed");
|
|
596
|
+
this.webSocketKeepaliveSubscription?.unsubscribe();
|
|
597
|
+
this.webSocketKeepaliveSubscription = void 0;
|
|
590
598
|
});
|
|
591
599
|
webSocket.on("message", (data, isBinary) => {
|
|
592
600
|
this.emit("websocket-message", data, isBinary);
|
|
@@ -603,8 +611,6 @@ var SystemAccessPoint = class extends import_events.EventEmitter {
|
|
|
603
611
|
if (!this.webSocket || this.webSocket.readyState === import_ws.WebSocket.CLOSED) {
|
|
604
612
|
throw new Error("Web socket is not open");
|
|
605
613
|
}
|
|
606
|
-
this.webSocketKeepaliveSubscription?.unsubscribe();
|
|
607
|
-
this.webSocketKeepaliveSubscription = void 0;
|
|
608
614
|
if (force) {
|
|
609
615
|
this.webSocket.terminate();
|
|
610
616
|
} else {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/model/validation/channel-ti.ts","../src/model/validation/configuration-ti.ts","../src/model/validation/device-ti.ts","../src/model/validation/device-list-ti.ts","../src/model/validation/device-response-ti.ts","../src/model/validation/devices-ti.ts","../src/model/validation/error-ti.ts","../src/model/validation/floors-ti.ts","../src/model/validation/get-data-point-response-ti.ts","../src/model/validation/in-out-put-ti.ts","../src/model/validation/rooms-ti.ts","../src/model/validation/scenes-triggered-ti.ts","../src/model/validation/set-data-point-response-ti.ts","../src/model/validation/sys-ap-ti.ts","../src/model/validation/users-ti.ts","../src/model/validation/virtual-device-ti.ts","../src/model/validation/virtual-device-response-ti.ts","../src/model/validation/websocket-message-ti.ts","../src/model/validator.ts","../src/model/virtual-device.ts","../src/system-access-point.ts"],"sourcesContent":["export * from \"./model\";\nexport { SystemAccessPoint } from \"./system-access-point\";\n","import { ITypeSuite, iface, indexKey, opt } from \"ts-interface-checker\";\n\nconst Channel = iface([], {\n displayName: opt(\"string\"),\n functionID: opt(\"string\"),\n room: opt(\"string\"),\n floor: opt(\"string\"),\n inputs: opt(\n iface([], {\n [indexKey]: \"InOutPut\",\n })\n ),\n outputs: opt(\n iface([], {\n [indexKey]: \"InOutPut\",\n })\n ),\n parameters: opt(\n iface([], {\n [indexKey]: \"string\",\n })\n ),\n type: opt(\"string\"),\n});\n\nexport const ChannelTypeSuite: ITypeSuite = {\n Channel,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Configuration = iface([], {\n [indexKey]: \"SysAP\",\n});\n\nexport const ConfigurationTypeSuite: ITypeSuite = {\n Configuration,\n};\n","import { iface, indexKey, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst Device = iface([], {\n displayName: opt(\"string\"),\n room: opt(\"string\"),\n floor: opt(\"string\"),\n interface: opt(\"string\"),\n nativeId: opt(\"string\"),\n channels: opt(\n iface([], {\n [indexKey]: \"Channel\",\n })\n ),\n parameters: opt(\n iface([], {\n [indexKey]: \"string\",\n })\n ),\n});\n\nexport const DeviceTypeSuite: ITypeSuite = {\n Device,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst DeviceList = iface([], {\n [indexKey]: array(\"string\"),\n});\n\nexport const DeviceListTypeSuite: ITypeSuite = {\n DeviceList,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst DeviceResponse = iface([], {\n [indexKey]: iface([], {\n devices: \"Devices\",\n }),\n});\n\nexport const DeviceResponseTypeSuite: ITypeSuite = {\n DeviceResponse,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Devices = iface([], {\n [indexKey]: \"Device\",\n});\n\nexport const DevicesTypeSuite: ITypeSuite = {\n Devices,\n};\n","import { iface, ITypeSuite } from \"ts-interface-checker\";\n\nconst Error = iface([], {\n code: \"string\",\n detail: \"string\",\n title: \"string\",\n});\n\nexport const ErrorTypeSuite: ITypeSuite = {\n Error,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Floors = iface([], {\n [indexKey]: iface([], {\n name: \"string\",\n rooms: \"Rooms\",\n }),\n});\n\nexport const FloorsTypeSuite: ITypeSuite = {\n Floors,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst GetDataPointResponse = iface([], {\n [indexKey]: iface([], {\n values: array(\"string\"),\n }),\n});\n\nexport const GetDataPointResponseTypeSuite: ITypeSuite = {\n GetDataPointResponse,\n};\n","import { iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst InOutPut = iface([], {\n value: opt(\"string\"),\n pairingID: opt(\"number\"),\n});\n\nexport const InOutPutTypeSuite: ITypeSuite = {\n InOutPut,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Rooms = iface([], {\n [indexKey]: iface([], {\n name: \"string\",\n }),\n});\n\nexport const RoomsTypeSuite: ITypeSuite = {\n Rooms,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst ScenesTriggered = iface([], {\n [indexKey]: iface([], {\n channels: iface([], {\n [indexKey]: iface([], {\n outputs: iface([], {\n [indexKey]: iface([], {\n value: \"string\",\n pairingID: \"number\",\n }),\n }),\n }),\n }),\n }),\n});\n\nexport const ScenesTriggeredTypeSuite: ITypeSuite = {\n ScenesTriggered,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst SetDataPointResponse = iface([], {\n [indexKey]: iface([], {\n [indexKey]: \"string\",\n }),\n});\n\nexport const SetDataPointResponseTypeSuite: ITypeSuite = {\n SetDataPointResponse,\n};\n","import { iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst SysAP = iface([], {\n devices: \"Devices\",\n floorplan: iface([], {\n floors: \"Floors\",\n }),\n sysapName: \"string\",\n users: \"Users\",\n error: opt(\"Error\"),\n});\n\nexport const SysApTypeSuite: ITypeSuite = {\n SysAP,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Users = iface([], {\n [indexKey]: iface([], {\n enabled: \"boolean\",\n flags: array(\"string\"),\n grantedPermissions: array(\"string\"),\n jid: \"string\",\n name: \"string\",\n requestedPermissions: array(\"string\"),\n role: \"string\",\n }),\n});\n\nexport const UsersTypeSuite: ITypeSuite = {\n Users,\n};\n","import { array, enumtype, iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst VirtualDevice = iface([], {\n type: \"VirtualDeviceType\",\n properties: opt(\n iface([], {\n ttl: opt(\"string\"),\n displayname: opt(\"string\"),\n flavor: opt(\"string\"),\n capabilities: opt(array(\"number\")),\n })\n ),\n});\n\nexport const VirtualDeviceType = enumtype({\n BinarySensor: \"BinarySensor\",\n BlindActuator: \"BlindActuator\",\n SwitchingActuator: \"SwitchingActuator\",\n CeilingFanActuator: \"CeilingFanActuator\",\n RTC: \"RTC\",\n DimActuator: \"DimActuator\",\n EVCharging: \"evcharging\",\n WindowSensor: \"WindowSensor\",\n SimpleDoorlock: \"simple_doorlock\",\n ShutterActuator: \"ShutterActuator\",\n WeatherStation: \"WeatherStation\",\n WeatherTemperatureSensor: \"Weather-TemperatureSensor\",\n WeatherWindSensor: \"Weather-WindSensor\",\n WeatherBrightnessSensor: \"Weather-BrightnessSensor\",\n WeatherRainSensor: \"Weather-RainSensor\",\n WindowActuator: \"WindowActuator\",\n CODetector: \"CODetector\",\n FireDetector: \"FireDetector\",\n KNXSwitchSensor: \"KNX-SwitchSensor\",\n MediaPlayer: \"MediaPlayer\",\n EnergyBattery: \"EnergyBattery\",\n EnergyInverter: \"EnergyInverter\",\n EnergyMeter: \"EnergyMeter\",\n EnergyInverterBattery: \"EnergyInverterBattery\",\n EnergyInverterMeter: \"EnergyInverterMeter\",\n EnergyInverterMeterBattery: \"EnergyInverterMeterBattery\",\n EnergyMeterBattery: \"EnergyMeterBattery\",\n AirQualityCO2: \"AirQualityCO2\",\n AirQualityCO: \"AirQualityCO\",\n AirQualityFull: \"AirQualityFull\",\n AirQualityHumidity: \"AirQualityHumidity\",\n AirQualityNO2: \"AirQualityNO2\",\n AirQualityO3: \"AirQualityO3\",\n AirQualityPM10: \"AirQualityPM10\",\n AirQualityPM25: \"AirQualityPM25\",\n AirQualityPressure: \"AirQualityPressure\",\n AirQualityTemperature: \"AirQualityTemperature\",\n AirQualityVOC: \"AirQualityVOC\",\n EnergyMeterV2: \"EnergyMeterv2\",\n HomeApplianceLaundry: \"HomeAppliance-Laundry\",\n HVAC: \"HVAC\",\n SplitUnit: \"SplitUnit\",\n});\n\nexport const VirtualDeviceTypeSuite: ITypeSuite = {\n VirtualDevice,\n VirtualDeviceType,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst VirtualDeviceResponse = iface([], {\n [indexKey]: iface([], {\n devices: iface([], {\n [indexKey]: iface([], {\n serial: \"string\",\n }),\n }),\n }),\n});\n\nexport const VirtualDeviceResponseTypeSuite: ITypeSuite = {\n VirtualDeviceResponse,\n};\n","import { array, iface, indexKey, ITypeSuite, opt } from \"ts-interface-checker\";\n\nconst WebSocketMessage = iface([], {\n [indexKey]: iface([], {\n datapoints: iface([], {\n [indexKey]: \"string\",\n }),\n devices: \"Devices\",\n devicesAdded: array(\"string\"),\n devicesRemoved: array(\"string\"),\n scenesTriggered: \"ScenesTriggered\",\n parameters: opt(\n iface([], {\n [indexKey]: \"string\",\n })\n ),\n }),\n});\n\nexport const WebSocketMessageTypeSuite: ITypeSuite = {\n WebSocketMessage,\n};\n","import {\n ChannelTypeSuite,\n DeviceTypeSuite,\n DevicesTypeSuite,\n InOutPutTypeSuite,\n ScenesTriggeredTypeSuite,\n WebSocketMessageTypeSuite,\n DeviceListTypeSuite,\n SetDataPointResponseTypeSuite,\n GetDataPointResponseTypeSuite,\n ConfigurationTypeSuite,\n FloorsTypeSuite,\n RoomsTypeSuite,\n SysApTypeSuite,\n UsersTypeSuite,\n ErrorTypeSuite,\n DeviceResponseTypeSuite,\n VirtualDeviceTypeSuite,\n VirtualDeviceResponseTypeSuite,\n} from \"./validation\";\nimport { Checker, createCheckers } from \"ts-interface-checker\";\nimport { WebSocketMessage as Message } from \"./websocket-message\";\nimport { Configuration as Config } from \"./configuration\";\nimport { Channel as Chan } from \"./channel\";\nimport { Device as Dev } from \"./device\";\nimport { DeviceList as DevList } from \"./device-list\";\nimport { DeviceResponse as DevResponse } from \"./device-response\";\nimport { GetDataPointResponse as GetResponse } from \"./get-data-point-response\";\nimport { SetDataPointResponse as SetResponse } from \"./set-data-point-response\";\nimport { VirtualDeviceResponse as VDeviceResponse } from \"./virtual-device-response\";\nimport { VirtualDevice as VDevice } from \"./virtual-device\";\nimport { Logger } from \"./logger\";\n\nconst { Channel } = createCheckers(ChannelTypeSuite, InOutPutTypeSuite);\n\nconst { Configuration } = createCheckers(\n ConfigurationTypeSuite,\n DevicesTypeSuite,\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite,\n FloorsTypeSuite,\n RoomsTypeSuite,\n SysApTypeSuite,\n UsersTypeSuite,\n ErrorTypeSuite\n);\n\nconst { Device } = createCheckers(\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite\n);\n\nconst { DeviceList } = createCheckers(DeviceListTypeSuite);\n\nconst { DeviceResponse } = createCheckers(\n DeviceResponseTypeSuite,\n DevicesTypeSuite,\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite\n);\n\nconst { GetDataPointResponse } = createCheckers(GetDataPointResponseTypeSuite);\n\nconst { SetDataPointResponse } = createCheckers(SetDataPointResponseTypeSuite);\n\nconst { VirtualDevice } = createCheckers(VirtualDeviceTypeSuite);\n\nconst { VirtualDeviceResponse } = createCheckers(\n VirtualDeviceResponseTypeSuite\n);\n\nconst { WebSocketMessage } = createCheckers(\n WebSocketMessageTypeSuite,\n DevicesTypeSuite,\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite,\n ScenesTriggeredTypeSuite\n);\n\nfunction check(\n obj: unknown,\n checker: Checker,\n logger: Logger,\n verbose: boolean\n): boolean {\n if (verbose) {\n try {\n checker.check(obj);\n return true;\n } catch (error) {\n logger.error(\"Object validation failed!\", error);\n return false;\n }\n }\n\n return checker.test(obj);\n}\n\n/**\n * Determines whether the specified object is a web socket message.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a web socket message.\n */\nexport function isWebSocketMessage(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Message {\n return check(obj, WebSocketMessage, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a configuration.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a configuration.\n */\nexport function isConfiguration(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Config {\n return check(obj, Configuration, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device list.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device list.\n */\nexport function isDeviceList(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is DevList {\n return check(obj, DeviceList, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device response.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device response.\n */\nexport function isDeviceResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is DevResponse {\n return check(obj, DeviceResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a valid response to a get data point request.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a get data point request.\n */\nexport function isGetDataPointResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is GetResponse {\n return check(obj, GetDataPointResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a valid response to a set data point request.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a set data point request.\n */\nexport function isSetDataPointResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is SetResponse {\n return check(obj, SetDataPointResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a virtual device.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a virtual device.\n */\nexport function isVirtualDevice(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is VDevice {\n return check(obj, VirtualDevice, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a virtual device response.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a virtual device request.\n */\nexport function isVirtualDeviceResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is VDeviceResponse {\n return check(obj, VirtualDeviceResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a channel.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a channel.\n */\nexport function isChannel(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Chan {\n return check(obj, Channel, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device.\n */\nexport function isDevice(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Dev {\n return check(obj, Device, logger, verbose);\n}\n","/** Defines a virtual device. */\nexport interface VirtualDevice {\n /** The virtual device type. */\n type: VirtualDeviceType;\n /** The virtual device properties */\n properties?: {\n /** The time to live value indicates the number of seconds the system access point will wait for a message before it assumes the device to be unresponsive. */\n ttl?: string;\n /** The display name for the virtual device. */\n displayname?: string;\n /** The virtual device flavor. */\n flavor?: string;\n /** The virtual device capabilities. */\n capabilities?: Array<number>;\n };\n}\n\n/** Defines the possible types of virtual devices. */\nexport enum VirtualDeviceType {\n /** A binary sensor */\n BinarySensor = \"BinarySensor\",\n /** A blind actuator */\n BlindActuator = \"BlindActuator\",\n /** A switching actuator */\n SwitchingActuator = \"SwitchingActuator\",\n /** A ceiling fan actuator */\n CeilingFanActuator = \"CeilingFanActuator\",\n /** A real time clock */\n RTC = \"RTC\",\n /** A dimmer actuator */\n DimActuator = \"DimActuator\",\n /** A charger for an electronic vehicle */\n EVCharging = \"evcharging\",\n /** A window sensor */\n WindowSensor = \"WindowSensor\",\n /** A simple door lock */\n SimpleDoorlock = \"simple_doorlock\",\n /** A shutter actuator */\n ShutterActuator = \"ShutterActuator\",\n /** A weather station */\n WeatherStation = \"WeatherStation\",\n /** A temperature sensor */\n WeatherTemperatureSensor = \"Weather-TemperatureSensor\",\n /** A wind sensor */\n WeatherWindSensor = \"Weather-WindSensor\",\n /** A brightness sensor */\n WeatherBrightnessSensor = \"Weather-BrightnessSensor\",\n /** A rain sensor */\n WeatherRainSensor = \"Weather-RainSensor\",\n /** A window actuator */\n WindowActuator = \"WindowActuator\",\n /** A detector for carbon monoxide (CO) */\n CODetector = \"CODetector\",\n /** A fire detector */\n FireDetector = \"FireDetector\",\n /** A KNX switch sensor */\n KNXSwitchSensor = \"KNX-SwitchSensor\",\n /** A media player */\n MediaPlayer = \"MediaPlayer\",\n /** A battery */\n EnergyBattery = \"EnergyBattery\",\n /** An inverter */\n EnergyInverter = \"EnergyInverter\",\n /** An energy meter */\n EnergyMeter = \"EnergyMeter\",\n /** A device combining inverter and battery characteristics */\n EnergyInverterBattery = \"EnergyInverterBattery\",\n /** A device combining inverter and energy meter characteristics */\n EnergyInverterMeter = \"EnergyInverterMeter\",\n /** A device combining inverter, battery and energy meter characteristics */\n EnergyInverterMeterBattery = \"EnergyInverterMeterBattery\",\n /** A device combining battery and energy meter characteristics */\n EnergyMeterBattery = \"EnergyMeterBattery\",\n /** An air quality sensor measuring carbon dioxide (CO2) */\n AirQualityCO2 = \"AirQualityCO2\",\n /** An air quality sensor measuring carbon monoxide (CO) */\n AirQualityCO = \"AirQualityCO\",\n /** An full air quality sensor */\n AirQualityFull = \"AirQualityFull\",\n /** An air quality sensor measuring humidity */\n AirQualityHumidity = \"AirQualityHumidity\",\n /** An air quality sensor measuring nitrogen dioxide (NO2) */\n AirQualityNO2 = \"AirQualityNO2\",\n /** An air quality sensor measuring ozone (O3) */\n AirQualityO3 = \"AirQualityO3\",\n /** An air quality sensor measuring coarse particulate matter with in the 10 micron scale */\n AirQualityPM10 = \"AirQualityPM10\",\n /** An air quality sensor measuring coarse particulate matter with in the 25 micron scale */\n AirQualityPM25 = \"AirQualityPM25\",\n /** An air quality sensor measuring barometric pressure */\n AirQualityPressure = \"AirQualityPressure\",\n /** An air quality sensor measuring temperature */\n AirQualityTemperature = \"AirQualityTemperature\",\n /** An air quality sensor measuring volatile organic compounds */\n AirQualityVOC = \"AirQualityVOC\",\n /** A version 2 energy meter */\n EnergyMeterV2 = \"EnergyMeterv2\",\n HomeApplianceLaundry = \"HomeAppliance-Laundry\",\n HVAC = \"HVAC\",\n SplitUnit = \"SplitUnit\",\n}\n","import { EventEmitter } from \"events\";\nimport {\n interval,\n Observable,\n SchedulerLike,\n Subject,\n Subscription,\n switchMap,\n takeUntil,\n} from \"rxjs\";\nimport { ClientOptions, RawData, WebSocket } from \"ws\";\nimport {\n Configuration,\n DeviceList,\n DeviceResponse,\n GetDataPointResponse,\n isConfiguration,\n isDeviceList,\n isDeviceResponse,\n isGetDataPointResponse,\n isSetDataPointResponse,\n isWebSocketMessage,\n Logger,\n SetDataPointResponse,\n VirtualDevice,\n VirtualDeviceResponse,\n WebSocketMessage,\n} from \"./model\";\nimport { isVirtualDeviceResponse } from \"./model/validator\";\n\n/** The HTTP request method */\ntype HttpRequestMethod = \"GET\" | \"POST\" | \"DELETE\" | \"PATCH\" | \"PUT\";\n\n/** The class representing a System Access Point. */\nexport class SystemAccessPoint extends EventEmitter {\n /** The basic authentication key used for requests. */\n public readonly basicAuthKey: string;\n private webSocket?: WebSocket;\n private readonly webSocketMessageSubject = new Subject<WebSocketMessage>();\n private readonly webSocketKeepaliveTimerReset$ = new Subject<void>();\n private readonly webSocketKeepaliveTimer$ =\n this.webSocketKeepaliveTimerReset$.pipe(\n switchMap(() =>\n interval(30000, this.scheduler).pipe(\n takeUntil(this.webSocketKeepaliveTimerReset$)\n )\n )\n );\n private webSocketKeepaliveSubscription?: Subscription;\n\n /**\n * Constructs a new SystemAccessPoint instance\n *\n * @constructor\n * @param hostName {string} The system access point host name.\n * @param userName {string} The user name that shall be used to authenticate with the system access point.\n * @param password {string} The password that shall be used to authenticate with the system access point.\n * @param tlsEnabled {boolean} Determines whether the communication with the system access point shall be protected by TLS.\n * @param verboseErrors {boolean} Determines whether verbose error messages shall be used, for example for message validation.\n * @param logger {Logger} The logger instance to be used. If no explicit implementation is provided, the this.logger will be used for logging.\n */\n constructor(\n private readonly hostName: string,\n readonly userName: string,\n readonly password: string,\n private readonly tlsEnabled = true,\n private readonly verboseErrors = false,\n private readonly logger: Logger = console,\n readonly scheduler?: SchedulerLike\n ) {\n super();\n\n // Create Basic Authentication key\n this.basicAuthKey = Buffer.from(`${userName}:${password}`, \"utf8\").toString(\n \"base64\"\n );\n }\n\n /**\n * Connects to the System Access Point web socket.\n * @param certificateVerification {boolean} Determines whether the TLS certificate presented by the server will be verified.\n */\n public connectWebSocket(certificateVerification: boolean = true): void {\n if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {\n throw new Error(\"Web socket is already connected\");\n }\n\n this.webSocket = this.createWebSocket(certificateVerification);\n this.webSocketKeepaliveSubscription =\n this.webSocketKeepaliveTimer$.subscribe(() => {\n if (!(this.webSocket && this.webSocket.readyState === WebSocket.OPEN))\n return;\n\n this.logger.log(\"keepalive timer expired, sending ping message...\");\n this.webSocket.ping();\n });\n }\n\n /**\n * Creates a new virtual device.\n * @param sysApUuid {string} The UUID identifying the system access point.\n * @param deviceSerial {string} The serial number to be assigned to the device.\n * @param virtualDevice {VirtualDevice} The virtual device to be created.\n * @returns {Promise.<VirtualDeviceResponse>} The response to the virtual device request.\n */\n public async createVirtualDevice(\n sysApUuid: string,\n deviceSerial: string,\n virtualDevice: VirtualDevice\n ): Promise<VirtualDeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"PUT\",\n `virtualdevice/${sysApUuid}/${deviceSerial}`,\n JSON.stringify(virtualDevice)\n );\n\n // Process response\n return this.processRestResponse(response, isVirtualDeviceResponse);\n }\n\n private createWebSocket(certificateVerification: boolean): WebSocket {\n // Disabling certificate verification is discouraged, issue a warning\n if (this.tlsEnabled && !certificateVerification) {\n this.logger.warn(\n \"TLS certificate verification is disabled! This poses a security risk, activating certificate verification is strictly recommended.\"\n );\n }\n\n const url = `${this.tlsEnabled ? \"wss\" : \"ws\"}://${\n this.hostName\n }/fhapi/v1/api/ws`;\n const options: ClientOptions = {\n rejectUnauthorized: this.tlsEnabled && certificateVerification,\n headers: {\n Authorization: `Basic ${this.basicAuthKey}`,\n },\n };\n const webSocket = new WebSocket(url, options);\n webSocket.on(\"error\", (error: Error) => {\n this.emit(\"websocket-error\", error);\n this.logger.error(\"Error received\", error);\n });\n webSocket.on(\"ping\", (data: Buffer) => {\n this.emit(\"websocket-ping\", data);\n this.logger.debug(\"Ping received\", data.toString(\"ascii\"));\n });\n webSocket.on(\"pong\", (data: Buffer) => {\n this.emit(\"websocket-pong\", data);\n this.logger.debug(\"Pong received\", data.toString(\"ascii\"));\n });\n webSocket.on(\"unexpected-response\", (request, response) => {\n this.emit(\"websocket-unexpected-response\", request, response);\n this.logger.error(\"Unexpected response received\");\n });\n webSocket.on(\"upgrade\", (request) => {\n this.emit(\"websocket-upgrade\", request);\n this.logger.debug(\"Upgrade request received\");\n });\n webSocket.on(\"open\", () => {\n this.emit(\"websocket-open\");\n this.logger.log(\"Connection opened\");\n });\n webSocket.on(\"close\", (code, reason) => {\n this.emit(\"websocket-close\", code, reason);\n this.logger.log(\"Connection closed\");\n });\n webSocket.on(\"message\", (data: RawData, isBinary: boolean) => {\n this.emit(\"websocket-message\", data, isBinary);\n this.webSocketKeepaliveTimerReset$.next();\n this.processWebSocketMessage(data, isBinary);\n });\n return webSocket;\n }\n\n /**\n * Disconnects from the System Access Point web socket.\n * @param force {boolean} Determines whether or not the connection will be closed forcibly.\n */\n public disconnectWebSocket(force: boolean = false): void {\n if (!this.webSocket || this.webSocket.readyState === WebSocket.CLOSED) {\n throw new Error(\"Web socket is not open\");\n }\n\n this.webSocketKeepaliveSubscription?.unsubscribe();\n this.webSocketKeepaliveSubscription = undefined;\n if (force) {\n this.webSocket.terminate();\n } else {\n this.webSocket.close();\n }\n }\n\n /**\n * Gets the configuration from the system access point.\n * @returns {Promise.<Configuration>} The system access point configuration.\n */\n public async getConfiguration(): Promise<Configuration> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n \"configuration\"\n );\n\n // Process response\n return this.processRestResponse(response, isConfiguration);\n }\n\n /**\n * Gets the device list from the system access point.\n * @returns {Promise.<DeviceList>} The requested device list.\n */\n public async getDeviceList(): Promise<DeviceList> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\"GET\", \"devicelist\");\n\n // Process response\n return this.processRestResponse(response, isDeviceList);\n }\n\n /**\n * Gets the specified device from the system access point.\n * @param sysApUuid {string} The UUID identifying the system access point.\n * @param deviceSerial {string} The device serial number.\n * @returns {Promise.<DeviceResponse>} The response to the device request.\n */\n public async getDevice(\n sysApUuid: string,\n deviceSerial: string\n ): Promise<DeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n `device/${sysApUuid}/${deviceSerial}`\n );\n\n // Process response\n return this.processRestResponse(response, isDeviceResponse);\n }\n\n /**\n * Gets the specified data point from the system access point.\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceSerial {string} The device serial number.\n * @param channel {string} The channel identifier.\n * @param dataPoint {string} The datapoint identifier.\n * @returns {Promise.<GetDataPointResponse>} The response to the get data point request.\n */\n public async getDatapoint(\n sysApUuid: string,\n deviceSerial: string,\n channel: string,\n dataPoint: string\n ): Promise<GetDataPointResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n `datapoint/${sysApUuid}/${deviceSerial}.${channel}.${dataPoint}`\n );\n\n // Process response\n return this.processRestResponse(response, isGetDataPointResponse);\n }\n\n /**\n * Gets the web socket messages.\n * @returns {Observable.<WebSocketMessage>} An observable that is updated with the messages received from the web socket.\n */\n public getWebSocketMessages(): Observable<WebSocketMessage> {\n return this.webSocketMessageSubject.asObservable();\n }\n\n /**\n * Sets a new value for the specificed data point.\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceSerial {string} The device serial number.\n * @param channel {string} The channel identifier.\n * @param dataPoint {string} The datapoint identifier.\n * @param value {string} The new value to be set.\n * @returns {Promise.<SetDataPointResponse>} The response to the set data point request.\n */\n public async setDatapoint(\n sysApUuid: string,\n deviceSerial: string,\n channel: string,\n dataPoint: string,\n value: string\n ): Promise<SetDataPointResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"PUT\",\n `datapoint/${sysApUuid}/${deviceSerial}.${channel}.${dataPoint}`,\n value\n );\n\n // Process response\n return this.processRestResponse(response, isSetDataPointResponse);\n }\n\n /**\n * Triggeres the given action for the specified proxy device. Please note that this method is part of the experimental API!\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceClass {string} The device class.\n * @param deviceSerial {string} The device serial number.\n * @param action {string} The action to be triggered.\n * @returns {Promise.<DeviceResponse>} The response to the request.\n */\n public async triggerProxyDevice(\n sysApUuid: string,\n deviceClass: string,\n deviceSerial: string,\n action: string\n ): Promise<DeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n `proxydevice/${sysApUuid}/${deviceClass}/${deviceSerial}/action/${action}`\n );\n\n // Process response\n return this.processRestResponse(response, isDeviceResponse);\n }\n\n /**\n * Sets the given value for the specified proxy device. Please note that this method is part of the experimental API!\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceClass {string} The device class.\n * @param deviceSerial {string} The device serial number.\n * @param value {string} The value to be set.\n * @returns {Promise.<DeviceResponse>} The response to the request.\n */\n public async setProxyDeviceValue(\n sysApUuid: string,\n deviceClass: string,\n deviceSerial: string,\n value: string\n ): Promise<DeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"PUT\",\n `proxydevice/${sysApUuid}/${deviceClass}/${deviceSerial}/value/${value}`\n );\n\n // Process response\n return this.processRestResponse(response, isDeviceResponse);\n }\n\n private async fetchDataViaRest(\n method: HttpRequestMethod,\n route: string,\n body: BodyInit | null | undefined = undefined\n ): Promise<Response> {\n // Set up request info\n const info: RequestInfo = `${this.tlsEnabled ? \"https\" : \"http\"}://${\n this.hostName\n }/fhapi/v1/api/rest/${route}`;\n\n // Set up request init\n const init: RequestInit = {\n method: method,\n headers: {\n Authorization: `Basic ${this.basicAuthKey}`,\n },\n body: body,\n };\n\n // Get response from system access point\n return fetch(info, init);\n }\n\n private async processRestResponse<TResponse>(\n response: Response,\n typeGuard: (\n obj: unknown,\n logger: Logger,\n verbose: boolean\n ) => obj is TResponse\n ): Promise<TResponse> {\n let body: unknown;\n let message: string;\n\n // Process response\n switch (response.status) {\n case 200:\n body = await response.json();\n if (!typeGuard(body, this.logger, this.verboseErrors)) {\n message = \"Received message has an unexpected type!\";\n this.logger.error(message, body);\n throw new Error(message);\n }\n\n return body;\n case 401:\n message = \"Authentication information is missing or invalid.\";\n this.logger.error(message);\n throw new Error(message);\n case 502:\n message = await response.text();\n this.logger.error(message);\n throw new Error(message);\n default:\n message = `Received HTTP ${\n response.status\n } status code unexpectedly: ${await response.text()}`;\n this.logger.error(message);\n throw new Error(message);\n }\n }\n\n private processWebSocketMessage(data: RawData, isBinary: boolean): void {\n // Do not process binary messages\n if (isBinary) {\n this.logger.warn(\n \"Binary message received. Binary messages are not processed.\"\n );\n return;\n }\n\n this.logger.debug(\"Message received\");\n /*\n * Deserialize the message.\n * The message is expected to be deserializable as a web socket message.\n * If that is not the case, that's an error case.\n */\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const serialized = data.toString();\n const message: unknown = JSON.parse(serialized);\n\n if (isWebSocketMessage(message, this.logger, this.verboseErrors)) {\n this.webSocketMessageSubject.next(message);\n return;\n }\n\n this.logger.error(\"Received message has an unexpected type!\", serialized);\n }\n}\n"],"mappings":"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","names":["VirtualDeviceType","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","Error","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","Channel","Configuration","Device","DeviceList","DeviceResponse","GetDataPointResponse","SetDataPointResponse","VirtualDevice","VirtualDeviceResponse","WebSocketMessage","VirtualDeviceType"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/model/validation/channel-ti.ts","../src/model/validation/configuration-ti.ts","../src/model/validation/device-ti.ts","../src/model/validation/device-list-ti.ts","../src/model/validation/device-response-ti.ts","../src/model/validation/devices-ti.ts","../src/model/validation/error-ti.ts","../src/model/validation/floors-ti.ts","../src/model/validation/get-data-point-response-ti.ts","../src/model/validation/in-out-put-ti.ts","../src/model/validation/rooms-ti.ts","../src/model/validation/scenes-triggered-ti.ts","../src/model/validation/set-data-point-response-ti.ts","../src/model/validation/sys-ap-ti.ts","../src/model/validation/users-ti.ts","../src/model/validation/virtual-device-ti.ts","../src/model/validation/virtual-device-response-ti.ts","../src/model/validation/websocket-message-ti.ts","../src/model/validator.ts","../src/model/virtual-device.ts","../src/system-access-point.ts"],"sourcesContent":["export * from \"./model\";\nexport { SystemAccessPoint } from \"./system-access-point\";\n","import { ITypeSuite, iface, indexKey, opt } from \"ts-interface-checker\";\n\nconst Channel = iface([], {\n displayName: opt(\"string\"),\n functionID: opt(\"string\"),\n room: opt(\"string\"),\n floor: opt(\"string\"),\n inputs: opt(\n iface([], {\n [indexKey]: \"InOutPut\",\n })\n ),\n outputs: opt(\n iface([], {\n [indexKey]: \"InOutPut\",\n })\n ),\n parameters: opt(\n iface([], {\n [indexKey]: \"string\",\n })\n ),\n type: opt(\"string\"),\n});\n\nexport const ChannelTypeSuite: ITypeSuite = {\n Channel,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Configuration = iface([], {\n [indexKey]: \"SysAP\",\n});\n\nexport const ConfigurationTypeSuite: ITypeSuite = {\n Configuration,\n};\n","import { iface, indexKey, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst Device = iface([], {\n displayName: opt(\"string\"),\n room: opt(\"string\"),\n floor: opt(\"string\"),\n interface: opt(\"string\"),\n nativeId: opt(\"string\"),\n channels: opt(\n iface([], {\n [indexKey]: \"Channel\",\n })\n ),\n parameters: opt(\n iface([], {\n [indexKey]: \"string\",\n })\n ),\n});\n\nexport const DeviceTypeSuite: ITypeSuite = {\n Device,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst DeviceList = iface([], {\n [indexKey]: array(\"string\"),\n});\n\nexport const DeviceListTypeSuite: ITypeSuite = {\n DeviceList,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst DeviceResponse = iface([], {\n [indexKey]: iface([], {\n devices: \"Devices\",\n }),\n});\n\nexport const DeviceResponseTypeSuite: ITypeSuite = {\n DeviceResponse,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Devices = iface([], {\n [indexKey]: \"Device\",\n});\n\nexport const DevicesTypeSuite: ITypeSuite = {\n Devices,\n};\n","import { iface, ITypeSuite } from \"ts-interface-checker\";\n\nconst Error = iface([], {\n code: \"string\",\n detail: \"string\",\n title: \"string\",\n});\n\nexport const ErrorTypeSuite: ITypeSuite = {\n Error,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Floors = iface([], {\n [indexKey]: iface([], {\n name: \"string\",\n rooms: \"Rooms\",\n }),\n});\n\nexport const FloorsTypeSuite: ITypeSuite = {\n Floors,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst GetDataPointResponse = iface([], {\n [indexKey]: iface([], {\n values: array(\"string\"),\n }),\n});\n\nexport const GetDataPointResponseTypeSuite: ITypeSuite = {\n GetDataPointResponse,\n};\n","import { iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst InOutPut = iface([], {\n value: opt(\"string\"),\n pairingID: opt(\"number\"),\n});\n\nexport const InOutPutTypeSuite: ITypeSuite = {\n InOutPut,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Rooms = iface([], {\n [indexKey]: iface([], {\n name: \"string\",\n }),\n});\n\nexport const RoomsTypeSuite: ITypeSuite = {\n Rooms,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst ScenesTriggered = iface([], {\n [indexKey]: iface([], {\n channels: iface([], {\n [indexKey]: iface([], {\n outputs: iface([], {\n [indexKey]: iface([], {\n value: \"string\",\n pairingID: \"number\",\n }),\n }),\n }),\n }),\n }),\n});\n\nexport const ScenesTriggeredTypeSuite: ITypeSuite = {\n ScenesTriggered,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst SetDataPointResponse = iface([], {\n [indexKey]: iface([], {\n [indexKey]: \"string\",\n }),\n});\n\nexport const SetDataPointResponseTypeSuite: ITypeSuite = {\n SetDataPointResponse,\n};\n","import { iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst SysAP = iface([], {\n devices: \"Devices\",\n floorplan: iface([], {\n floors: \"Floors\",\n }),\n sysapName: \"string\",\n users: \"Users\",\n error: opt(\"Error\"),\n});\n\nexport const SysApTypeSuite: ITypeSuite = {\n SysAP,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Users = iface([], {\n [indexKey]: iface([], {\n enabled: \"boolean\",\n flags: array(\"string\"),\n grantedPermissions: array(\"string\"),\n jid: \"string\",\n name: \"string\",\n requestedPermissions: array(\"string\"),\n role: \"string\",\n }),\n});\n\nexport const UsersTypeSuite: ITypeSuite = {\n Users,\n};\n","import { array, enumtype, iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst VirtualDevice = iface([], {\n type: \"VirtualDeviceType\",\n properties: opt(\n iface([], {\n ttl: opt(\"string\"),\n displayname: opt(\"string\"),\n flavor: opt(\"string\"),\n capabilities: opt(array(\"number\")),\n })\n ),\n});\n\nexport const VirtualDeviceType = enumtype({\n BinarySensor: \"BinarySensor\",\n BlindActuator: \"BlindActuator\",\n SwitchingActuator: \"SwitchingActuator\",\n CeilingFanActuator: \"CeilingFanActuator\",\n RTC: \"RTC\",\n DimActuator: \"DimActuator\",\n EVCharging: \"evcharging\",\n WindowSensor: \"WindowSensor\",\n SimpleDoorlock: \"simple_doorlock\",\n ShutterActuator: \"ShutterActuator\",\n WeatherStation: \"WeatherStation\",\n WeatherTemperatureSensor: \"Weather-TemperatureSensor\",\n WeatherWindSensor: \"Weather-WindSensor\",\n WeatherBrightnessSensor: \"Weather-BrightnessSensor\",\n WeatherRainSensor: \"Weather-RainSensor\",\n WindowActuator: \"WindowActuator\",\n CODetector: \"CODetector\",\n FireDetector: \"FireDetector\",\n KNXSwitchSensor: \"KNX-SwitchSensor\",\n MediaPlayer: \"MediaPlayer\",\n EnergyBattery: \"EnergyBattery\",\n EnergyInverter: \"EnergyInverter\",\n EnergyMeter: \"EnergyMeter\",\n EnergyInverterBattery: \"EnergyInverterBattery\",\n EnergyInverterMeter: \"EnergyInverterMeter\",\n EnergyInverterMeterBattery: \"EnergyInverterMeterBattery\",\n EnergyMeterBattery: \"EnergyMeterBattery\",\n AirQualityCO2: \"AirQualityCO2\",\n AirQualityCO: \"AirQualityCO\",\n AirQualityFull: \"AirQualityFull\",\n AirQualityHumidity: \"AirQualityHumidity\",\n AirQualityNO2: \"AirQualityNO2\",\n AirQualityO3: \"AirQualityO3\",\n AirQualityPM10: \"AirQualityPM10\",\n AirQualityPM25: \"AirQualityPM25\",\n AirQualityPressure: \"AirQualityPressure\",\n AirQualityTemperature: \"AirQualityTemperature\",\n AirQualityVOC: \"AirQualityVOC\",\n EnergyMeterV2: \"EnergyMeterv2\",\n HomeApplianceLaundry: \"HomeAppliance-Laundry\",\n HVAC: \"HVAC\",\n SplitUnit: \"SplitUnit\",\n});\n\nexport const VirtualDeviceTypeSuite: ITypeSuite = {\n VirtualDevice,\n VirtualDeviceType,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst VirtualDeviceResponse = iface([], {\n [indexKey]: iface([], {\n devices: iface([], {\n [indexKey]: iface([], {\n serial: \"string\",\n }),\n }),\n }),\n});\n\nexport const VirtualDeviceResponseTypeSuite: ITypeSuite = {\n VirtualDeviceResponse,\n};\n","import { array, iface, indexKey, ITypeSuite, opt } from \"ts-interface-checker\";\n\nconst WebSocketMessage = iface([], {\n [indexKey]: iface([], {\n datapoints: iface([], {\n [indexKey]: \"string\",\n }),\n devices: \"Devices\",\n devicesAdded: array(\"string\"),\n devicesRemoved: array(\"string\"),\n scenesTriggered: \"ScenesTriggered\",\n parameters: opt(\n iface([], {\n [indexKey]: \"string\",\n })\n ),\n }),\n});\n\nexport const WebSocketMessageTypeSuite: ITypeSuite = {\n WebSocketMessage,\n};\n","import {\n ChannelTypeSuite,\n DeviceTypeSuite,\n DevicesTypeSuite,\n InOutPutTypeSuite,\n ScenesTriggeredTypeSuite,\n WebSocketMessageTypeSuite,\n DeviceListTypeSuite,\n SetDataPointResponseTypeSuite,\n GetDataPointResponseTypeSuite,\n ConfigurationTypeSuite,\n FloorsTypeSuite,\n RoomsTypeSuite,\n SysApTypeSuite,\n UsersTypeSuite,\n ErrorTypeSuite,\n DeviceResponseTypeSuite,\n VirtualDeviceTypeSuite,\n VirtualDeviceResponseTypeSuite,\n} from \"./validation\";\nimport { Checker, createCheckers } from \"ts-interface-checker\";\nimport { WebSocketMessage as Message } from \"./websocket-message\";\nimport { Configuration as Config } from \"./configuration\";\nimport { Channel as Chan } from \"./channel\";\nimport { Device as Dev } from \"./device\";\nimport { DeviceList as DevList } from \"./device-list\";\nimport { DeviceResponse as DevResponse } from \"./device-response\";\nimport { GetDataPointResponse as GetResponse } from \"./get-data-point-response\";\nimport { SetDataPointResponse as SetResponse } from \"./set-data-point-response\";\nimport { VirtualDeviceResponse as VDeviceResponse } from \"./virtual-device-response\";\nimport { VirtualDevice as VDevice } from \"./virtual-device\";\nimport { Logger } from \"./logger\";\n\nconst { Channel } = createCheckers(ChannelTypeSuite, InOutPutTypeSuite);\n\nconst { Configuration } = createCheckers(\n ConfigurationTypeSuite,\n DevicesTypeSuite,\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite,\n FloorsTypeSuite,\n RoomsTypeSuite,\n SysApTypeSuite,\n UsersTypeSuite,\n ErrorTypeSuite\n);\n\nconst { Device } = createCheckers(\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite\n);\n\nconst { DeviceList } = createCheckers(DeviceListTypeSuite);\n\nconst { DeviceResponse } = createCheckers(\n DeviceResponseTypeSuite,\n DevicesTypeSuite,\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite\n);\n\nconst { GetDataPointResponse } = createCheckers(GetDataPointResponseTypeSuite);\n\nconst { SetDataPointResponse } = createCheckers(SetDataPointResponseTypeSuite);\n\nconst { VirtualDevice } = createCheckers(VirtualDeviceTypeSuite);\n\nconst { VirtualDeviceResponse } = createCheckers(\n VirtualDeviceResponseTypeSuite\n);\n\nconst { WebSocketMessage } = createCheckers(\n WebSocketMessageTypeSuite,\n DevicesTypeSuite,\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite,\n ScenesTriggeredTypeSuite\n);\n\nfunction check(\n obj: unknown,\n checker: Checker,\n logger: Logger,\n verbose: boolean\n): boolean {\n if (verbose) {\n try {\n checker.check(obj);\n return true;\n } catch (error) {\n logger.error(\"Object validation failed!\", error);\n return false;\n }\n }\n\n return checker.test(obj);\n}\n\n/**\n * Determines whether the specified object is a web socket message.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a web socket message.\n */\nexport function isWebSocketMessage(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Message {\n return check(obj, WebSocketMessage, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a configuration.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a configuration.\n */\nexport function isConfiguration(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Config {\n return check(obj, Configuration, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device list.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device list.\n */\nexport function isDeviceList(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is DevList {\n return check(obj, DeviceList, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device response.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device response.\n */\nexport function isDeviceResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is DevResponse {\n return check(obj, DeviceResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a valid response to a get data point request.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a get data point request.\n */\nexport function isGetDataPointResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is GetResponse {\n return check(obj, GetDataPointResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a valid response to a set data point request.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a set data point request.\n */\nexport function isSetDataPointResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is SetResponse {\n return check(obj, SetDataPointResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a virtual device.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a virtual device.\n */\nexport function isVirtualDevice(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is VDevice {\n return check(obj, VirtualDevice, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a virtual device response.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a virtual device request.\n */\nexport function isVirtualDeviceResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is VDeviceResponse {\n return check(obj, VirtualDeviceResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a channel.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a channel.\n */\nexport function isChannel(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Chan {\n return check(obj, Channel, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device.\n */\nexport function isDevice(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Dev {\n return check(obj, Device, logger, verbose);\n}\n","/** Defines a virtual device. */\nexport interface VirtualDevice {\n /** The virtual device type. */\n type: VirtualDeviceType;\n /** The virtual device properties */\n properties?: {\n /** The time to live value indicates the number of seconds the system access point will wait for a message before it assumes the device to be unresponsive. */\n ttl?: string;\n /** The display name for the virtual device. */\n displayname?: string;\n /** The virtual device flavor. */\n flavor?: string;\n /** The virtual device capabilities. */\n capabilities?: Array<number>;\n };\n}\n\n/** Defines the possible types of virtual devices. */\nexport enum VirtualDeviceType {\n /** A binary sensor */\n BinarySensor = \"BinarySensor\",\n /** A blind actuator */\n BlindActuator = \"BlindActuator\",\n /** A switching actuator */\n SwitchingActuator = \"SwitchingActuator\",\n /** A ceiling fan actuator */\n CeilingFanActuator = \"CeilingFanActuator\",\n /** A real time clock */\n RTC = \"RTC\",\n /** A dimmer actuator */\n DimActuator = \"DimActuator\",\n /** A charger for an electronic vehicle */\n EVCharging = \"evcharging\",\n /** A window sensor */\n WindowSensor = \"WindowSensor\",\n /** A simple door lock */\n SimpleDoorlock = \"simple_doorlock\",\n /** A shutter actuator */\n ShutterActuator = \"ShutterActuator\",\n /** A weather station */\n WeatherStation = \"WeatherStation\",\n /** A temperature sensor */\n WeatherTemperatureSensor = \"Weather-TemperatureSensor\",\n /** A wind sensor */\n WeatherWindSensor = \"Weather-WindSensor\",\n /** A brightness sensor */\n WeatherBrightnessSensor = \"Weather-BrightnessSensor\",\n /** A rain sensor */\n WeatherRainSensor = \"Weather-RainSensor\",\n /** A window actuator */\n WindowActuator = \"WindowActuator\",\n /** A detector for carbon monoxide (CO) */\n CODetector = \"CODetector\",\n /** A fire detector */\n FireDetector = \"FireDetector\",\n /** A KNX switch sensor */\n KNXSwitchSensor = \"KNX-SwitchSensor\",\n /** A media player */\n MediaPlayer = \"MediaPlayer\",\n /** A battery */\n EnergyBattery = \"EnergyBattery\",\n /** An inverter */\n EnergyInverter = \"EnergyInverter\",\n /** An energy meter */\n EnergyMeter = \"EnergyMeter\",\n /** A device combining inverter and battery characteristics */\n EnergyInverterBattery = \"EnergyInverterBattery\",\n /** A device combining inverter and energy meter characteristics */\n EnergyInverterMeter = \"EnergyInverterMeter\",\n /** A device combining inverter, battery and energy meter characteristics */\n EnergyInverterMeterBattery = \"EnergyInverterMeterBattery\",\n /** A device combining battery and energy meter characteristics */\n EnergyMeterBattery = \"EnergyMeterBattery\",\n /** An air quality sensor measuring carbon dioxide (CO2) */\n AirQualityCO2 = \"AirQualityCO2\",\n /** An air quality sensor measuring carbon monoxide (CO) */\n AirQualityCO = \"AirQualityCO\",\n /** An full air quality sensor */\n AirQualityFull = \"AirQualityFull\",\n /** An air quality sensor measuring humidity */\n AirQualityHumidity = \"AirQualityHumidity\",\n /** An air quality sensor measuring nitrogen dioxide (NO2) */\n AirQualityNO2 = \"AirQualityNO2\",\n /** An air quality sensor measuring ozone (O3) */\n AirQualityO3 = \"AirQualityO3\",\n /** An air quality sensor measuring coarse particulate matter with in the 10 micron scale */\n AirQualityPM10 = \"AirQualityPM10\",\n /** An air quality sensor measuring coarse particulate matter with in the 25 micron scale */\n AirQualityPM25 = \"AirQualityPM25\",\n /** An air quality sensor measuring barometric pressure */\n AirQualityPressure = \"AirQualityPressure\",\n /** An air quality sensor measuring temperature */\n AirQualityTemperature = \"AirQualityTemperature\",\n /** An air quality sensor measuring volatile organic compounds */\n AirQualityVOC = \"AirQualityVOC\",\n /** A version 2 energy meter */\n EnergyMeterV2 = \"EnergyMeterv2\",\n HomeApplianceLaundry = \"HomeAppliance-Laundry\",\n HVAC = \"HVAC\",\n SplitUnit = \"SplitUnit\",\n}\n","import { EventEmitter } from \"events\";\nimport {\n interval,\n Observable,\n SchedulerLike,\n Subject,\n Subscription,\n switchMap,\n takeUntil,\n} from \"rxjs\";\nimport { ClientOptions, RawData, WebSocket } from \"ws\";\nimport {\n Configuration,\n DeviceList,\n DeviceResponse,\n GetDataPointResponse,\n isConfiguration,\n isDeviceList,\n isDeviceResponse,\n isGetDataPointResponse,\n isSetDataPointResponse,\n isWebSocketMessage,\n Logger,\n SetDataPointResponse,\n VirtualDevice,\n VirtualDeviceResponse,\n WebSocketMessage,\n} from \"./model\";\nimport { isVirtualDeviceResponse } from \"./model/validator\";\n\n/** The HTTP request method */\ntype HttpRequestMethod = \"GET\" | \"POST\" | \"DELETE\" | \"PATCH\" | \"PUT\";\n\n/** The class representing a System Access Point. */\nexport class SystemAccessPoint extends EventEmitter {\n /** The basic authentication key used for requests. */\n public readonly basicAuthKey: string;\n private webSocket?: WebSocket;\n private readonly webSocketMessageSubject = new Subject<WebSocketMessage>();\n private readonly webSocketKeepaliveTimerReset$ = new Subject<void>();\n private readonly webSocketKeepaliveTimer$ =\n this.webSocketKeepaliveTimerReset$.pipe(\n switchMap(() =>\n interval(30000, this.scheduler).pipe(\n takeUntil(this.webSocketKeepaliveTimerReset$)\n )\n )\n );\n private webSocketKeepaliveSubscription?: Subscription;\n\n /**\n * Constructs a new SystemAccessPoint instance\n *\n * @constructor\n * @param hostName {string} The system access point host name.\n * @param userName {string} The user name that shall be used to authenticate with the system access point.\n * @param password {string} The password that shall be used to authenticate with the system access point.\n * @param tlsEnabled {boolean} Determines whether the communication with the system access point shall be protected by TLS.\n * @param verboseErrors {boolean} Determines whether verbose error messages shall be used, for example for message validation.\n * @param logger {Logger} The logger instance to be used. If no explicit implementation is provided, the this.logger will be used for logging.\n */\n constructor(\n private readonly hostName: string,\n readonly userName: string,\n readonly password: string,\n private readonly tlsEnabled = true,\n private readonly verboseErrors = false,\n private readonly logger: Logger = console,\n readonly scheduler?: SchedulerLike\n ) {\n super();\n\n // Create Basic Authentication key\n this.basicAuthKey = Buffer.from(`${userName}:${password}`, \"utf8\").toString(\n \"base64\"\n );\n }\n\n /**\n * Connects to the System Access Point web socket.\n * @param certificateVerification {boolean} Determines whether the TLS certificate presented by the server will be verified.\n */\n public connectWebSocket(certificateVerification: boolean = true): void {\n if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {\n throw new Error(\"Web socket is already connected\");\n }\n\n this.webSocket = this.createWebSocket(certificateVerification);\n // (Re-)create the web socket keepalive timer\n this.webSocketKeepaliveSubscription?.unsubscribe();\n this.webSocketKeepaliveSubscription = undefined;\n this.webSocketKeepaliveSubscription =\n this.webSocketKeepaliveTimer$.subscribe(() => {\n if (!(this.webSocket && this.webSocket.readyState === WebSocket.OPEN))\n return;\n\n this.logger.log(\"keepalive timer expired, sending ping message...\");\n this.webSocket.ping();\n });\n this.webSocketKeepaliveTimerReset$.next();\n }\n\n /**\n * Creates a new virtual device.\n * @param sysApUuid {string} The UUID identifying the system access point.\n * @param deviceSerial {string} The serial number to be assigned to the device.\n * @param virtualDevice {VirtualDevice} The virtual device to be created.\n * @returns {Promise.<VirtualDeviceResponse>} The response to the virtual device request.\n */\n public async createVirtualDevice(\n sysApUuid: string,\n deviceSerial: string,\n virtualDevice: VirtualDevice\n ): Promise<VirtualDeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"PUT\",\n `virtualdevice/${sysApUuid}/${deviceSerial}`,\n JSON.stringify(virtualDevice)\n );\n\n // Process response\n return this.processRestResponse(response, isVirtualDeviceResponse);\n }\n\n private createWebSocket(certificateVerification: boolean): WebSocket {\n // Disabling certificate verification is discouraged, issue a warning\n if (this.tlsEnabled && !certificateVerification) {\n this.logger.warn(\n \"TLS certificate verification is disabled! This poses a security risk, activating certificate verification is strictly recommended.\"\n );\n }\n\n const url = `${this.tlsEnabled ? \"wss\" : \"ws\"}://${\n this.hostName\n }/fhapi/v1/api/ws`;\n const options: ClientOptions = {\n rejectUnauthorized: this.tlsEnabled && certificateVerification,\n headers: {\n Authorization: `Basic ${this.basicAuthKey}`,\n },\n };\n const webSocket = new WebSocket(url, options);\n webSocket.on(\"error\", (error: Error) => {\n this.emit(\"websocket-error\", error);\n this.logger.error(\"Error received\", error);\n });\n webSocket.on(\"ping\", (data: Buffer) => {\n this.emit(\"websocket-ping\", data);\n this.logger.debug(\"Ping received\", data.toString(\"ascii\"));\n this.webSocketKeepaliveTimerReset$.next();\n webSocket.pong(data);\n this.logger.debug(\"Pong sent\", data.toString(\"ascii\"));\n });\n webSocket.on(\"pong\", (data: Buffer) => {\n this.emit(\"websocket-pong\", data);\n this.logger.debug(\"Pong received\", data.toString(\"ascii\"));\n });\n webSocket.on(\"unexpected-response\", (request, response) => {\n this.emit(\"websocket-unexpected-response\", request, response);\n this.logger.error(\"Unexpected response received\");\n });\n webSocket.on(\"upgrade\", (request) => {\n this.emit(\"websocket-upgrade\", request);\n this.logger.debug(\"Upgrade request received\");\n });\n webSocket.on(\"open\", () => {\n this.emit(\"websocket-open\");\n this.logger.log(\"Connection opened\");\n });\n webSocket.on(\"close\", (code, reason) => {\n this.emit(\"websocket-close\", code, reason);\n this.logger.log(\"Connection closed\");\n this.webSocketKeepaliveSubscription?.unsubscribe();\n this.webSocketKeepaliveSubscription = undefined;\n });\n webSocket.on(\"message\", (data: RawData, isBinary: boolean) => {\n this.emit(\"websocket-message\", data, isBinary);\n this.webSocketKeepaliveTimerReset$.next();\n this.processWebSocketMessage(data, isBinary);\n });\n return webSocket;\n }\n\n /**\n * Disconnects from the System Access Point web socket.\n * @param force {boolean} Determines whether or not the connection will be closed forcibly.\n */\n public disconnectWebSocket(force: boolean = false): void {\n if (!this.webSocket || this.webSocket.readyState === WebSocket.CLOSED) {\n throw new Error(\"Web socket is not open\");\n }\n\n if (force) {\n this.webSocket.terminate();\n } else {\n this.webSocket.close();\n }\n }\n\n /**\n * Gets the configuration from the system access point.\n * @returns {Promise.<Configuration>} The system access point configuration.\n */\n public async getConfiguration(): Promise<Configuration> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n \"configuration\"\n );\n\n // Process response\n return this.processRestResponse(response, isConfiguration);\n }\n\n /**\n * Gets the device list from the system access point.\n * @returns {Promise.<DeviceList>} The requested device list.\n */\n public async getDeviceList(): Promise<DeviceList> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\"GET\", \"devicelist\");\n\n // Process response\n return this.processRestResponse(response, isDeviceList);\n }\n\n /**\n * Gets the specified device from the system access point.\n * @param sysApUuid {string} The UUID identifying the system access point.\n * @param deviceSerial {string} The device serial number.\n * @returns {Promise.<DeviceResponse>} The response to the device request.\n */\n public async getDevice(\n sysApUuid: string,\n deviceSerial: string\n ): Promise<DeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n `device/${sysApUuid}/${deviceSerial}`\n );\n\n // Process response\n return this.processRestResponse(response, isDeviceResponse);\n }\n\n /**\n * Gets the specified data point from the system access point.\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceSerial {string} The device serial number.\n * @param channel {string} The channel identifier.\n * @param dataPoint {string} The datapoint identifier.\n * @returns {Promise.<GetDataPointResponse>} The response to the get data point request.\n */\n public async getDatapoint(\n sysApUuid: string,\n deviceSerial: string,\n channel: string,\n dataPoint: string\n ): Promise<GetDataPointResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n `datapoint/${sysApUuid}/${deviceSerial}.${channel}.${dataPoint}`\n );\n\n // Process response\n return this.processRestResponse(response, isGetDataPointResponse);\n }\n\n /**\n * Gets the web socket messages.\n * @returns {Observable.<WebSocketMessage>} An observable that is updated with the messages received from the web socket.\n */\n public getWebSocketMessages(): Observable<WebSocketMessage> {\n return this.webSocketMessageSubject.asObservable();\n }\n\n /**\n * Sets a new value for the specificed data point.\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceSerial {string} The device serial number.\n * @param channel {string} The channel identifier.\n * @param dataPoint {string} The datapoint identifier.\n * @param value {string} The new value to be set.\n * @returns {Promise.<SetDataPointResponse>} The response to the set data point request.\n */\n public async setDatapoint(\n sysApUuid: string,\n deviceSerial: string,\n channel: string,\n dataPoint: string,\n value: string\n ): Promise<SetDataPointResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"PUT\",\n `datapoint/${sysApUuid}/${deviceSerial}.${channel}.${dataPoint}`,\n value\n );\n\n // Process response\n return this.processRestResponse(response, isSetDataPointResponse);\n }\n\n /**\n * Triggeres the given action for the specified proxy device. Please note that this method is part of the experimental API!\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceClass {string} The device class.\n * @param deviceSerial {string} The device serial number.\n * @param action {string} The action to be triggered.\n * @returns {Promise.<DeviceResponse>} The response to the request.\n */\n public async triggerProxyDevice(\n sysApUuid: string,\n deviceClass: string,\n deviceSerial: string,\n action: string\n ): Promise<DeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n `proxydevice/${sysApUuid}/${deviceClass}/${deviceSerial}/action/${action}`\n );\n\n // Process response\n return this.processRestResponse(response, isDeviceResponse);\n }\n\n /**\n * Sets the given value for the specified proxy device. Please note that this method is part of the experimental API!\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceClass {string} The device class.\n * @param deviceSerial {string} The device serial number.\n * @param value {string} The value to be set.\n * @returns {Promise.<DeviceResponse>} The response to the request.\n */\n public async setProxyDeviceValue(\n sysApUuid: string,\n deviceClass: string,\n deviceSerial: string,\n value: string\n ): Promise<DeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"PUT\",\n `proxydevice/${sysApUuid}/${deviceClass}/${deviceSerial}/value/${value}`\n );\n\n // Process response\n return this.processRestResponse(response, isDeviceResponse);\n }\n\n private async fetchDataViaRest(\n method: HttpRequestMethod,\n route: string,\n body: BodyInit | null | undefined = undefined\n ): Promise<Response> {\n // Set up request info\n const info: RequestInfo = `${this.tlsEnabled ? \"https\" : \"http\"}://${\n this.hostName\n }/fhapi/v1/api/rest/${route}`;\n\n // Set up request init\n const init: RequestInit = {\n method: method,\n headers: {\n Authorization: `Basic ${this.basicAuthKey}`,\n },\n body: body,\n };\n\n // Get response from system access point\n return fetch(info, init);\n }\n\n private async processRestResponse<TResponse>(\n response: Response,\n typeGuard: (\n obj: unknown,\n logger: Logger,\n verbose: boolean\n ) => obj is TResponse\n ): Promise<TResponse> {\n let body: unknown;\n let message: string;\n\n // Process response\n switch (response.status) {\n case 200:\n body = await response.json();\n if (!typeGuard(body, this.logger, this.verboseErrors)) {\n message = \"Received message has an unexpected type!\";\n this.logger.error(message, body);\n throw new Error(message);\n }\n\n return body;\n case 401:\n message = \"Authentication information is missing or invalid.\";\n this.logger.error(message);\n throw new Error(message);\n case 502:\n message = await response.text();\n this.logger.error(message);\n throw new Error(message);\n default:\n message = `Received HTTP ${\n response.status\n } status code unexpectedly: ${await response.text()}`;\n this.logger.error(message);\n throw new Error(message);\n }\n }\n\n private processWebSocketMessage(data: RawData, isBinary: boolean): void {\n // Do not process binary messages\n if (isBinary) {\n this.logger.warn(\n \"Binary message received. Binary messages are not processed.\"\n );\n return;\n }\n\n this.logger.debug(\"Message received\");\n /*\n * Deserialize the message.\n * The message is expected to be deserializable as a web socket message.\n * If that is not the case, that's an error case.\n */\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const serialized = data.toString();\n const message: unknown = JSON.parse(serialized);\n\n if (isWebSocketMessage(message, this.logger, this.verboseErrors)) {\n this.webSocketMessageSubject.next(message);\n return;\n }\n\n this.logger.error(\"Received message has an unexpected type!\", serialized);\n }\n}\n"],"mappings":"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","names":["VirtualDeviceType","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","Error","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","import_ts_interface_checker","Channel","Configuration","Device","DeviceList","DeviceResponse","GetDataPointResponse","SetDataPointResponse","VirtualDevice","VirtualDeviceResponse","WebSocketMessage","VirtualDeviceType"]}
|
package/dist/index.mjs
CHANGED
|
@@ -492,12 +492,15 @@ var SystemAccessPoint = class extends EventEmitter {
|
|
|
492
492
|
throw new Error("Web socket is already connected");
|
|
493
493
|
}
|
|
494
494
|
this.webSocket = this.createWebSocket(certificateVerification);
|
|
495
|
+
this.webSocketKeepaliveSubscription?.unsubscribe();
|
|
496
|
+
this.webSocketKeepaliveSubscription = void 0;
|
|
495
497
|
this.webSocketKeepaliveSubscription = this.webSocketKeepaliveTimer$.subscribe(() => {
|
|
496
498
|
if (!(this.webSocket && this.webSocket.readyState === WebSocket.OPEN))
|
|
497
499
|
return;
|
|
498
500
|
this.logger.log("keepalive timer expired, sending ping message...");
|
|
499
501
|
this.webSocket.ping();
|
|
500
502
|
});
|
|
503
|
+
this.webSocketKeepaliveTimerReset$.next();
|
|
501
504
|
}
|
|
502
505
|
/**
|
|
503
506
|
* Creates a new virtual device.
|
|
@@ -535,6 +538,9 @@ var SystemAccessPoint = class extends EventEmitter {
|
|
|
535
538
|
webSocket.on("ping", (data) => {
|
|
536
539
|
this.emit("websocket-ping", data);
|
|
537
540
|
this.logger.debug("Ping received", data.toString("ascii"));
|
|
541
|
+
this.webSocketKeepaliveTimerReset$.next();
|
|
542
|
+
webSocket.pong(data);
|
|
543
|
+
this.logger.debug("Pong sent", data.toString("ascii"));
|
|
538
544
|
});
|
|
539
545
|
webSocket.on("pong", (data) => {
|
|
540
546
|
this.emit("websocket-pong", data);
|
|
@@ -555,6 +561,8 @@ var SystemAccessPoint = class extends EventEmitter {
|
|
|
555
561
|
webSocket.on("close", (code, reason) => {
|
|
556
562
|
this.emit("websocket-close", code, reason);
|
|
557
563
|
this.logger.log("Connection closed");
|
|
564
|
+
this.webSocketKeepaliveSubscription?.unsubscribe();
|
|
565
|
+
this.webSocketKeepaliveSubscription = void 0;
|
|
558
566
|
});
|
|
559
567
|
webSocket.on("message", (data, isBinary) => {
|
|
560
568
|
this.emit("websocket-message", data, isBinary);
|
|
@@ -571,8 +579,6 @@ var SystemAccessPoint = class extends EventEmitter {
|
|
|
571
579
|
if (!this.webSocket || this.webSocket.readyState === WebSocket.CLOSED) {
|
|
572
580
|
throw new Error("Web socket is not open");
|
|
573
581
|
}
|
|
574
|
-
this.webSocketKeepaliveSubscription?.unsubscribe();
|
|
575
|
-
this.webSocketKeepaliveSubscription = void 0;
|
|
576
582
|
if (force) {
|
|
577
583
|
this.webSocket.terminate();
|
|
578
584
|
} else {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/model/validation/channel-ti.ts","../src/model/validation/configuration-ti.ts","../src/model/validation/device-ti.ts","../src/model/validation/device-list-ti.ts","../src/model/validation/device-response-ti.ts","../src/model/validation/devices-ti.ts","../src/model/validation/error-ti.ts","../src/model/validation/floors-ti.ts","../src/model/validation/get-data-point-response-ti.ts","../src/model/validation/in-out-put-ti.ts","../src/model/validation/rooms-ti.ts","../src/model/validation/scenes-triggered-ti.ts","../src/model/validation/set-data-point-response-ti.ts","../src/model/validation/sys-ap-ti.ts","../src/model/validation/users-ti.ts","../src/model/validation/virtual-device-ti.ts","../src/model/validation/virtual-device-response-ti.ts","../src/model/validation/websocket-message-ti.ts","../src/model/validator.ts","../src/model/virtual-device.ts","../src/system-access-point.ts"],"sourcesContent":["import { ITypeSuite, iface, indexKey, opt } from \"ts-interface-checker\";\n\nconst Channel = iface([], {\n displayName: opt(\"string\"),\n functionID: opt(\"string\"),\n room: opt(\"string\"),\n floor: opt(\"string\"),\n inputs: opt(\n iface([], {\n [indexKey]: \"InOutPut\",\n })\n ),\n outputs: opt(\n iface([], {\n [indexKey]: \"InOutPut\",\n })\n ),\n parameters: opt(\n iface([], {\n [indexKey]: \"string\",\n })\n ),\n type: opt(\"string\"),\n});\n\nexport const ChannelTypeSuite: ITypeSuite = {\n Channel,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Configuration = iface([], {\n [indexKey]: \"SysAP\",\n});\n\nexport const ConfigurationTypeSuite: ITypeSuite = {\n Configuration,\n};\n","import { iface, indexKey, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst Device = iface([], {\n displayName: opt(\"string\"),\n room: opt(\"string\"),\n floor: opt(\"string\"),\n interface: opt(\"string\"),\n nativeId: opt(\"string\"),\n channels: opt(\n iface([], {\n [indexKey]: \"Channel\",\n })\n ),\n parameters: opt(\n iface([], {\n [indexKey]: \"string\",\n })\n ),\n});\n\nexport const DeviceTypeSuite: ITypeSuite = {\n Device,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst DeviceList = iface([], {\n [indexKey]: array(\"string\"),\n});\n\nexport const DeviceListTypeSuite: ITypeSuite = {\n DeviceList,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst DeviceResponse = iface([], {\n [indexKey]: iface([], {\n devices: \"Devices\",\n }),\n});\n\nexport const DeviceResponseTypeSuite: ITypeSuite = {\n DeviceResponse,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Devices = iface([], {\n [indexKey]: \"Device\",\n});\n\nexport const DevicesTypeSuite: ITypeSuite = {\n Devices,\n};\n","import { iface, ITypeSuite } from \"ts-interface-checker\";\n\nconst Error = iface([], {\n code: \"string\",\n detail: \"string\",\n title: \"string\",\n});\n\nexport const ErrorTypeSuite: ITypeSuite = {\n Error,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Floors = iface([], {\n [indexKey]: iface([], {\n name: \"string\",\n rooms: \"Rooms\",\n }),\n});\n\nexport const FloorsTypeSuite: ITypeSuite = {\n Floors,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst GetDataPointResponse = iface([], {\n [indexKey]: iface([], {\n values: array(\"string\"),\n }),\n});\n\nexport const GetDataPointResponseTypeSuite: ITypeSuite = {\n GetDataPointResponse,\n};\n","import { iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst InOutPut = iface([], {\n value: opt(\"string\"),\n pairingID: opt(\"number\"),\n});\n\nexport const InOutPutTypeSuite: ITypeSuite = {\n InOutPut,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Rooms = iface([], {\n [indexKey]: iface([], {\n name: \"string\",\n }),\n});\n\nexport const RoomsTypeSuite: ITypeSuite = {\n Rooms,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst ScenesTriggered = iface([], {\n [indexKey]: iface([], {\n channels: iface([], {\n [indexKey]: iface([], {\n outputs: iface([], {\n [indexKey]: iface([], {\n value: \"string\",\n pairingID: \"number\",\n }),\n }),\n }),\n }),\n }),\n});\n\nexport const ScenesTriggeredTypeSuite: ITypeSuite = {\n ScenesTriggered,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst SetDataPointResponse = iface([], {\n [indexKey]: iface([], {\n [indexKey]: \"string\",\n }),\n});\n\nexport const SetDataPointResponseTypeSuite: ITypeSuite = {\n SetDataPointResponse,\n};\n","import { iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst SysAP = iface([], {\n devices: \"Devices\",\n floorplan: iface([], {\n floors: \"Floors\",\n }),\n sysapName: \"string\",\n users: \"Users\",\n error: opt(\"Error\"),\n});\n\nexport const SysApTypeSuite: ITypeSuite = {\n SysAP,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Users = iface([], {\n [indexKey]: iface([], {\n enabled: \"boolean\",\n flags: array(\"string\"),\n grantedPermissions: array(\"string\"),\n jid: \"string\",\n name: \"string\",\n requestedPermissions: array(\"string\"),\n role: \"string\",\n }),\n});\n\nexport const UsersTypeSuite: ITypeSuite = {\n Users,\n};\n","import { array, enumtype, iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst VirtualDevice = iface([], {\n type: \"VirtualDeviceType\",\n properties: opt(\n iface([], {\n ttl: opt(\"string\"),\n displayname: opt(\"string\"),\n flavor: opt(\"string\"),\n capabilities: opt(array(\"number\")),\n })\n ),\n});\n\nexport const VirtualDeviceType = enumtype({\n BinarySensor: \"BinarySensor\",\n BlindActuator: \"BlindActuator\",\n SwitchingActuator: \"SwitchingActuator\",\n CeilingFanActuator: \"CeilingFanActuator\",\n RTC: \"RTC\",\n DimActuator: \"DimActuator\",\n EVCharging: \"evcharging\",\n WindowSensor: \"WindowSensor\",\n SimpleDoorlock: \"simple_doorlock\",\n ShutterActuator: \"ShutterActuator\",\n WeatherStation: \"WeatherStation\",\n WeatherTemperatureSensor: \"Weather-TemperatureSensor\",\n WeatherWindSensor: \"Weather-WindSensor\",\n WeatherBrightnessSensor: \"Weather-BrightnessSensor\",\n WeatherRainSensor: \"Weather-RainSensor\",\n WindowActuator: \"WindowActuator\",\n CODetector: \"CODetector\",\n FireDetector: \"FireDetector\",\n KNXSwitchSensor: \"KNX-SwitchSensor\",\n MediaPlayer: \"MediaPlayer\",\n EnergyBattery: \"EnergyBattery\",\n EnergyInverter: \"EnergyInverter\",\n EnergyMeter: \"EnergyMeter\",\n EnergyInverterBattery: \"EnergyInverterBattery\",\n EnergyInverterMeter: \"EnergyInverterMeter\",\n EnergyInverterMeterBattery: \"EnergyInverterMeterBattery\",\n EnergyMeterBattery: \"EnergyMeterBattery\",\n AirQualityCO2: \"AirQualityCO2\",\n AirQualityCO: \"AirQualityCO\",\n AirQualityFull: \"AirQualityFull\",\n AirQualityHumidity: \"AirQualityHumidity\",\n AirQualityNO2: \"AirQualityNO2\",\n AirQualityO3: \"AirQualityO3\",\n AirQualityPM10: \"AirQualityPM10\",\n AirQualityPM25: \"AirQualityPM25\",\n AirQualityPressure: \"AirQualityPressure\",\n AirQualityTemperature: \"AirQualityTemperature\",\n AirQualityVOC: \"AirQualityVOC\",\n EnergyMeterV2: \"EnergyMeterv2\",\n HomeApplianceLaundry: \"HomeAppliance-Laundry\",\n HVAC: \"HVAC\",\n SplitUnit: \"SplitUnit\",\n});\n\nexport const VirtualDeviceTypeSuite: ITypeSuite = {\n VirtualDevice,\n VirtualDeviceType,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst VirtualDeviceResponse = iface([], {\n [indexKey]: iface([], {\n devices: iface([], {\n [indexKey]: iface([], {\n serial: \"string\",\n }),\n }),\n }),\n});\n\nexport const VirtualDeviceResponseTypeSuite: ITypeSuite = {\n VirtualDeviceResponse,\n};\n","import { array, iface, indexKey, ITypeSuite, opt } from \"ts-interface-checker\";\n\nconst WebSocketMessage = iface([], {\n [indexKey]: iface([], {\n datapoints: iface([], {\n [indexKey]: \"string\",\n }),\n devices: \"Devices\",\n devicesAdded: array(\"string\"),\n devicesRemoved: array(\"string\"),\n scenesTriggered: \"ScenesTriggered\",\n parameters: opt(\n iface([], {\n [indexKey]: \"string\",\n })\n ),\n }),\n});\n\nexport const WebSocketMessageTypeSuite: ITypeSuite = {\n WebSocketMessage,\n};\n","import {\n ChannelTypeSuite,\n DeviceTypeSuite,\n DevicesTypeSuite,\n InOutPutTypeSuite,\n ScenesTriggeredTypeSuite,\n WebSocketMessageTypeSuite,\n DeviceListTypeSuite,\n SetDataPointResponseTypeSuite,\n GetDataPointResponseTypeSuite,\n ConfigurationTypeSuite,\n FloorsTypeSuite,\n RoomsTypeSuite,\n SysApTypeSuite,\n UsersTypeSuite,\n ErrorTypeSuite,\n DeviceResponseTypeSuite,\n VirtualDeviceTypeSuite,\n VirtualDeviceResponseTypeSuite,\n} from \"./validation\";\nimport { Checker, createCheckers } from \"ts-interface-checker\";\nimport { WebSocketMessage as Message } from \"./websocket-message\";\nimport { Configuration as Config } from \"./configuration\";\nimport { Channel as Chan } from \"./channel\";\nimport { Device as Dev } from \"./device\";\nimport { DeviceList as DevList } from \"./device-list\";\nimport { DeviceResponse as DevResponse } from \"./device-response\";\nimport { GetDataPointResponse as GetResponse } from \"./get-data-point-response\";\nimport { SetDataPointResponse as SetResponse } from \"./set-data-point-response\";\nimport { VirtualDeviceResponse as VDeviceResponse } from \"./virtual-device-response\";\nimport { VirtualDevice as VDevice } from \"./virtual-device\";\nimport { Logger } from \"./logger\";\n\nconst { Channel } = createCheckers(ChannelTypeSuite, InOutPutTypeSuite);\n\nconst { Configuration } = createCheckers(\n ConfigurationTypeSuite,\n DevicesTypeSuite,\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite,\n FloorsTypeSuite,\n RoomsTypeSuite,\n SysApTypeSuite,\n UsersTypeSuite,\n ErrorTypeSuite\n);\n\nconst { Device } = createCheckers(\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite\n);\n\nconst { DeviceList } = createCheckers(DeviceListTypeSuite);\n\nconst { DeviceResponse } = createCheckers(\n DeviceResponseTypeSuite,\n DevicesTypeSuite,\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite\n);\n\nconst { GetDataPointResponse } = createCheckers(GetDataPointResponseTypeSuite);\n\nconst { SetDataPointResponse } = createCheckers(SetDataPointResponseTypeSuite);\n\nconst { VirtualDevice } = createCheckers(VirtualDeviceTypeSuite);\n\nconst { VirtualDeviceResponse } = createCheckers(\n VirtualDeviceResponseTypeSuite\n);\n\nconst { WebSocketMessage } = createCheckers(\n WebSocketMessageTypeSuite,\n DevicesTypeSuite,\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite,\n ScenesTriggeredTypeSuite\n);\n\nfunction check(\n obj: unknown,\n checker: Checker,\n logger: Logger,\n verbose: boolean\n): boolean {\n if (verbose) {\n try {\n checker.check(obj);\n return true;\n } catch (error) {\n logger.error(\"Object validation failed!\", error);\n return false;\n }\n }\n\n return checker.test(obj);\n}\n\n/**\n * Determines whether the specified object is a web socket message.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a web socket message.\n */\nexport function isWebSocketMessage(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Message {\n return check(obj, WebSocketMessage, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a configuration.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a configuration.\n */\nexport function isConfiguration(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Config {\n return check(obj, Configuration, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device list.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device list.\n */\nexport function isDeviceList(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is DevList {\n return check(obj, DeviceList, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device response.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device response.\n */\nexport function isDeviceResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is DevResponse {\n return check(obj, DeviceResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a valid response to a get data point request.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a get data point request.\n */\nexport function isGetDataPointResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is GetResponse {\n return check(obj, GetDataPointResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a valid response to a set data point request.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a set data point request.\n */\nexport function isSetDataPointResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is SetResponse {\n return check(obj, SetDataPointResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a virtual device.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a virtual device.\n */\nexport function isVirtualDevice(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is VDevice {\n return check(obj, VirtualDevice, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a virtual device response.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a virtual device request.\n */\nexport function isVirtualDeviceResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is VDeviceResponse {\n return check(obj, VirtualDeviceResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a channel.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a channel.\n */\nexport function isChannel(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Chan {\n return check(obj, Channel, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device.\n */\nexport function isDevice(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Dev {\n return check(obj, Device, logger, verbose);\n}\n","/** Defines a virtual device. */\nexport interface VirtualDevice {\n /** The virtual device type. */\n type: VirtualDeviceType;\n /** The virtual device properties */\n properties?: {\n /** The time to live value indicates the number of seconds the system access point will wait for a message before it assumes the device to be unresponsive. */\n ttl?: string;\n /** The display name for the virtual device. */\n displayname?: string;\n /** The virtual device flavor. */\n flavor?: string;\n /** The virtual device capabilities. */\n capabilities?: Array<number>;\n };\n}\n\n/** Defines the possible types of virtual devices. */\nexport enum VirtualDeviceType {\n /** A binary sensor */\n BinarySensor = \"BinarySensor\",\n /** A blind actuator */\n BlindActuator = \"BlindActuator\",\n /** A switching actuator */\n SwitchingActuator = \"SwitchingActuator\",\n /** A ceiling fan actuator */\n CeilingFanActuator = \"CeilingFanActuator\",\n /** A real time clock */\n RTC = \"RTC\",\n /** A dimmer actuator */\n DimActuator = \"DimActuator\",\n /** A charger for an electronic vehicle */\n EVCharging = \"evcharging\",\n /** A window sensor */\n WindowSensor = \"WindowSensor\",\n /** A simple door lock */\n SimpleDoorlock = \"simple_doorlock\",\n /** A shutter actuator */\n ShutterActuator = \"ShutterActuator\",\n /** A weather station */\n WeatherStation = \"WeatherStation\",\n /** A temperature sensor */\n WeatherTemperatureSensor = \"Weather-TemperatureSensor\",\n /** A wind sensor */\n WeatherWindSensor = \"Weather-WindSensor\",\n /** A brightness sensor */\n WeatherBrightnessSensor = \"Weather-BrightnessSensor\",\n /** A rain sensor */\n WeatherRainSensor = \"Weather-RainSensor\",\n /** A window actuator */\n WindowActuator = \"WindowActuator\",\n /** A detector for carbon monoxide (CO) */\n CODetector = \"CODetector\",\n /** A fire detector */\n FireDetector = \"FireDetector\",\n /** A KNX switch sensor */\n KNXSwitchSensor = \"KNX-SwitchSensor\",\n /** A media player */\n MediaPlayer = \"MediaPlayer\",\n /** A battery */\n EnergyBattery = \"EnergyBattery\",\n /** An inverter */\n EnergyInverter = \"EnergyInverter\",\n /** An energy meter */\n EnergyMeter = \"EnergyMeter\",\n /** A device combining inverter and battery characteristics */\n EnergyInverterBattery = \"EnergyInverterBattery\",\n /** A device combining inverter and energy meter characteristics */\n EnergyInverterMeter = \"EnergyInverterMeter\",\n /** A device combining inverter, battery and energy meter characteristics */\n EnergyInverterMeterBattery = \"EnergyInverterMeterBattery\",\n /** A device combining battery and energy meter characteristics */\n EnergyMeterBattery = \"EnergyMeterBattery\",\n /** An air quality sensor measuring carbon dioxide (CO2) */\n AirQualityCO2 = \"AirQualityCO2\",\n /** An air quality sensor measuring carbon monoxide (CO) */\n AirQualityCO = \"AirQualityCO\",\n /** An full air quality sensor */\n AirQualityFull = \"AirQualityFull\",\n /** An air quality sensor measuring humidity */\n AirQualityHumidity = \"AirQualityHumidity\",\n /** An air quality sensor measuring nitrogen dioxide (NO2) */\n AirQualityNO2 = \"AirQualityNO2\",\n /** An air quality sensor measuring ozone (O3) */\n AirQualityO3 = \"AirQualityO3\",\n /** An air quality sensor measuring coarse particulate matter with in the 10 micron scale */\n AirQualityPM10 = \"AirQualityPM10\",\n /** An air quality sensor measuring coarse particulate matter with in the 25 micron scale */\n AirQualityPM25 = \"AirQualityPM25\",\n /** An air quality sensor measuring barometric pressure */\n AirQualityPressure = \"AirQualityPressure\",\n /** An air quality sensor measuring temperature */\n AirQualityTemperature = \"AirQualityTemperature\",\n /** An air quality sensor measuring volatile organic compounds */\n AirQualityVOC = \"AirQualityVOC\",\n /** A version 2 energy meter */\n EnergyMeterV2 = \"EnergyMeterv2\",\n HomeApplianceLaundry = \"HomeAppliance-Laundry\",\n HVAC = \"HVAC\",\n SplitUnit = \"SplitUnit\",\n}\n","import { EventEmitter } from \"events\";\nimport {\n interval,\n Observable,\n SchedulerLike,\n Subject,\n Subscription,\n switchMap,\n takeUntil,\n} from \"rxjs\";\nimport { ClientOptions, RawData, WebSocket } from \"ws\";\nimport {\n Configuration,\n DeviceList,\n DeviceResponse,\n GetDataPointResponse,\n isConfiguration,\n isDeviceList,\n isDeviceResponse,\n isGetDataPointResponse,\n isSetDataPointResponse,\n isWebSocketMessage,\n Logger,\n SetDataPointResponse,\n VirtualDevice,\n VirtualDeviceResponse,\n WebSocketMessage,\n} from \"./model\";\nimport { isVirtualDeviceResponse } from \"./model/validator\";\n\n/** The HTTP request method */\ntype HttpRequestMethod = \"GET\" | \"POST\" | \"DELETE\" | \"PATCH\" | \"PUT\";\n\n/** The class representing a System Access Point. */\nexport class SystemAccessPoint extends EventEmitter {\n /** The basic authentication key used for requests. */\n public readonly basicAuthKey: string;\n private webSocket?: WebSocket;\n private readonly webSocketMessageSubject = new Subject<WebSocketMessage>();\n private readonly webSocketKeepaliveTimerReset$ = new Subject<void>();\n private readonly webSocketKeepaliveTimer$ =\n this.webSocketKeepaliveTimerReset$.pipe(\n switchMap(() =>\n interval(30000, this.scheduler).pipe(\n takeUntil(this.webSocketKeepaliveTimerReset$)\n )\n )\n );\n private webSocketKeepaliveSubscription?: Subscription;\n\n /**\n * Constructs a new SystemAccessPoint instance\n *\n * @constructor\n * @param hostName {string} The system access point host name.\n * @param userName {string} The user name that shall be used to authenticate with the system access point.\n * @param password {string} The password that shall be used to authenticate with the system access point.\n * @param tlsEnabled {boolean} Determines whether the communication with the system access point shall be protected by TLS.\n * @param verboseErrors {boolean} Determines whether verbose error messages shall be used, for example for message validation.\n * @param logger {Logger} The logger instance to be used. If no explicit implementation is provided, the this.logger will be used for logging.\n */\n constructor(\n private readonly hostName: string,\n readonly userName: string,\n readonly password: string,\n private readonly tlsEnabled = true,\n private readonly verboseErrors = false,\n private readonly logger: Logger = console,\n readonly scheduler?: SchedulerLike\n ) {\n super();\n\n // Create Basic Authentication key\n this.basicAuthKey = Buffer.from(`${userName}:${password}`, \"utf8\").toString(\n \"base64\"\n );\n }\n\n /**\n * Connects to the System Access Point web socket.\n * @param certificateVerification {boolean} Determines whether the TLS certificate presented by the server will be verified.\n */\n public connectWebSocket(certificateVerification: boolean = true): void {\n if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {\n throw new Error(\"Web socket is already connected\");\n }\n\n this.webSocket = this.createWebSocket(certificateVerification);\n this.webSocketKeepaliveSubscription =\n this.webSocketKeepaliveTimer$.subscribe(() => {\n if (!(this.webSocket && this.webSocket.readyState === WebSocket.OPEN))\n return;\n\n this.logger.log(\"keepalive timer expired, sending ping message...\");\n this.webSocket.ping();\n });\n }\n\n /**\n * Creates a new virtual device.\n * @param sysApUuid {string} The UUID identifying the system access point.\n * @param deviceSerial {string} The serial number to be assigned to the device.\n * @param virtualDevice {VirtualDevice} The virtual device to be created.\n * @returns {Promise.<VirtualDeviceResponse>} The response to the virtual device request.\n */\n public async createVirtualDevice(\n sysApUuid: string,\n deviceSerial: string,\n virtualDevice: VirtualDevice\n ): Promise<VirtualDeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"PUT\",\n `virtualdevice/${sysApUuid}/${deviceSerial}`,\n JSON.stringify(virtualDevice)\n );\n\n // Process response\n return this.processRestResponse(response, isVirtualDeviceResponse);\n }\n\n private createWebSocket(certificateVerification: boolean): WebSocket {\n // Disabling certificate verification is discouraged, issue a warning\n if (this.tlsEnabled && !certificateVerification) {\n this.logger.warn(\n \"TLS certificate verification is disabled! This poses a security risk, activating certificate verification is strictly recommended.\"\n );\n }\n\n const url = `${this.tlsEnabled ? \"wss\" : \"ws\"}://${\n this.hostName\n }/fhapi/v1/api/ws`;\n const options: ClientOptions = {\n rejectUnauthorized: this.tlsEnabled && certificateVerification,\n headers: {\n Authorization: `Basic ${this.basicAuthKey}`,\n },\n };\n const webSocket = new WebSocket(url, options);\n webSocket.on(\"error\", (error: Error) => {\n this.emit(\"websocket-error\", error);\n this.logger.error(\"Error received\", error);\n });\n webSocket.on(\"ping\", (data: Buffer) => {\n this.emit(\"websocket-ping\", data);\n this.logger.debug(\"Ping received\", data.toString(\"ascii\"));\n });\n webSocket.on(\"pong\", (data: Buffer) => {\n this.emit(\"websocket-pong\", data);\n this.logger.debug(\"Pong received\", data.toString(\"ascii\"));\n });\n webSocket.on(\"unexpected-response\", (request, response) => {\n this.emit(\"websocket-unexpected-response\", request, response);\n this.logger.error(\"Unexpected response received\");\n });\n webSocket.on(\"upgrade\", (request) => {\n this.emit(\"websocket-upgrade\", request);\n this.logger.debug(\"Upgrade request received\");\n });\n webSocket.on(\"open\", () => {\n this.emit(\"websocket-open\");\n this.logger.log(\"Connection opened\");\n });\n webSocket.on(\"close\", (code, reason) => {\n this.emit(\"websocket-close\", code, reason);\n this.logger.log(\"Connection closed\");\n });\n webSocket.on(\"message\", (data: RawData, isBinary: boolean) => {\n this.emit(\"websocket-message\", data, isBinary);\n this.webSocketKeepaliveTimerReset$.next();\n this.processWebSocketMessage(data, isBinary);\n });\n return webSocket;\n }\n\n /**\n * Disconnects from the System Access Point web socket.\n * @param force {boolean} Determines whether or not the connection will be closed forcibly.\n */\n public disconnectWebSocket(force: boolean = false): void {\n if (!this.webSocket || this.webSocket.readyState === WebSocket.CLOSED) {\n throw new Error(\"Web socket is not open\");\n }\n\n this.webSocketKeepaliveSubscription?.unsubscribe();\n this.webSocketKeepaliveSubscription = undefined;\n if (force) {\n this.webSocket.terminate();\n } else {\n this.webSocket.close();\n }\n }\n\n /**\n * Gets the configuration from the system access point.\n * @returns {Promise.<Configuration>} The system access point configuration.\n */\n public async getConfiguration(): Promise<Configuration> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n \"configuration\"\n );\n\n // Process response\n return this.processRestResponse(response, isConfiguration);\n }\n\n /**\n * Gets the device list from the system access point.\n * @returns {Promise.<DeviceList>} The requested device list.\n */\n public async getDeviceList(): Promise<DeviceList> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\"GET\", \"devicelist\");\n\n // Process response\n return this.processRestResponse(response, isDeviceList);\n }\n\n /**\n * Gets the specified device from the system access point.\n * @param sysApUuid {string} The UUID identifying the system access point.\n * @param deviceSerial {string} The device serial number.\n * @returns {Promise.<DeviceResponse>} The response to the device request.\n */\n public async getDevice(\n sysApUuid: string,\n deviceSerial: string\n ): Promise<DeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n `device/${sysApUuid}/${deviceSerial}`\n );\n\n // Process response\n return this.processRestResponse(response, isDeviceResponse);\n }\n\n /**\n * Gets the specified data point from the system access point.\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceSerial {string} The device serial number.\n * @param channel {string} The channel identifier.\n * @param dataPoint {string} The datapoint identifier.\n * @returns {Promise.<GetDataPointResponse>} The response to the get data point request.\n */\n public async getDatapoint(\n sysApUuid: string,\n deviceSerial: string,\n channel: string,\n dataPoint: string\n ): Promise<GetDataPointResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n `datapoint/${sysApUuid}/${deviceSerial}.${channel}.${dataPoint}`\n );\n\n // Process response\n return this.processRestResponse(response, isGetDataPointResponse);\n }\n\n /**\n * Gets the web socket messages.\n * @returns {Observable.<WebSocketMessage>} An observable that is updated with the messages received from the web socket.\n */\n public getWebSocketMessages(): Observable<WebSocketMessage> {\n return this.webSocketMessageSubject.asObservable();\n }\n\n /**\n * Sets a new value for the specificed data point.\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceSerial {string} The device serial number.\n * @param channel {string} The channel identifier.\n * @param dataPoint {string} The datapoint identifier.\n * @param value {string} The new value to be set.\n * @returns {Promise.<SetDataPointResponse>} The response to the set data point request.\n */\n public async setDatapoint(\n sysApUuid: string,\n deviceSerial: string,\n channel: string,\n dataPoint: string,\n value: string\n ): Promise<SetDataPointResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"PUT\",\n `datapoint/${sysApUuid}/${deviceSerial}.${channel}.${dataPoint}`,\n value\n );\n\n // Process response\n return this.processRestResponse(response, isSetDataPointResponse);\n }\n\n /**\n * Triggeres the given action for the specified proxy device. Please note that this method is part of the experimental API!\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceClass {string} The device class.\n * @param deviceSerial {string} The device serial number.\n * @param action {string} The action to be triggered.\n * @returns {Promise.<DeviceResponse>} The response to the request.\n */\n public async triggerProxyDevice(\n sysApUuid: string,\n deviceClass: string,\n deviceSerial: string,\n action: string\n ): Promise<DeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n `proxydevice/${sysApUuid}/${deviceClass}/${deviceSerial}/action/${action}`\n );\n\n // Process response\n return this.processRestResponse(response, isDeviceResponse);\n }\n\n /**\n * Sets the given value for the specified proxy device. Please note that this method is part of the experimental API!\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceClass {string} The device class.\n * @param deviceSerial {string} The device serial number.\n * @param value {string} The value to be set.\n * @returns {Promise.<DeviceResponse>} The response to the request.\n */\n public async setProxyDeviceValue(\n sysApUuid: string,\n deviceClass: string,\n deviceSerial: string,\n value: string\n ): Promise<DeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"PUT\",\n `proxydevice/${sysApUuid}/${deviceClass}/${deviceSerial}/value/${value}`\n );\n\n // Process response\n return this.processRestResponse(response, isDeviceResponse);\n }\n\n private async fetchDataViaRest(\n method: HttpRequestMethod,\n route: string,\n body: BodyInit | null | undefined = undefined\n ): Promise<Response> {\n // Set up request info\n const info: RequestInfo = `${this.tlsEnabled ? \"https\" : \"http\"}://${\n this.hostName\n }/fhapi/v1/api/rest/${route}`;\n\n // Set up request init\n const init: RequestInit = {\n method: method,\n headers: {\n Authorization: `Basic ${this.basicAuthKey}`,\n },\n body: body,\n };\n\n // Get response from system access point\n return fetch(info, init);\n }\n\n private async processRestResponse<TResponse>(\n response: Response,\n typeGuard: (\n obj: unknown,\n logger: Logger,\n verbose: boolean\n ) => obj is TResponse\n ): Promise<TResponse> {\n let body: unknown;\n let message: string;\n\n // Process response\n switch (response.status) {\n case 200:\n body = await response.json();\n if (!typeGuard(body, this.logger, this.verboseErrors)) {\n message = \"Received message has an unexpected type!\";\n this.logger.error(message, body);\n throw new Error(message);\n }\n\n return body;\n case 401:\n message = \"Authentication information is missing or invalid.\";\n this.logger.error(message);\n throw new Error(message);\n case 502:\n message = await response.text();\n this.logger.error(message);\n throw new Error(message);\n default:\n message = `Received HTTP ${\n response.status\n } status code unexpectedly: ${await response.text()}`;\n this.logger.error(message);\n throw new Error(message);\n }\n }\n\n private processWebSocketMessage(data: RawData, isBinary: boolean): void {\n // Do not process binary messages\n if (isBinary) {\n this.logger.warn(\n \"Binary message received. Binary messages are not processed.\"\n );\n return;\n }\n\n this.logger.debug(\"Message received\");\n /*\n * Deserialize the message.\n * The message is expected to be deserializable as a web socket message.\n * If that is not the case, that's an error case.\n */\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const serialized = data.toString();\n const message: unknown = JSON.parse(serialized);\n\n if (isWebSocketMessage(message, this.logger, this.verboseErrors)) {\n this.webSocketMessageSubject.next(message);\n return;\n }\n\n this.logger.error(\"Received message has an unexpected type!\", serialized);\n }\n}\n"],"mappings":"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","names":["iface","indexKey","iface","indexKey","opt","iface","indexKey","iface","indexKey","iface","indexKey","iface","Error","iface","indexKey","array","iface","indexKey","iface","opt","iface","indexKey","iface","indexKey","iface","indexKey","iface","opt","array","iface","indexKey","array","iface","opt","iface","indexKey","array","iface","indexKey","opt","Channel","Configuration","Device","DeviceList","DeviceResponse","GetDataPointResponse","SetDataPointResponse","VirtualDevice","VirtualDeviceResponse","WebSocketMessage","VirtualDeviceType"]}
|
|
1
|
+
{"version":3,"sources":["../src/model/validation/channel-ti.ts","../src/model/validation/configuration-ti.ts","../src/model/validation/device-ti.ts","../src/model/validation/device-list-ti.ts","../src/model/validation/device-response-ti.ts","../src/model/validation/devices-ti.ts","../src/model/validation/error-ti.ts","../src/model/validation/floors-ti.ts","../src/model/validation/get-data-point-response-ti.ts","../src/model/validation/in-out-put-ti.ts","../src/model/validation/rooms-ti.ts","../src/model/validation/scenes-triggered-ti.ts","../src/model/validation/set-data-point-response-ti.ts","../src/model/validation/sys-ap-ti.ts","../src/model/validation/users-ti.ts","../src/model/validation/virtual-device-ti.ts","../src/model/validation/virtual-device-response-ti.ts","../src/model/validation/websocket-message-ti.ts","../src/model/validator.ts","../src/model/virtual-device.ts","../src/system-access-point.ts"],"sourcesContent":["import { ITypeSuite, iface, indexKey, opt } from \"ts-interface-checker\";\n\nconst Channel = iface([], {\n displayName: opt(\"string\"),\n functionID: opt(\"string\"),\n room: opt(\"string\"),\n floor: opt(\"string\"),\n inputs: opt(\n iface([], {\n [indexKey]: \"InOutPut\",\n })\n ),\n outputs: opt(\n iface([], {\n [indexKey]: \"InOutPut\",\n })\n ),\n parameters: opt(\n iface([], {\n [indexKey]: \"string\",\n })\n ),\n type: opt(\"string\"),\n});\n\nexport const ChannelTypeSuite: ITypeSuite = {\n Channel,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Configuration = iface([], {\n [indexKey]: \"SysAP\",\n});\n\nexport const ConfigurationTypeSuite: ITypeSuite = {\n Configuration,\n};\n","import { iface, indexKey, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst Device = iface([], {\n displayName: opt(\"string\"),\n room: opt(\"string\"),\n floor: opt(\"string\"),\n interface: opt(\"string\"),\n nativeId: opt(\"string\"),\n channels: opt(\n iface([], {\n [indexKey]: \"Channel\",\n })\n ),\n parameters: opt(\n iface([], {\n [indexKey]: \"string\",\n })\n ),\n});\n\nexport const DeviceTypeSuite: ITypeSuite = {\n Device,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst DeviceList = iface([], {\n [indexKey]: array(\"string\"),\n});\n\nexport const DeviceListTypeSuite: ITypeSuite = {\n DeviceList,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst DeviceResponse = iface([], {\n [indexKey]: iface([], {\n devices: \"Devices\",\n }),\n});\n\nexport const DeviceResponseTypeSuite: ITypeSuite = {\n DeviceResponse,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Devices = iface([], {\n [indexKey]: \"Device\",\n});\n\nexport const DevicesTypeSuite: ITypeSuite = {\n Devices,\n};\n","import { iface, ITypeSuite } from \"ts-interface-checker\";\n\nconst Error = iface([], {\n code: \"string\",\n detail: \"string\",\n title: \"string\",\n});\n\nexport const ErrorTypeSuite: ITypeSuite = {\n Error,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Floors = iface([], {\n [indexKey]: iface([], {\n name: \"string\",\n rooms: \"Rooms\",\n }),\n});\n\nexport const FloorsTypeSuite: ITypeSuite = {\n Floors,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst GetDataPointResponse = iface([], {\n [indexKey]: iface([], {\n values: array(\"string\"),\n }),\n});\n\nexport const GetDataPointResponseTypeSuite: ITypeSuite = {\n GetDataPointResponse,\n};\n","import { iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst InOutPut = iface([], {\n value: opt(\"string\"),\n pairingID: opt(\"number\"),\n});\n\nexport const InOutPutTypeSuite: ITypeSuite = {\n InOutPut,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Rooms = iface([], {\n [indexKey]: iface([], {\n name: \"string\",\n }),\n});\n\nexport const RoomsTypeSuite: ITypeSuite = {\n Rooms,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst ScenesTriggered = iface([], {\n [indexKey]: iface([], {\n channels: iface([], {\n [indexKey]: iface([], {\n outputs: iface([], {\n [indexKey]: iface([], {\n value: \"string\",\n pairingID: \"number\",\n }),\n }),\n }),\n }),\n }),\n});\n\nexport const ScenesTriggeredTypeSuite: ITypeSuite = {\n ScenesTriggered,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst SetDataPointResponse = iface([], {\n [indexKey]: iface([], {\n [indexKey]: \"string\",\n }),\n});\n\nexport const SetDataPointResponseTypeSuite: ITypeSuite = {\n SetDataPointResponse,\n};\n","import { iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst SysAP = iface([], {\n devices: \"Devices\",\n floorplan: iface([], {\n floors: \"Floors\",\n }),\n sysapName: \"string\",\n users: \"Users\",\n error: opt(\"Error\"),\n});\n\nexport const SysApTypeSuite: ITypeSuite = {\n SysAP,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Users = iface([], {\n [indexKey]: iface([], {\n enabled: \"boolean\",\n flags: array(\"string\"),\n grantedPermissions: array(\"string\"),\n jid: \"string\",\n name: \"string\",\n requestedPermissions: array(\"string\"),\n role: \"string\",\n }),\n});\n\nexport const UsersTypeSuite: ITypeSuite = {\n Users,\n};\n","import { array, enumtype, iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst VirtualDevice = iface([], {\n type: \"VirtualDeviceType\",\n properties: opt(\n iface([], {\n ttl: opt(\"string\"),\n displayname: opt(\"string\"),\n flavor: opt(\"string\"),\n capabilities: opt(array(\"number\")),\n })\n ),\n});\n\nexport const VirtualDeviceType = enumtype({\n BinarySensor: \"BinarySensor\",\n BlindActuator: \"BlindActuator\",\n SwitchingActuator: \"SwitchingActuator\",\n CeilingFanActuator: \"CeilingFanActuator\",\n RTC: \"RTC\",\n DimActuator: \"DimActuator\",\n EVCharging: \"evcharging\",\n WindowSensor: \"WindowSensor\",\n SimpleDoorlock: \"simple_doorlock\",\n ShutterActuator: \"ShutterActuator\",\n WeatherStation: \"WeatherStation\",\n WeatherTemperatureSensor: \"Weather-TemperatureSensor\",\n WeatherWindSensor: \"Weather-WindSensor\",\n WeatherBrightnessSensor: \"Weather-BrightnessSensor\",\n WeatherRainSensor: \"Weather-RainSensor\",\n WindowActuator: \"WindowActuator\",\n CODetector: \"CODetector\",\n FireDetector: \"FireDetector\",\n KNXSwitchSensor: \"KNX-SwitchSensor\",\n MediaPlayer: \"MediaPlayer\",\n EnergyBattery: \"EnergyBattery\",\n EnergyInverter: \"EnergyInverter\",\n EnergyMeter: \"EnergyMeter\",\n EnergyInverterBattery: \"EnergyInverterBattery\",\n EnergyInverterMeter: \"EnergyInverterMeter\",\n EnergyInverterMeterBattery: \"EnergyInverterMeterBattery\",\n EnergyMeterBattery: \"EnergyMeterBattery\",\n AirQualityCO2: \"AirQualityCO2\",\n AirQualityCO: \"AirQualityCO\",\n AirQualityFull: \"AirQualityFull\",\n AirQualityHumidity: \"AirQualityHumidity\",\n AirQualityNO2: \"AirQualityNO2\",\n AirQualityO3: \"AirQualityO3\",\n AirQualityPM10: \"AirQualityPM10\",\n AirQualityPM25: \"AirQualityPM25\",\n AirQualityPressure: \"AirQualityPressure\",\n AirQualityTemperature: \"AirQualityTemperature\",\n AirQualityVOC: \"AirQualityVOC\",\n EnergyMeterV2: \"EnergyMeterv2\",\n HomeApplianceLaundry: \"HomeAppliance-Laundry\",\n HVAC: \"HVAC\",\n SplitUnit: \"SplitUnit\",\n});\n\nexport const VirtualDeviceTypeSuite: ITypeSuite = {\n VirtualDevice,\n VirtualDeviceType,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst VirtualDeviceResponse = iface([], {\n [indexKey]: iface([], {\n devices: iface([], {\n [indexKey]: iface([], {\n serial: \"string\",\n }),\n }),\n }),\n});\n\nexport const VirtualDeviceResponseTypeSuite: ITypeSuite = {\n VirtualDeviceResponse,\n};\n","import { array, iface, indexKey, ITypeSuite, opt } from \"ts-interface-checker\";\n\nconst WebSocketMessage = iface([], {\n [indexKey]: iface([], {\n datapoints: iface([], {\n [indexKey]: \"string\",\n }),\n devices: \"Devices\",\n devicesAdded: array(\"string\"),\n devicesRemoved: array(\"string\"),\n scenesTriggered: \"ScenesTriggered\",\n parameters: opt(\n iface([], {\n [indexKey]: \"string\",\n })\n ),\n }),\n});\n\nexport const WebSocketMessageTypeSuite: ITypeSuite = {\n WebSocketMessage,\n};\n","import {\n ChannelTypeSuite,\n DeviceTypeSuite,\n DevicesTypeSuite,\n InOutPutTypeSuite,\n ScenesTriggeredTypeSuite,\n WebSocketMessageTypeSuite,\n DeviceListTypeSuite,\n SetDataPointResponseTypeSuite,\n GetDataPointResponseTypeSuite,\n ConfigurationTypeSuite,\n FloorsTypeSuite,\n RoomsTypeSuite,\n SysApTypeSuite,\n UsersTypeSuite,\n ErrorTypeSuite,\n DeviceResponseTypeSuite,\n VirtualDeviceTypeSuite,\n VirtualDeviceResponseTypeSuite,\n} from \"./validation\";\nimport { Checker, createCheckers } from \"ts-interface-checker\";\nimport { WebSocketMessage as Message } from \"./websocket-message\";\nimport { Configuration as Config } from \"./configuration\";\nimport { Channel as Chan } from \"./channel\";\nimport { Device as Dev } from \"./device\";\nimport { DeviceList as DevList } from \"./device-list\";\nimport { DeviceResponse as DevResponse } from \"./device-response\";\nimport { GetDataPointResponse as GetResponse } from \"./get-data-point-response\";\nimport { SetDataPointResponse as SetResponse } from \"./set-data-point-response\";\nimport { VirtualDeviceResponse as VDeviceResponse } from \"./virtual-device-response\";\nimport { VirtualDevice as VDevice } from \"./virtual-device\";\nimport { Logger } from \"./logger\";\n\nconst { Channel } = createCheckers(ChannelTypeSuite, InOutPutTypeSuite);\n\nconst { Configuration } = createCheckers(\n ConfigurationTypeSuite,\n DevicesTypeSuite,\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite,\n FloorsTypeSuite,\n RoomsTypeSuite,\n SysApTypeSuite,\n UsersTypeSuite,\n ErrorTypeSuite\n);\n\nconst { Device } = createCheckers(\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite\n);\n\nconst { DeviceList } = createCheckers(DeviceListTypeSuite);\n\nconst { DeviceResponse } = createCheckers(\n DeviceResponseTypeSuite,\n DevicesTypeSuite,\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite\n);\n\nconst { GetDataPointResponse } = createCheckers(GetDataPointResponseTypeSuite);\n\nconst { SetDataPointResponse } = createCheckers(SetDataPointResponseTypeSuite);\n\nconst { VirtualDevice } = createCheckers(VirtualDeviceTypeSuite);\n\nconst { VirtualDeviceResponse } = createCheckers(\n VirtualDeviceResponseTypeSuite\n);\n\nconst { WebSocketMessage } = createCheckers(\n WebSocketMessageTypeSuite,\n DevicesTypeSuite,\n DeviceTypeSuite,\n ChannelTypeSuite,\n InOutPutTypeSuite,\n ScenesTriggeredTypeSuite\n);\n\nfunction check(\n obj: unknown,\n checker: Checker,\n logger: Logger,\n verbose: boolean\n): boolean {\n if (verbose) {\n try {\n checker.check(obj);\n return true;\n } catch (error) {\n logger.error(\"Object validation failed!\", error);\n return false;\n }\n }\n\n return checker.test(obj);\n}\n\n/**\n * Determines whether the specified object is a web socket message.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a web socket message.\n */\nexport function isWebSocketMessage(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Message {\n return check(obj, WebSocketMessage, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a configuration.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a configuration.\n */\nexport function isConfiguration(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Config {\n return check(obj, Configuration, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device list.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device list.\n */\nexport function isDeviceList(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is DevList {\n return check(obj, DeviceList, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device response.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device response.\n */\nexport function isDeviceResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is DevResponse {\n return check(obj, DeviceResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a valid response to a get data point request.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a get data point request.\n */\nexport function isGetDataPointResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is GetResponse {\n return check(obj, GetDataPointResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a valid response to a set data point request.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a set data point request.\n */\nexport function isSetDataPointResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is SetResponse {\n return check(obj, SetDataPointResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a virtual device.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a virtual device.\n */\nexport function isVirtualDevice(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is VDevice {\n return check(obj, VirtualDevice, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a virtual device response.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a virtual device request.\n */\nexport function isVirtualDeviceResponse(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is VDeviceResponse {\n return check(obj, VirtualDeviceResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a channel.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a channel.\n */\nexport function isChannel(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Chan {\n return check(obj, Channel, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device.\n */\nexport function isDevice(\n obj: unknown,\n logger: Logger,\n verbose = false\n): obj is Dev {\n return check(obj, Device, logger, verbose);\n}\n","/** Defines a virtual device. */\nexport interface VirtualDevice {\n /** The virtual device type. */\n type: VirtualDeviceType;\n /** The virtual device properties */\n properties?: {\n /** The time to live value indicates the number of seconds the system access point will wait for a message before it assumes the device to be unresponsive. */\n ttl?: string;\n /** The display name for the virtual device. */\n displayname?: string;\n /** The virtual device flavor. */\n flavor?: string;\n /** The virtual device capabilities. */\n capabilities?: Array<number>;\n };\n}\n\n/** Defines the possible types of virtual devices. */\nexport enum VirtualDeviceType {\n /** A binary sensor */\n BinarySensor = \"BinarySensor\",\n /** A blind actuator */\n BlindActuator = \"BlindActuator\",\n /** A switching actuator */\n SwitchingActuator = \"SwitchingActuator\",\n /** A ceiling fan actuator */\n CeilingFanActuator = \"CeilingFanActuator\",\n /** A real time clock */\n RTC = \"RTC\",\n /** A dimmer actuator */\n DimActuator = \"DimActuator\",\n /** A charger for an electronic vehicle */\n EVCharging = \"evcharging\",\n /** A window sensor */\n WindowSensor = \"WindowSensor\",\n /** A simple door lock */\n SimpleDoorlock = \"simple_doorlock\",\n /** A shutter actuator */\n ShutterActuator = \"ShutterActuator\",\n /** A weather station */\n WeatherStation = \"WeatherStation\",\n /** A temperature sensor */\n WeatherTemperatureSensor = \"Weather-TemperatureSensor\",\n /** A wind sensor */\n WeatherWindSensor = \"Weather-WindSensor\",\n /** A brightness sensor */\n WeatherBrightnessSensor = \"Weather-BrightnessSensor\",\n /** A rain sensor */\n WeatherRainSensor = \"Weather-RainSensor\",\n /** A window actuator */\n WindowActuator = \"WindowActuator\",\n /** A detector for carbon monoxide (CO) */\n CODetector = \"CODetector\",\n /** A fire detector */\n FireDetector = \"FireDetector\",\n /** A KNX switch sensor */\n KNXSwitchSensor = \"KNX-SwitchSensor\",\n /** A media player */\n MediaPlayer = \"MediaPlayer\",\n /** A battery */\n EnergyBattery = \"EnergyBattery\",\n /** An inverter */\n EnergyInverter = \"EnergyInverter\",\n /** An energy meter */\n EnergyMeter = \"EnergyMeter\",\n /** A device combining inverter and battery characteristics */\n EnergyInverterBattery = \"EnergyInverterBattery\",\n /** A device combining inverter and energy meter characteristics */\n EnergyInverterMeter = \"EnergyInverterMeter\",\n /** A device combining inverter, battery and energy meter characteristics */\n EnergyInverterMeterBattery = \"EnergyInverterMeterBattery\",\n /** A device combining battery and energy meter characteristics */\n EnergyMeterBattery = \"EnergyMeterBattery\",\n /** An air quality sensor measuring carbon dioxide (CO2) */\n AirQualityCO2 = \"AirQualityCO2\",\n /** An air quality sensor measuring carbon monoxide (CO) */\n AirQualityCO = \"AirQualityCO\",\n /** An full air quality sensor */\n AirQualityFull = \"AirQualityFull\",\n /** An air quality sensor measuring humidity */\n AirQualityHumidity = \"AirQualityHumidity\",\n /** An air quality sensor measuring nitrogen dioxide (NO2) */\n AirQualityNO2 = \"AirQualityNO2\",\n /** An air quality sensor measuring ozone (O3) */\n AirQualityO3 = \"AirQualityO3\",\n /** An air quality sensor measuring coarse particulate matter with in the 10 micron scale */\n AirQualityPM10 = \"AirQualityPM10\",\n /** An air quality sensor measuring coarse particulate matter with in the 25 micron scale */\n AirQualityPM25 = \"AirQualityPM25\",\n /** An air quality sensor measuring barometric pressure */\n AirQualityPressure = \"AirQualityPressure\",\n /** An air quality sensor measuring temperature */\n AirQualityTemperature = \"AirQualityTemperature\",\n /** An air quality sensor measuring volatile organic compounds */\n AirQualityVOC = \"AirQualityVOC\",\n /** A version 2 energy meter */\n EnergyMeterV2 = \"EnergyMeterv2\",\n HomeApplianceLaundry = \"HomeAppliance-Laundry\",\n HVAC = \"HVAC\",\n SplitUnit = \"SplitUnit\",\n}\n","import { EventEmitter } from \"events\";\nimport {\n interval,\n Observable,\n SchedulerLike,\n Subject,\n Subscription,\n switchMap,\n takeUntil,\n} from \"rxjs\";\nimport { ClientOptions, RawData, WebSocket } from \"ws\";\nimport {\n Configuration,\n DeviceList,\n DeviceResponse,\n GetDataPointResponse,\n isConfiguration,\n isDeviceList,\n isDeviceResponse,\n isGetDataPointResponse,\n isSetDataPointResponse,\n isWebSocketMessage,\n Logger,\n SetDataPointResponse,\n VirtualDevice,\n VirtualDeviceResponse,\n WebSocketMessage,\n} from \"./model\";\nimport { isVirtualDeviceResponse } from \"./model/validator\";\n\n/** The HTTP request method */\ntype HttpRequestMethod = \"GET\" | \"POST\" | \"DELETE\" | \"PATCH\" | \"PUT\";\n\n/** The class representing a System Access Point. */\nexport class SystemAccessPoint extends EventEmitter {\n /** The basic authentication key used for requests. */\n public readonly basicAuthKey: string;\n private webSocket?: WebSocket;\n private readonly webSocketMessageSubject = new Subject<WebSocketMessage>();\n private readonly webSocketKeepaliveTimerReset$ = new Subject<void>();\n private readonly webSocketKeepaliveTimer$ =\n this.webSocketKeepaliveTimerReset$.pipe(\n switchMap(() =>\n interval(30000, this.scheduler).pipe(\n takeUntil(this.webSocketKeepaliveTimerReset$)\n )\n )\n );\n private webSocketKeepaliveSubscription?: Subscription;\n\n /**\n * Constructs a new SystemAccessPoint instance\n *\n * @constructor\n * @param hostName {string} The system access point host name.\n * @param userName {string} The user name that shall be used to authenticate with the system access point.\n * @param password {string} The password that shall be used to authenticate with the system access point.\n * @param tlsEnabled {boolean} Determines whether the communication with the system access point shall be protected by TLS.\n * @param verboseErrors {boolean} Determines whether verbose error messages shall be used, for example for message validation.\n * @param logger {Logger} The logger instance to be used. If no explicit implementation is provided, the this.logger will be used for logging.\n */\n constructor(\n private readonly hostName: string,\n readonly userName: string,\n readonly password: string,\n private readonly tlsEnabled = true,\n private readonly verboseErrors = false,\n private readonly logger: Logger = console,\n readonly scheduler?: SchedulerLike\n ) {\n super();\n\n // Create Basic Authentication key\n this.basicAuthKey = Buffer.from(`${userName}:${password}`, \"utf8\").toString(\n \"base64\"\n );\n }\n\n /**\n * Connects to the System Access Point web socket.\n * @param certificateVerification {boolean} Determines whether the TLS certificate presented by the server will be verified.\n */\n public connectWebSocket(certificateVerification: boolean = true): void {\n if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {\n throw new Error(\"Web socket is already connected\");\n }\n\n this.webSocket = this.createWebSocket(certificateVerification);\n // (Re-)create the web socket keepalive timer\n this.webSocketKeepaliveSubscription?.unsubscribe();\n this.webSocketKeepaliveSubscription = undefined;\n this.webSocketKeepaliveSubscription =\n this.webSocketKeepaliveTimer$.subscribe(() => {\n if (!(this.webSocket && this.webSocket.readyState === WebSocket.OPEN))\n return;\n\n this.logger.log(\"keepalive timer expired, sending ping message...\");\n this.webSocket.ping();\n });\n this.webSocketKeepaliveTimerReset$.next();\n }\n\n /**\n * Creates a new virtual device.\n * @param sysApUuid {string} The UUID identifying the system access point.\n * @param deviceSerial {string} The serial number to be assigned to the device.\n * @param virtualDevice {VirtualDevice} The virtual device to be created.\n * @returns {Promise.<VirtualDeviceResponse>} The response to the virtual device request.\n */\n public async createVirtualDevice(\n sysApUuid: string,\n deviceSerial: string,\n virtualDevice: VirtualDevice\n ): Promise<VirtualDeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"PUT\",\n `virtualdevice/${sysApUuid}/${deviceSerial}`,\n JSON.stringify(virtualDevice)\n );\n\n // Process response\n return this.processRestResponse(response, isVirtualDeviceResponse);\n }\n\n private createWebSocket(certificateVerification: boolean): WebSocket {\n // Disabling certificate verification is discouraged, issue a warning\n if (this.tlsEnabled && !certificateVerification) {\n this.logger.warn(\n \"TLS certificate verification is disabled! This poses a security risk, activating certificate verification is strictly recommended.\"\n );\n }\n\n const url = `${this.tlsEnabled ? \"wss\" : \"ws\"}://${\n this.hostName\n }/fhapi/v1/api/ws`;\n const options: ClientOptions = {\n rejectUnauthorized: this.tlsEnabled && certificateVerification,\n headers: {\n Authorization: `Basic ${this.basicAuthKey}`,\n },\n };\n const webSocket = new WebSocket(url, options);\n webSocket.on(\"error\", (error: Error) => {\n this.emit(\"websocket-error\", error);\n this.logger.error(\"Error received\", error);\n });\n webSocket.on(\"ping\", (data: Buffer) => {\n this.emit(\"websocket-ping\", data);\n this.logger.debug(\"Ping received\", data.toString(\"ascii\"));\n this.webSocketKeepaliveTimerReset$.next();\n webSocket.pong(data);\n this.logger.debug(\"Pong sent\", data.toString(\"ascii\"));\n });\n webSocket.on(\"pong\", (data: Buffer) => {\n this.emit(\"websocket-pong\", data);\n this.logger.debug(\"Pong received\", data.toString(\"ascii\"));\n });\n webSocket.on(\"unexpected-response\", (request, response) => {\n this.emit(\"websocket-unexpected-response\", request, response);\n this.logger.error(\"Unexpected response received\");\n });\n webSocket.on(\"upgrade\", (request) => {\n this.emit(\"websocket-upgrade\", request);\n this.logger.debug(\"Upgrade request received\");\n });\n webSocket.on(\"open\", () => {\n this.emit(\"websocket-open\");\n this.logger.log(\"Connection opened\");\n });\n webSocket.on(\"close\", (code, reason) => {\n this.emit(\"websocket-close\", code, reason);\n this.logger.log(\"Connection closed\");\n this.webSocketKeepaliveSubscription?.unsubscribe();\n this.webSocketKeepaliveSubscription = undefined;\n });\n webSocket.on(\"message\", (data: RawData, isBinary: boolean) => {\n this.emit(\"websocket-message\", data, isBinary);\n this.webSocketKeepaliveTimerReset$.next();\n this.processWebSocketMessage(data, isBinary);\n });\n return webSocket;\n }\n\n /**\n * Disconnects from the System Access Point web socket.\n * @param force {boolean} Determines whether or not the connection will be closed forcibly.\n */\n public disconnectWebSocket(force: boolean = false): void {\n if (!this.webSocket || this.webSocket.readyState === WebSocket.CLOSED) {\n throw new Error(\"Web socket is not open\");\n }\n\n if (force) {\n this.webSocket.terminate();\n } else {\n this.webSocket.close();\n }\n }\n\n /**\n * Gets the configuration from the system access point.\n * @returns {Promise.<Configuration>} The system access point configuration.\n */\n public async getConfiguration(): Promise<Configuration> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n \"configuration\"\n );\n\n // Process response\n return this.processRestResponse(response, isConfiguration);\n }\n\n /**\n * Gets the device list from the system access point.\n * @returns {Promise.<DeviceList>} The requested device list.\n */\n public async getDeviceList(): Promise<DeviceList> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\"GET\", \"devicelist\");\n\n // Process response\n return this.processRestResponse(response, isDeviceList);\n }\n\n /**\n * Gets the specified device from the system access point.\n * @param sysApUuid {string} The UUID identifying the system access point.\n * @param deviceSerial {string} The device serial number.\n * @returns {Promise.<DeviceResponse>} The response to the device request.\n */\n public async getDevice(\n sysApUuid: string,\n deviceSerial: string\n ): Promise<DeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n `device/${sysApUuid}/${deviceSerial}`\n );\n\n // Process response\n return this.processRestResponse(response, isDeviceResponse);\n }\n\n /**\n * Gets the specified data point from the system access point.\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceSerial {string} The device serial number.\n * @param channel {string} The channel identifier.\n * @param dataPoint {string} The datapoint identifier.\n * @returns {Promise.<GetDataPointResponse>} The response to the get data point request.\n */\n public async getDatapoint(\n sysApUuid: string,\n deviceSerial: string,\n channel: string,\n dataPoint: string\n ): Promise<GetDataPointResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n `datapoint/${sysApUuid}/${deviceSerial}.${channel}.${dataPoint}`\n );\n\n // Process response\n return this.processRestResponse(response, isGetDataPointResponse);\n }\n\n /**\n * Gets the web socket messages.\n * @returns {Observable.<WebSocketMessage>} An observable that is updated with the messages received from the web socket.\n */\n public getWebSocketMessages(): Observable<WebSocketMessage> {\n return this.webSocketMessageSubject.asObservable();\n }\n\n /**\n * Sets a new value for the specificed data point.\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceSerial {string} The device serial number.\n * @param channel {string} The channel identifier.\n * @param dataPoint {string} The datapoint identifier.\n * @param value {string} The new value to be set.\n * @returns {Promise.<SetDataPointResponse>} The response to the set data point request.\n */\n public async setDatapoint(\n sysApUuid: string,\n deviceSerial: string,\n channel: string,\n dataPoint: string,\n value: string\n ): Promise<SetDataPointResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"PUT\",\n `datapoint/${sysApUuid}/${deviceSerial}.${channel}.${dataPoint}`,\n value\n );\n\n // Process response\n return this.processRestResponse(response, isSetDataPointResponse);\n }\n\n /**\n * Triggeres the given action for the specified proxy device. Please note that this method is part of the experimental API!\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceClass {string} The device class.\n * @param deviceSerial {string} The device serial number.\n * @param action {string} The action to be triggered.\n * @returns {Promise.<DeviceResponse>} The response to the request.\n */\n public async triggerProxyDevice(\n sysApUuid: string,\n deviceClass: string,\n deviceSerial: string,\n action: string\n ): Promise<DeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"GET\",\n `proxydevice/${sysApUuid}/${deviceClass}/${deviceSerial}/action/${action}`\n );\n\n // Process response\n return this.processRestResponse(response, isDeviceResponse);\n }\n\n /**\n * Sets the given value for the specified proxy device. Please note that this method is part of the experimental API!\n * @param sysApUuid {string} The UUID idenfifying the system access point.\n * @param deviceClass {string} The device class.\n * @param deviceSerial {string} The device serial number.\n * @param value {string} The value to be set.\n * @returns {Promise.<DeviceResponse>} The response to the request.\n */\n public async setProxyDeviceValue(\n sysApUuid: string,\n deviceClass: string,\n deviceSerial: string,\n value: string\n ): Promise<DeviceResponse> {\n // Get response from system access point\n const response: Response = await this.fetchDataViaRest(\n \"PUT\",\n `proxydevice/${sysApUuid}/${deviceClass}/${deviceSerial}/value/${value}`\n );\n\n // Process response\n return this.processRestResponse(response, isDeviceResponse);\n }\n\n private async fetchDataViaRest(\n method: HttpRequestMethod,\n route: string,\n body: BodyInit | null | undefined = undefined\n ): Promise<Response> {\n // Set up request info\n const info: RequestInfo = `${this.tlsEnabled ? \"https\" : \"http\"}://${\n this.hostName\n }/fhapi/v1/api/rest/${route}`;\n\n // Set up request init\n const init: RequestInit = {\n method: method,\n headers: {\n Authorization: `Basic ${this.basicAuthKey}`,\n },\n body: body,\n };\n\n // Get response from system access point\n return fetch(info, init);\n }\n\n private async processRestResponse<TResponse>(\n response: Response,\n typeGuard: (\n obj: unknown,\n logger: Logger,\n verbose: boolean\n ) => obj is TResponse\n ): Promise<TResponse> {\n let body: unknown;\n let message: string;\n\n // Process response\n switch (response.status) {\n case 200:\n body = await response.json();\n if (!typeGuard(body, this.logger, this.verboseErrors)) {\n message = \"Received message has an unexpected type!\";\n this.logger.error(message, body);\n throw new Error(message);\n }\n\n return body;\n case 401:\n message = \"Authentication information is missing or invalid.\";\n this.logger.error(message);\n throw new Error(message);\n case 502:\n message = await response.text();\n this.logger.error(message);\n throw new Error(message);\n default:\n message = `Received HTTP ${\n response.status\n } status code unexpectedly: ${await response.text()}`;\n this.logger.error(message);\n throw new Error(message);\n }\n }\n\n private processWebSocketMessage(data: RawData, isBinary: boolean): void {\n // Do not process binary messages\n if (isBinary) {\n this.logger.warn(\n \"Binary message received. Binary messages are not processed.\"\n );\n return;\n }\n\n this.logger.debug(\"Message received\");\n /*\n * Deserialize the message.\n * The message is expected to be deserializable as a web socket message.\n * If that is not the case, that's an error case.\n */\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const serialized = data.toString();\n const message: unknown = JSON.parse(serialized);\n\n if (isWebSocketMessage(message, this.logger, this.verboseErrors)) {\n this.webSocketMessageSubject.next(message);\n return;\n }\n\n this.logger.error(\"Received message has an unexpected type!\", serialized);\n }\n}\n"],"mappings":"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","names":["iface","indexKey","iface","indexKey","opt","iface","indexKey","iface","indexKey","iface","indexKey","iface","Error","iface","indexKey","array","iface","indexKey","iface","opt","iface","indexKey","iface","indexKey","iface","indexKey","iface","opt","array","iface","indexKey","array","iface","opt","iface","indexKey","array","iface","indexKey","opt","Channel","Configuration","Device","DeviceList","DeviceResponse","GetDataPointResponse","SetDataPointResponse","VirtualDevice","VirtualDeviceResponse","WebSocketMessage","VirtualDeviceType"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "freeathome-local-api-client",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"preview": false,
|
|
5
5
|
"description": "A client library for the BUSCH-JAEGER free@home local API implemented in TypeScript",
|
|
6
6
|
"repository": {
|
|
@@ -43,27 +43,27 @@
|
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"rxjs": "^7.8.2",
|
|
45
45
|
"ts-interface-checker": "^1.0.2",
|
|
46
|
-
"ws": "^8.18.
|
|
46
|
+
"ws": "^8.18.3"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@eslint/eslintrc": "^3.3.1",
|
|
50
|
-
"@eslint/js": "^9.
|
|
50
|
+
"@eslint/js": "^9.31.0",
|
|
51
51
|
"@istanbuljs/nyc-config-typescript": "^1.0.2",
|
|
52
52
|
"@types/jasmine": "^5.1.8",
|
|
53
53
|
"@types/ws": "^8.18.1",
|
|
54
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
55
|
-
"@typescript-eslint/parser": "^8.
|
|
56
|
-
"eslint": "^9.
|
|
57
|
-
"eslint-config-prettier": "^10.1.
|
|
58
|
-
"eslint-plugin-import": "^2.
|
|
59
|
-
"eslint-plugin-n": "^17.
|
|
60
|
-
"eslint-plugin-prettier": "^5.
|
|
54
|
+
"@typescript-eslint/eslint-plugin": "^8.38.0",
|
|
55
|
+
"@typescript-eslint/parser": "^8.38.0",
|
|
56
|
+
"eslint": "^9.31.0",
|
|
57
|
+
"eslint-config-prettier": "^10.1.8",
|
|
58
|
+
"eslint-plugin-import": "^2.32.0",
|
|
59
|
+
"eslint-plugin-n": "^17.21.0",
|
|
60
|
+
"eslint-plugin-prettier": "^5.5.3",
|
|
61
61
|
"eslint-plugin-promise": "^7.2.1",
|
|
62
|
-
"globals": "^16.
|
|
63
|
-
"jasmine": "^5.
|
|
62
|
+
"globals": "^16.3.0",
|
|
63
|
+
"jasmine": "^5.9.0",
|
|
64
64
|
"jasmine-spec-reporter": "^7.0.0",
|
|
65
65
|
"nyc": "^17.1.0",
|
|
66
|
-
"prettier": "^3.
|
|
66
|
+
"prettier": "^3.6.2",
|
|
67
67
|
"rimraf": "^6.0.1",
|
|
68
68
|
"ts-interface-builder": "^0.3.3",
|
|
69
69
|
"ts-loader": "^9.5.2",
|