LogoLogo
Sign UpSupported Devices
  • Seam Documentation
  • 🚲Quick Start
  • 🚀Go Live!
  • Contact Us
  • Core Concepts
    • Overview
    • Seam Console
      • Seam Online CLI
    • Workspaces
    • Authentication
      • API Keys
      • Personal Access Tokens
      • Client Sessions and Client Session Tokens
        • Implementing Client Sessions for Device Management in the Backend
    • Devices
      • Displaying Device Health
      • Displaying Device Power Status
      • Managed and Unmanaged Devices
      • Adding Custom Metadata to a Device
      • Filtering Devices by Custom Metadata
      • Testing Your App Against Device Disconnection and Removal
    • Connected Accounts
      • Adding Custom Metadata to a Connected Account
      • Filtering Connected Accounts by Custom Metadata
      • Reconnecting an Account
    • Action Attempts
  • Capability Guides
    • 📋Device and System Capabilities
    • 🔒Smart Locks
      • Locking and Unlocking Smart Locks
      • Creating and Managing Smart Lock Access Codes
        • Creating Access Codes
        • Retrieving Access Codes
        • Modifying Access Codes
        • Deleting Access Codes
        • Lifecycle of Access Codes
        • Access Code Requirements for Door Locks
        • Streamlining Access Code Management from the Manufacturer App
        • Troubleshooting Access Codes
        • Managing Backup Access Codes
        • Managing Offline Access Codes
        • Creating and Updating Multiple Linked Access Codes
        • Migrating Existing Unmanaged Access Codes
    • 🏢Access Control Systems
      • ACS Quick Starts
        • PIN Code Quick Start
        • Encodable Key Card Quick Start
        • Mobile Key Quick Start
      • Connect an ACS to Seam
        • Retrieving ACS System Details
        • Access Control System Resources
        • Understanding Access Control System Differences
      • Managing ACS Users
        • Suspending and Unsuspending ACS Users
        • Assigning ACS Users to Access Groups
      • Retrieving Entrance Details
      • Managing Credentials
        • Assigning Credentials to ACS Users
        • Listing Credentials and Associated Entrances
      • Working with Card Encoders and Scanners
        • Creating and Encoding Card-based Credentials
        • Scanning Encoded Cards
      • Troubleshooting Your Access Control System
    • 📱Mobile Access
      • Prepare your Workspace
      • Managing Mobile App User Accounts with User Identities
      • Managing Phones for a User Identity
      • Issuing Mobile Credentials from an Access Control System
      • Developing in a Sandbox Workspace
      • Integrating into your Mobile Application
        • Initializing the Seam Mobile SDK
        • Handling System Permissions
        • Using Unlock With Tap
    • 🌡️Thermostats
      • Understanding Thermostat Concepts
        • HVAC Mode
        • Set Points
      • Retrieving Thermostats
      • Setting and Monitoring Temperature Thresholds
      • Setting the Current HVAC and Fan Mode Settings
      • Creating and Managing Climate Presets
        • Setting the Fallback Climate Preset
        • Activating a Climate Preset
      • Creating and Managing Thermostat Schedules
      • Testing Your Thermostat App with Simulate Endpoints
    • 👂Noise Sensors
      • Configuring Noise Threshold Settings
    • 📡Seam Bridge
  • 💻UI Components
    • 🔌Connect Webviews
      • Connect Webview Process
      • Embedding a Connect Webview in Your App
      • Verifying Successful Account Connection
      • Retrieving Devices or Access Control Systems Connected Through a Connect Webview
      • Attaching Custom Metadata to the Connect Webview
      • Filtering Connect Webviews by Custom Metadata
      • Customizing Connect Webviews
    • 🧱Seam Components
      • Getting Started with Seam Components
        • Get Started with React
        • Get started with Angular
        • Get started with Vue
        • Get started with Client Side Components
      • Components
        • Device Details
        • Device Table
        • Access Code Table
        • Access Code Details
        • Create Access Code Form
        • Update Access Code Form
        • Supported Devices Table
        • Seam Provider
        • Connect Account Button
      • Make a Supported Devices Page
      • Using User Identities to Scope Users' Device Access
  • 📋API Reference
    • Overview
    • Installation
    • Authentication
    • Workspaces
      • Get Workspace
      • Reset Workspace
    • Client Sessions
      • Create a Client Session
      • Get or Create a Client Session
      • List Client Sessions
      • Get a Client Session
      • Grant Access to a Client Session
      • Delete a Client Session
    • Connect Webviews
      • Create a Connect Webview
      • List Connect Webviews
      • Get a Connect Webview
      • Delete a Connect Webview
    • Connected Accounts
      • Get a Connected Account
      • List Connected Accounts
      • Update a Connected Account
      • Delete a Connected Account
    • Devices
      • List Devices
      • List Device Providers
      • Device Provider Metadata
      • Get a Device
      • Update a Device
      • Unmanaged Devices
        • Update an Unmanaged Device
        • List Unmanaged Devices
        • Get an Unmanaged Device
    • Access Codes
      • Create an Access Code
      • Create Multiple Linked Access Codes
      • List Access Codes
      • Get an Access Code
      • Update an Access Code
      • Update Multiple Linked Access Codes
      • Report Device Access Code Constraints
      • Delete an Access Code
      • Pull Backup Access Code
      • Unmanaged Access Codes
        • List Unmanaged Access Codes
        • Convert an Unmanaged Access Code
        • Delete an Unmanaged Access Code
    • Locks
      • Get Lock
      • Lock a Lock
      • Unlock a Lock
      • List Locks
    • Access Control Systems
      • Systems
        • List ACS Systems
        • Get an ACS System
        • List Compatible Credential Manager ACS Systems
      • ACS Users
        • Create an ACS User
        • List ACS Users
        • Get an ACS User
        • Update an ACS User
        • Suspend an ACS User
        • Unsuspend an ACS User
        • Delete an ACS User
        • Add an ACS User to an Access Group
        • Remove an ACS User from an Access Group
      • Entrances
        • List Entrances
        • Get an Entrance
        • List Credentials with Access to an Entrance
      • Access Groups
        • List Access Groups
        • Get an Access Group
        • Add an ACS User to an Access Group
        • Remove an ACS User from an Access Group
        • List ACS Users in an Access Group
      • Credentials
        • Create a Credential for an ACS User
        • Assign a Credential to an ACS User
        • List Credentials
        • Get a Credential
        • Update a Credential
        • Unassign a Credential from an ACS User
        • Delete a Credential
        • List Accessible Entrances
      • Encoders
        • Encode a Credential
        • Get an Encoder
        • List Encoders
        • Scan a Credential
        • Encoder Simulations
          • Simulate that the Next Credential Encoding Will Fail
          • Simulate that the Next Credential Encoding Will Succeed
          • Simulate that the Next Credential Scan Will Fail
          • Simulate that the Next Credential Scan Will Succeed
    • Noise Sensors
      • Noise Thresholds
        • Create Noise Thresholds
        • List Noise Thresholds
        • Update Noise Threshold
        • Delete Noise Threshold
    • Phones
      • Get a Phone
      • List Phones
      • Deactivate a Phone
      • Phone Simulations
        • Create a Sandbox Phone
    • Thermostats
      • List Thermostats
      • Set to Heat Mode
      • Set to Cool Mode
      • Set to Heat-Cool (Auto) Mode
      • Set to Off Mode
      • Set the HVAC Mode
      • Set Fan Mode
      • Activate a Climate Preset
      • Create a Climate Preset
      • Update a Climate Preset
      • Delete a Climate Preset
      • Set a Fallback Climate Preset
      • Set a Temperature Threshold
      • Thermostat Schedules
        • Get a Thermostat Schedule
        • List Thermostat Schedules
        • Create a Thermostat Schedule
        • Update a Thermostat Schedule
        • Delete a Thermostat Schedule
      • Thermostat Simulations
        • Temperature Reached
        • HVAC Mode Adjusted
    • User Identities
      • Create a User Identity
      • List User Identities
      • Get a User Identity
      • Update a User Identity
      • Add an ACS User to a User Identity
      • List ACS Users Associated with a User Identity
      • List ACS Systems Associated with a User Identity
      • Remove an ACS User from a User Identity
      • Grant a User Identity Access to a Device
      • List Accessible Devices for a User Identity
      • Revoke Access to a Device from a User Identity
      • Delete a User Identity
      • Enrollment Automations
        • Launch an Enrollment Automation
        • List Enrollment Automations
        • Get an Enrollment Automation
        • Delete an Enrollment Automation
    • Action Attempts
      • Get Action Attempt
    • Events
      • List Events
      • Get an Event
  • 🛠️Developer Tools
    • Webhooks
    • Seam CLI
    • Sandbox Devices and Systems
      • Sandbox 2N Intercoms
      • Sandbox 4SUITES Locks
      • Sandbox Akiles Locks
      • Sandbox ASSA ABLOY Credential Services
      • Sandbox ASSA ABLOY Visionline Access Control System
      • Sandbox August Locks
      • Sandbox Avigilon Alta Access System
      • Sandbox Brivo Access
      • Sandbox ControlByWeb Relays
      • Sandbox Doorking Callboxes
      • Sandbox dormakaba Oracode Locks
      • Sandbox ecobee Thermostats
      • Sandbox Genie Garage Openers
      • Sandbox Google Nest Thermostats
      • Sandbox Honeywell Resideo Thermostats
      • Sandbox igloohome Locks
      • Sandbox Kwikset Locks
      • Sandbox Latch Access Control System
      • Sandbox Linear Callboxes
      • Sandbox Lockly Locks
      • Sandbox Minut Sensors
      • Sandbox NoiseAware Sensors
      • Sandbox Nuki Locks
      • Sandbox PTI Storlogix Cloud
      • Sandbox Salto KS Access Control System
      • Sandbox Salto Locks
      • Sandbox Salto Space Access System
      • Sandbox Schlage Encode Locks
      • Sandbox Seam Bridge
      • Sandbox SmartThings Hub
      • Sandbox Tedee Locks
      • Sandbox TTLock Locks
      • Sandbox Wyze Locks
      • Sandbox Yale Locks
    • Rate Limits and Guardrails
    • Mobile SDKs
      • Android SDK
      • iOS SDK
  • 🎛️Device and System Integration Guides
    • Overview
    • 2N Intercom Systems
      • Get started with 2N Intercoms
    • 33 Lock Devices
      • Get started with 33 Lock devices
    • 4SUITES Locks
      • Get started with 4SUITES locks
    • Akiles Locks
      • Get started with Akiles locks
    • ASSA ABLOY Credential Services
    • ASSA ABLOY Visionline Access Control System
      • Visionline ACS Setup Instructions
        • Developing and Launching Your Visionline Plastic Card Encoding App
          • Developing Your Visionline Plastic Card Encoding App Using a Real Visionline Server
            • Step 1: Install Your Visionline Application
            • Step 2: Unblock Required Ports
            • Step 3: Configure a Visionline User Account
            • Step 4: Install a Visionline Card Encoder
            • Step 5: Set up Door Locks
            • Step 6: Program Door Locks
            • Step 7: Create a Production Workspace
            • Step 8: Connect Your Visionline Development Account to Seam
            • Next Steps
          • Developing Your Visionline Plastic Card Encoding App Using a Sandbox Workspace
            • Step 1: Create a Sandbox Workspace
            • Step 2: Connect the Virtual Visionline ACS to Seam
            • Next Steps
          • Launching Your Visionline Plastic Card Encoding App to a Live Site
            • Step 1: Confirm That Your Visionline Site Meets the Requirements
            • Step 2: Configure a Visionline User Account
            • Step 3: Purchase and Import the Callback Option from ASSA ABLOY
            • Step 4: Create a Production Workspace
            • Step 5: Connect Your Visionline Production Account to Seam
        • Developing and Launching Your Visionline Mobile Key App
          • Developing Your Visionline Mobile Key App
            • Step 1: Complete the ASSA ABLOY Mobile Development Course
            • Step 2: Install Your Visionline Application
            • Step 3: Unblock Required Ports
            • Step 4: Configure a Visionline User Account
            • Step 5: Set up Your Credential Services Account in Visionline
            • Step 6: Configure the Mobile Access UUID in Visionline
            • Step 7: Set up Door Locks with BLE Profiles
            • Step 8: Program Door Locks
            • Step 9: Create a Production Workspace
            • Step 10: Connect Your Visionline Development Account to Seam
            • Next Steps
          • Launching Your Visionline Mobile Key App
            • Step 1: Obtain ASSA ABLOY Certification for Your Mobile Key App
            • Step 2: Confirm That Your Visionline Site Meets the Requirements
            • Step 3: Confirm BLE Module on All Locks
            • Step 4: Set up Door Locks with BLE Profiles
            • Step 5: Program Door Locks
            • Step 6: Configure a Visionline User Account
            • Step 7: Purchase and Import the Callback and Mobile Service Options from ASSA ABLOY
            • Step 8: Create a Production Workspace
            • Step 9: Connect Your Visionline Production Account to Seam
      • Configuring Visionline Mobile Credentials
        • Issuing Various Types of Guest Mobile Credentials
        • Issuing Various Types of Guest Joiner Mobile Credentials
        • Retrieving Guest and Common Entrances
        • Checking if a User Identity Has a Phone That Is Set up for a Credential Manager
        • Updating Guest Mobile Credentials
        • Revoking Mobile Credentials
      • Mobile Credential-Related Properties
      • Common Use Cases
      • Special Requirements for Android Mobile Access SDK Development
      • Special Requirements for iOS Mobile Access SDK Development
      • Creating Visionline Card-based Credentials
    • August Locks
      • Get started with August locks
    • Avigilon Alta Access System
    • Brivo Access
    • Get started with ControlByWeb Devices
    • dormakaba Oracode Locks
      • Get started with dormakaba Oracode Locks
      • Creating dormakaba Oracode Offline Access Codes
    • ecobee Thermostats
      • Get Started with ecobee Thermostats
    • Google Nest Thermostats
      • Get Started with Nest Thermostats
      • Obtain Google Nest Device Access and Commercial Development
    • Honeywell Resideo Thermostats
      • Get Started with Honeywell Resideo Thermostats
    • igloohome Locks
      • Get started with igloohome Locks
      • Creating igloohome Offline Access Codes
    • Kwikset Locks
      • Get started with Kwikset Wi-Fi Locks
    • Latch Access Control System
      • Latch ACS Setup Instructions
      • Programming Code-Based Latch Credentials
      • Programming Latch ACS Mobile Credentials
    • Lockly Locks
      • Creating Lockly Offline Access Codes
    • Minut Sensors
      • Get started with Minut Sensors
    • NoiseAware Sensors
      • Get started with NoiseAware Sensors
    • Nuki Locks
      • Get Started with Nuki Locks
    • PTI Storlogix Cloud
    • Salto KS Access Control System
      • Salto KS Setup Instructions
      • Programming Salto KS PIN Code Credentials
      • Programming Salto KS Mobile Credentials
      • Special Requirements for Android Mobile Access SDK Development
    • Salto KS Locks
      • Get started with Salto KS Locks
    • Salto ProAccess Space Access System
      • Salto Space Setup Instructions
      • Programming Salto Space Card-based Credentials
      • Programming Salto Space Mobile Credentials
    • Schlage Locks
      • Schlage Locks Setup Instructions
      • Get started with Schlage Locks
    • SmartThings Hubs + Smart Locks
      • Get started with SmartThings Hubs + Smart Locks
    • Tedee Locks
      • Get Started with Tedee Locks
    • TTLock Locks
      • Get started with TTLock Locks
    • Wyze Locks
      • Get started with Wyze Locks
    • Yale Locks
      • Get started with Yale Locks
    • Get started with Smart Locks
  • Device Manufacturer Guidance
    • Creating a Seam-Compatible Intercom API
      • Creating OAuth Endpoints
      • Creating Intercom CRUD Endpoints
      • Creating Access Code CRUD Endpoints
      • Creating the Health Endpoint
    • Creating a Seam-Compatible Door Locks API
      • Creating OAuth Endpoints
      • Creating Door Lock CRUD Endpoints
      • Creating Access Code CRUD Endpoints
      • Creating the Health Endpoint
