freeathome-local-api-client 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +12 -8
- package/dist/index.d.ts +12 -8
- package/dist/index.js +31 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +37 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
1
|
import { EventEmitter } from 'events';
|
|
2
|
+
import { SchedulerLike, Observable } from 'rxjs';
|
|
3
3
|
|
|
4
4
|
/** Describes an input or output. */
|
|
5
5
|
interface InOutPut {
|
|
@@ -470,16 +470,20 @@ declare function isDevice(obj: unknown, logger: Logger, verbose?: boolean): obj
|
|
|
470
470
|
|
|
471
471
|
/** The class representing a System Access Point. */
|
|
472
472
|
declare class SystemAccessPoint extends EventEmitter {
|
|
473
|
+
private readonly hostName;
|
|
474
|
+
readonly userName: string;
|
|
475
|
+
readonly password: string;
|
|
476
|
+
private readonly tlsEnabled;
|
|
477
|
+
private readonly verboseErrors;
|
|
478
|
+
private readonly logger;
|
|
479
|
+
readonly scheduler?: SchedulerLike | undefined;
|
|
473
480
|
/** The basic authentication key used for requests. */
|
|
474
481
|
readonly basicAuthKey: string;
|
|
475
|
-
/** The host name of the system access point. */
|
|
476
|
-
readonly hostName: string;
|
|
477
|
-
/** Determines whether requests to the system access point will use TLS. */
|
|
478
|
-
readonly tlsEnabled: boolean;
|
|
479
|
-
private readonly logger;
|
|
480
|
-
private readonly verboseErrors;
|
|
481
482
|
private webSocket?;
|
|
482
483
|
private readonly webSocketMessageSubject;
|
|
484
|
+
private readonly webSocketKeepaliveTimerReset$;
|
|
485
|
+
private readonly webSocketKeepaliveTimer$;
|
|
486
|
+
private webSocketKeepaliveSubscription?;
|
|
483
487
|
/**
|
|
484
488
|
* Constructs a new SystemAccessPoint instance
|
|
485
489
|
*
|
|
@@ -491,7 +495,7 @@ declare class SystemAccessPoint extends EventEmitter {
|
|
|
491
495
|
* @param verboseErrors {boolean} Determines whether verbose error messages shall be used, for example for message validation.
|
|
492
496
|
* @param logger {Logger} The logger instance to be used. If no explicit implementation is provided, the this.logger will be used for logging.
|
|
493
497
|
*/
|
|
494
|
-
constructor(hostName: string, userName: string, password: string, tlsEnabled?: boolean, verboseErrors?: boolean, logger?: Logger);
|
|
498
|
+
constructor(hostName: string, userName: string, password: string, tlsEnabled?: boolean, verboseErrors?: boolean, logger?: Logger, scheduler?: SchedulerLike | undefined);
|
|
495
499
|
/**
|
|
496
500
|
* Connects to the System Access Point web socket.
|
|
497
501
|
* @param certificateVerification {boolean} Determines whether the TLS certificate presented by the server will be verified.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
1
|
import { EventEmitter } from 'events';
|
|
2
|
+
import { SchedulerLike, Observable } from 'rxjs';
|
|
3
3
|
|
|
4
4
|
/** Describes an input or output. */
|
|
5
5
|
interface InOutPut {
|
|
@@ -470,16 +470,20 @@ declare function isDevice(obj: unknown, logger: Logger, verbose?: boolean): obj
|
|
|
470
470
|
|
|
471
471
|
/** The class representing a System Access Point. */
|
|
472
472
|
declare class SystemAccessPoint extends EventEmitter {
|
|
473
|
+
private readonly hostName;
|
|
474
|
+
readonly userName: string;
|
|
475
|
+
readonly password: string;
|
|
476
|
+
private readonly tlsEnabled;
|
|
477
|
+
private readonly verboseErrors;
|
|
478
|
+
private readonly logger;
|
|
479
|
+
readonly scheduler?: SchedulerLike | undefined;
|
|
473
480
|
/** The basic authentication key used for requests. */
|
|
474
481
|
readonly basicAuthKey: string;
|
|
475
|
-
/** The host name of the system access point. */
|
|
476
|
-
readonly hostName: string;
|
|
477
|
-
/** Determines whether requests to the system access point will use TLS. */
|
|
478
|
-
readonly tlsEnabled: boolean;
|
|
479
|
-
private readonly logger;
|
|
480
|
-
private readonly verboseErrors;
|
|
481
482
|
private webSocket?;
|
|
482
483
|
private readonly webSocketMessageSubject;
|
|
484
|
+
private readonly webSocketKeepaliveTimerReset$;
|
|
485
|
+
private readonly webSocketKeepaliveTimer$;
|
|
486
|
+
private webSocketKeepaliveSubscription?;
|
|
483
487
|
/**
|
|
484
488
|
* Constructs a new SystemAccessPoint instance
|
|
485
489
|
*
|
|
@@ -491,7 +495,7 @@ declare class SystemAccessPoint extends EventEmitter {
|
|
|
491
495
|
* @param verboseErrors {boolean} Determines whether verbose error messages shall be used, for example for message validation.
|
|
492
496
|
* @param logger {Logger} The logger instance to be used. If no explicit implementation is provided, the this.logger will be used for logging.
|
|
493
497
|
*/
|
|
494
|
-
constructor(hostName: string, userName: string, password: string, tlsEnabled?: boolean, verboseErrors?: boolean, logger?: Logger);
|
|
498
|
+
constructor(hostName: string, userName: string, password: string, tlsEnabled?: boolean, verboseErrors?: boolean, logger?: Logger, scheduler?: SchedulerLike | undefined);
|
|
495
499
|
/**
|
|
496
500
|
* Connects to the System Access Point web socket.
|
|
497
501
|
* @param certificateVerification {boolean} Determines whether the TLS certificate presented by the server will be verified.
|
package/dist/index.js
CHANGED
|
@@ -474,20 +474,10 @@ var VirtualDeviceType2 = /* @__PURE__ */ ((VirtualDeviceType3) => {
|
|
|
474
474
|
})(VirtualDeviceType2 || {});
|
|
475
475
|
|
|
476
476
|
// src/system-access-point.ts
|
|
477
|
+
var import_events = require("events");
|
|
477
478
|
var import_rxjs = require("rxjs");
|
|
478
479
|
var import_ws = require("ws");
|
|
479
|
-
var import_events = require("events");
|
|
480
480
|
var SystemAccessPoint = class extends import_events.EventEmitter {
|
|
481
|
-
/** The basic authentication key used for requests. */
|
|
482
|
-
basicAuthKey;
|
|
483
|
-
/** The host name of the system access point. */
|
|
484
|
-
hostName;
|
|
485
|
-
/** Determines whether requests to the system access point will use TLS. */
|
|
486
|
-
tlsEnabled;
|
|
487
|
-
logger;
|
|
488
|
-
verboseErrors;
|
|
489
|
-
webSocket;
|
|
490
|
-
webSocketMessageSubject = new import_rxjs.Subject();
|
|
491
481
|
/**
|
|
492
482
|
* Constructs a new SystemAccessPoint instance
|
|
493
483
|
*
|
|
@@ -499,16 +489,32 @@ var SystemAccessPoint = class extends import_events.EventEmitter {
|
|
|
499
489
|
* @param verboseErrors {boolean} Determines whether verbose error messages shall be used, for example for message validation.
|
|
500
490
|
* @param logger {Logger} The logger instance to be used. If no explicit implementation is provided, the this.logger will be used for logging.
|
|
501
491
|
*/
|
|
502
|
-
constructor(hostName, userName, password, tlsEnabled = true, verboseErrors = false, logger) {
|
|
492
|
+
constructor(hostName, userName, password, tlsEnabled = true, verboseErrors = false, logger = console, scheduler) {
|
|
503
493
|
super();
|
|
504
|
-
this.logger = logger ?? console;
|
|
505
|
-
this.basicAuthKey = Buffer.from(`${userName}:${password}`, "utf8").toString(
|
|
506
|
-
"base64"
|
|
507
|
-
);
|
|
508
494
|
this.hostName = hostName;
|
|
495
|
+
this.userName = userName;
|
|
496
|
+
this.password = password;
|
|
509
497
|
this.tlsEnabled = tlsEnabled;
|
|
510
498
|
this.verboseErrors = verboseErrors;
|
|
499
|
+
this.logger = logger;
|
|
500
|
+
this.scheduler = scheduler;
|
|
501
|
+
this.basicAuthKey = Buffer.from(`${userName}:${password}`, "utf8").toString(
|
|
502
|
+
"base64"
|
|
503
|
+
);
|
|
511
504
|
}
|
|
505
|
+
/** The basic authentication key used for requests. */
|
|
506
|
+
basicAuthKey;
|
|
507
|
+
webSocket;
|
|
508
|
+
webSocketMessageSubject = new import_rxjs.Subject();
|
|
509
|
+
webSocketKeepaliveTimerReset$ = new import_rxjs.Subject();
|
|
510
|
+
webSocketKeepaliveTimer$ = this.webSocketKeepaliveTimerReset$.pipe(
|
|
511
|
+
(0, import_rxjs.switchMap)(
|
|
512
|
+
() => (0, import_rxjs.interval)(3e4, this.scheduler).pipe(
|
|
513
|
+
(0, import_rxjs.takeUntil)(this.webSocketKeepaliveTimerReset$)
|
|
514
|
+
)
|
|
515
|
+
)
|
|
516
|
+
);
|
|
517
|
+
webSocketKeepaliveSubscription;
|
|
512
518
|
/**
|
|
513
519
|
* Connects to the System Access Point web socket.
|
|
514
520
|
* @param certificateVerification {boolean} Determines whether the TLS certificate presented by the server will be verified.
|
|
@@ -518,6 +524,12 @@ var SystemAccessPoint = class extends import_events.EventEmitter {
|
|
|
518
524
|
throw new Error("Web socket is already connected");
|
|
519
525
|
}
|
|
520
526
|
this.webSocket = this.createWebSocket(certificateVerification);
|
|
527
|
+
this.webSocketKeepaliveSubscription = this.webSocketKeepaliveTimer$.subscribe(() => {
|
|
528
|
+
if (!(this.webSocket && this.webSocket.readyState === import_ws.WebSocket.OPEN))
|
|
529
|
+
return;
|
|
530
|
+
this.logger.log("keepalive timer expired, sending ping message...");
|
|
531
|
+
this.webSocket.ping();
|
|
532
|
+
});
|
|
521
533
|
}
|
|
522
534
|
/**
|
|
523
535
|
* Creates a new virtual device.
|
|
@@ -578,6 +590,7 @@ var SystemAccessPoint = class extends import_events.EventEmitter {
|
|
|
578
590
|
});
|
|
579
591
|
webSocket.on("message", (data, isBinary) => {
|
|
580
592
|
this.emit("websocket-message", data, isBinary);
|
|
593
|
+
this.webSocketKeepaliveTimerReset$.next();
|
|
581
594
|
this.processWebSocketMessage(data, isBinary);
|
|
582
595
|
});
|
|
583
596
|
return webSocket;
|
|
@@ -590,6 +603,8 @@ var SystemAccessPoint = class extends import_events.EventEmitter {
|
|
|
590
603
|
if (!this.webSocket || this.webSocket.readyState === import_ws.WebSocket.CLOSED) {
|
|
591
604
|
throw new Error("Web socket is not open");
|
|
592
605
|
}
|
|
606
|
+
this.webSocketKeepaliveSubscription?.unsubscribe();
|
|
607
|
+
this.webSocketKeepaliveSubscription = void 0;
|
|
593
608
|
if (force) {
|
|
594
609
|
this.webSocket.terminate();
|
|
595
610
|
} 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 { Observable, Subject } from \"rxjs\";\nimport { ClientOptions, RawData, WebSocket } from \"ws\";\nimport { EventEmitter } from \"events\";\nimport {\n Configuration,\n DeviceList,\n DeviceResponse,\n GetDataPointResponse,\n isDeviceList,\n isDeviceResponse,\n isWebSocketMessage,\n isGetDataPointResponse,\n isSetDataPointResponse,\n isConfiguration,\n SetDataPointResponse,\n WebSocketMessage,\n VirtualDevice,\n VirtualDeviceResponse,\n Logger,\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 /** The host name of the system access point. */\n public readonly hostName: string;\n /** Determines whether requests to the system access point will use TLS. */\n public readonly tlsEnabled: boolean;\n private readonly logger: Logger;\n private readonly verboseErrors: boolean;\n private webSocket?: WebSocket;\n private readonly webSocketMessageSubject = new Subject<WebSocketMessage>();\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 hostName: string,\n userName: string,\n password: string,\n tlsEnabled = true,\n verboseErrors = false,\n logger?: Logger\n ) {\n super();\n\n // Configure logging\n this.logger = logger ?? console;\n\n // Create Basic Authentication key\n this.basicAuthKey = Buffer.from(`${userName}:${password}`, \"utf8\").toString(\n \"base64\"\n );\n this.hostName = hostName;\n this.tlsEnabled = tlsEnabled;\n this.verboseErrors = verboseErrors;\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 = 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 }\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.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 = 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"]}
|
|
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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -437,20 +437,15 @@ var VirtualDeviceType2 = /* @__PURE__ */ ((VirtualDeviceType3) => {
|
|
|
437
437
|
})(VirtualDeviceType2 || {});
|
|
438
438
|
|
|
439
439
|
// src/system-access-point.ts
|
|
440
|
-
import { Subject } from "rxjs";
|
|
441
|
-
import { WebSocket } from "ws";
|
|
442
440
|
import { EventEmitter } from "events";
|
|
441
|
+
import {
|
|
442
|
+
interval,
|
|
443
|
+
Subject,
|
|
444
|
+
switchMap,
|
|
445
|
+
takeUntil
|
|
446
|
+
} from "rxjs";
|
|
447
|
+
import { WebSocket } from "ws";
|
|
443
448
|
var SystemAccessPoint = class extends EventEmitter {
|
|
444
|
-
/** The basic authentication key used for requests. */
|
|
445
|
-
basicAuthKey;
|
|
446
|
-
/** The host name of the system access point. */
|
|
447
|
-
hostName;
|
|
448
|
-
/** Determines whether requests to the system access point will use TLS. */
|
|
449
|
-
tlsEnabled;
|
|
450
|
-
logger;
|
|
451
|
-
verboseErrors;
|
|
452
|
-
webSocket;
|
|
453
|
-
webSocketMessageSubject = new Subject();
|
|
454
449
|
/**
|
|
455
450
|
* Constructs a new SystemAccessPoint instance
|
|
456
451
|
*
|
|
@@ -462,16 +457,32 @@ var SystemAccessPoint = class extends EventEmitter {
|
|
|
462
457
|
* @param verboseErrors {boolean} Determines whether verbose error messages shall be used, for example for message validation.
|
|
463
458
|
* @param logger {Logger} The logger instance to be used. If no explicit implementation is provided, the this.logger will be used for logging.
|
|
464
459
|
*/
|
|
465
|
-
constructor(hostName, userName, password, tlsEnabled = true, verboseErrors = false, logger) {
|
|
460
|
+
constructor(hostName, userName, password, tlsEnabled = true, verboseErrors = false, logger = console, scheduler) {
|
|
466
461
|
super();
|
|
467
|
-
this.logger = logger ?? console;
|
|
468
|
-
this.basicAuthKey = Buffer.from(`${userName}:${password}`, "utf8").toString(
|
|
469
|
-
"base64"
|
|
470
|
-
);
|
|
471
462
|
this.hostName = hostName;
|
|
463
|
+
this.userName = userName;
|
|
464
|
+
this.password = password;
|
|
472
465
|
this.tlsEnabled = tlsEnabled;
|
|
473
466
|
this.verboseErrors = verboseErrors;
|
|
467
|
+
this.logger = logger;
|
|
468
|
+
this.scheduler = scheduler;
|
|
469
|
+
this.basicAuthKey = Buffer.from(`${userName}:${password}`, "utf8").toString(
|
|
470
|
+
"base64"
|
|
471
|
+
);
|
|
474
472
|
}
|
|
473
|
+
/** The basic authentication key used for requests. */
|
|
474
|
+
basicAuthKey;
|
|
475
|
+
webSocket;
|
|
476
|
+
webSocketMessageSubject = new Subject();
|
|
477
|
+
webSocketKeepaliveTimerReset$ = new Subject();
|
|
478
|
+
webSocketKeepaliveTimer$ = this.webSocketKeepaliveTimerReset$.pipe(
|
|
479
|
+
switchMap(
|
|
480
|
+
() => interval(3e4, this.scheduler).pipe(
|
|
481
|
+
takeUntil(this.webSocketKeepaliveTimerReset$)
|
|
482
|
+
)
|
|
483
|
+
)
|
|
484
|
+
);
|
|
485
|
+
webSocketKeepaliveSubscription;
|
|
475
486
|
/**
|
|
476
487
|
* Connects to the System Access Point web socket.
|
|
477
488
|
* @param certificateVerification {boolean} Determines whether the TLS certificate presented by the server will be verified.
|
|
@@ -481,6 +492,12 @@ var SystemAccessPoint = class extends EventEmitter {
|
|
|
481
492
|
throw new Error("Web socket is already connected");
|
|
482
493
|
}
|
|
483
494
|
this.webSocket = this.createWebSocket(certificateVerification);
|
|
495
|
+
this.webSocketKeepaliveSubscription = this.webSocketKeepaliveTimer$.subscribe(() => {
|
|
496
|
+
if (!(this.webSocket && this.webSocket.readyState === WebSocket.OPEN))
|
|
497
|
+
return;
|
|
498
|
+
this.logger.log("keepalive timer expired, sending ping message...");
|
|
499
|
+
this.webSocket.ping();
|
|
500
|
+
});
|
|
484
501
|
}
|
|
485
502
|
/**
|
|
486
503
|
* Creates a new virtual device.
|
|
@@ -541,6 +558,7 @@ var SystemAccessPoint = class extends EventEmitter {
|
|
|
541
558
|
});
|
|
542
559
|
webSocket.on("message", (data, isBinary) => {
|
|
543
560
|
this.emit("websocket-message", data, isBinary);
|
|
561
|
+
this.webSocketKeepaliveTimerReset$.next();
|
|
544
562
|
this.processWebSocketMessage(data, isBinary);
|
|
545
563
|
});
|
|
546
564
|
return webSocket;
|
|
@@ -553,6 +571,8 @@ var SystemAccessPoint = class extends EventEmitter {
|
|
|
553
571
|
if (!this.webSocket || this.webSocket.readyState === WebSocket.CLOSED) {
|
|
554
572
|
throw new Error("Web socket is not open");
|
|
555
573
|
}
|
|
574
|
+
this.webSocketKeepaliveSubscription?.unsubscribe();
|
|
575
|
+
this.webSocketKeepaliveSubscription = void 0;
|
|
556
576
|
if (force) {
|
|
557
577
|
this.webSocket.terminate();
|
|
558
578
|
} 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 { Observable, Subject } from \"rxjs\";\nimport { ClientOptions, RawData, WebSocket } from \"ws\";\nimport { EventEmitter } from \"events\";\nimport {\n Configuration,\n DeviceList,\n DeviceResponse,\n GetDataPointResponse,\n isDeviceList,\n isDeviceResponse,\n isWebSocketMessage,\n isGetDataPointResponse,\n isSetDataPointResponse,\n isConfiguration,\n SetDataPointResponse,\n WebSocketMessage,\n VirtualDevice,\n VirtualDeviceResponse,\n Logger,\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 /** The host name of the system access point. */\n public readonly hostName: string;\n /** Determines whether requests to the system access point will use TLS. */\n public readonly tlsEnabled: boolean;\n private readonly logger: Logger;\n private readonly verboseErrors: boolean;\n private webSocket?: WebSocket;\n private readonly webSocketMessageSubject = new Subject<WebSocketMessage>();\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 hostName: string,\n userName: string,\n password: string,\n tlsEnabled = true,\n verboseErrors = false,\n logger?: Logger\n ) {\n super();\n\n // Configure logging\n this.logger = logger ?? console;\n\n // Create Basic Authentication key\n this.basicAuthKey = Buffer.from(`${userName}:${password}`, \"utf8\").toString(\n \"base64\"\n );\n this.hostName = hostName;\n this.tlsEnabled = tlsEnabled;\n this.verboseErrors = verboseErrors;\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 = 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 }\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.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 = 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"]}
|
|
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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "freeathome-local-api-client",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.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": {
|
|
@@ -47,13 +47,13 @@
|
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@eslint/eslintrc": "^3.3.1",
|
|
50
|
-
"@eslint/js": "^9.
|
|
50
|
+
"@eslint/js": "^9.27.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.32.
|
|
55
|
-
"@typescript-eslint/parser": "^8.32.
|
|
56
|
-
"eslint": "^9.
|
|
54
|
+
"@typescript-eslint/eslint-plugin": "^8.32.1",
|
|
55
|
+
"@typescript-eslint/parser": "^8.32.1",
|
|
56
|
+
"eslint": "^9.27.0",
|
|
57
57
|
"eslint-config-prettier": "^10.1.5",
|
|
58
58
|
"eslint-plugin-import": "^2.31.0",
|
|
59
59
|
"eslint-plugin-n": "^17.18.0",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"ts-interface-builder": "^0.3.3",
|
|
69
69
|
"ts-loader": "^9.5.2",
|
|
70
70
|
"ts-node": "^10.9.2",
|
|
71
|
-
"tsup": "^8.
|
|
71
|
+
"tsup": "^8.5.0",
|
|
72
72
|
"typescript": "^5.8.3"
|
|
73
73
|
},
|
|
74
74
|
"scripts": {
|