> ## Documentation Index
> Fetch the complete documentation index at: https://seam-feat-mintlify-migration-iteration.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Testing Your Thermostat App with Simulate Endpoints

> Learn how to use the Seam suite of simulate endpoints to test your thermostat app.

Seam's suite of `simulate` endpoints help you to test your thermostat app against events that can be difficult to orchestrate in your quality assurance (QA) environment using real devices. Seam provides the following thermostat-related `simulate` endpoints that you can use in a [sandbox workspace](/core-concepts/workspaces/index#sandbox-workspaces):

* [`/thermostats/simulate/hvac_mode_adjusted`](#simulate-adjusting-the-hvac-mode)
* [`/thermostats/simulate/temperature_reached`](#simulate-reaching-a-desired-temperature)

Seam supports these endpoints for all thermostat [sandbox devices](/device-and-system-integration-guides).

<Info>
  Seam provides additional `simulate` endpoints to help you [test your app
  against device disconnection and
  removal](../../core-concepts/devices/testing-your-app-against-device-disconnection-and-removal).
</Info>

***

## Checking Capability Flags

Before using the `simulate` endpoints, check the relevant capabilities of the sandbox thermostat that you want to test. For example, if you want to use `/thermostats/simulate/hvac_mode_adjusted` to simulate having set the [HVAC mode](./understanding-thermostat-concepts/hvac-mode) on a thermostat to `heat`, you must first make sure that the thermostat supports heat mode.

The following device properties show the relevant capabilities of a thermostat:

* `device.can_hvac_heat`
* `device.can_hvac_cool`
* `device.can_hvac_heat_cool`
* `device.can_turn_off_hvac`

For more information, see [Thermostat Capabilities](/capability-guides/thermostats/index#thermostat-capabilities).

***

## Simulate Adjusting the HVAC Mode

The `/thermostats/simulate/hvac_mode_adjusted` endpoint enables you to simulate having adjusted the [HVAC mode](./understanding-thermostat-concepts/hvac-mode) for a thermostat. This simulation is helpful for testing that your app is receiving [thermostat events](/api/events/object) correctly, such as `thermostat.manually_adjusted`.

You can simulate having set the HVAC mode to any of the following settings:

* `heat`
* `cool`
* `heat_cool`
* `off`

When you set the HVAC mode to `heat`, `cool`, or `heat_cool`, you must also set the following applicable [set points](./understanding-thermostat-concepts/set-points) to the desired degrees Fahrenheit or Celsius:

| HVAC Mode Setting | Required Set Points                                                                                                                                                                                           |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `heat`            | <ul><li><code>heating\_set\_point\_fahrenheit</code> or <code>heating\_set\_point\_celsius</code></li></ul>                                                                                                   |
| `cool`            | <ul><li><code>cooling\_set\_point\_fahrenheit</code> or <code>cooling\_set\_point\_celsius</code></li></ul>                                                                                                   |
| `heat_cool`       | <ul><li><code>heating\_set\_point\_fahrenheit</code> or <code>heating\_set\_point\_celsius</code></li><li><code>cooling\_set\_point\_fahrenheit</code> or <code>cooling\_set\_point\_celsius</code></li></ul> |
| `off`             | <ul><li>None</li></ul>                                                                                                                                                                                        |

To simulate having adjusted the HVAC mode for a thermostat:

<Tabs>
  <Tab title="JavaScript">
    **Code:**

    ```javascript theme={null}
    // Get the device.
    const thermostat = await seam.devices.get({
      device_id: '11111111-1111-1111-2222-444444444444',
    })

    // Confirm that Seam supports the desired HVAC mode for the thermostat.
    // In this example, we're simulating having set the thermostat to heat mode.
    if (thermostat.can_hvac_heat) {
      // Perform the simulated HVAC mode adjustment.
      await seam.thermostats.simulate.hvacModeAdjusted({
        device_id: thermostat.device_id,
        hvac_mode: 'heat',
        heating_set_point_fahrenheit: 68,
      })
    }
    ```

    **Output:**

    ```json theme={null}
    void
    ```
  </Tab>

  <Tab title="cURL">
    **Code:**

    ```bash theme={null}
    # Get the device.
    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": "11111111-1111-1111-2222-444444444444"
      }')

    # Confirm that Seam supports the desired HVAC mode for the thermostat.
    # In this example, we're simulating having set the thermostat to heat mode.
    if  $(jq -r '.device.can_hvac_heat' <<< ${thermostat}); then \
      # Perform the simulated HVAC mode adjustment.
      curl -X 'POST' \
        'https://connect.getseam.com/thermostats/simulate/hvac_mode_adjusted' \
        -H 'accept: application/json' \
        -H "Authorization: Bearer ${SEAM_API_KEY}" \
        -H 'Content-Type: application/json' \
        -d "{
          \"device_id\": \"$(jq -r '.device.device_id' <<< ${thermostat})\",
          \"hvac_mode\": \"heat\",
          \"heating_set_point_fahrenheit\": 68
      }";
    fi
    ```

    **Output:**

    ```json theme={null}
    {
      "ok": true
    }
    ```
  </Tab>

  <Tab title="Python">
    **Code:**

    ```python theme={null}
    # Get the device.
    thermostat = seam.devices.get(
      device_id="11111111-1111-1111-2222-444444444444"
    )

    # Confirm that Seam supports the desired HVAC mode for the thermostat.
    # In this example, we're simulating having set the thermostat to heat mode.
    if thermostat.can_hvac_heat:
      # Perform the simulated HVAC mode adjustment.
      seam.thermostats.simulate.hvac_mode_adjusted(
        device_id = thermostat.device_id,
        hvac_mode = "heat",
        heating_set_point_fahrenheit = 68
      )
    ```

    **Output:**

    ```
    None
    ```
  </Tab>

  <Tab title="Ruby">
    <Info>Coming soon!</Info>

    **Code:**

    ```ruby theme={null}
    # Get the device.
    thermostat = client.devices.get(device_id: "11111111-1111-1111-2222-444444444444")

    # Confirm that Seam supports the desired HVAC mode for the thermostat.
    # In this example, we're simulating having set the thermostat to heat mode.
    if (thermostat.can_hvac_heat)
      # Perform the simulated HVAC mode adjustment.
      client.thermostats.simulate.hvac_mode_adjusted(
        device_id: thermostat.device_id,
        hvac_mode: "heat",
        heating_set_point_fahrenheit: 68
      )
    end
    ```

    **Output:**

    ```
    nil
    ```
  </Tab>

  <Tab title="PHP">
    **Code:**

    ```php theme={null}
    // Get the device.
    $thermostat = $seam->devices->get(device_id: "11111111-1111-1111-2222-444444444444");

    // Confirm that Seam supports the desired HVAC mode for the thermostat.
    // In this example, we're simulating having set the thermostat to heat mode.
    if ($thermostat->can_hvac_heat) {
      // Perform the simulated HVAC mode adjustment.
      $seam->thermostats->simulate->hvac_mode_adjusted(
        device_id: $thermostat->device_id,
        hvac_mode: "heat",
        heating_set_point_fahrenheit: 68
      );
    }
    ```

    **Output:**

    ```json theme={null}
    void
    ```
  </Tab>

  <Tab title="C#">
    <Info>Coming soon!</Info>

    **Code:**

    ```csharp theme={null}
    // Get the device.
    Device thermostat = seam.Devices.Get(deviceId: "11111111-1111-1111-2222-444444444444");

    // Confirm that Seam supports the desired HVAC mode for the thermostat.
    // In this example, we're simulating having set the thermostat to heat mode.
    if (thermostat.CanHvacHeat == true) {
      // Perform the simulated HVAC mode adjustment.
      seam.Thermostats.Simulate.HvacModeAdjusted(
        deviceId: thermostat.DeviceId,
        hvacMode: "heat",
        heatingSetPointFahrenheit: 68
      );
    }
    ```

    **Output:**

    ```json theme={null}
    void
    ```
  </Tab>
</Tabs>

***

## Simulate Reaching a Desired Temperature

The `/thermostats/simulate/temperature_reached` endpoint enables you to simulate the thermostat reaching a specified temperature. This simulation is helpful for testing that your app is receiving [thermostat events](/api/events/object) correctly, such as `thermostat.temperature_changed` and `thermostat.temperature_reached_set_point`.

Specify the desired temperature that you want to simulate the thermostat reaching using either of the following parameters:

* `temperature_celsius`
* `temperature_fahrenheit`

To simulate reaching a desired temperature:

<Tabs>
  <Tab title="JavaScript">
    **Code:**

    ```javascript theme={null}
    // Get the device.
    const thermostat = await seam.devices.get({
      device_id: '11111111-1111-1111-2222-444444444444',
    })

    // Simulate reaching the specified temperature.
    await seam.thermostats.simulate.temperatureReached({
      device_id: thermostat.device_id,
      temperature_celsius: 25,
    })
    ```

    **Output:**

    ```json theme={null}
    void
    ```
  </Tab>

  <Tab title="cURL">
    **Code:**

    ```bash theme={null}
    # Get the device.
    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": "11111111-1111-1111-2222-444444444444"
      }')

    # Simulate reaching the specified temperature.
    curl -X 'POST' \
      'https://connect.getseam.com/thermostats/simulate/temperature_reached' \
      -H 'accept: application/json' \
      -H "Authorization: Bearer ${SEAM_API_KEY}" \
      -H 'Content-Type: application/json' \
      -d "{
        \"device_id\": \"$(jq -r '.device.device_id' <<< ${thermostat})\",
        \"temperature_celsius\": 25
    }"
    ```

    **Output:**

    ```json theme={null}
    {
      "ok": true
    }
    ```
  </Tab>

  <Tab title="Python">
    **Code:**

    ```python theme={null}
    # Get the device.
    thermostat = seam.devices.get(
      device_id="11111111-1111-1111-2222-444444444444"
    )

    # Simulate reaching the specified temperature.
    seam.thermostats.simulate.temperature_reached(
      device_id = thermostat.device_id,
      temperature_celsius = 25
    )
    ```

    **Output:**

    ```
    None
    ```
  </Tab>

  <Tab title="Ruby">
    <Info>Coming soon!</Info>

    **Code:**

    ```ruby theme={null}
    # Get the device.
    thermostat = client.devices.get(device_id: "11111111-1111-1111-2222-444444444444")

    # Simulate reaching the specified temperature.
    client.thermostats.simulate.temperature_reached(
      device_id: thermostat.device_id,
      temperature_celsius: 25
    )
    ```

    **Output:**

    ```
    nil
    ```
  </Tab>

  <Tab title="PHP">
    **Code:**

    ```php theme={null}
    // Get the device.
    $thermostat = $seam->devices->get(device_id: "11111111-1111-1111-2222-444444444444");

    // Simulate reaching the specified temperature.
    $seam->thermostats->simulate->temperature_reached(
      device_id: $thermostat->device_id,
      temperature_celsius: 25
    );
    ```

    **Output:**

    ```json theme={null}
    void
    ```
  </Tab>

  <Tab title="C#">
    <Info>Coming soon!</Info>

    **Code:**

    ```csharp theme={null}
    // Get the device.
    Device thermostat = seam.Devices.Get(deviceId: "11111111-1111-1111-2222-444444444444");

    // Simulate reaching the specified temperature.
    seam.Thermostats.Simulate.TemperatureReached(
      deviceId: thermostat.DeviceId,
      temperatureCelsius: 25
    );
    ```

    **Output:**

    ```json theme={null}
    void
    ```
  </Tab>
</Tabs>