Powered by GitBook
LogoLogo

Get Started

  • Sign Up
  • Supported Devices

News

  • Changelog
  • Blog

Company

  • About
  • Privacy Notice

© Seam Labs, Inc. All rights reserved.

On this page
  • Overview
  • Step 1: Install a Seam SDK
  • Step 2: Link your Honeywell Resideo account with Seam
  • Create a Connect Webview
  • Authorize Your Workspace
  • Step 3: Retrieve Honeywell Resideo thermostat devices
  • Step 4: Control your Honeywell Resideo thermostat
  • Set the HVAC mode
  • Create and schedule climate presets
  • Step 5: Connect a real Honeywell Resideo thermostat
  • Step 6: Build your application!
  • Next steps
  • Quick links

Was this helpful?

Edit on GitHub
  1. Device and System Integration Guides
  2. Honeywell Resideo Thermostats

Get Started with Honeywell Resideo Thermostats

Learn how to connect and control Honeywell Resideo thermostats with the Seam API.

PreviousHoneywell Resideo ThermostatsNextigloohome Locks

Last updated 2 months ago

Was this helpful?

Overview

Seam provides a universal API to connect and control many brands of IoT devices and systems, including thermostats, smart locks, access control systems (ACSs), and noise sensors.

This guide shows you how to install a Seam SDK and then control your Honeywell Resideo thermostat using the Seam API.


