기능(Capability)

기능(Capability)은 SmartThings의 짜임새의 핵심입니다. 물리적인 기기를 SmartThings의 기본 기능의 생김새로 추상화하여 기기의 구성요소의 상태를 알아보거나 기기의 기능을 켜고 끌 수 있습니다. 그런 다음 기능은 기기의 모든 기능을 캡슐화(Encapsulation)하는 기기의 프로필에 통합됩니다(**여기**에서 기기의 프로필에 대해 자세히 알아보세요).

기능(Capability)은 속성(Attributes)과 명령(Commands)으로 만들어집니다. 속성(Attributes)이 기기의 정보 또는 속성 상태를 나타내는 것 과는 다르게, 명령(Commands)은 기기의 기능을 켜고 끌 수 있게 합니다. 일반적으로 명령(Commands)은 속성(Attributes)을 움직이는 데 쓰입니다. 이로 인해 정해져 있던 속성(Attribute)은 바뀌게 됩니다. 모든 속성(Attribute)에 대한 명령(Commands)이 있는 것은 아닙니다. 모니터링에만 쓰이는 기능(Capability)에는 명령(Commands)이 있지 않습니다. 예를 들어 온습도계는 명령(Commands) 없이 기기의 온도와 습도를 모니터링하는 속성(Attributes)만 가질 수 있습니다.

## 데이터 타입

다음 표에는 명령(Commands)과 속성(Attribute)과 다른 데이터 타입의 리스트가 있습니다.

 integer
 number
 boolean
 object
 array

## 큰 개념

기능(Capability)의 정의에는 몇 가지 큰 개념이 있습니다. 이들은 아래에 정의되어 있습니다.

## 속성(Attributes)

속성(Attributes)은 기능(Capability)의 상태의 타입이 어떤게 있는 지를 알려주고 그 상태를 저장하는 데에 쓰입니다. 속성(Attributes)에는 타입이 있고 단위와 하나 이상의 제약 조건(Constraints)이 있을 수 있습니다. 다음 예에서 조명은 따뜻한 색에서 차가운 색까지의 색온도 범위를 쓸 수 있습니다. 색온도 속성(Attributes)을 정의하는 스키마는 JSON schema 버전 4입니다.

```
"attributes": {
    "colorTemperature": {
        "schema": {
            "type": "object",
            "properties": {
                "value": {
                    "type": "integer",
                    "minimum": 2600,
                    "maximum": 9000
                },
                "unit": {
                    "type": "string",
                    "enum": [
                        "K"
                    ],
                    "default": "K"
                }
            },
            "additionalProperties": false
        },
        "required": [
            "value"
        ]
    }
}
```

## 명령(Commands)

명령(Commands)은 기능(Capability)의 기능과 기기가 할 수 있는 것을 설명합니다. 명령(Commands)에는 0개 이상의 인수가 있을 수 있습니다. 명령(Commands) 인수에는 타입이 있으며 속성(Attributes)과 마찬가지로 제약 조건이 있을 수 있습니다. 인수는 기본 값이지만 옵션으로도 넣을 수 있습니다. 아래 예에서 조명은 얼마나 따뜻한지 또는 시원한 지를 나타내는 값으로 설정할 수 있습니다.

이 케이스는 `setColorTemperature` 명령(Commands)을 써서 색 온도를 쓰게 되면 기능의 `colorTemperature` 속성(Attributes) 값이 판올림됩니다.

```
"commands": {
    "setColorTemperature": {
        "arguments": [
            {
                "name": "temperature",
                "optional": false,
                "schema": {
                    "type": "integer",
                    "minimum": 2600,
                    "maximum": 9000
                }
            }
        ]
    }
}
```

## 속성(Attributes)과 명령(Commands)의 제약 조건(Constraints)

속성(Attributes)과 명령(Commands)의 인수에는 가능한 값에 대한 제약 조건(Constraints)이 있을 수 있습니다. SmartThings 플랫폼과 API는 이러한 제약 조건(Constraints)을 벗어나는 값의 이벤트의 만들기나 움직임을 미리 막습니다. 쓸 수 있는 제약 조건(Constraints) 의 타입은 속성(Attributes)의 타입에 따라 다릅니다. 배열(array)와 개체(object)의 유형의 요소에도 제약 조건(Constraints)이 있을 수 있습니다.

### 문자열(String)의 제약 조건(Constraints)

