기기 보여짐(Device Presentations)과 기기 구성

## 기기 보여짐(Device Presentations)

기기 보여짐(Device Presentations)으로 기기의 기능 보여짐(Capability Presentation)이 SmartThings 앱에서 그룹핑 되어 보여지는 방법을 뜻합니다.

기기 보여짐(Device Presentations)은 유저가 설정한 기기 구성(아래에서 알려드리겠습니다)을 베이스로 SmartThings 플랫폼에 의해 손 안대고도 만들어집니다. 기기 구성이 설정되지 않을 때는 가능 보여짐(Capability Presentation)을 써서 기기가 보여지는 방식을 고릅니다.

기기 보여짐(Device Presentations)은 SmartThings 앱의 세 가지 기본 보기 타입들에서 기기가 보여지는 방식을 정의하고 기능 보여짐(Capability Presentation) 문서에 쓰여진 규칙대로 쓰여집니다.

* **대시보드 보기**
* **디테일 보기(detailView)**
* **자동화 보기**

## 기기 구성

기기 구성에는 기기가 보여지기 위해 개발자가 만든 옵션들이 있습니다. 기기 구성은 기능 보여짐(Capability Presentation)에서 만들어져 있는 기본 보기와 그것이 어떻게 움직이는지를 다시 고칠 수 있습니다.

다음의 요소들은 아래의 코드에 쓰여진 것 처럼 기기 구성에 쓰일 수 있습니다. 모든 요소들을 꼭 써야하지는 않습니다. 기기 구성에 요소가 쓰여지지 않게 된다면, 기능 보여짐(Capability Presentation)에서 미리 쓰여졌던 것들이 대신 쓰이게 됩니다.

* **States** - 기능 보여짐(Capability Presentation)에 있는 상태 문자열(strings)의 값을 다시 쓸 수 있습니다. 이 과정에서 기기를 불러오는 것에 대한 문자열(String)을 따로 가질 수 있습니다.
* **Actions** - 기능 보여짐(Capability Presentation)에 지정된 액션(Actions) 값을 다시 쓸 수 있습니다.
* **Conditions** - 기능 보여짐(Capability Presentation)에 지정된 조건(Conditions) 값을 다시 쓸 수 있습니다.

아래의 예는 대시보드 보기에서 커스텀 디머 스위치(조광기)의 기기 구성에 대해 보여주고 있습니다.

```
"dashboard": {
    "states": [
        {
            "component": "main",
            "capability": "switch",
            "values": [
                {
                    "key": "switch",
                    "enabledValues": [
                        "on"
                    ]
                }
            ]
        },
        {
            "component": "main",
            "capability": "switchLevel",
            "values": [
                {
                    "key": "level",
                    "range": [
                        10,
                        80
                    ],
                    "step": 1
                }
            ]
        },
        {
            "component": "comp1",
            "capability": "switch"
        }

    ],
    "actions": [
        {
            "component": "main",
            "capability": "switchLevel",
            "values": [
                {
                    "key": "level",
                    "range": [
                        10,
                        80
                    ],
                    "step": 1
                }
            ]
        },
        {
            "component": "main",
            "capability": "switch",
            "values": [
                {
                    "key": "switch",
                    "enabledValues": [
                        "on"
                    ]
                }
            ]
        },
        {
            "component": "comp1",
            "capability": "switch"
        }
    ]
}
```

같은 커스텀 디머 스위치(조광기)에 대해 아래에서 디테일 보기(detailView)의 움직임을 만듭니다. 기능(Capabilities)이 세 가지 보기에서 모두에서 같은 방식으로 보여지도록 하기 위해 저번과 같은 값을 다시 쓰겠습니다.

```
"detailView": [
    {
        "component": "main",
        "capability": "switch",
        "values": [
            {
                "key": "switch",
                "enabledValues": [
                    "on"
                ]
            }
        ]
    },
    {
        "component": "main",
        "capability": "switchLevel",
        "values": [
            {
                "key": "level",
                "range": [
                    10,
                    80
                ],
                "step": 1
            }
        ]
    },
    {
        "component": "comp1",
        "capability": "switch"
    }
]
```

아래 예에서 보여지는 같은 기기의 자동화 보기는 대시보드 보기와 디테일 보기(detailView)와 비슷합니다. `conditions` 은 이 보기서 새로운 필드로 넣어지는데, 이 필드는 위에서 자세히 알아 본 `states` 와 `actions` 의 짜임새와 비슷하게 짜여집니다.`visibleCondition` 은 값이 `off` 로 되어 있는 때에만 스위치가 보여지도록 하는 데에 쓰입니다. 그러므로, 자동화의 조건(Aondition)을 짤 때 `visibleCondition` 에 쓰여진 states를 바탕으로 이 기능(Capability)이 자동화의 조건(Conditions) 또는 액션(Actions)에 보여지는지 그렇지 않는지에 대해 고를 수 있습니다.

아래 예에서는 `enabledValues`에 `on` 과 `off` 값을 모두 갖고 있습니다. switch 기능(Capability)에서 쓸 수 있는 값은 두 개였으므로, 굳이 넣을 필요는 없지만, 필드를 쓰는 방법을 알아보려고 일부러 넣었습니다.

```
"automation": {
    "conditions": [
        {
            "component": "main",
            "capability": "switch",
            "values": [
                {
                    "key": "switch",
                    "enabledValues": [
                        "on",
                        "off"
                    ]
                }
            ]
        },
        {
            "component": "main",
            "capability": "switchLevel",
            "values": [
                {
                    "key": "level",
                    "range": [
                        10,
                        80
                    ],
                    "step": 1
                }
            ]
        }

    ],
    "actions": [
        {
            "component": "main",
            "capability": "switchLevel",
            "values": [
                {
                    "key": "level",
                    "range": [
                        10,
                        80
                    ],
                    "step": 1
                }
            ]
        },
        {
            "component": "main",
            "capability": "switch",
            "values": [
                {
                    "key": "switch",
                    "enabledValues": [
                        "on",
                        "off"
                    ]
                }
            ],
            "visibleCondition": {
                "capability": "switch",
                "component": "main",
                "attribute": "switch",
                "operator": "EQUALS",
                "operand": "off"
            }
        }
    ]
}
```