Step 1: Install a Seam SDK

First, install a Seam SDK, as follows:

npm i seam
pip install seam
# For some development environments, use pip3 in this command instead of pip.
bundle add seam
composer require seamapi/seam

Gradle:

// build.gradle
dependencies {
    implementation 'io.github.seamapi:java:0.x.x'
}

Maven:

<!-- pom.xml -->
<dependency>
    <groupId>io.github.seamapi</groupId>
    <artifactId>java</artifactId>
    <version>0.x.x</version>
</dependency>
go get github.com/seamapi/go

Then, export your API key as an environment variable.

$ export SEAM_API_KEY=seam_test2bMS_94SrGUXuNR2JmJkjtvBQDg5c

Step 2: Link your Honeywell Resideo account with Seam

In this guide, you create a Connect Webview object. Then, you display the graphical component of the created Connect Webview and enter a set of sample credentials to connect a sandbox Honeywell Resideo account.

This guide shows you how to create a Connect Webview programmatically using the Seam API.

Create a Connect Webview

Create a connect_webview object and then note the returned URL.

Code:

from seam import Seam

seam = Seam()  # Seam automatically uses your exported SEAM_API_KEY.

connect_webview = seam.connect_webviews.create(accepted_providers=["honeywell_resideo"])

assert connect_webview.login_successful is False

# Use the returned Connect Webview URL to display
# the Connect Webview authorization flow to your user.
print(connect_webview.url)

Output:

https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Code:

curl -X 'POST' \
  'https://connect.getseam.com/connect_webviews/create' \
  -H 'accept: application/json' \
  -H "Authorization: Bearer ${SEAM_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
  "accepted_providers": ["honeywell_resideo"]
}' | jq -r '"Login Successful (false): " + (.connect_webview.login_successful | tostring),
  "URL: " + .connect_webview.url'
  # Use the returned Connect Webview URL to display
  # the Connect Webview authorization flow to your user.

Output:

Login Successful (false): false
https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Code:

import { Seam } from "seam";

const seam = new Seam(); // Seam automatically uses your exported SEAM_API_KEY.

const connectWebview = await seam.connectWebviews.create({
  accepted_providers: ['honeywell_resideo']
});

console.log(connectWebview.login_successful); // false

// Use the returned Connect Webview URL to display
// the Connect Webview authorization flow to your user.
console.log(connectWebview.url);

Output:

false
https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Code:

require "seam"

seam = Seam.new() # Seam automatically uses your exported SEAM_API_KEY.

connect_webview = seam.connect_webviews.create(
  accepted_providers: ["honeywell_resideo"]
)

puts connect_webview.login_successful # false

# Use the returned Connect Webview URL to display
# the Connect Webview authorization flow to your user.
puts connect_webview.url

Output:

false
https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Code:

<?php
require 'vendor/autoload.php';

$seam = new Seam\SeamClient(); // Seam automatically uses your exported SEAM_API_KEY.

$connect_webview = $seam->connect_webviews->create(
  accepted_providers: ["honeywell_resideo"]
);

echo $connect_webview->login_successful ? 'true' : 'false', "\n"; // false

// Use the returned Connect Webview URL to display
// the Connect Webview authorization flow to your user.
echo $connect_webview->url;

Output:

false
https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Code:

using Seam.Client;

var seam = new SeamClient(apiToken: SEAM_API_KEY);

var connectWebview = seam.ConnectWebviews.Create(
  acceptedProviders: new() {Seam.Api.ConnectWebviews.CreateRequest.AcceptedProvidersEnum.Ecobee}
);

Console.WriteLine(connectWebview.LoginSuccessful); // False

// Use the returned Connect Webview URL to display
// the Connect Webview authorization flow to your user.
Console.WriteLine(connectWebview.Url);

Output:

False
https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Code:

import java.io.Console;
import java.util.*;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.seam.api.Seam;
import com.seam.api.core.ObjectMappers;
import com.seam.api.types.ConnectWebview;
import com.seam.api.types.Device;
import com.seam.api.types.Manufacturer;
import com.seam.api.types.ActionAttempt;
import com.seam.api.types.AccessCode;
import com.seam.api.resources.connectwebviews.requests.ConnectWebviewsCreateRequest;
import com.seam.api.resources.connectwebviews.requests.ConnectWebviewsGetRequest;
import com.seam.api.resources.devices.requests.DevicesListRequest;
import com.seam.api.resources.devices.requests.DevicesGetRequest;
import com.seam.api.resources.locks.requests.LocksUnlockDoorRequest;
import com.seam.api.resources.accesscodes.requests.AccessCodesCreateRequest;
import com.seam.api.resources.accesscodes.requests.AccessCodesListRequest;

public class Main {

  public static void main(String[] args) {

    Seam seam = Seam.builder()
      .apiKey(SEAM_API_KEY)
      .build();

    ConnectWebview connectWebview = seam.connectWebviews().create(ConnectWebviewsCreateRequest.builder()
      .acceptedProviders(List.of(AcceptedProvider.ECOBEE))
      .build());

    System.out.println(connectWebview.getLoginSuccessful()); // false

    // Use the returned Connect Webview URL to display
    // the Connect Webview authorization flow to your user.
    System.out.println(connectWebview.getUrl());

  }
}

Output:

false
https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Code:

package main

import (
  "context"
  "fmt"
  "os"

  api "github.com/seamapi/go"
  seam "github.com/seamapi/go/client"
)

func main() {
  if err := run(); err != nil {
    _, _ = fmt.Fprintln(os.Stderr, err.Error())
    os.Exit(1)
  }
}

func run() error {
  client := seam.NewClient(
    seam.WithApiKey(SEAM_API_KEY),
  )

  connectWebview, err := client.ConnectWebviews.Create(
    context.Background(),
    &api.ConnectWebviewsCreateRequest{
      AcceptedProviders: []api.AcceptedProvider{
        api.AcceptedProviderEcobee,
      },
    },
  )

  if err != nil {
    return err
  }

  fmt.Println(connectWebview.LoginSuccessful) // false

  // Use the returned Connect Webview URL to display
  // the Connect Webview authorization flow to your user.
  fmt.Println(connectWebview.Url)

  return nil
}

Output:

false
https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Authorize Your Workspace

In a web browser, go to the URL that the Connect Webview object returned.

  • Email: jane@example.com

  • Password: 1234

Confirm that authorization through the Connect Webview was successful by querying its status.

