/// import { EventEmitter } from 'events'; import type log from 'loglevel'; import type { BulbSysinfo } from '../bulb'; import type { default as Client, SendOptions } from '../client'; import type { Logger } from '../logger'; import type { PlugSysinfo } from '../plug'; import type { RealtimeNormalized } from '../shared/emeter'; import { type HasErrCode } from '../utils'; import Netif from './netif'; type HasAtLeastOneProperty = { [key: string]: unknown; }; export interface ApiModuleNamespace { system: string; cloud: string; schedule: string; timesetting: string; emeter: string; netif: string; lightingservice: string; } export type Sysinfo = BulbSysinfo | PlugSysinfo; export interface DeviceConstructorOptions { client: Client; host: string; /** * @defaultValue 9999 */ port?: number; logger?: log.RootLogger; defaultSendOptions?: SendOptions; } export type CommonSysinfo = { alias: string; deviceId: string; model: string; sw_ver: string; hw_ver: string; }; export declare function isCommonSysinfo(candidate: unknown): candidate is CommonSysinfo; export declare function isBulbSysinfo(candidate: unknown): candidate is BulbSysinfo; export declare function isPlugSysinfo(candidate: unknown): candidate is PlugSysinfo; export interface DeviceEvents { /** * Energy Monitoring Details were updated from device. Fired regardless if status was changed. */ 'emeter-realtime-update': (value: RealtimeNormalized) => void; } declare interface Device { on(event: U, listener: DeviceEvents[U]): this; emit(event: U, ...args: Parameters): boolean; } /** * TP-Link Device. * * Abstract class. Shared behavior for {@link Plug} and {@link Bulb}. * @fires Device#emeter-realtime-update * @noInheritDoc */ declare abstract class Device extends EventEmitter { readonly client: Client; host: string; port: number; netif: Netif; log: Logger; readonly defaultSendOptions: SendOptions; private readonly udpConnection; private readonly tcpConnection; protected _sysInfo: Sysinfo; abstract readonly apiModules: ApiModuleNamespace; abstract supportsEmeter: boolean; get childId(): string | undefined; constructor(options: DeviceConstructorOptions & { _sysInfo: Sysinfo; }); /** * Returns cached results from last retrieval of `system.sysinfo`. * @returns system.sysinfo */ get sysInfo(): Sysinfo; /** * @internal */ setSysInfo(sysInfo: Sysinfo): void; /** * Cached value of `sysinfo.alias`. */ get alias(): string; /** * Cached value of `sysinfo.deviceId`. */ get id(): string; /** * Cached value of `sysinfo.deviceId`. */ get deviceId(): string; /** * Cached value of `sysinfo.[description|dev_name]`. */ abstract get description(): string | undefined; /** * Cached value of `sysinfo.model`. */ get model(): string; /** * Cached value of `sysinfo.alias`. */ get name(): string; /** * Cached value of `sysinfo.[type|mic_type]`. */ get type(): string; /** * Type of device (or `device` if unknown). * * Based on cached value of `sysinfo.[type|mic_type]` */ get deviceType(): 'plug' | 'bulb' | 'device'; /** * Cached value of `sysinfo.sw_ver`. */ get softwareVersion(): string; /** * Cached value of `sysinfo.hw_ver`. */ get hardwareVersion(): string; /** * Cached value of `sysinfo.[mac|mic_mac|ethernet_mac]`. */ get mac(): string; /** * Normalized cached value of `sysinfo.[mac|mic_mac|ethernet_mac]` * * Removes all non alphanumeric characters and makes uppercase * `aa:bb:cc:00:11:22` will be normalized to `AABBCC001122` */ get macNormalized(): string; /** * Closes any open network connections including any shared sockets. */ closeConnection(): void; /** * Sends `payload` to device (using {@link Client#send}) * @param payload - payload to send to device, if object, converted to string via `JSON.stringify` * @returns parsed JSON response */ send(payload: string | Record, sendOptions?: SendOptions): Promise; /** * @internal * @alpha */ sendSingleCommand(moduleName: string, methodName: string, parameters: HasAtLeastOneProperty, childIds?: string[] | string | undefined, sendOptions?: SendOptions): Promise; /** * Sends command(s) to device. * * Calls {@link Device#send} and processes the response. * * - Adds context.child_ids:[] to the command. * - If `childIds` parameter is set. _or_ * - If device was instantiated with a childId it will default to that value. * * - If only one operation was sent: * - Promise fulfills with specific parsed JSON response for command.\ * Example: `{system:{get_sysinfo:{}}}` * - resolves to: `{err_code:0,...}`\ * - instead of: `{system:{get_sysinfo:{err_code:0,...}}}` (as {@link Device#send} would) * - If more than one operation was sent: * - Promise fulfills with full parsed JSON response (same as {@link Device#send}) * * Also, the response's `err_code`(s) are checked, if any are missing or != `0` the Promise is rejected with {@link ResponseError}. * @returns parsed JSON response * @throws {@link ResponseError} */ sendCommand(command: string | Record, childIds?: string[] | string | undefined, sendOptions?: SendOptions): Promise; protected normalizeChildId(childId: string): string; /** * Gets device's SysInfo. * * Requests `system.sysinfo` from device. Does not support childId. * @returns parsed JSON response * @throws {@link ResponseError} */ getSysInfo(sendOptions?: SendOptions): Promise; /** * Change device's alias (name). * * Sends `system.set_dev_alias` command. Supports childId. * @returns parsed JSON response * @throws {@link ResponseError} */ setAlias(alias: string, sendOptions?: SendOptions): Promise; protected abstract setAliasProperty(alias: string): void; /** * Set device's location. * * Sends `system.set_dev_location` command. Does not support childId. * @returns parsed JSON response * @throws {@link ResponseError} */ setLocation(latitude: number, longitude: number, sendOptions?: SendOptions): Promise>; /** * Gets device's model. * * Requests `system.sysinfo` and returns model name. Does not support childId. * @returns parsed JSON response * @throws {@link ResponseError} */ getModel(sendOptions?: SendOptions): Promise; /** * Reboot device. * * Sends `system.reboot` command. Does not support childId. * @returns parsed JSON response * @throws {@link ResponseError} */ reboot(delay: number, sendOptions?: SendOptions): Promise; /** * Reset device. * * Sends `system.reset` command. Does not support childId. * @returns parsed JSON response * @throws {@link ResponseError} */ reset(delay: number, sendOptions?: SendOptions): Promise; abstract getInfo(sendOptions?: SendOptions): Promise>; } export default Device; //# sourceMappingURL=index.d.ts.map