import { Logger } from 'homebridge';
import { EventEmitter } from 'events';
import { HomeConnectAPI } from './api.js';
import { HomeAppliance } from './api-types.js';
import { OperationState, OptionValues, ProgramKey } from './api-value-types.js';
import { CommandKV, EventKey, EventKV, EventValue, KVKey, KVValue, OptionKey, OptionValue, ProgramDefinitionKV, ProgramKV, ProgramListKV, SettingKey, SettingKV, SettingValue, StatusKey, StatusKV, StatusValue } from './api-value.js';
import { Scope } from './api-auth-types.js';
interface DeviceExtraValues {
    connected?: boolean;
}
type DeviceExtraKey = KVKey<DeviceExtraValues>;
type DeviceKey = DeviceExtraKey | OptionKey | StatusKey | SettingKey | EventKey;
type DeviceExtraValue<Key> = KVValue<DeviceExtraValues, Key>;
type DeviceValue<Key> = DeviceExtraValue<Key> | OptionValue<Key> | StatusValue<Key> | SettingValue<Key> | EventValue<Key>;
type Item<KeyU extends DeviceKey = DeviceKey> = {
    [Key in KeyU]: {
        key: Key;
        value: DeviceValue<Key>;
        unit?: string;
    };
}[KeyU];
export type OperationStateKey = keyof typeof OperationState;
export declare class HomeConnectDevice extends EventEmitter {
    readonly log: Logger;
    readonly api: HomeConnectAPI;
    readonly ha: HomeAppliance;
    readonly items: {
        [Key in DeviceKey]?: Item<Key>;
    };
    private stopEvents;
    private setConnectedScheduled?;
    private stopScheduled?;
    private readAllActions?;
    private readAllScheduled?;
    private readPrograms?;
    constructor(log: Logger, api: HomeConnectAPI, ha: HomeAppliance);
    stop(): void;
    describe<Key extends DeviceKey>(item: Item<Key>): string;
    update<Key extends DeviceKey>(items: Item<Key>[]): void;
    getItem<Key extends DeviceKey>(key: Key): DeviceValue<Key> | undefined;
    getAppliance(): Promise<HomeAppliance>;
    getStatus(): Promise<StatusKV[]>;
    getSettings(): Promise<SettingKV[]>;
    getSetting<Key extends SettingKey>(settingKey: Key): Promise<SettingKV<Key> | null>;
    setSetting<Key extends SettingKey>(settingKey: Key, value: SettingValue<Key>): Promise<void>;
    getAllPrograms(): Promise<ProgramListKV[]>;
    getAvailablePrograms(): Promise<ProgramListKV[]>;
    getAvailableProgram<Key extends ProgramKey>(programKey: Key): Promise<ProgramDefinitionKV<Key>>;
    getSelectedProgram(): Promise<ProgramKV | null>;
    setSelectedProgram(programKey: ProgramKey, options?: OptionValues): Promise<void>;
    getActiveProgram(): Promise<ProgramKV | null>;
    startProgram(programKey?: ProgramKey, options?: OptionValues): Promise<void>;
    stopProgram(): Promise<void>;
    getCommands(): Promise<CommandKV[]>;
    pauseProgram(pause?: boolean): Promise<void>;
    openDoor(fully?: boolean): Promise<void>;
    setActiveProgramOption<Key extends OptionKey>(optionKey: Key, value: OptionValue<Key>): Promise<void>;
    waitConnected(immediate?: boolean): Promise<void>;
    waitOperationState(states: OperationStateKey[], milliseconds?: number): Promise<void>;
    inferPowerState(): void;
    setConnectedState(isConnected?: boolean): void;
    onConnected(): void;
    onDisconnected(): void;
    readAll(): Promise<void>;
    isOperationState(...states: OperationStateKey[]): boolean;
    requireConnected(): void;
    requireIdentify(): void;
    requireMonitor(): void;
    requireSettings(): void;
    requireControl(): void;
    requireRemoteControl(): void;
    requireRemoteStart(): void;
    hasScope(scope: Scope): boolean;
    pollPrograms(enable?: boolean): void;
    processEvents(): Promise<void>;
    eventListener(event: EventKV): void;
    on<Key extends DeviceKey>(key: Key, listener: (value: DeviceValue<Key>) => void): this;
    off<Key extends DeviceKey>(key: Key, listener: (value: DeviceValue<Key>) => void): this;
    onceWait<Key extends DeviceKey>(key: Key): Promise<DeviceValue<Key>>;
    emit<Key extends DeviceKey>(key: Key, value: DeviceValue<Key>): boolean;
}
export {};
//# sourceMappingURL=homeconnect-device.d.ts.map