Code:

updated_connect_webview = seam.connect_webviews.get(connect_webview.connect_webview_id)

assert updated_connect_webview.login_successful is True # True

Output:

True

Code:

curl -X 'GET' \
  'https://connect.getseam.com/connect_webviews/get' \
  -H 'accept: application/json' \
  -H "Authorization: Bearer ${SEAM_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d "{
  \"connect_webview_id\": \"${connect_webview_id}\"
}" | jq -r '"Login Successful (true): " + (.connect_webview.login_successful | tostring)'

Output:

Login Successful (true): true

Code:

const updatedConnectWebview = await seam.connectWebviews.get({
  connect_webview_id: connectWebview.connect_webview_id
});

console.log(updatedConnectWebview.login_successful); // true

Output:

true

Code:

updated_connect_webview = seam.connect_webviews.get(
  connect_webview_id: connect_webview.connect_webview_id
)

puts updated_connect_webview.login_successful # true

Output:

true

Code:

$updated_connect_webview = $seam->connect_webviews->get(
  connect_webview_id: $connect_webview->connect_webview_id
);

echo $updated_connect_webview->login_successful ? 'true' : 'false', "\n"; // true

Output:

true

Code:

var updatedConnectWebview = seam.ConnectWebviews.Get(
  connectWebviewId: connectWebview.connectWebviewId
);

Console.WriteLine(updatedConnectWebview.LoginSuccessful); // True

Output:

True

Code:

ConnectWebview updatedConnectWebview = seam.connectWebviews().get(ConnectWebviewsGetRequest.builder()
  .connectWebviewId(connectWebview.getConnectWebviewId())
  .build());

System.out.println(updatedConnectWebview.getLoginSuccessful()); // true

Output:

true

Code:

updatedConnectWebview, err := client.ConnectWebviews.Get(
  context.Background(),
  &api.ConnectWebviewsGetRequest{
    ConnectWebviewId: connectWebview.connectWebviewId,
  },
)

if err != nil {
  return err
}

fmt.Println(updatedConnectWebview.LoginSuccessful) // true

return nil

Output:

true

Step 3: Retrieve Honeywell Resideo thermostat devices

The Seam API exposes each device's properties, such as the current temperature reading in Fahrenheit and Celsius, current HVAC and fan modes, available climate presets, thermostat-specific constraints, and much more.

Code:

# Retrieve all devices, filtered by manufacturer,
# which is one of several filters that list() supports.
all_honeywell_resideo_thermostats = seam.devices.list(manufacturer="honeywell_resideo")

# Select the first device as an example.
living_room_thermostat = all_honeywell_resideo_thermostats[0]

# Inspect specific properties.
pprint("Current temperature: " + str(living_room_thermostat.properties["temperature_fahrenheit"]))
pprint("Fan running: " + str(living_room_thermostat.properties["is_fan_running"]))

# View the entire returned device object.
pprint(living_room_thermostat)

Output:

'Current temperature: 70'
'Fan running: False'
Device(
  device_id='11111111-1111-1111-2222-444444444444',
  workspace_id='00000000-0000-0000-0000-000000000000',
  connected_account_id='11111111-1111-1111-1111-222222222222',
  created_at='2024-10-03T22:12:15.666Z',
  properties={
    'manufacturer': 'honeywell_resideo',
    'online': True,
    'temperature_celsius': 21.11111111111111,
    'temperature_fahrenheit': 70,
    'relative_humidity': 0.36,
    'is_cooling': False,
    'is_heating': False,
    'is_fan_running': False,
    'current_climate_setting': {
      'display_name': 'Manual Setting',
      'fan_mode_setting': 'auto',
      'heating_set_point_celsius': 21.11111111111111,   
      'heating_set_point_fahrenheit': 70,
      'hvac_mode_setting': 'heat',
      'manual_override_allowed': True
    },
    ...
  },
  can_hvac_cool=True,
  can_hvac_heat=True,
  can_hvac_heat_cool=True,
  can_turn_off_hvac=True,
  ...
)

Code:

# Retrieve all devices, filtered by manufacturer, which is
# one of several filters that the list endpoint supports.
all_honeywell_resideo_thermostats=$(
  # Use GET or POST.
  curl -X 'GET' \
    'https://connect.getseam.com/devices/list' \
    -H 'accept: application/json' \
    -H "Authorization: Bearer ${SEAM_API_KEY}" \
    -H 'Content-Type: application/json' \
    -d '{
    "manufacturer": "honeywell_resideo"
  }')

# Select the first device as an example.
living_room_thermostat=$(jq -r '.devices[0]' <<< ${all_honeywell_resideo_thermostats})

# Inspect specific properties.
echo $(jq -r '"Current temperature: " + (.properties.temperature_fahrenheit | tostring)' <<< ${living_room_thermostat})
echo $(jq -r '"Fan running: " + (.properties.is_fan_running | tostring)' <<< ${living_room_thermostat})

# View the entire returned device object.
echo ${living_room_thermostat}

Output:

Current temperature: 70
Fan running: false
{
  "device_id": "11111111-1111-1111-2222-444444444444",
  "workspace_id": "00000000-0000-0000-0000-000000000000",
  "connected_account_id": "11111111-1111-1111-1111-222222222222",
  "created_at": "2024-10-03T22:12:15.666Z",
  "properties": {
    "manufacturer": "honeywell_resideo",
    "online": true,
    "temperature_celsius": 21.11111111111111,
    "temperature_fahrenheit": 70,
    "relative_humidity": 0.36,
    "is_cooling": false,
    "is_heating": false,
    "is_fan_running": false,
    "current_climate_setting": {
      "display_name": "Manual Setting",
      "fan_mode_setting": "auto",
      "hvac_mode_setting": "heat",
      "manual_override_allowed": true,
      "heating_set_point_celsius": 21.11111111111111,
      "heating_set_point_fahrenheit": 70
    },
    ...
  },
  "can_hvac_cool": true,
  "can_hvac_heat": true,
  "can_hvac_heat_cool": true,
  "can_turn_off_hvac": true,
  ...
}

Code:

// Retrieve all devices, filtered by manufacturer,
// which is one of several filters that list() supports.
const allHoneywellResideoThermostats = await seam.devices.list({manufacturer: "honeywell_resideo"});

// Select the first device as an example.
const livingRoomThermostat = allHoneywellResideoThermostats[0];

// Inspect specific properties.
console.log("Current temperature: " + livingRoomThermostat.properties.temperature_fahrenheit);
console.log("Fan running: " + livingRoomThermostat.properties.is_fan_running);

// View the entire returned device object.
console.log(livingRoomThermostat);

Output:

Current temperature: 70
Fan running: false
{
  device_id: '11111111-1111-1111-2222-444444444444',
  workspace_id: '00000000-0000-0000-0000-000000000000',
  connected_account_id: '11111111-1111-1111-1111-222222222222',
  created_at: '2024-10-03T22:12:15.666Z',
  properties: {
    manufacturer: 'honeywell_resideo',
    online: true,
    temperature_celsius: 21.11111111111111,
    temperature_fahrenheit: 70,
    relative_humidity: 0.36,
    is_cooling: false,
    is_heating: false,
    is_fan_running: false,
    current_climate_setting: {
      display_name: 'Manual Setting',
      fan_mode_setting: 'auto',
      hvac_mode_setting: 'heat',
      manual_override_allowed: true,
      heating_set_point_celsius: 21.11111111111111,
      heating_set_point_fahrenheit: 70
    },
    ...
  },
  can_hvac_cool: true,
  can_hvac_heat: true,
  can_hvac_heat_cool: true
  can_turn_off_hvac: true,
  ...
}

Code:

# Retrieve all devices, filtered by manufacturer,
# which is one of several filters that list() supports.
all_honeywell_resideo_thermostats = seam.devices.list(manufacturer: "honeywell_resideo")

# Select the first device as an example.
living_room_thermostat = all_honeywell_resideo_thermostats[0]