문자열(Strings)은 maxLength, *pattern,* *enum* 제약 조건(Constraints)으로 제약될 수 있습니다.

#### maxLength

문자열(string)이 지정된 길이보다 길지 않도록 제한할 수 있습니다. 이 경우 `title` 속성(Attributes)은 255자 이하로 제한됩니다.

```
"title": {
    "schema": {
        "type": "object",
        "properties": {
            "value": {
                "type": "string",
                "maxLength": 255
            }
```

#### pattern

정규식과 일치하도록 문자열(Strings)을 제한할 수 있습니다. 이는 URL 및 ISO 8601 시간/날짜 문자열에 특히 유용할 수 있습니다. 아래의 예에는 ISO 8601 문자열(Strings)이어야 하는 `startTime` 속성(Attributes)이 있습니다.

```
"startTime": {
    "schema": {
        "type": "object",
        "properties": {
            "value": {
                "type": "string",
            }
```

#### enum

enum 값은 속성을 문자열(String)로 입력하고 허용될 수 있는 값의 리스트를 제공하여 정의할 수 있습니다. 이 경우 "locked", "unlocked" 및 "jammed" 값을 가진 `lock` 속성(Attributes)이 있습니다.

```
"lock": {
    "schema": {
        "type": "object",
        "properties": {
            "value": {
                "type": "string",
                "enum": {
                    "locked",
                    "unlocked",
                    "jammed"
                }
```

### 정수와 숫자(Number)의 제약 조건(Constraints)

정수 및 숫자 값은 *minimum*, *maximum* 또는 둘 다 제한을 넣을 수 있습니다. 이 경우 0~15V로 제한되는 `batteryVoltage` 속성(Attributes)이 있습니다.

```
"batteryVoltage": {
    "schema": {
        "type": "object",
        "properties": {
            "value": {
                "type": "number",
                "minimum": 0,
                "maximum": 15
            }
```

## 기본이 아닌 타입들

기본 *문자열, 정수, 숫자, 부울린* 타입 외에도 속성(Attributes) 값은 다른 타입으로 이루어진 데이터의 짜임새로 정의할 수 있습니다. *개체(object) 및 배열(array)* 유형이 모두 지원됩니다.

### 개체(Object)의 타입

속성(Attributes)은 anonymous나 타입이 있는 개체(Object)로 정의할 수 있습니다. 가장 간단한 개체(Object)의 타입은 anonymous이며 어떤 값으로든 설정할 수 있습니다.

```
"audioStream": {
  "schema": {
    "type": "object",
    "properties": {
      "value": {
        "title": "Stream Descriptor",
        "type": "object"
      }
    },
```

개체(object)에 유효한 속성(properties)을 적을 수도 있습니다. 개체(object)의 각 속성(properties)에는 고유한 타입과 제약 조건(Constraints)이 있을 수 있습니다.

```
"energyEvent": {
  "schema": {
    "type": "object",
    "properties": {
      "value": {
        "title": "Energy Event",
        "type": "object",
        "properties": {
          "type": {
            "title": "Event Type",
            "type": "string",
            "enum": [
              "moderate",
              "aggressive"
            ]
          },
          "level": {
            "title": "Event Level",
            "type": "integer",
            "minimum": -1,
            "maximum": 3
          },
          "start": {
            "title": "Event Start Time",
            "type": "string",
          },
          "duration": {
            "title": "Event Duration",
            "type": "integer",
            "minimum": 0
          },
```

### 배열(Array) 타입

배열 속성(Array Attributes)은 하나의 타입으로만 쓸 수 있는 값들의 리스트입니다. 다음은 값이 쓰여진 문자열(strings)인 배열 속성(Array Attributes)의 예입니다.

```
"supportedThermostatFanModes": {
  "schema": {
    "type": "object",
    "properties": {
      "value": {
        "type": "array",
        "items": {
          "title": "ThermostatFanMode",
          "type": "string",
          "enum": [
            "auto",
            "circulate",
            "followschedule",
            "on"
          ]
        }
      }
    }
```

## 만들어진 기능(Capability)

**여기**에서 SmartThings 개발 팀이 유지 관리하는 표준 기능(Capability) 리스트를 찾을 수 있습니다. 기기를 개발할 때 이러한 기능(Capability)과 정보를 나누거나(예: SmartThing의 자동화) 기기에 이러한 기능(Capability)을 넣을 수 있습니다.