Edge Driver 제작 강좌 #1 - 스마트싱스 작동 원리 이해하기

tutorial01.png

0. 사용자가 마음대로 써보는 SmartThings 개발자 문서

SmartThings 엣지드라이버를 만들면서 비개발자인 제가 가장 어려운 부분이

개발자 문서를 이해하는 것이었습니다.

 

비개발자인 제가 이해하기에 너무 불친절하게 써져있었고,

하나의 문서를 이해하기 위해서 여러 개의 문서를 참조해서 봐야하는 구조가 어려웠습니다.

 

(개발자들에게는 이미 알고 있는 지식을 생략하는 것이 더 간략하여 이해하기 편할지 모르겠네요.)

 

이런 개발자 문서를 이해하지 못하면 커뮤니티를 통해 공부해야하지만.. 

 

원하는 정보를 찾는게 사막에서 바늘 찾는 기분이었습니다.

아는게 없으니, 찾는 것도 쉽지 않았다는게 더 정확한 표현일지도 모르겠습니다.

 

그리고 .. 관련된 개발자도 많지 않았습니다.

많은 능력있는 분들이 DTH방식에서 엣지드라이버 방식으로 바뀌면서 다른 플랫폼으로 떠났다고 들었습니다..

 

즉, SmartThings는 개방형 플랫폼이지만

그 개방형 플랫폼을 풍성하게 해줄 유저들이 많이 없다는 생각이 들었습니다.

 

이 글이 100% 정답이 아니고, 얼마나 많은 분들이 이 글을 읽으실지 모르지만..

그동안 제가 삽질을 해온 정보들을 제 기준에서 가장 이해하기 쉽게 기록으로 남겨두고자 합니다.

 

누군가에게는 필요한 정보가 돼서, 삽질을 조금만 하시길 바라며

스마트싱스 엣지드라이버 제작 강좌를 작성합니다.

 

언제 이 게시글의 연재가 중단될지, 업로드 주기가 얼마나 될지는 모르겠습니다.

시간나는대로 조금씩 적겠습니다.

 

1. SmartThings 엣지드라이버는 어떻게 작동할까?

SmartThings 엣지드라이버의 작동이 어떻게 되는지,

실제로 엣지드라이버 파일 구조가 어떻게 만들어져있는지 이해가 되어야

쉽게 엣지드라이버를 만드실 수 있습니다.

 

가장 먼저 엣지드라이버를 통해 어떻게 장치가 연결되는지 이해해야할겁니다.

 

이 부분부터 차근 차근 이해해보도록 하겠습니다.

 

2. 스마트싱스 장치 작동 구조

스마트싱스 장치들이 어떻게 작동하고 있는지 알아보겠습니다.

이러한 작동 방식을 이해하여야, 앞으로 만들 파일 구조도 더 잘 이해가 되실겁니다.

 

1) Fingerprint 핑거프린트, 지문

영어 그대로 해석하면 "지문"입니다.

 

스마트싱스에 장치를 연결하려면 가장 먼저 필요한 정보가 무엇일까요?

 

아마도, 그 장치가 도대체 어떤 장치인지 식별해야할겁니다.

 

그래서.. 사람마다 지문이 모두 다른 것처럼 iot장치들도 고유의 fingerprint를 부여했습니다.

 

etc-image-1

 

https://my.smartthings.com/advanced/devices (이하 스마트싱스 advanced 웹)을 접속하시면,

Model과 Manufacture 을 확인 하실 수 있는데,

 

이 2개의 정보가 장치 고유 지문인 fingerprint라고 할 수 있습니다.

 

하나는 모델이고, 하나는 제조사인 이 2개 정보를 핑거프린트로 하였기 때문에..

아마도 다른 장치인데 같은 핑거프린트일 가능성은 매우 낮지 않을까 싶습니다.

 

2) Capability 

영어를 그대로 해석해보면 "능력"입니다.

 

이제 장치가 어떤 장치인지 식별을 했으니... 어떤 기능이 있는지도 알아야할 것입니다.

 

예를 들어, 알리익스프레스에서 구매한 전구와 시하스 스위치가 있다고 가정해봅시다.

 

이 2개의 장치는 모두 불을 켜고 끄는 동일한 기능을 합니다.

 

이때 2개 장치에서 공통적으로 필요한 "불을 켜고 끄는 기능"

이것이 capability 입니다.

 

이러한 끄고, 켜는 장치에 사용되는 가장 기본적인 capability로 switch가 사용되고 있습니다.

 

여러 IoT 장치들이 작동하는데 필요한 기능을 하나씩 정의한 것이 capability라고 보시면 됩니다.

 

이렇게 한번 정의해두게 되면 다른 비슷한 IoT장치에서도 해당 capability를 활용하여,

좀 더 손쉽게 엣지드라이버를 개발할 수 있게 됩니다.

 

공식적으로 사용되는 capability 는 아래 링크에서 확인할 수 있습니다.

https://developer.smartthings.com/docs/devices/capabilities/capabilities-reference

 

Production Capabilities | Developer Documentation | SmartThings

Here you can find the list of standard production Capabilities maintained by SmartThings. Live Capabilities are available for you to use today.

developer.smartthings.com

 

즉 capability는 원하는 기능을 수행하기 위해 만들어진 것입니다.

따라서, capability는 기능을 수행하는데 필요한 정보도 기억해야합니다.

 

예를 들어 시하스 스위치의 불을 켜고 끄기 위해

switch라는 Capability를 만들었다면 필요한 것이 무엇일까요?

 