# Inspect specific properties.
puts "Current temperature: " + living_room_thermostat.properties.temperature_fahrenheit.to_s
puts "Fan running: " + living_room_thermostat.properties.is_fan_running.to_s

# View the entire returned device object.
puts living_room_thermostat.inspect

Output:

Current temperature: 70
Fan running: false
<Seam::Resources::Device:0x005f0
  device_id="11111111-1111-1111-2222-444444444444"
  workspace_id="00000000-0000-0000-0000-000000000000"
  connected_account_id="11111111-1111-1111-1111-222222222222"
  created_at=2024-10-03 22:12:15.666 UTC
  properties=#<Seam::DeepHashAccessor:0x0000016b1791f068 @data={
    "manufacturer"=>"honeywell_resideo",
    "online"=>true,
    "temperature_celsius"=>21.11111111111111,
    "temperature_fahrenheit"=>70,
    "relative_humidity"=>0.36,
    "is_cooling"=>false,
    "is_heating"=>false,
    "is_fan_running"=>false,
    "current_climate_setting"=>{
      "display_name"=>"Manual Setting",
      "fan_mode_setting"=>"auto",
      "hvac_mode_setting"=>"heat",
      "manual_override_allowed"=>true,
      "heating_set_point_celsius"=>21.11111111111111,
      "heating_set_point_fahrenheit"=>70
    },
    ...
  }>
  can_hvac_cool=true
  can_hvac_heat=true
  can_hvac_heat_cool=true
  can_turn_off_hvac=true
  ...
>

Code:

// Retrieve all devices, filtered by manufacturer,
// which is one of several filters that list() supports.
$all_honeywell_resideo_thermostats = $seam->devices->list(manufacturer: "honeywell_resideo");

// Select the first device as an example.
$living_room_thermostat = $all_honeywell_resideo_thermostats[0];

// Inspect specific properties.
echo "Current temperature: ", $living_room_thermostat->properties->temperature_fahrenheit, "\n";
echo "Fan running: ", $living_room_thermostat->properties->is_fan_running ? 'true' : 'false', "\n";

// View the entire returned device object.
echo json_encode($living_room_thermostat, JSON_PRETTY_PRINT);

Output:

Current temperature: 70
Fan running: false
{
  "device_id": "11111111-1111-1111-2222-444444444444",
  "workspace_id": "00000000-0000-0000-0000-000000000000",
  "connected_account_id": "11111111-1111-1111-1111-222222222222",
  "created_at": "2024-10-03T22:12:15.666Z",
  "properties": {
    "manufacturer": "honeywell_resideo",
    "online": true,
    "temperature_celsius": 21.11111111111111,
    "temperature_fahrenheit": 70,
    "relative_humidity": 0.36,
    "is_cooling": false,
    "is_heating": false,
    "is_fan_running": false,
    "current_climate_setting": {
      "display_name": "Manual Setting",
      "fan_mode_setting": "auto",
      "heating_set_point_celsius": 21.11111111111111,
      "heating_set_point_fahrenheit": 70,
      "hvac_mode_setting": "heat",
      "manual_override_allowed": true,
      ...
    },
    ...
  },
  "can_hvac_cool": true,
  "can_hvac_heat": true,
  "can_hvac_heat_cool": true,
  "can_turn_off_hvac": true,
  ...
}

Code:

// Coming soon!

Output:

// Coming soon!

Code:

// Coming soon!

Output:

// Coming soon!

Code:

// Coming soon!

Output:

// Coming soon!

Step 4: Control your Honeywell Resideo thermostat

Next, you can use the Seam API to control your Honeywell Resideo thermostat.

Seam provides additional actions for thermostats, such as setting the fan mode, creating and scheduling climate presets, and setting temperature thresholds. You can also monitor for Seam thermostat-related events, such as reported temperatures outside your set thresholds.

Try out the following actions on your Honeywell Resideo thermostat:

Set the HVAC mode

To set the HVAC mode, use any of the following endpoints or their equivalents in the Seam SDKs:

  • /thermostats/heat

  • /thermostats/cool

  • /thermostats/heat_cool

  • /thermostats/off

  • /thermostats/set_hvac_mode

    This endpoint is a consolidated version of the other four endpoints.

In this example, set the HVAC mode to heat and the desired heating set point to 68 °F.

Code:

# Confirm that the device supports heat mode.
# You're using a capability flag here!
if living_room_thermostat.can_hvac_heat:
  # Set the HVAC mode
  # and return an action attempt.
  action_attempt = seam.thermostats.heat(
    device_id = living_room_thermostat.device_id,
    heating_set_point_fahrenheit = 68
  )

Output:

ActionAttempt(
  action_attempt_id='11111111-2222-3333-4444-555555555555',
  action_type='SET_HVAC_MODE',
  status='success',
  result={},
  error=None
)

Code:

# Confirm that the device supports heat mode.
# You're using a capability flag here!
if  $(jq -r '.can_hvac_heat' <<< ${living_room_thermostat}); then \
  # Set the HVAC mode
  # and return an action attempt.
  curl -X 'POST' \
    'https://connect.getseam.com/thermostats/heat' \
    -H 'accept: application/json' \
    -H "Authorization: Bearer ${SEAM_API_KEY}" \
    -H 'Content-Type: application/json' \
    -d "{
      \"device_id\": \"$(jq -r '.device_id' <<< ${living_room_thermostat})\",
      \"heating_set_point_fahrenheit\": 68
  }";
fi

Output:

{
  "action_attempt": {
    "status": "pending",
    "action_type": "SET_HVAC_MODE",
    "action_attempt_id": "11111111-2222-3333-4444-555555555555",
    "result": null,
    "error": null
  },
  "ok": true
}

Code:

// Confirm that the device supports heat mode.
// You're using a capability flag here!
if (livingRoomThermostat.can_hvac_heat) {
  // Set the HVAC mode
  // and return an action attempt.
  const actionAttempt = await seam.thermostats.heat({
    device_id: livingRoomThermostat.device_id,
    heating_set_point_fahrenheit: 68
  });
};

Output:

{
  actionAttempt: {
    status: 'success',
    action_attempt_id: '11111111-2222-3333-4444-555555555555',
    action_type: 'SET_HVAC_MODE',
    result: {},
    error: null
  }
}

Code:

# Confirm that the device supports heat mode.
# You're using a capability flag here!
if (living_room_thermostat.can_hvac_heat)
  # Set the HVAC mode
  # and return an action attempt.
  action_attempt = seam.thermostats.heat(
    device_id: living_room_thermostat.device_id,
    heating_set_point_fahrenheit: 68
  )
end

Output:

<Seam::Resources::ActionAttempt:0x005f0
  status="success"
  action_type="SET_HVAC_MODE"
  action_attempt_id="11111111-2222-3333-4444-555555555555"
  result={}
  error=nil>

Code:

// Confirm that the device supports heat mode.
// You're using a capability flag here!
if ($living_room_thermostat->can_hvac_heat) {
  // Set the HVAC mode
  // and return an action attempt.
  $action_attempt = $seam->thermostats->heat(
    device_id: $living_room_thermostat->device_id,
    heating_set_point_fahrenheit: 68
  );
}

Output:

{
  "action_attempt_id":"11111111-2222-3333-4444-555555555555",
  "action_type":"SET_HVAC_MODE",
  "error":null,
  "result":{},
  "status":"success"
}

Code:

// Coming soon!

Output:

// Coming soon!

Code:

// Coming soon!

Output:

// Coming soon!

Code:

// Coming soon!

Output:

// Coming soon!

To query properties.current_climate_setting.hvac_mode_setting for the device:

Code:

# Get the device by ID.
updated_living_room_thermostat = seam.devices.get(
  device_id = living_room_thermostat.device_id
)

# Inspect properties.current_climate_setting.hvac_mode_setting 
# to confirm that setting the HVAC mode to heat was successful.
pprint(
  updated_living_room_thermostat.
  properties["current_climate_setting"]["hvac_mode_setting"]
)

Output:

'heat'

Code:

