import { Logger } from 'homebridge';
import Token = PubSubJS.Token;
export interface UniFiDeviceStatus {
    device: UniFiDevice;
    ports: UniFiSwitchPort[];
    outlets: UniFiSmartPowerOutlet[];
    rpsPorts: UniFiRpsPort[];
}
export interface UniFiDevice {
    site: string;
    id: string;
    ip: string;
    mac: string;
    model: string;
    version: string;
    serialNumber: string;
    name: string;
}
export interface UniFiSmartPowerOutlet {
    index: number;
    name: string;
    relayState: UniFiSmartPowerOutletState;
    inUse: UniFiPortOrOutletInUse;
    entry: UniFiApiDeviceOutletTable;
    override: UniFiApiDeviceOutletOverride;
}
export interface UniFiSwitchPort {
    index: number;
    name: string;
    poeMode: UniFiSwitchPortPoeMode;
    poeOnAction: UniFiSwitchPortPoeModeAction;
    inUse: UniFiPortOrOutletInUse;
    active: boolean;
    entry: UniFiApiDeviceSwitchPortTable;
    override: UniFiApiDeviceSwitchPortOverride;
}
export interface UniFiRpsPort {
    index: number;
    name: string;
    portMode: UniFiRpsPortMode;
    inUse: UniFiPortOrOutletInUse;
    active: boolean;
    entry: UniFiApiDeviceRpsPortTable;
    override: UniFiApiDeviceRpsPortTableOverride;
}
export type UniFiSwitchPortPoeMode = 'unknown' | 'auto' | 'passthrough' | 'pasv24' | 'off';
export type UniFiSwitchPortPoeModeAction = 'auto' | 'passthrough' | 'pasv24' | 'off';
export type UniFiRpsPortMode = 'auto' | 'disabled';
export declare enum UniFiSmartPowerOutletState {
    UNKNOWN = -1,
    OFF = 0,
    ON = 1
}
export declare enum UniFiPortOrOutletInUse {
    UNKNOWN = -1,
    NO = 0,
    YES = 1
}
export declare enum UniFiSmartPowerOutletAction {
    OFF = 0,
    ON = 1
}
export declare enum UniFiRpsPortAction {
    OFF = 0,
    ON = 1
}
export declare enum UniFiDeviceKind {
    OUTLET = 0,
    PORT = 1,
    RPS_PORT = 2
}
export declare const UniFiSwitchPortPoeCaps: {
    '8023AF': number;
    '8023AT': number;
    PASV24: number;
    PASSTHROUGHABLE: number;
    PASSTHROUGH: number;
    '8023BT': number;
};
export interface UniFiControllerConfig {
    host: string;
    port: number;
    username: string;
    password: string;
    refreshDevicesPollInterval?: number;
    outletStatusPollInterval?: number;
    outletStatusCacheTtl?: number;
}
export interface UniFiSite {
    id: string;
    name: string;
}
export declare class UniFiSmartPower {
    readonly log: Logger;
    private readonly config;
    private static readonly PUB_SUB_OUTLET_TOPIC;
    private static readonly STATUS_CACHE_KEY;
    private static readonly STATUS_CACHE_TTL_MS_DEFAULT;
    private static readonly STATUS_CACHE_TTL_MS_MIN;
    private static readonly STATUS_CACHE_TTL_MS_MAX;
    private static readonly STATUS_POLL_INTERVAL_MS_DEFAULT;
    private static readonly STATUS_POLL_INTERVAL_MS_MIN;
    private static readonly STATUS_POLL_INTERVAL_MS_MAX;
    private static readonly CONTROLLER_LOCK;
    private readonly lock;
    private readonly cache;
    private readonly controller;
    constructor(log: Logger, config: UniFiControllerConfig);
    reset(): void;
    subscribe(device: UniFiDevice, kind: UniFiDeviceKind, index: number, func: ((outlet: UniFiSmartPowerOutlet) => void) | ((port: UniFiSwitchPort) => void) | ((rpsPort: UniFiRpsPort) => void)): Token;
    unsubscribe(token: Token): void;
    getSites(): Promise<UniFiSite[]>;
    getDeviceStatuses(site: string, acquireLock?: boolean): Promise<UniFiDeviceStatus[]>;
    getDeviceStatuses(device: UniFiDevice, acquireLock?: boolean): Promise<UniFiDeviceStatus[]>;
    private static transformDeviceStatusResponse;
    private static getPortPoeOnMode;
    private static poeSupportsMode;
    getDeviceStatus(device: UniFiDevice, acquireLock?: boolean): Promise<UniFiDeviceStatus>;
    getPortStatus(device: UniFiDevice, portIndex: number): Promise<UniFiSwitchPort>;
    getOutletStatus(device: UniFiDevice, outletIndex: number): Promise<UniFiSmartPowerOutlet>;
    getRpsPortStatus(device: UniFiDevice, portIndex: number): Promise<UniFiRpsPort>;
    commandOutlet(device: UniFiDevice, outletIndex: number, command: UniFiSmartPowerOutletAction): Promise<void>;
    commandPort(device: UniFiDevice, portIndex: number, poeMode: UniFiSwitchPortPoeModeAction): Promise<void>;
    commandRpsPort(device: UniFiDevice, portIndex: number, command: UniFiRpsPortAction): Promise<void>;
    private get statusCacheTtlMs();
    private get statusPollIntervalMs();
    private static statusTopic;
    private static deviceCacheKey;
}
type UniFiApiDeviceSwitchPortTable = {
    port_idx: number;
    name?: string;
    port_poe?: boolean;
    poe_mode?: UniFiSwitchPortPoeModeAction;
    poe_caps?: number;
    poe_power?: string;
    poe_enable?: boolean;
};
type UniFiApiDeviceSwitchPortOverride = {
    port_idx: number;
    name?: string;
    poe_mode: UniFiSwitchPortPoeModeAction;
};
type UniFiApiDeviceRpsPortTable = {
    port_idx: number;
    name?: string;
    port_mode?: UniFiRpsPortMode;
    up?: boolean;
    power_active?: boolean;
    power_delivering?: boolean;
};
type UniFiApiDeviceRpsPortTableOverride = {
    port_idx: number;
    name?: string;
    port_mode: UniFiRpsPortMode;
};
type UniFiApiDeviceOutletTable = {
    index: number;
    name?: string;
    relay_state: boolean;
    outlet_power?: string;
    outlet_caps?: number;
};
type UniFiApiDeviceOutletOverride = {
    index: number;
    name?: string;
    relay_state: boolean;
};
export {};
//# sourceMappingURL=uniFiSmartPower.d.ts.map