import { DeviceTypeDefinition, MatterbridgeEndpoint } from 'matterbridge';
import { AnsiLogger } from 'matterbridge/logger';
import { Config, EntityName } from './config-types.js';
import { EndpointBase, EndpointOptionsBase } from './endpoint-base.js';
import { AtLeastOne, ClusterId } from 'matterbridge/matter';
import { AirQuality, ConcentrationMeasurement, FanControl, ResourceMonitoring, Thermostat } from 'matterbridge/matter/clusters';
import { FanControlOptions, FilterMonitoringOptions } from './endpoint-air-purifier.js';
import { Changed } from './decorator-changed.js';
import { MaybePromise } from 'matterbridge/matter';
export type EndpointOptionsAirSensors = {
    [K in keyof UpdateAirSensors as undefined extends UpdateAirSensors[K] ? K : never]-?: boolean;
};
export interface EndpointOptionsAir extends EndpointOptionsBase {
    validatedNames: EntityName[];
    fanControl: FanControlOptions;
    hepaFilter: FilterMonitoringOptions;
    carbonFilter?: FilterMonitoringOptions;
    sensors: EndpointOptionsAirSensors;
}
export type HandlerAir<T> = (newValue: T, oldValue: T) => MaybePromise;
export type HandlerAirMap<T extends Record<string, unknown>> = {
    [K in keyof T & string]: HandlerAir<T[K]>;
};
export interface HandlersAirFan {
    onOff: HandlerAir<boolean>;
    airflowDirection: HandlerAir<FanControl.AirflowDirection>;
    fanMode: HandlerAir<FanControl.FanMode>;
    percentSetting: HandlerAir<number>;
    rockSetting: HandlerAir<AirFanRockSetting>;
    speedSetting: HandlerAir<number>;
    windSetting: HandlerAir<AirWindSetting>;
}
export interface HandlersAirThermostat {
    occupiedHeatingSetpoint: HandlerAir<number>;
    systemMode: HandlerAir<Thermostat.SystemMode>;
}
export interface AirFanRockSetting {
    rockLeftRight?: boolean;
    rockUpDown?: boolean;
    rockRound?: boolean;
}
export interface AirWindSetting {
    sleepWind?: boolean;
    naturalWind?: boolean;
}
export interface UpdateAirFan {
    onOff: boolean;
    airflowDirection?: FanControl.AirflowDirection;
    fanMode: FanControl.FanMode;
    percentSetting: number | null;
    rockSetting?: AirFanRockSetting;
    speedSetting: number | null;
    windSetting?: AirWindSetting;
    percentCurrent: number;
    speedCurrent: number;
}
export interface UpdateAirThermostatRunningState {
    cool?: false;
    coolStage2?: false;
    heat: boolean;
    heatStage2?: boolean;
    fan: boolean;
    fanStage2?: boolean;
    fanStage3?: boolean;
}
export interface UpdateAirThermostat {
    occupiedHeatingSetpoint: number;
    systemMode: Thermostat.SystemMode;
    localTemperature: number | null;
    piHeatingDemand: number;
    thermostatRunningState: UpdateAirThermostatRunningState;
}
export interface UpdateAirFilterMonitoringSingle {
    condition: number;
    changeIndication: ResourceMonitoring.ChangeIndication;
    inPlaceIndicator: boolean;
}
export interface UpdateAirFilterMonitoring {
    hepa: UpdateAirFilterMonitoringSingle;
    carbon?: UpdateAirFilterMonitoringSingle;
}
export interface UpdateAirSensors {
    airQuality: AirQuality.AirQualityEnum;
    temperature: number | null;
    humidity: number | null;
    voc?: ConcentrationMeasurement.LevelValue;
    co2?: number | null;
    nox?: ConcentrationMeasurement.LevelValue;
    hcho?: number | null;
    pm25?: number | null;
    pm10?: number | null;
}
export declare class EndpointsAir {
    readonly log: AnsiLogger;
    readonly config: Config;
    readonly options: EndpointOptionsAir;
    bridged: EndpointBase[];
    purifier?: MatterbridgeEndpoint;
    thermostat?: MatterbridgeEndpoint;
    airQuality: MatterbridgeEndpoint[];
    temperature: MatterbridgeEndpoint[];
    humidity: MatterbridgeEndpoint[];
    changed: Changed;
    lastWrite: Map<string, unknown>;
    constructor(log: AnsiLogger, config: Config, options: EndpointOptionsAir);
    createAirPurifierEndpoint(composed?: boolean): MatterbridgeEndpoint | undefined;
    createHumiditySensorEndpoint(parent?: MatterbridgeEndpoint): MatterbridgeEndpoint | undefined;
    createTemperatureSensorEndpoint(parent?: MatterbridgeEndpoint): MatterbridgeEndpoint | undefined;
    createThermostatEndpoint(parent?: MatterbridgeEndpoint): MatterbridgeEndpoint | undefined;
    createAirQualitySensorEndpoint(parent?: MatterbridgeEndpoint): MatterbridgeEndpoint | undefined;
    createDevice(endpointName: EntityName, definition: AtLeastOne<DeviceTypeDefinition>, parent?: MatterbridgeEndpoint): MatterbridgeEndpoint | undefined;
    get bridgedNodeEndpoints(): MatterbridgeEndpoint[];
    setFanControlHandlers(handlers: HandlersAirFan): Promise<void>;
    setThermostatHandlers(handlers: HandlersAirThermostat): Promise<void>;
    subscribeAttributes<T extends Record<keyof T, unknown>>(endpoint: MatterbridgeEndpoint, clusterId: ClusterId, name: string, handlers: HandlerAirMap<T>, keys?: (keyof T & string)[]): Promise<void>;
    updateReachable(reachable: boolean): Promise<void>;
    updateFanControl(fan: UpdateAirFan): Promise<void>;
    updateThermostat(thermostat: UpdateAirThermostat): Promise<void>;
    updateFilterMonitoring(filters: UpdateAirFilterMonitoring): Promise<void>;
    updateSensors(measurements: UpdateAirSensors): Promise<void>;
    updateNextStatus(): void;
}
//# sourceMappingURL=endpoint-air.d.ts.map