# Get the device by ID.
updated_living_room_thermostat=$(
  # Use GET or POST.
  curl -X 'GET' \
    'https://connect.getseam.com/devices/get' \
    -H 'accept: application/json' \
    -H "Authorization: Bearer ${SEAM_API_KEY}" \
    -H 'Content-Type: application/json' \
    -d "{
      \"device_id\": \"$(jq -r '.device_id' <<< ${living_room_thermostat})\"
  }")

# Inspect properties.current_climate_setting.hvac_mode_setting 
# to confirm that setting the HVAC mode to heat was successful.
echo $(jq -r '(.device.properties.current_climate_setting.hvac_mode_setting)' <<< ${updated_living_room_thermostat})

Output:

heat

Code:

// Get the device by ID.
const updatedLivingRoomThermostat = await seam.devices.get({
  device_id: livingRoomThermostat.device_id
});

// Inspect properties.current_climate_setting.hvac_mode_setting 
// to confirm that setting the HVAC mode to heat was successful.
console.log(
  updatedLivingRoomThermostat.properties.
  current_climate_setting.hvac_mode_setting
);

Output:

heat

Code:

# Get the device by ID.
updated_living_room_thermostat = seam.devices.get(
  device_id: living_room_thermostat.device_id
)

# Inspect properties.current_climate_setting.hvac_mode_setting 
# to confirm that setting the HVAC mode to heat was successful.
puts updated_living_room_thermostat.
  properties.current_climate_setting.hvac_mode_setting

Output:

heat

Code:

// Get the device by ID.
$updated_living_room_thermostat = $seam->devices->get(
  device_id: $living_room_thermostat->device_id
);

// Inspect properties.current_climate_setting.hvac_mode_setting 
// to confirm that setting the HVAC mode to heat was successful.
echo $updated_living_room_thermostat->properties->
  current_climate_setting->hvac_mode_setting;

Output:

heat

Code:

// Coming soon!

Output:

// Coming soon!

Code:

// Coming soon!

Output:

// Coming soon!

Code:

// Coming soon!

Output:

// Coming soon!

Create and schedule climate presets

You can use the Seam API to create climate presets for Honeywell Resideo thermostats. Each climate preset is a predefined configuration that specifies settings, such as HVAC mode, fan mode, and temperature set points. Climate presets make it quick and efficient for users to apply consistent climate settings tailored to different scenarios, enhancing both comfort and energy efficiency. For example, you could create two climate presets: a comfort preset for when a vacation rental is occupied and an eco preset for when the vacation rental is empty.

Once you create climate presets, you can schedule them to start and stop whenever you'd like. For example, you could schedule your thermostat to switch to the comfort preset in sync with your vacation rental reservations. You can even set a fallback climate preset, such as eco, and Seam enforces this preset's settings on your thermostat whenever there is no other active climate preset.

In this example, create comfort and eco climate presets, set eco as the fallback, and schedule the comfort climate preset to coincide with two vacation rental reservations.

Code:

# Confirm that the thermostat supports heat_cool mode
# so that the climate presets can use this mode.
if updated_living_room_thermostat.can_hvac_heat_cool:
  # Create the climate presets.
  seam.thermostats.create_climate_preset(
    device_id = updated_living_room_thermostat.device_id,
    climate_preset_key = "comfort",
    name = "Comfort",
    fan_mode_setting = "auto",
    hvac_mode_setting = "heat_cool",
    cooling_set_point_celsius = 25,
    heating_set_point_celsius = 20
  )
  
  seam.thermostats.create_climate_preset(
    device_id: updated_living_room_thermostat.device_id,
    climate_preset_key = "eco",
    name = "Eco",
    fan_mode_setting = "auto",
    hvac_mode_setting = "heat_cool",
    cooling_set_point_celsius = 30,
    heating_set_point_celsius = 15
  )

  # Then, set eco as the fallback climate setting.
  seam.thermostats.set_fallback_climate_preset(
    device_id = updated_living_room_thermostat.device_id,
    climate_preset_key = "eco"
  )
  
  # Now, schedule the comfort preset to coincide with two reservations.
  seam.thermostats.schedules.create(
    device_id = updated_living_room_thermostat.device_id,
    name = "Jim's stay",
    climate_preset_key = "comfort",
    starts_at = "2025-03-10T15:00:00Z",
    ends_at = "2025-03-15T12:00:00Z",
    is_override_allowed = True,
    max_override_period_minutes = 90
  )
  
  seam.thermostats.schedules.create(
    device_id = updated_living_room_thermostat.device_id,
    name = "Jane's stay",
    climate_preset_key = "comfort",
    starts_at = "2025-03-17T15:00:00Z",
    ends_at = "2025-03-20T12:00:00Z",
    is_override_allowed = True,
    max_override_period_minutes = 90
  )

Output:

ThermostatSchedule(
  thermostat_schedule_id='88888888-1111-1111-1111-111111111111',
  name="Jim's stay",
  device_id='11111111-1111-1111-2222-444444444444',
  climate_preset_key='comfort',
  starts_at='2025-03-10T15:00:00.000Z',
  ends_at='2025-03-15T12:00:00.000Z',
  is_override_allowed=True,
  max_override_period_minutes=90,
  ...
)
ThermostatSchedule(
  thermostat_schedule_id='88888888-1111-1111-1111-222222222222',
  name="Jane's stay",
  device_id='11111111-1111-1111-2222-444444444444',
  climate_preset_key='comfort',
  starts_at='2025-03-17T15:00:00.000Z',
  ends_at='2025-03-20T12:00:00.000Z',
  is_override_allowed=True,
  max_override_period_minutes=90,
  ...
)

Code:

# Confirm that the thermostat supports heat_cool mode
# so that the climate presets can use this mode.
if  $(jq -r '.device.can_hvac_heat_cool' <<< ${updated_living_room_thermostat}); then \
  # Create the climate presets.
  curl -X 'POST' \
    'https://connect.getseam.com/thermostats/create_climate_preset' \
    -H 'accept: application/json' \
    -H "Authorization: Bearer ${SEAM_API_KEY}" \
    -H 'Content-Type: application/json' \
    -d "{
      \"device_id\": \"$(jq -r '.device.device_id' <<< ${updated_living_room_thermostat})\",
      \"climate_preset_key\": \"comfort\",
      \"name\": \"Comfort\",
      \"fan_mode_setting\": \"auto\",
      \"hvac_mode_setting\": \"heat_cool\",
      \"cooling_set_point_celsius\": 25,
      \"heating_set_point_celsius\": 20
  }";

  curl -X 'POST' \
    'https://connect.getseam.com/thermostats/create_climate_preset' \
    -H 'accept: application/json' \
    -H "Authorization: Bearer ${SEAM_API_KEY}" \
    -H 'Content-Type: application/json' \
    -d "{
      \"device_id\": \"$(jq -r '.device.device_id' <<< ${updated_living_room_thermostat})\",
      \"climate_preset_key\": \"eco\",
      \"name\": \"Eco\",
      \"fan_mode_setting\": \"auto\",
      \"hvac_mode_setting\": \"heat_cool\",
      \"cooling_set_point_celsius\": 30,
      \"heating_set_point_celsius\": 15
  }";

  # Then, set eco as the fallback climate setting.
  curl -X 'POST' \
    'https://connect.getseam.com/thermostats/set_fallback_climate_preset' \
    -H 'accept: application/json' \
    -H "Authorization: Bearer ${SEAM_API_KEY}" \
    -H 'Content-Type: application/json' \
    -d "{
      \"device_id\": \"$(jq -r '.device.device_id' <<< ${updated_living_room_thermostat})\",
      \"climate_preset_key\": \"eco\"
  }";

  # Now, schedule the comfort preset to coincide with two reservations.
  curl -X 'POST' \
  'https://connect.getseam.com/thermostats/schedules/create' \
  -H 'accept: application/json' \
  -H "Authorization: Bearer ${SEAM_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d "{
    \"device_id\": \"$(jq -r '.device.device_id' <<< ${updated_living_room_thermostat})\",
    \"name\":  \"Jim's stay\",
    \"climate_preset_key\": \"comfort\",
    \"starts_at\": \"2025-03-10T15:00:00Z\",
    \"ends_at\": \"2025-03-15T12:00:00Z\",
    \"is_override_allowed\": true,
    \"max_override_period_minutes\": 90
  }";

  curl -X 'POST' \
  'https://connect.getseam.com/thermostats/schedules/create' \
  -H 'accept: application/json' \
  -H "Authorization: Bearer ${SEAM_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d "{
    \"device_id\": \"$(jq -r '.device.device_id' <<< ${updated_living_room_thermostat})\",
    \"name\":  \"Jane's stay\",
    \"climate_preset_key\": \"comfort\",
    \"starts_at\": \"2025-03-17T15:00:00Z\",
    \"ends_at\": \"2025-03-20T12:00:00Z\",
    \"is_override_allowed\": true,
    \"max_override_period_minutes\": 90
  }";
