# Smart Home Garage Guide

`action.devices.types.GARAGE` - Garage doors can open, close, and detect an open state. They can also indicate if an object has obstructed the path of the door while closing or if the door is locked and therefore cannot be controlled.

This type indicates that the device gets the Garage icon and some related
synonyms and aliases.

## Device capabilities

Refer to the corresponding trait documentation for
implementation details, such as attributes and states that your service should support, and how to
build EXECUTE and QUERY responses.

### Required traits

These traits and commands are required, if applicable to your
device. If your device does not support these traits, enter the error code of
`functionNotSupported` in a QUERY or EXECUTE response. See
[Errors and exceptions](https://developers.home.google.com/cloud-to-cloud/intents/errors-exceptions) for more info.

- [`action.devices.traits.OpenClose`](https://developers.home.google.com/cloud-to-cloud/traits/openclose)

### Recommended traits

These traits are recommended, if applicable to your device.
However, you are free to mix and match from all available traits to best match your existing
product functionality.

- [`action.devices.traits.LockUnlock`](https://developers.home.google.com/cloud-to-cloud/traits/lockunlock)

> [!NOTE]
> **Note:** You must use [secondary user verification](https://developers.home.google.com/cloud-to-cloud/enhancements/secondary-user-verification) for security-sensitive actions as indicated in the traits description.

## Example device: Simple garage

This section contains example intent payloads representing a common "Garage"
based on the device type and traits above. If you add or remove traits in your implementation,
modify your responses accordingly to reflect those changes.

### Sample SYNC response

Request

```
{
  "requestId": "6894439706274654512",
  "inputs": [
    {
      "intent": "action.devices.SYNC"
    }
  ]
}
```
Response

```
{
  "requestId": "6894439706274654512",
  "payload": {
    "agentUserId": "user123",
    "devices": [
      {
        "id": "123",
        "type": "action.devices.types.GARAGE",
        "traits": [
          "action.devices.traits.OpenClose",
          "action.devices.traits.LockUnlock"
        ],
        "name": {
          "name": "Simple garage"
        },
        "willReportState": true,
        "deviceInfo": {
          "manufacturer": "smart-home-inc",
          "model": "hs1234",
          "hwVersion": "3.2",
          "swVersion": "11.4"
        }
      }
    ]
  }
}
```

### Sample QUERY response

Request

```
{
  "requestId": "6894439706274654514",
  "inputs": [
    {
      "intent": "action.devices.QUERY",
      "payload": {
        "devices": [
          {
            "id": "123"
          }
        ]
      }
    }
  ]
}
```
Response

```
{
  "requestId": "6894439706274654514",
  "payload": {
    "devices": {
      "123": {
        "status": "SUCCESS",
        "online": true,
        "openPercent": 50,
        "isLocked": false,
        "isJammed": false
      }
    }
  }
}
```

### Sample EXECUTE commands

#### OpenClose

For additional details on the command parameters,
see the [`action.devices.traits.OpenClose`](https://developers.home.google.com/cloud-to-cloud/traits/openclose#action.devices.commands.openclose) reference.

> [!NOTE]
> For commands which have a naturally longer process time, please use the `PENDING` status in the EXECUTE response and follow-up with the [ReportStateAndNotification API](https://developers.home.google.com/cloud-to-cloud/integration/notifications#send-notification) when the command has been completed.

Request

```
{
  "requestId": "6894439706274654518",
  "inputs": [
    {
      "intent": "action.devices.EXECUTE",
      "payload": {
        "commands": [
          {
            "devices": [
              {
                "id": "123"
              }
            ],
            "execution": [
              {
                "command": "action.devices.commands.OpenClose",
                "params": {
                  "openPercent": 100
                }
              }
            ]
          }
        ]
      }
    }
  ]
}
```
Response

```
{
  "requestId": "6894439706274654518",
  "payload": {
    "commands": [
      {
        "ids": [
          "123"
        ],
        "status": "PENDING",
        "states": {
          "online": true,
          "openPercent": 100
        }
      }
    ]
  }
}
```

#### OpenCloseRelative

For additional details on the command parameters,
see the [`action.devices.traits.OpenClose`](https://developers.home.google.com/cloud-to-cloud/traits/openclose#action.devices.commands.opencloserelative) reference.

> [!NOTE]
> For commands which have a naturally longer process time, please use the `PENDING` status in the EXECUTE response and follow-up with the [ReportStateAndNotification API](https://developers.home.google.com/cloud-to-cloud/integration/notifications#send-notification) when the command has been completed.

Request

```
{
  "requestId": "6894439706274654520",
  "inputs": [
    {
      "intent": "action.devices.EXECUTE",
      "payload": {
        "commands": [
          {
            "devices": [
              {
                "id": "123"
              }
            ],
            "execution": [
              {
                "command": "action.devices.commands.OpenCloseRelative",
                "params": {
                  "openRelativePercent": 10
                }
              }
            ]
          }
        ]
      }
    }
  ]
}
```
Response

```
{
  "requestId": "6894439706274654520",
  "payload": {
    "commands": [
      {
        "ids": [
          "123"
        ],
        "status": "PENDING",
        "states": {
          "online": true,
          "openPercent": 60
        }
      }
    ]
  }
}
```

#### LockUnlock

For additional details on the command parameters,
see the [`action.devices.traits.LockUnlock`](https://developers.home.google.com/cloud-to-cloud/traits/lockunlock#action.devices.commands.lockunlock) reference.

> [!NOTE]
> For commands which have a naturally longer process time, please use the `PENDING` status in the EXECUTE response and follow-up with the [ReportStateAndNotification API](https://developers.home.google.com/cloud-to-cloud/integration/notifications#send-notification) when the command has been completed.

Request

```
{
  "requestId": "6894439706274654516",
  "inputs": [
    {
      "intent": "action.devices.EXECUTE",
      "payload": {
        "commands": [
          {
            "devices": [
              {
                "id": "123"
              }
            ],
            "execution": [
              {
                "command": "action.devices.commands.LockUnlock",
                "params": {
                  "lock": true
                }
              }
            ]
          }
        ]
      }
    }
  ]
}
```
Response

```
{
  "requestId": "6894439706274654516",
  "payload": {
    "commands": [
      {
        "ids": [
          "123"
        ],
        "status": "PENDING",
        "states": {
          "online": true,
          "isLocked": true,
          "isJammed": false
        }
      }
    ]
  }
}
```

## Device ERRORS

See the full list of [errors and exceptions](https://developers.home.google.com/cloud-to-cloud/intents/errors-exceptions).

- `obstructionDetected` - The user tried to close the garage door but there was an object obstructing the door.
- `lockedState` - The user tried to control the garage door but it is in a locked state that does not allow it to move.