UNPKG

node-tado-client

Version:
937 lines (936 loc) 25.6 kB
import { ACHorizontalSwing, ACInstallationState, ACMode, ACVerticalSwing, AirComfortFreshnessValue, AwayConfigurationPreheatingLevel, DataPointType, DeviceBatteryState, DeviceCharacteristicsCapabilities, DeviceOrientation, DeviceType, EnergySavingReportUnit, FanLevel, FanSpeed, Feature, HeatingInstallationState, HomeGeneration, HorizontalSwing, HumidityLevel, InstallationType, IQUnit, OutdoorPollensTypeValue, OutdoorQualityLevel, Platform, Power, StatePresence, StripeTypeValue, TadoMode, TemperatureLevel, TemperatureUnit, TimeTableDayType, VerticalSwing, WeatherStateValue, XConnectionState, XFeature, ZoneDeviceDuty, ZoneOverlayTerminationTypeSkillBasedApp, ZoneType } from "./enums"; export * from "./auth"; export * from "./enums"; export * from "./errors"; export type DeepPartial<T> = T extends object ? { [P in keyof T]?: DeepPartial<T[P]>; } : T; type Nullable<T> = T | null; /** Example: `'en'` */ export type Locale = string; /** Example: `'Europe/Paris'` */ export type TimeZone = string; /** Example: `'FRA'` */ export type Country = string; /** Example: `'EUR'` */ export type Currency = string; /** Example: `'€'` */ export type CurrencySign = string; export type Geolocation = { latitude: number; longitude: number; }; export type Interval = { /** JSON formated date */ start: string; /** JSON formated date */ end: string; }; export type HomeIncidentDetection = { supported: boolean; enabled: boolean; }; export type HomeSkill = "AUTO_ASSIST"; export type HomeContactDetail = { name: string; email: string; phone: string; }; export type HomeAddress = { addressLine1: string; addressLine2: string | null; zipCode: string; city: string; state: string | null; country: Country; }; export type Home = { id: number; name: string; dateTimeZone: TimeZone; dateCreated: string; temperatureUnit: TemperatureUnit; /** Partner organisation where Tado was purchased */ partner: string; simpleSmartScheduleEnabled: boolean; awayRadiusInMeters: number; installationCompleted: boolean; incidentDetection: HomeIncidentDetection; generation: HomeGeneration; zonesCount: number; language: string; skills: HomeSkill[]; christmasModeEnabled: boolean; showAutoAssistReminders: boolean; contactDetails: HomeContactDetail; address: HomeAddress; geolocation: Geolocation; consentGrantSkippable: boolean; enabledFeatures: Feature[]; isAirComfortEligible: boolean; isBalanceAcEligible: boolean; isBalanceHpEligible?: boolean; isEnergyIqEligible: boolean; isHeatSourceInstalled: boolean; isHeatPumpInstalled: boolean; supportsFlowTemperatureOptimization?: boolean; preventFromSubscribing?: boolean; }; export type MeHome = Pick<Home, "id" | "name">; export type MobileDeviceSettingsPushNotification = { lowBatteryReminder: boolean; awayModeReminder: boolean; homeModeReminder: boolean; openWindowReminder: boolean; energySavingsReportReminder: boolean; incidentDetection: boolean; }; export type PushNotificationRegistrationData = { token: string; firebaseProject: "tado-app" | string; provider: "FCM" | string; }; export type PushNotificationRegistration = { endpointArnValue: string; }; export type MobileDeviceSettings = { geoTrackingEnabled: boolean; onDemandLogRetrievalEnabled: boolean; pushNotifications?: MobileDeviceSettingsPushNotification; specialOffersEnabled?: boolean; }; export type MobileDeviceLocationBearingFromHome = { degrees: number; radians: number; }; export type MobileDeviceLocation = { stale: boolean; atHome: boolean; bearingFromHome: MobileDeviceLocationBearingFromHome; relativeDistanceFromHomeFence: number; }; export type MobileDeviceMetadata = { platform: Platform; osVersion: string; model: string; locale: Locale; }; export type MobileDevice = { name: string; id: number; settings: MobileDeviceSettings; location?: Nullable<MobileDeviceLocation>; deviceMetadata: MobileDeviceMetadata; }; export type MobileDeviceGeoLocationConfig = { home: { geolocation: Geolocation; region: number; wifiRegion: number; }; regions: number[]; desiredAccuracy: number; maxAccuracy: number; distanceFilter: number; maxAge: number; providerUpdateInterval: number; minIntervalBetweenSentUpdates: number; minIntervalBetweenBackgroundUpdates: number; wakeupInterval: number; }; export type Me = { name: string; email: string; username: string; id: string; homes: MeHome[]; locale: Locale; mobileDevices: MobileDevice[]; }; export type WeatherSolarIntensity = { type: "PERCENTAGE"; percentage: number; timestamp: string; }; export type Temperature = { celsius: number; fahrenheit: number; }; export type WeatherOutsideTemperature = { type: "TEMPERATURE"; celsius: number; fahrenheit: number; timestamp: string; precision: Temperature; }; export type WeatherState = { type: "WEATHER_STATE"; value: WeatherStateValue; timestamp: string; }; export type Weather = { solarIntensity: WeatherSolarIntensity; outsideTemperature: WeatherOutsideTemperature; weatherState: WeatherState; }; export type DeviceConnectionState = { value: boolean; timestamp: string; }; export type DeviceCharacteristics = { capabilities: DeviceCharacteristicsCapabilities[]; }; export type DeviceMountingStateValue = "CALIBRATED"; export type DeviceMountingState = { value: DeviceMountingStateValue; timestamp: string; }; export type Device = { deviceType: DeviceType; serialNo: string; shortSerialNo: string; currentFwVersion: string; connectionState: DeviceConnectionState; characteristics: DeviceCharacteristics; batteryState: DeviceBatteryState; mountingState?: DeviceMountingState; mountingStateWithError?: DeviceMountingStateValue; orientation?: DeviceOrientation; childLockEnabled?: boolean; }; export type UserHome = Pick<Home, "id" | "name">; export type User = { name: string; email: string; username: string; id: string; homes: UserHome[]; locale: Locale; mobileDevices: MobileDevice[]; }; export type State = { presence: StatePresence; presenceLocked: boolean; }; export type ZoneDazzleMode = { supported: boolean; enabled: boolean; }; export type ZoneOpenWindowDetection = { supported: boolean; enabled: boolean; timeoutInSeconds: number; }; export type ZoneDevice = Zone & { duties: ZoneDeviceDuty[]; }; export type ZoneOverlayTerminationNextTimeBlock = { type: "TIMER"; typeSkillBasedApp: "NEXT_TIME_BLOCK"; durationInSeconds: number; /** `YYYY-MM-DDTHH:mm:ss` format datetime */ expiry: string; remainingTimeInSeconds: number; /** `YYYY-MM-DDTHH:mm:ss` format datetime */ projectedExpiry: string; }; export type ZoneOverlayTerminationTimer = Omit<ZoneOverlayTerminationNextTimeBlock, "type" | "typeSkillBasedApp"> & { type: "TIMER"; typeSkillBasedApp: "TIMER"; }; export type ZoneOverlayTerminationManual = { type: "MANUAL"; typeSkillBasedApp: "MANUAL"; }; export type ZoneOverlayTermination = ZoneOverlayTerminationManual | ZoneOverlayTerminationTimer | ZoneOverlayTerminationNextTimeBlock | { type: "TADO_MODE"; typeSkillBasedApp: "TADO_MODE"; }; export type ZoneOverlay = { type: "MANUAL"; setting: TimeTableSettings; termination: ZoneOverlayTermination; }; export type ZoneMultiOverlay = { overlay: { setting: Partial<SetZoneOverlayArg>; termination: Partial<ZoneOverlayTermination>; }; room: number; }; export type DefaultOverlay = { terminationCondition: { type: "MANUAL" | "TADO_MODE"; }; } | { terminationCondition: { type: "TIMER"; durationInSeconds: number; }; }; export type ZoneOpenWindow = { /** RFC3339 formatted datetime */ detectedTime: string; durationInSeconds: number; /** RFC3339 formatted datetime */ expiry: string; remainingTimeInSeconds: number; }; export type Zone = { id: number; name: string; type: ZoneType; dateCreated: string; deviceTypes: DeviceType[]; devices: ZoneDevice[]; reportAvailable: boolean; showScheduleSetup: boolean; supportsDazzle: boolean; dazzleEnabled: boolean; dazzleMode: ZoneDazzleMode; openWindowDetection: ZoneOpenWindowDetection; }; export type TimeTableSettings = { type: ZoneType; isBoost?: boolean; power: Power; temperature: Temperature | null; fanSpeed?: FanSpeed; fanLevel?: FanLevel; verticalSwing?: VerticalSwing; horizontalSwing?: HorizontalSwing; light?: unknown; }; export type SetTimeTableSettings = Omit<TimeTableSettings, "temperature"> & { temperature: Temperature | { celsius: number; } | { fahrenheit: number; } | null; }; export type SetZoneOverlayArg = SetTimeTableSettings & { mode?: ACMode; }; export type SetZoneOverlaysArg = Omit<SetTimeTableSettings, "type"> & { mode?: ACMode; zone_id: number; }; export type ZoneStateNextScheduleChange = { start: string; setting: TimeTableSettings; }; export type ZoneNextTimeBlock = { start: string; }; export type ZoneLinkState = "ONLINE"; export type ZoneLink = { state: ZoneLinkState; }; export type DataPointPercentage = { type: DataPointType.PERCENTAGE; timestamp: string; percentage: number; }; export type DataPointTemperature = Temperature & { type: DataPointType.TEMPERATURE; timestamp: string; precision: Temperature; } & { value?: Power; }; export type DataPointPower = { type: DataPointType.POWER; power: Power; }; export type DataPointHeating = DataPointPercentage | DataPointTemperature; /** * @deprecated Use {@link DataPointHeating} instead. */ export type DataPoint = DataPointHeating; export type ZoneActivityDataPoints = { heatingPower: DataPointHeating; } | { acPower: DataPointPower; }; export type ZoneStateSensorDataPoints = { insideTemperature: DataPointTemperature; humidity: DataPointPercentage; }; export type Preparation = { tadoMode: TadoMode; /** `YYYY-MM-DDTHH:mm:ss` format datetime */ end: string; setting: TimeTableSettings; }; export type ZoneState = { tadoMode: TadoMode; geolocationOverride: boolean | null; geolocationOverrideDisableTime: boolean | null; preparation: Preparation | null; setting: TimeTableSettings; overlayType: Nullable<"MANUAL">; overlay: Nullable<ZoneOverlay>; openWindow: Nullable<ZoneOpenWindow>; nextScheduleChange: Nullable<ZoneStateNextScheduleChange>; nextTimeBlock: Nullable<ZoneNextTimeBlock>; link: ZoneLink; activityDataPoints: ZoneActivityDataPoints; sensorDataPoints: ZoneStateSensorDataPoints; }; export type ZoneControl = { type: ZoneType; heatingCircuit?: number; earlyStartEnabled: boolean; duties: { type: ZoneType; leader: Device; drivers: Device[]; uis: Device[]; }; }; type ZoneId = string; export type ZoneStates = { zoneStates: Record<ZoneId, ZoneState>; }; export type HeatingCircuit = { number: number; driverSerialNo: string; driverShortSerialNo: string; }; export type RunningTimeZone = { id: number; runningTimeInSeconds: number; }; export type RunningTime = { /** `YYYY-MM-DDTHH:mm:ss` format datetime */ startTime: string; /** `YYYY-MM-DDTHH:mm:ss` format datetime */ endTime: string; runningTimeInSeconds: number; zones: RunningTimeZone[]; }; export type RunningTimeSummary = { /** `YYYY-MM-DDTHH:mm:ss` format datetime */ start: string; /** `YYYY-MM-DDTHH:mm:ss` format datetime */ end: string; meanInSecondsPerDay: number; totalRunningTimeInSeconds: number; }; export type RunningTimes = { /** `YYYY-MM-DDTHH:mm:ss` format datetime */ lastUpdated: string; runningTimes: RunningTime[]; summary: RunningTimeSummary; }; export type RunningTimesSummaryOnly = { summary: RunningTimeSummary; }; export type StepTemperature = { min: number; max: number; step: number; }; export type ZoneCapabilitiesAC = { fanLevel: FanLevel; temperatures?: ZoneCapabilitiesTemperatures; verticalSwing?: ACVerticalSwing; horizontalSwing?: ACHorizontalSwing; }; export type ZoneCapabilitiesTemperatures = { celsius: StepTemperature; fahrenheit: StepTemperature; }; export type ZoneCapabilities = { type: "HEATING"; temperatures: ZoneCapabilitiesTemperatures; } | ({ type: "AIR_CONDITIONING"; } & { [key in ACMode]: ZoneCapabilitiesAC; }) | { type: "HOT_WATER"; }; export type HeatingAwayConfiguration = { type: ZoneType & "HEATING"; preheatingLevel: AwayConfigurationPreheatingLevel; minimumAwayTemperature: Temperature; }; export type HotWaterAwayConfiguration = { type: ZoneType & "HOT_WATER"; power: Power; temperature: Temperature; }; export type CoolingAwayConfiguration = Omit<TimeTableSettings, "isBoost"> & { type: ZoneType & "AIR_CONDITIONING"; }; export type AwayConfiguration = HeatingAwayConfiguration | HotWaterAwayConfiguration | CoolingAwayConfiguration; export type TimeTableBlock = { dayType: TimeTableDayType; /** HH:mm */ start: string; /** HH:mm */ end: string; geolocationOverride: boolean; setting: TimeTableSettings; }; export type TimeTable = TimeTableBlock[]; export type TimeTables = { id: 0; type: "ONE_DAY"; } | { id: 1; type: "THREE_DAY"; } | { id: 2; type: "SEVEN_DAY"; }; export type AirComfortFreshness = { value: AirComfortFreshnessValue; /** `YYYY-MM-DDTHH:mm:ss` format datetime */ lastOpenWindow: string; }; export type AirComfortCoordinate = { radial: number; angular: number; }; export type AirComfortRoom = { roomId: number; temperatureLevel: TemperatureLevel; humidityLevel: HumidityLevel; coordinate: AirComfortCoordinate; }; export type AirComfort = { freshness: AirComfortFreshness; comfort: AirComfortRoom[]; }; export type EnergyIQTariffInfo = { unit: IQUnit; /** `YYYY-MM-DDTHH:mm:ss` format datetime */ lastUpdated: string; /** `YYYY-MM-DD` format date */ endDate?: string; homeId: number; /** `YYYY-MM-DD` format date */ startDate: string; tariffInCents: number; /** UUID string */ id: string; }; export type EnergyIQTariffs = { tariffs: EnergyIQTariffInfo[]; }; export type EnergyIQDetailPerDay = { /** `YYYY-MM-DD` format date */ date: string; consumption: number; costInCents: number; }; export type EnergyIQDetail = { totalConsumption: 24.57; totalCostInCents: 2685.45; perDay: EnergyIQDetailPerDay[]; }; export type EnergyIQMonthOverview = { startDate: string; endDate: string; totalConsumption: number; totalCostInCents: number; consumptionPerDate: Array<{ date: string; consumption: number; costInCents: number; }>; }; export type EnergyIQOverview = { unit: IQUnit; monthlyAggregation: { endOfMonthForecast: unknown; requestedMonth: EnergyIQMonthOverview; monthBefore: EnergyIQMonthOverview; yearBefore: EnergyIQMonthOverview; }; isInPreferredUnit: boolean; energySavingsReport: { totalSavingsInPercent: number; yearMonth: string; }; ecogaz: unknown; }; export type EnergyIQConsumptionDetailsSummary = { costInCents: number; costForecastInCents: number; averageDailyCostInCents: number; consumption: number; consumptionForecast: number; averageDailyConsumption: number; unit: IQUnit; tariff: { unit: IQUnit; unitPriceInCents: number; }; }; export type EnergyIQConsumptionDetails = { isInPreferredUnit: boolean; summary: EnergyIQConsumptionDetailsSummary; graphConsumption: EnergyIQOverview; }; export type EnergyIQMeterReading = { id: string; homeId: number; reading: number; /** `YYYY-MM-DD` format date */ date: string; }; export type EnergyIQMeterReadings = { readings: EnergyIQMeterReading[]; }; export type EnergySavingDuration = { value: number; unit: EnergySavingReportUnit; }; export type EnergySavingReport = { coveredInterval: Interval; totalSavingsAvailable: boolean; withAutoAssist: { detectedAwayDuration: EnergySavingDuration; openWindowDetectionTimes: number; }; totalSavingsInThermostaticMode: EnergySavingDuration; manualControlSaving: EnergySavingDuration; totalSavings: EnergySavingDuration; hideSunshineDuration: boolean; awayDuration: EnergySavingDuration; showSavingsInThermostaticMode: boolean; communityNews: { type: "TURN_ON_HEATING_DATE"; /** `YYYY-MM-DD` format date */ turnOnDateForMajorityOfTadoUsers: string; /** `YYYY-MM-DD` format date */ turnOnDateForMajorityOfUsersInLocalRegion: string; }; sunshineDuration: EnergySavingDuration; hasAutoAssist: boolean; openWindowDetectionTimes: number; setbackScheduleDurationPerDay: EnergySavingDuration; totalSavingsInThermostaticModeAvailable: boolean; /** `YYYY-MM` */ yearMonth: string; hideOpenWindowDetection: boolean; home: number; hideCommunityNews: boolean; }; export type AirComfortDetailedRoomMessage = { roomId: number; message: string; visual: null; link: { text: string; type: "internal"; url: string; }; }; export type OutdoorQualityPollutant = { localizedName: string; scientificName: string; level: OutdoorQualityLevel; concentration: [object]; }; export type OutdoorPollensTypeForcast = { localizedDay: string; /** `YYYY-MM-DD` format date */ date: string; level: OutdoorQualityLevel; }; export type OutdoorPollensType = { localizedName: string; type: OutdoorPollensTypeValue; localizedDescription: string; forecast: OutdoorPollensTypeForcast[]; }; export type AirComfortDetailed = { roomMessages: AirComfortDetailedRoomMessage[]; outdoorQuality: { aqi: { value: number; level: OutdoorQualityLevel; }; pollens: { dominant: { level: string; }; types: OutdoorPollensType[]; }; pollutants: OutdoorQualityPollutant[]; }; }; export type AddEnergiIQMeterReadingResponse = { id: string; homeId: number; /** `YYYY-MM-DD` format date */ date: string; reading: number; }; export type MeasureDataInterval<T> = { /** JSON formated date */ from: string; /** JSON formated date */ to: string; value: T; }; export type MeasureDataPoint<T> = { /** JSON formated date */ timestamp: string; value: T; }; export type MeasureBoolean = { timeSeriesType: "dataIntervals"; valueType: "boolean"; dataIntervals: MeasureDataInterval<boolean>[]; }; export type MeasureTemperature = { timeSeriesType: "dataPoints"; valueType: "temperature"; min: Temperature; max: Temperature; dataPoints: MeasureDataPoint<Temperature>[]; }; export type MeasurePercentage = { timeSeriesType: "dataPoints"; valueType: "percentage"; percentageUnit: "UNIT_INTERVAL"; min: number; max: number; dataPoints: MeasureDataPoint<number>[]; }; export type MeasureStripeData = { stripeType: StripeTypeValue; setting: { type: "HEATING"; power: Power; temperature: Temperature | null; }; } | { stripeType: "AWAY"; }; export type MeasureStripe = { timeSeriesType: "dataIntervals"; valueType: "stripes"; dataIntervals: MeasureDataInterval<MeasureStripeData>[]; }; export type MeasureSettings = { timeSeriesType: "dataIntervals"; valueType: "heatingSetting"; dataIntervals: MeasureDataInterval<MeasureStripeData>[]; }; export type MeasureCallForHeat = { timeSeriesType: "dataIntervals"; valueType: "callForHeat"; dataIntervals: MeasureDataInterval<"NONE" | "LOW" | "MEDIUM" | "HIGH">[]; }; export type MeasureWeatherConditionData = { state: WeatherStateValue; temperature: Temperature; }; export type MeasureWeatherCondition = { timeSeriesType: "dataIntervals"; valueType: "weatherCondition"; dataIntervals: MeasureDataInterval<MeasureWeatherConditionData>[]; }; export type MeasureWeatherSunny = { timeSeriesType: "dataIntervals"; valueType: "boolean"; dataIntervals: MeasureDataInterval<boolean>[]; }; export type MeasureWeatherSlotData = { state: WeatherStateValue; temperature: Temperature; }; export type MeasureWeatherSlot = { timeSeriesType: "slots"; valueType: "weatherCondition"; slots: { "04:00": MeasureWeatherSlotData | null; "08:00": MeasureWeatherSlotData | null; "12:00": MeasureWeatherSlotData | null; "16:00": MeasureWeatherSlotData | null; "20:00": MeasureWeatherSlotData | null; }; }; export type ZoneDayReport = { zoneType: ZoneType; interval: Interval; hoursInDay: number; measuredData: { measuringDeviceConnected: MeasureBoolean; insideTemperature: MeasureTemperature; humidity: MeasurePercentage; }; stripes: MeasureStripe; settings: MeasureSettings; callForHeat: MeasureCallForHeat; weather: { condition: MeasureWeatherCondition; sunny: MeasureWeatherSunny; slots: MeasureWeatherSlot; }; }; export type Installation = { id: number; type: InstallationType | null; revision: number; state: ACInstallationState | HeatingInstallationState; devices: Device[]; }; export type BoilerAvailability = { present: boolean; id: number; found: boolean; }; export type UnderfloorHeatingAvailability = { present: boolean; }; export type HeatingSystem = { boiler: BoilerAvailability; underfloorHeating: UnderfloorHeatingAvailability; }; export type Manufacturer = { name: string; }; export type BoilerSystemInformation = { modelName: string; shortModelName: string; thumbnail: { schematic: { url: string; }; }; manufacturers: Manufacturer[]; }; export type Inviter = Omit<User, "homes" | "mobileDevices"> & { enabled: boolean; homeId: number; type: string & "WEB_USER"; }; export type Invitation = { token: string; email: string; firstSent: string; lastSent: string; inviter: Inviter; home: Home; }; export interface XRoomValue { value: number; precision?: number; } export interface XRoomPercentage { percentage: number; } export type XRoomSensorDataPoints = { insideTemperature: XRoomValue; humidity: XRoomPercentage; }; export type XRoomSetting = { power: Power; temperature: XRoomValue; }; export type XNextScheduleChange = { start: string; setting: XRoomSetting; }; export type XNextTimeBlock = { /** `YYYY-MM-DDTHH:mm:ss` format datetime */ start: string; }; export type XConnection = { string: XConnectionState; }; export type XRoom = { id: number; name: string; sensorDataPoints: XRoomSensorDataPoints; setting: XRoomSetting; manualControlTermination: unknown; boostMode: unknown; heatingPower: XRoomPercentage; connection: XConnection; openWindow: unknown; nextScheduleChange: XNextScheduleChange; nextTimeBlock: XNextTimeBlock; balanceControl: unknown; }; export interface XRoomWithDevices { roomId: number; roomName: string; deviceManualControlTermination: XManualControlTermination; devices: XDevice[]; zoneControllerAssignable: boolean; zoneControllers: unknown[]; } export interface XManualControlTermination { type: ZoneOverlayTerminationTypeSkillBasedApp; durationInSeconds?: number; } export interface XDevice { serialNumber: string; type: string; firmwareVersion: string; connection: XConnection; mountingState?: string; batteryState?: string; childLockEnabled?: boolean; temperatureAsMeasured?: number; temperatureOffset?: number; } export type XRoomsAndDevices = { rooms: XRoomWithDevices[]; otherDevices: XDevice[]; }; export type XFeatures = { availableFeatures: XFeature[]; }; export type XTerminationConfig = { type: "NEXT_TIME_BLOCK" | "MANUAL"; } | { type: "TIMER"; durationInSeconds: number; }; export type XOverlay = { setting: { power: Power; temperature: XRoomValue | null; }; termination: XTerminationConfig; isBoost?: boolean; }; export type ActionableDevice = { serialNumber: string; needsMounting: boolean; isOffline: boolean; batteryState: DeviceBatteryState; }; export type XRoomAwayConfiguration = { roomId: number; mode: Power; awayTemperatureCelsius: number; }; export type XHomeSummary = { roomCount: number; isHeatSourceInstalled: boolean; isHeatPumpInstalled: boolean; supportsFlowTemperatureOptimization: boolean; }; export type FlowTemperatureOptimization = { maxFlowTemperature: number; maxFlowTemperatureConstraints: { min: number; max: number; }; openThermDeviceSerialNumber: string; hasMultipleBoilerControlDevices: boolean; autoAdaptation: { enabled: boolean; maxFlowTemperature: number; }; };