fi

Output:

{
  "thermostat_schedule":{
    "thermostat_schedule_id":"88888888-1111-1111-1111-111111111111",
    "name":"Jim's stay",
    "device_id":"11111111-1111-1111-2222-444444444444",
    "climate_preset_key":"comfort",
    "starts_at":"2025-03-10T15:00:00.000Z",
    "ends_at":"2025-03-15T12:00:00.000Z",
    "is_override_allowed":true,
    "max_override_period_minutes":90,
    ...
  },
  "ok":true
}
{
  "thermostat_schedule":{
    "thermostat_schedule_id":"88888888-1111-1111-1111-222222222222",
    "name":"Jane's stay",
    "device_id":"11111111-1111-1111-2222-444444444444",
    "climate_preset_key":"comfort",
    "starts_at":"2025-03-17T15:00:00.000Z",
    "ends_at":"2025-03-20T12:00:00.000Z",
    "is_override_allowed":true,
    "max_override_period_minutes":90,
    ...
  },
  "ok":true
}

Code:

// Confirm that the thermostat supports heat_cool mode
// so that the climate presets can use this mode.
if (updatedLivingRoomThermostat.can_hvac_heat_cool) {
  // Create the climate presets.
  await seam.thermostats.createClimatePreset({
    device_id: updatedLivingRoomThermostat.device_id,
    climate_preset_key: "comfort",
    name: "Comfort",
    fan_mode_setting: "auto",
    hvac_mode_setting: "heat_cool",
    cooling_set_point_celsius: 25,
    heating_set_point_celsius: 20
  });
  
  await seam.thermostats.createClimatePreset({
    device_id: updatedLivingRoomThermostat.device_id,
    climate_preset_key: "eco",
    name: "Eco",
    fan_mode_setting: "auto",
    hvac_mode_setting: "heat_cool",
    cooling_set_point_celsius: 30,
    heating_set_point_celsius: 15
  });

  // Then, set eco as the fallback climate setting.
  await seam.thermostats.setFallbackClimatePreset({
    device_id: updatedLivingRoomThermostat.device_id,
    climate_preset_key: "eco"
  });
  
  // Now, schedule the comfort preset to coincide with two reservations.
  await seam.thermostats.schedules.create({
    device_id: updatedLivingRoomThermostat.device_id,
    name: "Jim's stay",
    climate_preset_key: "comfort",
    starts_at: "2025-03-10T15:00:00Z",
    ends_at: "2025-03-15T12:00:00Z",
    is_override_allowed: true,
    max_override_period_minutes: 90
  });

  await seam.thermostats.schedules.create({
    device_id: updatedLivingRoomThermostat.device_id,
    name: "Jane's stay",
    climate_preset_key: "comfort",
    starts_at: "2025-03-17T15:00:00Z",
    ends_at: "2025-03-20T12:00:00Z",
    is_override_allowed: true,
    max_override_period_minutes: 90
  });
}

Output:

{
  thermostat_schedule_id: '88888888-1111-1111-1111-111111111111',
  name: "Jim's stay",
  device_id: '11111111-1111-1111-2222-444444444444',
  climate_preset_key: 'comfort',
  starts_at: '2025-03-10T15:00:00.000Z',
  ends_at: '2025-03-15T12:00:00.000Z',
  is_override_allowed: true,
  max_override_period_minutes: 90,
  ...
}
{
  thermostat_schedule_id: '88888888-1111-1111-1111-222222222222',
  name: "Jane's stay",
  device_id: '11111111-1111-1111-2222-444444444444',
  climate_preset_key: 'comfort',
  starts_at: '2025-03-17T15:00:00.000Z',
  ends_at: '2025-03-20T12:00:00.000Z',
  is_override_allowed: true,
  max_override_period_minutes: 90,
  ...
}

Code:

# Confirm that the thermostat supports heat_cool mode
# so that the climate presets can use this mode.
if (updated_living_room_thermostat.can_hvac_heat_cool)
  # Create the climate presets.
  seam.thermostats.create_climate_preset(
    device_id: updated_living_room_thermostat.device_id,
    climate_preset_key: "comfort",
    name: "Comfort",
    fan_mode_setting: "auto",
    hvac_mode_setting: "heat_cool",
    cooling_set_point_celsius: 25,
    heating_set_point_celsius: 20
  )

  seam.thermostats.create_climate_preset(
    device_id: updated_living_room_thermostat.device_id,
    climate_preset_key: "eco",
    name: "Eco",
    fan_mode_setting: "auto",
    hvac_mode_setting: "heat_cool",
    cooling_set_point_celsius: 30,
    heating_set_point_celsius: 15
  )
  
  # Then, set eco as the fallback climate setting.
  seam.thermostats.set_fallback_climate_preset(
    device_id: updated_living_room_thermostat.device_id,
    climate_preset_key: "eco"
  )
  
  # Now, schedule the comfort preset to coincide with two reservations.
  seam.thermostats.schedules.create(
    device_id: updated_living_room_thermostat.device_id,
    name: "Jim's stay",
    climate_preset_key: "comfort",
    starts_at: "2025-03-10T15:00:00Z",
    ends_at: "2025-03-15T12:00:00Z",
    is_override_allowed: true,
    max_override_period_minutes: 90
  )

  await seam.thermostats.schedules.create(
    device_id: updated_living_room_thermostat.device_id,
    name: "Jane's stay",
    climate_preset_key: "comfort",
    starts_at: "2025-03-17T15:00:00Z",
    ends_at: "2025-03-20T12:00:00Z",
    is_override_allowed: true,
    max_override_period_minutes: 90
  )
end

Output:

<Seam::Resources::ThermostatSchedule:0x005f0
  thermostat_schedule_id="88888888-1111-1111-1111-111111111111"
  name="Jim's stay"
  device_id="11111111-1111-1111-2222-444444444444"
  climate_preset_key="comfort"
  starts_at=2025-03-10 15:00:00 UTC
  ends_at=2025-03-15 12:00:00 UTC
  is_override_allowed=true
  max_override_period_minutes=90
  ...
>
<Seam::Resources::ThermostatSchedule:0x005f0
  thermostat_schedule_id="88888888-1111-1111-1111-222222222222"
  name="Jane's stay"
  device_id="11111111-1111-1111-2222-444444444444"
  climate_preset_key="comfort"
  starts_at=2025-03-17 15:00:00 UTC
  ends_at=2025-03-20 12:00:00 UTC
  is_override_allowed=true
  max_override_period_minutes=90
  ...
>

Code:

