import { AnsiLogger } from 'matterbridge/logger';
import { Config } from './config-types.js';
import EventEmitter from 'events';
import { DysonMsg } from './dyson-types.js';
import { DysonMqttParserConfig, DysonMsgAny } from './dyson-mqtt-parse.js';
import { DysonMqttSubscribeConfig } from './dyson-mqtt-subscribe.js';
import { DysonMqttFiltered } from './dyson-mqtt-filter.js';
import { AsyncEventEmitter } from './async-eventemitter.js';
import { DeviceConfigMqtt } from './dyson-mqtt-client.js';
export interface DysonMqttConfig<T> {
    topics: DysonMqttSubscribeConfig;
    messages: DysonMqttParserConfig<T>;
}
export interface DysonMqttStatusBase {
    reachable: boolean;
    initialised: boolean;
}
export type DysonMqttStatus<T> = T & DysonMqttStatusBase;
export interface DysonMqttEventMapBase {
    error: [unknown];
    subscribed: [];
    status: [];
}
export interface DysonMqttEventMap<T> extends DysonMqttEventMapBase {
    message: [DysonMsgAny<T>];
}
export type PublishArgs<T, O extends string> = {
    [K in keyof T]: T[K] extends DysonMsg ? (Omit<T[K], O | 'msg'> extends Record<string, never> ? [T[K]['msg']] : [T[K]['msg'], Omit<T[K], O | 'msg'>]) : never;
}[keyof T];
export interface DysonMqttLike extends EventEmitter {
    waitUntilInitialised(): Promise<void>;
    stop(): Promise<void>;
}
export declare abstract class DysonMqtt<T, S> extends AsyncEventEmitter<DysonMqttEventMap<T>> implements DysonMqttLike {
    readonly log: AnsiLogger;
    readonly config: Config;
    readonly deviceConfig: DeviceConfigMqtt;
    readonly mqttConfig: DysonMqttConfig<T>;
    private mqtt;
    private mqttConnection;
    private mqttSubscribe;
    private mqttFilter;
    readonly status: DysonMqttStatus<S>;
    constructor(log: AnsiLogger, config: Config, deviceConfig: DeviceConfigMqtt, mqttConfig: DysonMqttConfig<T>);
    downTimerHandle: Map<string, NodeJS.Timeout>;
    updateReachable(key: 'mqtt' | 'msg', reachable: boolean): void;
    waitUntilInitialised(): Promise<void>;
    stop(): Promise<void>;
    publish(...[msg, params]: PublishArgs<T, 'time'>): Promise<void>;
    logPayload(direction: 'publish' | 'receive', topic: string, payload: DysonMsg, filter?: DysonMqttFiltered): void;
}
//# sourceMappingURL=dyson-mqtt.d.ts.map