node-tradfri-client
Version:
Library to talk to IKEA Trådfri Gateways without external binaries
812 lines (785 loc) • 32.6 kB
TypeScript
// Generated by dts-bundle v0.7.3
// Dependencies for this module:
// ../alcalzone-shared/types
// ../events
// ../node-coap-client
import { Overwrite as Merge } from "alcalzone-shared/types";
import { EventEmitter } from "events";
import { CoapResponse, RequestMethod } from "node-coap-client";
export enum AccessoryTypes {
/** A "normal" remote */
remote = 0,
/**
* A remote which has been paired with another remote.
* See https://www.reddit.com/r/tradfri/comments/6x1miq for details
*/
slaveRemote = 1,
/** A lightbulb */
lightbulb = 2,
/** A smart plug */
plug = 3,
/** A motion sensor (currently unsupported) */
motionSensor = 4,
/** A signal repeater */
signalRepeater = 6,
/** A smart blind */
blind = 7,
/** Symfonisk Remote */
soundRemote = 8,
/** STARKVIND Air purifier */
airPurifier = 10
}
export class Accessory extends IPSODevice {
type: AccessoryTypes;
deviceInfo: DeviceInfo;
alive: boolean;
lastSeen: number;
lightList: Light[];
plugList: Plug[];
sensorList: Sensor[];
switchList: IPSODevice[];
repeaterList: IPSODevice[];
blindList: Blind[];
airPurifierList: AirPurifier[];
otaUpdateState: number;
/**
* Fixes property values that are known to be bugged
*/
fixBuggedProperties(): this;
}
export enum PowerSources {
Unknown = 0,
InternalBattery = 1,
ExternalBattery = 2,
Battery = 3,
PowerOverEthernet = 4,
USB = 5,
AC_Power = 6,
Solar = 7
}
export class DeviceInfo extends IPSOObject {
battery: number;
firmwareVersion: string;
manufacturer: string;
modelNumber: string;
power: PowerSources;
otaImageType: string;
serialNumber: number;
UNKNOWN1: number;
}
/** contains information about the gateway */
export class GatewayDetails extends IPSOObject {
alexaPairStatus: boolean;
googleHomePairStatus: boolean;
certificateProvisioned: boolean;
commissioningMode: number;
utcNowUnixTimestamp: number;
utcNowISODate: string;
timeSource: number;
ntpServerUrl: string;
version: string;
UNKNOWN_9062: number;
otaUpdateState: boolean;
updateProgress: number;
updatePriority: UpdatePriority;
updateAcceptedTimestamp: number;
releaseNotes: string;
dstStartMonth: number;
dstStartDay: number;
dstStartHour: number;
dstStartMinute: number;
dstEndMonth: number;
dstEndDay: number;
dstEndHour: number;
dstEndMinute: number;
dstTimeOffset: number;
UNKNOWN_9081: string;
UNKNOWN_9082: boolean;
UNKNOWN_9083: string;
UNKNOWN_9106: number;
forceOtaUpdateCheck: string;
name: string;
}
export enum UpdatePriority {
Normal = 0,
Critical = 1,
Required = 2,
Forced = 5
}
export interface GroupInfo {
group: Group;
scenes: Record<string, Scene>;
}
export class Group extends IPSODevice {
onOff: boolean;
dimmer: number;
position: number;
trigger: number | undefined;
sceneId: number;
deviceIDs: number[];
transitionTime: number;
/** Turn all lightbulbs on */
turnOn(): Promise<boolean>;
/** Turn all lightbulbs off */
turnOff(): Promise<boolean>;
/** Set all lightbulbs on/off to the given state */
toggle(value: boolean): Promise<boolean>;
/** Activates the given scene */
activateScene(sceneOrId: Scene | number): Promise<boolean>;
/**
* Changes this lightbulb's brightness
* @returns true if a request was sent, false otherwise
*/
setBrightness(value: number, transitionTime?: number): Promise<boolean>;
/**
* Sets all blinds to the given position
* @returns true if a request was sent, false otherwise
*/
setPosition(value: number): Promise<boolean>;
/**
* Stops all moving blinds
* @returns true if a request was sent, false otherwise
*/
stopBlinds(): Promise<boolean>;
}
export type GroupOperation = Partial<Pick<Group, "onOff" | "dimmer" | "position" | "trigger" | "sceneId" | "transitionTime">>;
export class IPSODevice extends IPSOObject {
name: string;
createdAt: number;
instanceId: number;
}
export type LightOperation = Partial<Pick<Light, "onOff" | "dimmer" | "whenPowerRestored" | "color" | "colorTemperature" | "colorX" | "colorY" | "hue" | "saturation" | "transitionTime">>;
export enum PowerRestoredAction {
TurnOn = 2,
RememberStatus = 4
}
export class Light extends IPSODevice {
constructor(options?: IPSOOptions, accessory?: Accessory);
color: string;
hue: number;
saturation: number;
colorX: number;
colorY: number;
colorTemperature: number;
transitionTime: number;
cumulativeActivePower: number;
dimmer: number;
onOff: boolean;
whenPowerRestored: PowerRestoredAction;
onTime: number;
powerFactor: number;
unit: string;
/**
* Returns true if the current lightbulb is dimmable
*/
get isDimmable(): boolean;
/**
* Returns true if the current lightbulb is switchable
*/
get isSwitchable(): boolean;
clone(): this;
get spectrum(): Spectrum;
/**
* Creates a proxy which redirects the properties to the correct internal one
*/
createProxy(): this;
/** Turn this lightbulb on */
turnOn(): Promise<boolean>;
/** Turn this lightbulb off */
turnOff(): Promise<boolean>;
/** Toggles this lightbulb on or off */
toggle(value?: boolean): Promise<boolean>;
/**
* Changes this lightbulb's brightness
* @returns true if a request was sent, false otherwise
*/
setBrightness(value: number, transitionTime?: number): Promise<boolean>;
/**
* Changes this lightbulb's color
* @param value The target color as a 6-digit hex string
* @returns true if a request was sent, false otherwise
*/
setColor(value: string, transitionTime?: number): Promise<boolean>;
/**
* Changes this lightbulb's color temperature
* @param value The target color temperature in the range 0% (cold) to 100% (warm)
* @returns true if a request was sent, false otherwise
*/
setColorTemperature(value: number, transitionTime?: number): Promise<boolean>;
/**
* Changes this lightbulb's color hue
* @returns true if a request was sent, false otherwise
*/
setHue(value: number, transitionTime?: number): Promise<boolean>;
/**
* Changes this lightbulb's color saturation
* @returns true if a request was sent, false otherwise
*/
setSaturation(value: number, transitionTime?: number): Promise<boolean>;
/** Turns this object into JSON while leaving out the potential circular reference */
toJSON(): {};
/**
* Fixes property values that are known to be bugged
*/
fixBuggedProperties(): this;
}
export type Spectrum = "none" | "white" | "rgb";
export class LightSetting extends IPSODevice {
color: string;
hue: number;
saturation: number;
colorX: number;
colorY: number;
colorTemperature: number;
dimmer: number;
onOff: boolean;
}
export class Notification extends IPSOObject {
timestamp: number;
event: NotificationTypes;
get details(): NotificationDetails;
isActive: boolean;
toJSON(): {
timestamp: number;
event: string;
details: NotificationDetails;
isActive: boolean;
};
}
export class RebootNotification extends IPSOObject {
reason: GatewayRebootReason;
toJSON(): {
reason: string;
};
}
export class FirmwareUpdateNotification extends IPSOObject {
releaseNotes: string;
priority: UpdatePriority;
toJSON(): {
releaseNotes: string;
priority: string;
};
}
export type NotificationDetails = RebootNotification | FirmwareUpdateNotification | Record<string, string>;
export enum NotificationTypes {
NewFirmwareAvailable = 1001,
Reboot = 1003,
UNKNOWN1 = 1004,
UNKNOWN2 = 1005,
LossOfInternetConnectivity = 5001
}
export enum GatewayRebootReason {
"default" = -1,
"firmware upgrade" = 0,
"initiated by client" = 1,
"homekit reset" = 3,
"factory reset" = 2
}
export type BlindOperation = Partial<Pick<Blind, "position" | "trigger">>;
export class Blind extends IPSODevice {
constructor(options?: IPSOOptions, accessory?: Accessory);
position: number;
trigger: number | undefined;
/**
* Returns true if the current blind is dimmable
*/
get isDimmable(): boolean;
/**
* Returns true if the current blind is switchable
*/
get isSwitchable(): boolean;
clone(): this;
/**
* Creates a proxy which redirects the properties to the correct internal one, does nothing now
*/
createProxy(): this;
/** Open these blinds */
open(): Promise<boolean>;
/** Close these blinds */
close(): Promise<boolean>;
/** Stops moving blinds */
stop(): Promise<boolean>;
/**
* Sets this blind's position. 0 is closed, 100 is open.
* @returns true if a request was sent, false otherwise
*/
setPosition(value: number): Promise<boolean>;
/** Turns this object into JSON while leaving out the potential circular reference */
toJSON(): {};
}
export type PlugOperation = Partial<Pick<Plug, "onOff" | "dimmer">>;
export class Plug extends IPSODevice {
constructor(options?: IPSOOptions, accessory?: Accessory);
cumulativeActivePower: number;
dimmer: number;
onOff: boolean;
onTime: number;
powerFactor: number;
/**
* Returns true if the current plug is dimmable
*/
get isDimmable(): boolean;
/**
* Returns true if the current plug is switchable
*/
get isSwitchable(): boolean;
clone(): this;
/**
* Creates a proxy which redirects the properties to the correct internal one, does nothing now
*/
createProxy(): this;
/** Turn this plug on */
turnOn(): Promise<boolean>;
/** Turn this plug off */
turnOff(): Promise<boolean>;
/** Toggles this plug on or off */
toggle(value?: boolean): Promise<boolean>;
/**
* Changes this plug's "brightness". Any value > 0 turns the plug on, 0 turns it off.
* @returns true if a request was sent, false otherwise
*/
setBrightness(value: number): Promise<boolean>;
/** Turns this object into JSON while leaving out the potential circular reference */
toJSON(): {};
}
export enum FanMode {
Off = 0,
Auto = 1,
Level1 = 10,
Level2 = 20,
Level3 = 30,
Level4 = 40,
Level5 = 50
}
export type AirPurifierOperation = Partial<Pick<AirPurifier, "controlsLocked" | "fanMode" | "fanSpeed" | "statusLEDs">>;
export class AirPurifier extends IPSODevice {
constructor(options?: IPSOOptions, accessory?: Accessory);
airQuality: number | undefined;
controlsLocked: boolean;
fanMode: FanMode;
fanSpeed: number;
totalFilterLifetime: number;
filterRuntime: number;
filterRemainingLifetime: number;
filterStatus: number;
statusLEDs: boolean;
totalMotorRuntime: number;
clone(): this;
/**
* Creates a proxy which redirects the properties to the correct internal one, does nothing now
*/
createProxy(): this;
/** Changes the fan mode of this air purifier */
setFanMode(fanMode: FanMode): Promise<boolean>;
/** Changes the fan speed of this air purifier */
setFanSpeed(fanSpeed: number): Promise<boolean>;
/** Locks or unlocks the controls on the air purifier */
setControlsLocked(locked: boolean): Promise<boolean>;
/** Enables or disables the status LEDs */
setStatusLEDs(enabled: boolean): Promise<boolean>;
/** Turns this object into JSON while leaving out the potential circular reference */
toJSON(): {};
}
export class AirPurifierSetting extends IPSODevice {
fanMode: FanMode;
}
export class Scene extends IPSODevice {
isActive: boolean;
isPredefined: boolean;
lightSettings: LightSetting[];
blindSettings: BlindSetting[];
plugSettings: PlugSetting[];
airPurifierSettings: AirPurifierSetting[];
sceneIndex: number;
sceneIconId: number;
coapVersion: string;
useCurrentLightSettings: boolean;
}
export class Sensor extends IPSODevice {
appType: string;
sensorType: string;
minMeasuredValue: number;
maxMeasuredValue: number;
minRangeValue: number;
maxRangeValue: number;
resetMinMaxMeasureValue: boolean;
sensorValue: number;
unit: string;
}
export enum TradfriErrorCodes {
ConnectionFailed = 0,
ConnectionTimedOut = 1,
AuthenticationFailed = 2,
NetworkReset = 3
}
export class TradfriError extends Error {
readonly message: string;
readonly code: TradfriErrorCodes;
constructor(message: string, code: TradfriErrorCodes);
}
export interface DiscoveredGateway {
name: string;
host?: string;
version: string;
addresses: string[];
}
/**
* Auto-discover a tradfri gateway on the network.
* @param timeout (optional) Time in milliseconds to wait for a response. Default 10000.
* Pass false or a negative number to explicitly wait forever.
*/
export function discoverGateway(timeout?: number | false): Promise<DiscoveredGateway | null>;
export type ConnectionFailedCallback = (attempt: number, maxAttempts: number) => void;
export interface ConnectionEventCallbacks {
"connection failed": ConnectionFailedCallback;
}
export type ConnectionEvents = keyof ConnectionEventCallbacks;
export type ConnectionWatcherEvents = "ping succeeded" | "ping failed" | "connection alive" | "connection lost" | "gateway offline" | "reconnecting" | "give up";
export type PingFailedCallback = (failedPingCount: number) => void;
export type ReconnectingCallback = (reconnectAttempt: number, maximumReconnects: number) => void;
export type ConnectionWatcherEventCallbacks = Merge<{
[K in ConnectionWatcherEvents]: () => void;
}, {
"ping failed": PingFailedCallback;
"reconnecting": ReconnectingCallback;
}>;
export type DeviceUpdatedCallback = (device: Accessory) => void;
export type DeviceRemovedCallback = (instanceId: number) => void;
export type GroupUpdatedCallback = (group: Group) => void;
export type GroupRemovedCallback = (instanceId: number) => void;
export type SceneUpdatedCallback = (groupId: number, scene: Scene) => void;
export type SceneRemovedCallback = (groupId: number, instanceId: number) => void;
export type ErrorCallback = (e: Error) => void;
export type GatewayUpdatedCallback = (gateway: GatewayDetails) => void;
export interface ObservableEventCallbacks {
"device updated": DeviceUpdatedCallback;
"device removed": DeviceRemovedCallback;
"group updated": GroupUpdatedCallback;
"group removed": GroupRemovedCallback;
"scene updated": SceneUpdatedCallback;
"scene removed": SceneRemovedCallback;
"gateway updated": GatewayUpdatedCallback;
"error": ErrorCallback;
}
export type ObservableEvents = keyof ObservableEventCallbacks;
export type RebootNotificationCallback = (reason: keyof typeof GatewayRebootReason) => void;
export type FirmwareUpdateNotificationCallback = (releaseNotes: string, priority: keyof typeof UpdatePriority) => void;
export type InternetConnectivityChangedCallback = (connected: boolean) => void;
export interface NotificationEventCallbacks {
"rebooting": RebootNotificationCallback;
"internet connectivity changed": FirmwareUpdateNotificationCallback;
"firmware update available": InternetConnectivityChangedCallback;
}
export type NotificationEvents = keyof NotificationEventCallbacks;
export type AllEventCallbacks = Merge<Merge<ObservableEventCallbacks, NotificationEventCallbacks>, Merge<ConnectionWatcherEventCallbacks, ConnectionEventCallbacks>>;
export type AllEvents = keyof AllEventCallbacks;
export type ObserveResourceCallback = (resp: CoapResponse) => void;
export type ObserveDevicesCallback = (addedDevices: Accessory[], removedDevices: Accessory[]) => void;
export interface TradfriClient {
on<TEvent extends AllEvents>(event: TEvent, callback: AllEventCallbacks[TEvent]): this;
removeListener<TEvent extends AllEvents>(event: TEvent, callback: AllEventCallbacks[TEvent]): this;
removeAllListeners(event?: AllEvents): this;
}
export interface TradfriOptions {
/** Callback for a custom logger function. */
customLogger: LoggerFunction;
/** Whether to use raw CoAP values or the simplified scale */
useRawCoAPValues: boolean;
/** Whether the connection should be automatically watched */
watchConnection: boolean | Partial<ConnectionWatcherOptions>;
}
export class TradfriClient extends EventEmitter implements OperationProvider {
readonly hostname: string;
/** dictionary of CoAP observers */
observedPaths: string[];
/** dictionary of known devices */
devices: Record<string, Accessory>;
/** dictionary of known groups */
groups: Record<string, GroupInfo>;
constructor(hostname: string);
constructor(hostname: string, customLogger: LoggerFunction);
constructor(hostname: string, options: Partial<TradfriOptions>);
/**
* Connect to the gateway
* @param identity A previously negotiated identity.
* @param psk The pre-shared key belonging to the identity.
*/
connect(identity: string, psk: string): Promise<true>;
/**
* Negotiates a new identity and psk with the gateway to use for connections
* @param securityCode The security code that is printed on the gateway
* @returns The identity and psk to use for future connections. Store these!
* @throws TradfriError
*/
authenticate(securityCode: string): Promise<{
identity: string;
psk: string;
}>;
/**
* Observes a resource at the given url and calls the callback when the information is updated.
* Prefer the specialized versions if possible.
* @param path The path of the resource
* @param callback The callback to be invoked when the resource updates
* @returns true if the observer was set up, false otherwise (e.g. if it already exists)
*/
observeResource(path: string, callback: (resp: CoapResponse) => void): Promise<boolean>;
/**
* Checks if a resource is currently being observed
* @param path The path of the resource
*/
isObserving(path: string): boolean;
/**
* Stops observing a resource that is being observed through `observeResource`
* Use the specialized version of this method for observers that were set up with the specialized versions of `observeResource`
* @param path The path of the resource
*/
stopObservingResource(path: string): void;
/**
* Resets the underlying CoAP client and clears all observers.
* @param preserveObservers Whether the active observers should be remembered to restore them later
*/
reset(preserveObservers?: boolean): void;
/**
* Closes the underlying CoAP client and clears all observers.
*/
destroy(): void;
/**
* Restores all previously remembered observers with their original callbacks
* Call this AFTER a dead connection was restored
*/
restoreObservers(): Promise<void>;
/**
* Sets up an observer for all devices
* @returns A promise that resolves when the information about all devices has been received.
*/
observeDevices(): Promise<void>;
stopObservingDevices(): void;
/**
* Sets up an observer for all groups and scenes
* @returns A promise that resolves when the information about all groups and scenes has been received.
*/
observeGroupsAndScenes(): Promise<void>;
stopObservingGroups(): void;
/**
* Sets up an observer for the gateway
* @returns A promise that resolves when the gateway information has been received for the first time
*/
observeGateway(): Promise<void>;
stopObservingGateway(): void;
/**
* Sets up an observer for the notification
* @returns A promise that resolves when a notification has been received for the first time
*/
observeNotifications(): Promise<void>;
stopObservingNotifications(): void;
/**
* Pings the gateway to check if it is alive
* @param timeout - (optional) Timeout in ms, after which the ping is deemed unanswered. Default: 5000ms
*/
ping(timeout?: number): Promise<boolean>;
/**
* Updates a device object on the gateway
* @param accessory The device to be changed
* @returns true if a request was sent, false otherwise
*/
updateDevice(accessory: Accessory): Promise<boolean>;
/**
* Updates a group object on the gateway
* @param group The group to be changed
* @returns true if a request was sent, false otherwise
*/
updateGroup(group: Group): Promise<boolean>;
/**
* Sets some properties on a group
* @param group The group to be updated
* @param operation The properties to be set
* @param force Include all properties of operation in the payload, even if the values are unchanged
* @returns true if a request was sent, false otherwise
*/
operateGroup(group: Group, operation: GroupOperation, force?: boolean): Promise<boolean>;
/**
* Sets some properties on a lightbulb
* @param accessory The parent accessory of the lightbulb
* @param operation The properties to be set
* @param force Include all properties of operation in the payload, even if the values are unchanged
* @returns true if a request was sent, false otherwise
*/
operateLight(accessory: Accessory, operation: LightOperation, force?: boolean): Promise<boolean>;
/**
* Sets some properties on a plug
* @param accessory The parent accessory of the plug
* @param operation The properties to be set
* @param force Include all properties of operation in the payload, even if the values are unchanged
* @returns true if a request was sent, false otherwise
*/
operatePlug(accessory: Accessory, operation: PlugOperation, force?: boolean): Promise<boolean>;
/**
* Sets some properties on a blind
* @param accessory The parent accessory of the blind
* @param operation The properties to be set
* @param force Include all properties of operation in the payload, even if the values are unchanged
* @returns true if a request was sent, false otherwise
*/
operateBlind(accessory: Accessory, operation: BlindOperation, force?: boolean): Promise<boolean>;
/**
* Sets some properties on a airpurifier
* @param accessory The parent accessory of the airpurifier
* @param operation The properties to be set
* @param force Include all properties of operation in the payload, even if the values are unchanged
* @returns true if a request was sent, false otherwise
*/
operateAirPurifier(accessory: Accessory, operation: AirPurifierOperation, force?: boolean): Promise<boolean>;
/**
* Sends a custom request to a resource
* @param path The path of the resource
* @param method The method of the request
* @param payload The optional payload as a JSON object
*/
request(path: string, method: RequestMethod, payload?: object): Promise<{
code: string;
payload: any;
}>;
/** Reboots the gateway. This operation is additionally acknowledged with a reboot notification. */
rebootGateway(): Promise<boolean>;
/** Factory resets the gateway. WARNING: All configuration will be wiped! */
resetGateway(): Promise<boolean>;
}
export type PropertyTransformKernel = (value: any, parent?: IPSOObject) => any;
export interface PropertyTransform extends PropertyTransformKernel {
/** If this transform is not supposed to be skipped ever */
neverSkip: boolean;
/** If this transform requires arrays to be split */
splitArrays: boolean;
}
export type RequiredPredicate = (me: IPSOObject, reference?: IPSOObject) => boolean;
/**
* Defines the ipso key neccessary to serialize a property to a CoAP object
*/
export const ipsoKey: (key: string) => PropertyDecorator;
/**
* Declares that a property is required to be present in a serialized CoAP object
*/
export const required: (predicate?: boolean | RequiredPredicate) => PropertyDecorator;
/**
* Defines the required transformations to serialize a property to a CoAP object
* @param kernel The transformation to apply during serialization
* @param options Some options regarding the behavior of the property transform
*/
export function serializeWith(kernel: PropertyTransformKernel, options?: {
splitArrays?: boolean;
neverSkip?: boolean;
}): PropertyDecorator;
/**
* Defines the required transformations to deserialize a property from a CoAP object
* @param kernel The transformation to apply during deserialization
* @param options Options for deserialisation
*/
export function deserializeWith(kernel: PropertyTransformKernel, options?: {
splitArrays?: boolean;
neverSkip?: boolean;
}): PropertyDecorator;
/**
* Defines that a property will not be serialized
*/
export const doNotSerialize: <T extends IPSOObject>(target: T, property: string | keyof T) => void;
/**
* Provides a set of options regarding IPSO objects and serialization
*/
export interface IPSOOptions {
/**
* Determines if basic serializers (i.e. for simple values) should be skipped
* This is used to support raw CoAP values instead of the simplified scales
*/
skipValueSerializers?: boolean;
}
export class IPSOObject {
constructor(options?: IPSOOptions);
/**
* Reads this instance's properties from the given object
*/
parse(obj: Record<string, any>): this;
/**
* Overrides this object's properties with those from another partial one
*/
merge(obj: Partial<this>, allProperties?: boolean): this;
/** serializes this object in order to transfer it via COAP */
serialize(reference?: this): Record<string, any>;
/**
* Deeply clones an IPSO Object
*/
clone(...constructorArgs: any[]): this;
/** If this object was proxied or not */
readonly isProxy: boolean;
/** Returns the raw object without a wrapping proxy */
unproxy(): this;
/**
* Creates a proxy for this device
* @param get Custom getter trap (optional). This is called after mandatory traps are in place and before default behavior
* @param set Custom setter trap (optional). This is called after mandatory traps are in place and before default behavior
*/
createProxy(get?: (me: this, key: PropertyKey) => any, set?: (me: this, key: PropertyKey, value: any, receiver: any) => boolean): this;
protected client: OperationProvider | undefined;
/**
* Fixes property values that are known to be bugged
*/
fixBuggedProperties(): this;
}
export class BlindSetting extends IPSODevice {
position: number;
}
export class PlugSetting extends IPSODevice {
onOff: boolean;
}
export type LoggerFunction = (message: string, severity?: "info" | "warn" | "debug" | "error" | "silly") => void;
export function setCustomLogger(logger: LoggerFunction): void;
export function log(message: string, severity?: "info" | "warn" | "debug" | "error" | "silly"): void;
export interface OperationProvider {
operateGroup(group: Group, operation: GroupOperation, force?: boolean): Promise<boolean>;
operateLight(accessory: Accessory, operation: LightOperation, force?: boolean): Promise<boolean>;
operatePlug(accessory: Accessory, operation: PlugOperation, force?: boolean): Promise<boolean>;
operateBlind(accessory: Accessory, operation: BlindOperation, force?: boolean): Promise<boolean>;
operateAirPurifier(accessory: Accessory, operation: AirPurifierOperation, force?: boolean): Promise<boolean>;
}
/** Configures options for connection watching and automatic reconnection */
export interface ConnectionWatcherOptions {
/** The interval in ms between consecutive pings */
pingInterval: number;
/** How many pings have to consecutively fail until the gateway is assumed offline */
failedPingCountUntilOffline: number;
/**
* How much the interval between consecutive pings should be increased while the gateway is offline.
* The actual interval is calculated by <ping interval> * <backoff factor> ** <min(5, # offline pings)>
*/
failedPingBackoffFactor: number;
/** Whether automatic reconnection is enabled */
reconnectionEnabled: boolean;
/** How many pings have to consecutively fail while the gateway is offline until a reconnection is triggered */
offlinePingCountUntilReconnect: number;
/** After how many failed reconnects we give up. Number.POSITIVE_INFINITY to never gonna give you up, never gonna let you down... */
maximumReconnects: number;
/** How many tries for the initial connection should be attempted */
maximumConnectionAttempts: number;
/** The interval in ms between consecutive connection attempts */
connectionInterval: number;
/**
* How much the interval between consecutive connection attempts should be increased.
* The actual interval is calculated by <connection interval> * <backoff factor> ** <min(5, # failed attempts)>
*/
failedConnectionBackoffFactor: number;
}
export interface ConnectionWatcher {
on<TEvent extends ConnectionWatcherEvents>(event: TEvent, callback: ConnectionWatcherEventCallbacks[TEvent]): this;
removeListener<TEvent extends ConnectionWatcherEvents>(event: TEvent, callback: ConnectionWatcherEventCallbacks[TEvent]): this;
removeAllListeners(event?: ConnectionWatcherEvents): this;
}
/**
* Watches the connection of a TradfriClient and notifies about changes in the connection state
*/
export class ConnectionWatcher extends EventEmitter {
constructor(client: TradfriClient, options?: Partial<ConnectionWatcherOptions>);
get options(): ConnectionWatcherOptions;
/** Starts watching the connection */
start(): void;
/** Stops watching the connection */
stop(): void;
}