// Confirm that the thermostat supports heat_cool mode
// so that the climate presets can use this mode.
if ($updated_living_room_thermostat->can_hvac_heat_cool) {
  // Create the climate presets.
  $seam->thermostats->create_climate_preset(
    device_id: $updated_living_room_thermostat->device_id,
    climate_preset_key: "comfort",
    name: "Comfort",
    fan_mode_setting: "auto",
    hvac_mode_setting: "heat_cool",
    cooling_set_point_celsius: 25,
    heating_set_point_celsius: 20
  );
  
  $seam->thermostats->create_climate_preset(
    device_id: $updated_living_room_thermostat->device_id,
    climate_preset_key: "eco",
    name: "Eco",
    fan_mode_setting: "auto",
    hvac_mode_setting: "heat_cool",
    cooling_set_point_celsius: 30,
    heating_set_point_celsius: 15
  );
    
  // Then, set eco as the fallback climate setting.
  $seam->thermostats->set_fallback_climate_preset(
    device_id: $updated_living_room_thermostat->device_id,
    climate_preset_key: "eco"
  );

  // Now, schedule the comfort preset to coincide with two reservations.
  $seam->thermostats->schedules->create(
    device_id: $updated_living_room_thermostat->device_id,
    name: "Jim's stay",
    climate_preset_key: "comfort",
    starts_at: "2025-03-10T15:00:00Z",
    ends_at: "2025-03-15T12:00:00Z",
    is_override_allowed: true,
    max_override_period_minutes: 90
  );

  $seam->thermostats->schedules->create(
    device_id: updated_living_room_thermostat.device_id,
    name: "Jane's stay",
    climate_preset_key: "comfort",
    starts_at: "2025-03-17T15:00:00Z",
    ends_at: "2025-03-20T12:00:00Z",
    is_override_allowed: true,
    max_override_period_minutes: 90
  );
}

Output:

{
  "thermostat_schedule_id":"88888888-1111-1111-1111-111111111111",
  "name":"Jim's stay",
  "device_id":"11111111-1111-1111-2222-444444444444",
  "climate_preset_key":"comfort",
  "starts_at":"2025-03-10T15:00:00.000Z",
  "ends_at":"2025-03-15T12:00:00.000Z",
  "is_override_allowed":true,
  "max_override_period_minutes":90,
  ...
}
{
  "thermostat_schedule_id":"88888888-1111-1111-1111-222222222222",
  "name":"Jane's stay",
  "device_id":"11111111-1111-1111-2222-444444444444",
  "climate_preset_key":"comfort",
  "starts_at":"2025-03-17T15:00:00.000Z",
  "ends_at":"2025-03-20T12:00:00.000Z",
  "is_override_allowed":true,
  "max_override_period_minutes":90,
  ...
}

Code:

// Coming soon!

Output:

// Coming soon!

Code:

// Coming soon!

Output:

// Coming soon!

Code:

// Coming soon!

Output:

// Coming soon!

Step 5: Connect a real Honeywell Resideo thermostat


Step 6: Build your application!

Seam makes it easy to develop your application. The robust Seam API and Seam SDKs in a wide variety of programming languages provide robust, up-to-date information about your thermostats. We also provide helpful thermostat-related events that enable you to monitor the status of your thermostats and the connected HVAC systems. Further, our simulation endpoints make it easy for you to test your thermostat app against events that can be difficult to orchestrate in your quality assurance (QA) environment using real devices.


Next steps

Now that you've completed this getting started guide for Honeywell Resideo devices, you can learn more about what you can do with the Seam API.


Quick links

This guide gives you a rapid introduction to connecting and controlling your thermostats using the Seam API. For application developers, you can use the Seam API in your app, and your users can authorize your app to control their devices using Seam.

For detailed information about the Honeywell Resideo devices that Seam supports, see the following table and our :

To learn more about other IoT device and system brands that Seam supports—such as ecobee, Google Nest, Yale, Schlage, and many more—visit our .

Another easy way to learn about what you can do with the Seam API is to explore the , which you can access from directly within the .

Seam provides client libraries for many languages, including JavaScript, Python, Ruby, PHP, and others, as well as a Postman collection and an spec.

JavaScript / TypeScript (, )

Python (, )

Ruby Gem (, )

PHP (, )

Java ()

C# (, )

Go ()

Install using .

Next, go to and to get your .

This guide uses a . You can only connect virtual devices and systems in this type of workspace. If you want to connect a real Honeywell Resideo thermostat, use a and API key.

To control your Honeywell Resideo thermostat using the Seam API, you must first authorize your Seam workspace to connect to your Honeywell Resideo account. If your application needs to connect to your users' Honeywell Resideo accounts, Seam provides fully-embedded, client-side to collect their authorization securely. These user-friendly pre-built authorization flows walk your users through the process of granting your Seam workspace permission to control their Honeywell Resideo thermostats. The Connect Webview presents a flow that prompts your users to enter their credentials for their Honeywell Resideo account.

The provides another easy way to connect devices to your Seam workspace.

Go to . On the Devices page, click + Add Devices. Then, see in this guide to complete the Connect Webview authorization flow.

For application developers, you can redirect your user to this Connect Webview URL so that they can authorize your app to control their devices using Seam. We even provide a prebuilt within our suite of that help you build your device management flow.

Because you're using a sandbox workspace, you can connect Seam's test Honeywell Resideo account. We provide for each of the brands that we support. These sandbox devices and systems enable you to test your app with devices from multiple brands without the need to own all the corresponding physical devices.

Complete the Connect Webview authorization flow by entering the following credentials:

When you link a Honeywell Resideo account with Seam, we create a device object to represent each Honeywell Resideo thermostat in your account. You can then retrieve these Honeywell Resideo devices using the and endpoints.

Each device that you connect to Seam has a specific set of capabilities. These capabilities define the Seam API actions that you can use. For thermostats, device-specific capabilities include whether you can to heat, cool, or heat_cool. Seam's intuitive and granular inform your application about what features and behaviors each device supports. Notice the capability flags within the code samples in this guide.

Specify the thermostat that you want to control by including the device_id in the request body. Also, include the desired temperature .

Each of these HVAC mode endpoints returns an to track the progress of the operation.

You can track the status of the operation to confirm that the device was set to heat mode successfully. Query properties.current_climate_setting.hvac_mode_setting for the device, by ID, or look for a . Further, if you wanted to find out whether the HVAC system was currently heating, you could inspect properties.is_heating for the device.

Now that you have learned the basics of using the Seam API, you can connect and control a real Honeywell Resideo device. To do so, make sure to switch to a and .

For more details about setting up your real Honeywell Resideo thermostat, see the .

Explore See the that Seam supports.

Learn Read about Seam and the that Seam supports.

Expand your abilities Find out what other you can perform using the Seam API.

Use webhooks Learn how to use as an efficient way to receive device events.

Find out more Explore the other types of devices and systems that you can control with Seam, including , , and .

Develop for mobile access Learn about Seam's .

If you have any questions or want to report an issue, email us at .

🎛️
Honeywell Resideo
Honeywell Resideo Supported Devices page
integration page
interactive Seam CLI
Seam Console
▶️
Go to the Seam Console!
OpenAPI
npm
GitHub
pip
GitHub
rubygem
GitHub
packagist
GitHub
GitHub
nuget
GitHub
GitHub
nuget
customizable
Connect Webviews
Seam Console
Connect Account Button
Seam Components
virtual devices
Honeywell Resideo sandbox account
List Devices
Get Device
set point
action attempt
Honeywell Resideo thermostats integration guide
other devices and system integrations
concepts
device and system capabilities
thermostat actions
webhooks
smart locks
access control systems
noise sensors
mobile access solution
support@seam.co
https://console.seam.co/
Authorize your workspace
Set the HVAC mode
Create and schedule climate presets
https://console.seam.co/
API key
sign up for Seam
retrieve the action attempt
thermostat.manually_adjusted event
set the HVAC mode
API key
capability flags
sandbox workspace
non-sandbox workspace
non-sandbox workspace
Honeywell Resideo ThermostatsHoneywell Resideo Thermostats
Honeywell Resideo Thermostats
Use the Seam Connect Webview authorization flow to connect a Honeywell Resideo account with Seam. This flow varies slightly based on the device manufacturer.Use the Seam Connect Webview authorization flow to connect a Honeywell Resideo account with Seam. This flow varies slightly based on the device manufacturer.
Use the Seam Connect Webview authorization flow to connect a Honeywell Resideo account with Seam. This flow varies slightly based on the device manufacturer.
Cover

Get an API Key (free)

Sign up for the Seam Console and get your API keys. →

Cover

Contact Sales

Got a project or a specific question? Contact our team to get answers. →