이 스위치가 켜져있는지, 꺼져있는지 확인이 필요하겠죠?

 

이런 스위치의 상태를 Capability에 기억하게 되고, 

이를 capability의 속성 값인 attributes 라는 곳에 저장하게 됩니다.

 

etc-image-2

스마트싱스 advanced 웹에서 실제 장치 세부사항을 들어가보시면 위와 같은 페이지를 확인 하실 수 있을 겁니다.

 

이 내용을 해석해보면,

switch라는 Capability에 switch라는 Attribute가 있고,

switch라는 Attribute의 상태값 (Value)는 On인 상태가 됩니다.

 

즉 스위치가 켜져있는 상태를 Attribute가 기록하고 있는 것이고,

이것이 저희가 나중에 앱을 통해 확인하면, 스위치가 켜져있다! 라고 알려줄 수 있게 해주는겁니다.

 

 

이 attributes에 대해서는 차후에 capabilites 를 만드는 과정에서 더 자세히 다룰 것이므로,

본 글에서는 여기까지만 설명하도록 하겠습니다.

 

3) Device Profiles 장치 프로파일

 

이제 Capability를 이해하였으면, 이 Capability를 활용해서 장치를 구성해야합니다.

 

앞의 예시처럼 시하스 스위치의 경우에는 switch라는 1개의 Capability만 있어도 잘 작동할겁니다.

그러나, 만약 밝기 조절이 가능한 전구라면 어떨까요?

 

켜고 끄는 것 외에 어떤 능력이 더 필요할지를 생각해보면..

밝기를 조절할 수 있는 능력이 필요할 겁니다.

 

밝기를 조절할 수 있는 능력, 밝기 Capability에는 어떤 값을 또 기록해야할까요?

아마도 밝기를 기억하는 값을 저장해두어야할 겁니다.

 

SmartThings에서는 이러한 밝기를 조절하고, 밝기를 저장해두기 위해

switchLevel이라는 Capability를 만들었습니다.

 

앞의 시하스 스위치와 마찬가지로 실제 장치가 등록된 상태를 확인해보겠습니다.

 

etc-image-3

이 장치의 경우, 

Switch가 off 되어있는 것을 통해 꺼져있다는 것을 알 수 있을겁니다.

 

또 하나 안보이던 Capability가 있을겁니다.

switchLevel 을 보시면, level이라는 attribute를 가지고 있고,

현재 값은 9%입니다.

 

즉.. 장치는 꺼져있지만 9%라는 밝기를 기억하고 있는 것이고,

다음에 켜질 때는 9% 밝기로 켜질 것입니다.

 

 

 

다시 말해..

밝기 조절을 하는 전구를 정상적으로 작동시키기 위해 필요한 capability로 switch, switchLevel가 필요합니다.

 

이렇듯 하나의 장치에는 여러개의 capability가 모여서 작동하게 됩니다.

 

즉 이런 capability들이 모여서 하나의 장치를 구성하게 해주어야하는데,

어떤 capability들이 모여야 하는지 알려주는 구성 파일이 profiles라고 생각하시면 됩니다.

 

etc-image-4

 

이런 장치의 profile도 스마트싱스 advanced 웹에서 확인을 할 수 있습니다.

 

 

4) Commands

앞에서 Capability로 기능을 정의하고,

그 capability 안의 attribute에 상태를 기록할 수 있었습니다.

 

이제 남은 것은 저희가 직접 명령을 내렸을 때 불을 켜고, 끄는 명령을 수행해야합니다.

이러한 명령들을 정의한 것이 commands라고 생각하시면 됩니다.

 

etc-image-5

 

이 역시 SmartThings Advanced Web에서 확인하실 수 있습니다.

 

예시로 보여드린 이미지를 같이 이해해보겠습니다.

 

지금 보여드린 이미지의 장치는 switch capability에는 on, off 라는 명령을

switchLevel에는 setLevel 이라는 명령을 가지고 있습니다.

 

영어 그대로 해석해보면 switch는 끄고 켜는 명령,

switchLevel은 밝기를 설정하는 명령이라고 생각하면 되겠습니다.

5) 정리

앞에 말한 내용들을 토대로 이제 엣지드라이버를 만든다고 가정해보겠습니다.

 

우리는 밝기 조절이 가능한 전구의 엣지드라이버를 만들어야합니다.

 

그러기 위해,

우리는 "switch"와 "switchLevel"이라는 capability가 필요하고,

이 "switch"와 "switchLevel"을 사용할 수 있는 장치 구성인 profiles을 만들어야합니다.

 

이렇게 만들어진 엣지드라이버가 스마트싱스 허브에 올라가게 되면,

허브는

 

  어떤 장치인지 식별하고 (fingerprint)

  그 장치에 필요한 기능이 무엇인지 확인하고, (profiles)

  이 기능에 필요한 기능을 가져오고 (capability)

  실제로 장치를 작동할 수 있는 명령들도 가져올 것입니다. (commands)

 

 

다음 게시글은..

오늘 살펴본 capability, atrribute, command는 SmartThings 사용자가 직접 만들 수도 있고,

이미 잘 만들어진 capability를 활용하여 만들 수 있습니다.

 

이러한 부분들에 대해서 본 게시글 시리즈를 통해 차근 차근 알아갈 수 있도록 도와드리겠습니다.

 

다음에 작성한 게시글에서는 SmartThings 엣지드라이버의 기본 파일 구조에 대해 알아보겠습니다.

 

감사합니다.

 

* 본 게시글에 대한 궁금증은 댓글을 통해 문의 주시기 바랍니다 *