맞춤 기능(Custom Capability)

기기의 기능(Capability)을 SmartThings에서 쓸 수 있게 하는 SmartThings의 만들어진 기능(Capabilities)을 찾지 못하셨나요? 맞춤 기능(Custom Capabilities)을 쓰면 고유한 기능을 만들 수 있습니다. 맞춤 기능(Custom Capabilities)은 네임스페이스와 이를 고유하게 알아볼 수 있는 기능(Capability) 이름으로 이루어져 있습니다.

## 기능의 네임스페이스(Namespaces)

표준 기능과 유사한 맞춤 기능(Custom Capabilities)에는 속성(Attributes)과 명령(Commands)이 들어가 있습니다. 기능(Capability)은 `namespace.capabilityName`을 참조하여 액세스합니다. 이 조합을 `capabilityId`라고 합니다. `capabilityId`의 예는 `angryofmyhomeminister6617.customGarageDoor`(내무부장관의분노6617.맞춤형차고문)이 될 수도 있습니다.

## 당신의 맞춤 기능(Custom Capability)을 만드세요

맞춤 기능(Custom Capabilities)을 만들 때 기능(Capability)이 가질 수 있는 속성(Attributes)과 할 수 있는 명령(Commands)을 생각하세요.

아래의 예는 문의 상태를 아는 것과 손 안대고 여닫기를 할 수 있는 맞춤형 차고 문(`Custom Garage Door`)기능입니다.

```
{
  "name": "Custom Garage Door",
  "attributes": {
    "door": {
      "schema": {
        "type": "object",
        "properties": {
          "value": {
            "type": "string",
            "enum": [
              "open",
              "opening",
              "closed",
              "closing",
              "partial"
            ]
          }
        },
        "additionalProperties": false,
        "required": [
          "value"
        ]
      },
      "setter": "setDoor",
      "enumCommands": []
    }
  },
  "commands": {
    "setDoor": {
      "name": "setDoor",
      "arguments": [
        {
          "name": "door",
          "optional": false,
          "schema": {
            "type": "string",
            "enum": [
              "open",
              "closed"
            ]
          }
        }
      ]
    }
  }
}
```

이 기능은 속성(Attributes) (이 케이스에서는 `door`가 속성(Attributes)입니다)을 정의하는 일반적인 패턴과 해당 속성(Attributes)을 바꾸는 "setter" 명령(Commands)을 따릅니다. 명령(Commands) 인수에는 속성(Attributes)과 다른 제약 조건(constraints)이 있습니다. 왜냐하면, 기기가 문을 열고 닫는 명령(Commands)만 받아들이고 문이 열리고 닫힐 때 여러 다른 상태에 있을 수 있기 때문입니다. 이 정의를 쓰면 API는 `setDoor` 명령(Commands)에 대해 `open` 인수와 `closed` 인수만 받아들이지만 문이 움직일 때의 기기(문)의 모든 상태에 있는 서로 다른 속성(Attributes) 값을 모두 받아들일 것입니다.

setter 대신 또는 setter에다가 별도의 `open` 및 `close`명령(Commands)을 정의하도록 할 수는 있지만, 이런 방식은 쓸 수 있는 속성(Attributes) 값이 많을 때만 잘 작동합니다.

SmartThings CLI를 써서 맞춤 기능(Custom Capabilities)을 만드세요. 여기서 `capability.json`이 있는 곳은 상위 파일입니다.

```
smartthings capabilities:create -i capability.json
```

입력 파일을 쓰지 않고도 아래와 같이 채팅으로 기능(Capability)을 만들 수도 있습니다.

```
smartthings capabilities:create
```

## 당신의 맞춤 기능(Custom Capability)을 쓰세요

맞춤 기능(Custom Capabilities)은 표준 기능이 쓰이는 것과 같은 방식으로 쓰이며 기기의 프로필을 통해 기기에 각각 할당됩니다. 기기의 프로필에서 맞춤 기능(Custom Capabilities)을 쓰는 데에 있어야 하는 특별한 권한은 없습니다. `capabilityId` 나 버전을 아는 사람은 누구나 기능(Capability)에 대한 자세한 정보를 볼 수 있는 보기 권한이 있습니다. 그러나 네임스페이스 소유자만 해당 네임스페이스에서 기능(Capability)을 만들거나 고칠 수 있습니다.

예를 들어 다음은 몇 가지 표준 기능(Capability)과 함께 맞춤형 차고 문 기능(Capability)을 쓰는 기기의 프로필입니다.

```
{
  "name": "Custom Garage Door",
  "components": [
    {
      "id": "main",
      "capabilities": [
        {
          "id": "angryofmyhomeminister6617.customGarageDoor",
          "version": 1
        },
        {
          "id": "refresh",
          "version": 1
        },
        {
          "id": "healthCheck",
          "version": 1
        }
      ],
      "categories": []
    }
  ],
  "metadata": {
    "ocfDeviceType": "oic.d.garagedoor"
  }
}
```

다음은 기능 보여짐(Capability Presentations)을 써서 SmartThings의 모바일 앱에서 기능(Capability)이 보여지는 방법을 살펴보겠습니다.