Tado class provides functions to interact with the Tado API, including user authentication and various home and device management operations.

// Import the Tado client
const { Tado } = require("node-tado-client");

// Create a new Tado instance
var tado = new Tado();

// Set a cllabck to catch token changes
tado.setTokenCallback(console.log);

// Authenticate with the Tado API
const [verify, futureToken] = await tado.authenticate("refresh_token");

if (verify) {
console.log("------------------------------------------------");
console.log("Device authentication required.");
console.log("Please visit the following website in a browser.");
console.log("");
console.log(` ${verify.verification_uri_complete}`);
console.log("");
console.log(
`Checks will occur every ${verify.interval}s up to a maximum of ${verify.expires_in}s`,
);
console.log("------------------------------------------------");
}
await futureToken;

const me = await tado.getMe();
console.log(me);

Hierarchy

  • BaseTado
    • Tado

Constructors

Accessors

  • get token(): undefined | Token

    Get the latest Oauth Token and Refresh Token

    Returns undefined | Token

    The latest token

Methods

  • Adds an energy IQ meter reading for a given home.

    Parameters

    • home_id: number

      The ID of the home.

    • date: string

      The date of the meter reading in ISO format.

    • reading: number

      The meter reading value.

    Returns Promise<AddEnergiIQMeterReadingResponse>

    A promise that resolves to the response of the API call.

  • Adds a new energy IQ tariff for a specified home.

    Parameters

    • home_id: number

      The identifier of the home.

    • unit: IQUnit

      The unit of energy measurement.

    • startDate: string

      The start date of the tariff in ISO format.

    • endDate: string

      The end date of the tariff in ISO format.

    • tariffInCents: number

      The tariff amount in cents.

    Returns Promise<void>

    A promise that resolves to the API response.

    TadoError if the unit is not valid.

  • Makes an API call to the provided URL with the specified method and data.

    Type Parameters

    • R

      The type of the response

    • T = unknown

      The type of the request body

    Parameters

    • url: string

      The endpoint to which the request is sent. If the URL contains "https", it will be used as is.

    • method: Method = "get"

      The HTTP method to use for the request (e.g., "get", "post").

    • Optionaldata: T

      The payload to send with the request, if applicable.

    Returns Promise<R>

    A promise that resolves to the response data.

  • Authenticate with the Oauth server. A refresh token may be supplied to bypass the device auth flow if it is still valid, otherwise the device flow is initiaited.

    Parameters

    • OptionalrefreshToken: string

      Attempt to use this refresh token to re-authenticate

    • Optionaltimeout: number

      Ignore the Tado provided timeout for device auth and use this value

    Returns Promise<[undefined | DeviceVerification, Promise<Token>]>

    A promise that resolves to either a DeviceVerification object for device auth flows and a promise of a token, or an undefined auth flow and a promise of a token, if the refresh token was supplied

  • Clears the overlay for a specific zone in a home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • zone_id: number

      The unique identifier of the zone within the home.

    Returns Promise<void>

    A promise that resolves when the operation is complete.

    Use clearZoneOverlays instead.

  • Clears overlays for specified zones in a home.

    Parameters

    • home_id: number

      The ID of the home.

    • zone_ids: number[]

      An array of IDs of the zones to clear overlays for.

    Returns Promise<void>

    A promise that resolves when the overlays are cleared.

  • Creates an invitation for a specified home.

    Parameters

    • home_id: number

      The unique identifier of the home to which the invitation will be sent.

    • email: string

      The email address of the invitee.

    Returns Promise<Invitation>

    A promise that resolves to an Invitation object.

  • Creates a push notification registration for a given home and mobile device.

    Note: Do not use this unless you know what you are doing, you might want to consider registering a dummy device.

    Parameters

    • home_id: number

      The identifier for the home.

    • mobile_device_id: number

      The identifier for the mobile device.

    • token: string

      The push notification token for the device.

    Returns Promise<PushNotificationRegistration>

    A promise that resolves to the push notification registration (AWS SNS Endpoint ARN).

  • Deletes a specific energy meter reading for a given home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • reading_id: number

      The unique identifier of the meter reading to be deleted.

    Returns Promise<void>

    A promise that resolves when the meter reading has been successfully deleted.

  • Deletes an invitation associated with a home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • token: string

      The token associated with the invitation.

    Returns Promise<void>

    A promise that resolves when the invitation is successfully deleted.

  • Retrieves the air comfort details for a given home.

    Parameters

    • home_id: number

      The ID of the home for which to get the air comfort details.

    Returns Promise<AirComfort>

    A promise that resolves to an AirComfort object containing the air comfort details.

  • Fetches detailed air comfort information for a specific home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    Returns Promise<AirComfortDetailed>

    A promise that resolves to detailed air comfort data.

  • Retrieves the away configuration for a specific home and zone.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • zone_id: number

      The unique identifier of the zone within the home.

    Returns Promise<AwayConfiguration>

    A promise that resolves to the away configuration object.

  • Retrieves information about the specified boiler system. This includes model name, image used by the app, and manufacturer names.

    Parameters

    Returns Promise<BoilerSystemInformation>

    A promise that resolves to an object containing the boiler system information.

    const heatingSystem = await tado.getHomeHeatingSystem(1907);
    const boilerInformation = await tado.getBoilerSystemInformation(heatingSystem.boiler.id);
    console.log(
    `Your boiler model is ${boilerInformation.modelName} manufactured by ${boilerInformation.manufacturers[0].name}`,
    );
  • Retrieves a list of devices associated with the given home ID.

    Parameters

    • home_id: number

      The unique identifier of the home.

    Returns Promise<Device[]>

    A promise that resolves to an array of Device objects.

  • Fetches the temperature offset of a device using its serial number.

    Parameters

    • serial_no: string

      The serial number of the device.

    Returns Promise<Temperature>

    A promise that resolves to the temperature offset of the device.

  • Retrieves energy consumption details for a specified home, month, and year.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • month: number

      The specific month for which the consumption details are requested.

    • year: number

      The specific year for which the consumption details are requested.

    Returns Promise<EnergyIQConsumptionDetails>

    A promise resolving to the energy consumption details for the specified time period.

  • Fetches the Energy IQ meter readings for a specified home.

    Parameters

    • home_id: number

      The unique identifier of the home for which the meter readings are to be retrieved.

    Returns Promise<EnergyIQMeterReadings>

    A promise that resolves to the Energy IQ meter readings for the specified home.

  • Fetches the energy consumption overview for a specified home, month, and year.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • month: number

      The month for which the energy overview is needed.

    • year: number

      The year for which the energy overview is needed.

    Returns Promise<EnergyIQOverview>

    A promise that resolves to an EnergyIQOverview object containing the energy consumption details.

  • Fetches the EnergyIQ tariff for a given home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    Returns Promise<EnergyIQTariffs>

    A promise that resolves to the EnergyIQTariffs object.

  • Fetches the energy savings report for a specific home and time period.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • year: number

      The year for the report.

    • month: number

      The month for the report.

    • countryCode: string

      The country code of the home.

    Returns Promise<EnergySavingReport>

    A promise that resolves to the energy savings report.

    const today = new Date();
    const countryCode = await tado.getHome(home_id).address.country;
    const report = await this tado.getEnergySavingsReport(home_id, today.getFullYear(), today.getMonth() + 1)
  • Retrieves the heating circuits associated with a given home based on the home ID.

    Parameters

    • home_id: number

      The ID of the home for which to retrieve heating circuits.

    Returns Promise<HeatingCircuit>

    A promise that resolves to a HeatingCircuit object.

  • Fetches and returns the home details for the specified home ID.

    Parameters

    • home_id: number

      The ID of the home to be retrieved.

    Returns Promise<Home>

    A promise that resolves to the details of the home.

  • Retrieves the heating system information for a specific home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    Returns Promise<HeatingSystem>

    A promise that resolves to the heating system information of the specified home.

  • Fetches incident detection details for the specified home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    Returns Promise<HomeIncidentDetection>

    A promise that resolves to the incident detection details of the home.

  • Fetches the list of installations for a given home.

    Parameters

    • home_id: number

      The ID of the home for which to fetch installations.

    Returns Promise<Installation[]>

    A promise that resolves to an array of installations.

  • Retrieves an invitation based on the provided home ID and token.

    Parameters

    • home_id: number

      The ID of the home for which the invitation is to be retrieved.

    • token: string

      The unique token (invitation id) associated with the invitation.

    Returns Promise<Invitation>

    A promise that resolves to the invitation details.

  • Fetches the list of invitations for a specified home.

    Parameters

    • home_id: number

      The ID of the home for which to retrieve invitations.

    Returns Promise<Invitation[]>

    A promise that resolves to an array of Invitation objects.

  • Fetches the current user data.

    Returns Promise<Me>

    A promise that resolves to the user data.

  • Fetches a mobile device associated with the given home ID and mobile device ID.

    Parameters

    • home_id: number

      The ID of the home.

    • mobile_device_id: number

      The ID of the mobile device.

    Returns Promise<MobileDevice>

    A promise that resolves to the mobile device data.

  • Fetches the geo-location configuration for a specific mobile device in a home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • mobile_device_id: number

      The unique identifier of the mobile device.

    Returns Promise<MobileDeviceGeoLocationConfig>

    A promise that resolves to the mobile device's geo-location configuration.

  • Retrieves a list of mobile devices associated with a given home ID.

    Parameters

    • home_id: number

      The unique identifier of the home.

    Returns Promise<MobileDevice[]>

    A promise that resolves to an array of MobileDevice objects.

  • Fetches the settings for a specific mobile device within a given home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • mobile_device_id: number

      The unique identifier of the mobile device.

    Returns Promise<MobileDeviceSettings>

    A promise that resolves to the mobile device's settings.

  • Retrieves the running times for a specific home within a given date range.

    Parameters

    • home_id: number

      The unique identifier for the home.

    • from: string

      The start date of the range in ISO 8601 format.

    • to: string

      The end date of the range in ISO 8601 format.

    • aggregate: RunningTimeAggregation

      The method of aggregation for the running times.

    • summary_only: true

      Indicates that only a summary of the running times is to be returned.

    Returns Promise<RunningTimesSummaryOnly>

    A promise that resolves to a summary of the running times.

  • Retrieves the running times of a specific home within a specified date range.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • from: string

      The start date of the range in ISO 8601 format.

    • to: string

      The end date of the range in ISO 8601 format.

    • aggregate: RunningTimeAggregation

      The type of aggregation to apply to the running times.

    • summary_only: false

      If false, detailed running times are included; otherwise, only the summary is provided.

    Returns Promise<RunningTimes>

    A promise that resolves to the running times data for the specified home and date range.

  • Fetches the state of a home based on the provided home ID.

    Parameters

    • home_id: number

      The unique identifier of the home for which the state is to be retrieved.

    Returns Promise<State>

    A promise that resolves to the state of the specified home.

  • Retrieves a timetable for the specified home, zone, and timetable IDs.

    Parameters

    • home_id: number

      The unique identifier for the home.

    • zone_id: number

      The unique identifier for the zone.

    • timetable_id: number

      The unique identifier for the timetable.

    Returns Promise<TimeTable>

    A promise that resolves to the requested TimeTable object.

  • Fetches the active timetable for a specific zone in a home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • zone_id: number

      The unique identifier of the zone within the home.

    Returns Promise<TimeTables>

    A promise that resolves to the active timetable.

  • Fetches the list of users associated with a given home.

    Parameters

    • home_id: number

      The ID of the home for which to fetch users.

    Returns Promise<User[]>

    A promise that resolves to an array of User objects.

  • Fetches the weather information for a specified home.

    Parameters

    • home_id: number

      The unique identifier of the home for which to retrieve the weather data.

    Returns Promise<Weather>

    A promise that resolves to a Weather object containing the weather information for the specified home.

  • Retrieves the capabilities of a specific zone within a home.

    Parameters

    • home_id: number

      The ID of the home containing the zone.

    • zone_id: number

      The ID of the zone whose capabilities are to be retrieved.

    Returns Promise<ZoneCapabilities>

    A promise that resolves to the capabilities of the specified zone.

  • Fetches the control settings for a specific zone within a home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • zone_id: number

      The unique identifier of the zone within the home.

    Returns Promise<ZoneControl>

    A promise that resolves to the ZoneControl object containing the zone's control settings.

  • Retrieves the daily report for a specified zone in a given home on a specific date.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • zone_id: number

      The unique identifier of the zone within the home.

    • reportDate: string

      The date for which the report is requested, in the format 'YYYY-MM-DD'.

    Returns Promise<ZoneDayReport>

    A promise that resolves to the ZoneDayReport object containing the daily report data.

  • Fetches the default overlay for a specified zone in a specified home.

    Parameters

    • home_id: number

      The identifier of the home.

    • zone_id: number

      The identifier of the zone within the home.

    Returns Promise<DefaultOverlay>

    A promise that resolves to the default overlay of the specified zone.

  • Retrieves the overlay information for a specific zone within a home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • zone_id: number

      The unique identifier of the zone.

    Returns Promise<ZoneOverlay | Record<string, never>>

    A promise that resolves to the zone's overlay information, or an empty object if the zone is not found.

  • Fetches the zones for a given home.

    Parameters

    • home_id: number

      The ID of the home for which to fetch the zones.

    Returns Promise<Zone[]>

    A promise that resolves to an array of Zone objects.

  • Fetches the state of a specified zone in a home.

    Parameters

    • home_id: number

      The ID of the home.

    • zone_id: number

      The ID of the zone within the home.

    Returns Promise<ZoneState>

    A promise that resolves to the state of the specified zone.

  • Retrieves the states of zones for a specified home.

    Parameters

    • home_id: number

      The ID of the home for which to retrieve zone states.

    Returns Promise<ZoneStates>

    A promise that resolves to the states of the zones.

  • Identifies a device using its serial number.

    Parameters

    • serial_no: string

      The serial number of the device.

    Returns Promise<void>

    A promise that resolves when the device has been successfully identified.

  • Checks if anyone is at home based on the geo-tracking data of mobile devices.

    Parameters

    • home_id: number

      The unique identifier of the home.

    Returns Promise<boolean>

    A promise that resolves to a boolean indicating if any tracked device is at home.

  • Checks if the early start feature is enabled for a given home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    Returns Promise<boolean>

    A promise that resolves to a boolean indicating whether the early start feature is enabled.

  • Checks if the early start feature is enabled for a given zone.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • zone_id: number

      The ID of the zone whose early start feature status is to be checked.

    Returns Promise<boolean>

    A promise that resolves to a boolean indicating whether the early start feature is enabled.

  • Resends an invitation to a specific home.

    Parameters

    • home_id: number

      The ID of the home for which the invitation is to be resent.

    • token: string

      The token representing the invitation to be resent.

    Returns Promise<void>

    A promise that resolves once the invitation has been resent.

  • Sets the active timetable for a specific zone in a given home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • zone_id: number

      The unique identifier of the zone within the home.

    • timetable: TimeTables

      The timetable object to be set as active.

    Returns Promise<TimeTables>

    A promise that resolves to the updated timetable object.

  • Sets the away configuration for a specified zone in the home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • zone_id: number

      The unique identifier of the zone within the home.

    • config: AwayConfiguration

      The configuration settings for away mode.

    Returns Promise<void>

    A promise that resolves when the configuration has been successfully set.

  • Sets the away radius for a specific home.

    Parameters

    • home_id: number

      The ID of the home.

    • away_radius_meters: number

      The away radius in meters.

    Returns Promise<void>

    A promise that resolves when the away radius is successfully set.

  • Sets the child lock feature for a specified device.

    Parameters

    • serial_no: string

      The serial number of the device.

    • child_lock: boolean

      Boolean value to enable or disable the child lock.

    Returns Promise<void>

    A promise that resolves when the child lock has been set.

  • Sets the temperature offset for a specified device.

    Parameters

    • serial_no: string

      The serial number of the device.

    • temperatureOffset: number

      The temperature offset to be set, in degrees Celsius.

    Returns Promise<Temperature>

    A promise that resolves to the updated temperature object.

  • Sets the early start feature for a specified home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • enabled: boolean

      A boolean indicating whether the early start feature should be enabled or disabled.

    Returns Promise<void>

    A promise that resolves when the early start setting has been successfully updated.

  • Sets the geo-tracking settings for a specified mobile device in a given home.

    Parameters

    • home_id: number

      The ID of the home.

    • mobile_device_id: number

      The ID of the mobile device.

    • geoTrackingEnabled: boolean

      A flag indicating whether geo-tracking should be enabled.

    Returns Promise<MobileDeviceSettings>

    A promise that resolves to the updated mobile device settings.

  • Enables or disables incident detection for a specified home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • enabled: boolean

      Indicates whether incident detection should be enabled (true) or disabled (false).

    Returns Promise<void>

    A promise that resolves when the operation is complete.

  • Sets the open window mode for a specified home and zone.

    Parameters

    • home_id: number

      Identifier for the home.

    • zone_id: number

      Identifier for the zone within the home.

    • activate: boolean

      If true, activates the open window mode; if false, deactivates it.

    Returns Promise<void>

    A promise that resolves when the operation is complete.

  • Updates the presence status for a specified home.

    Parameters

    • home_id: number

      The unique identifier for the home.

    • presence: StatePresence

      The new presence state which must be "HOME", "AWAY", or "AUTO".

    Returns Promise<void>

    Resolves when the presence status has been successfully updated.

    TadoError if the supplied presence state is not "HOME", "AWAY", or "AUTO".

  • Sets the time table for a specified zone in a home.

    Parameters

    • home_id: number

      The ID of the home.

    • zone_id: number

      The ID of the zone within the home.

    • timetable_id: number

      The ID of the timetable to be set.

    • timetable: TimeTable

      The timetable data to be set.

    • day_type: TimeTableDayType

      The type of day for the timetable.

    Returns Promise<TimeTables>

    A promise that resolves to the updated timetables.

  • Set the callback function that is called when the Oauth token changes.

    Parameters

    • Optionalcb: (token: Token) => void

      The callback function

    Returns void

  • Configures the window detection feature for a specified zone within a home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • zone_id: number

      The unique identifier of the zone within the home.

    • enabled: true

      A flag indicating whether the window detection should be enabled or not.

    • timeout: number

      The time period in seconds before the window detection should timeout.

    Returns Promise<void>

    A promise that resolves when the window detection setting has been updated.

  • Enables or disables window detection for a specified home and zone.

    Parameters

    • home_id: number

      The unique identifier for the home.

    • zone_id: number

      The unique identifier for the zone within the home.

    • enabled: false

      A flag indicating whether window detection should be enabled (true) or disabled (false).

    Returns Promise<void>

    A promise that resolves when the operation is complete.

  • Sets the default overlay for a specified zone within a home.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • zone_id: number

      The unique identifier of the zone within the home.

    • overlay: DefaultOverlay

      An object representing the default overlay settings to be applied.

    Returns Promise<DefaultOverlay>

    A promise that resolves to the updated default overlay settings.

  • Sets the early start feature for a specified zone.

    Parameters

    • home_id: number

      The unique identifier of the home.

    • zone_id: number

      The ID of the zone whose early start feature status is to be set.

    • enabled: boolean

      A boolean indicating whether the early start feature should be enabled or disabled.

    Returns Promise<void>

    A promise that resolves when the early start setting has been successfully updated.

  • Sets the overlay configuration for a specific zone in a home.

    Parameters

    • home_id: number

      The identifier of the home.

    • zone_id: number

      The identifier of the zone within the home.

    • power: Power

      The power state, either 'ON' or 'OFF'.

    • Optionaltemperature: number

      The desired temperature for the overlay, in celsius.

    • Optionaltermination: number | Termination

      The termination condition for the overlay. Options include 'MANUAL', 'AUTO', 'NEXT_TIME_BLOCK', or a number representing duration in seconds.

    • Optionalfan_speed:
          | "LEVEL1"
          | "LEVEL2"
          | "LEVEL3"
          | "LEVEL4"
          | "AUTO"
          | "SILENT"
          | "HIGH"
          | "MIDDLE"
          | "LOW"

      The desired fan speed or level.

    • Optionalac_mode: ACMode

      The air conditioning mode (e.g., 'COOL', 'HEAT').

    • OptionalverticalSwing: VerticalSwing

      The vertical swing setting for air conditioning.

    • OptionalhorizontalSwing: HorizontalSwing

      The horizontal swing setting for air conditioning.

    Returns Promise<ZoneOverlay>

    A promise that resolves to the created zone overlay.

    Use setZoneOverlays instead.

  • Applies multiple zone overlays to a home's zones with specified termination settings.

    Parameters

    • home_id: number

      The unique identifier for the home.

    • overlays: SetZoneOverlaysArg[]

      An array of configurations for each zone overlay.

    • termination: undefined | number | Termination

      Optional termination configuration which can be a string or a number, determining how the overlay should end.

    Returns Promise<void>

    A promise that resolves when the operation is complete.

    Each overlay item of the type SetZoneOverlaysArg.

    const zoneOverlay = {
    zone_id: 123, # Required
    power: "ON", # HEATING and AC
    temperature: { # HEATING and AC
    celsius: 24,
    fahrenheit: 75.2
    },
    mode: "HEAT", # AC only
    fanLevel: "LEVEL1", # AC only
    verticalSwing: "OFF", # AC only
    horizontalSwing: "OFF", # AC only
    light: "OFF", # AC only
    }
    tado.setZoneOverlays(1907, [ overlay ], 1800);

    It is not required to use upper case in the values, the library will convert the strings for you. It is also not required to supply both celsius and fahrenheit, the Tado API is able to convert for you.

    The termination argument should be one of the following:

    • A positive integer - this will be interpreted as the number of seconds to set the overlay for
    • "AUTO" - this will put the overlay into "TADO_MODE"
      • Note: This uses the default termination type set on the zone
    • "NEXT_TIME_BLOCK" - overlay until the next scheduled event
    • Anything else - the overlay will exist indefinitely and will need manually clearing

    See also Termination.

    await tado.setZoneOverlays(
    homeId,
    (await this.getZones(1907)).map((zone) => {
    return {
    isBoost: true,
    power: "ON",
    temperature: {
    celsius: 25,
    fahrenheit: 77,
    },
    zone_id: zone.id,
    };
    }),
    1800,
    );
  • Updates the Energy IQ tariff for a specified home.

    Parameters

    • home_id: number

      The unique identifier for the home.

    • tariff_id: string

      The unique identifier for the tariff.

    • unit: IQUnit

      The unit of the tariff, either "m3" or "kWh."

    • startDate: string

      The start date of the tariff in the format 'YYYY-MM-DD.'

    • endDate: string

      The end date of the tariff in the format 'YYYY-MM-DD.'

    • tariffInCents: number

      The tariff rate in cents.

    Returns Promise<EnergyIQTariffInfo>

    A promise that resolves to the response of the API call.

    TadoError if the unit is not "m3" or "kWh."

  • Updates the presence state of the specified home.

    This method checks if anyone is currently at home and compares it with the current presence state. If there is a discrepancy, it updates the presence state accordingly. If the presence state is already accurate, it returns a message indicating no change was needed.

    Parameters

    • home_id: number

      The unique identifier of the home whose presence state is to be updated.

    Returns Promise<void | "already up to date">

    A promise that resolves when the operation is complete, or returns a message if the presence state was already accurate.