결과적으로 실패했지만 엣지드라이버 개발에 있어 중요한 점을 알게되어 후기 남김
기획 : 스팀 API를 스싱으로 가져오는 랜엣지 드라이버 만들기
- SteamWeb API를 사용한다
- API에서 HTTP 호출을 스마트싱스로 쏘는 LAN Edge Driver를 만든다
- custom capability를 만든다
- 엣지드라이버로 만든 가상 재실센서에 Http 요청으로 받는 데이터를 capability 밸류에 반영한다.
준비물 :
- SmartThings CLI -> 반드시 필요함
- 스마트싱스 토큰 https://gall.dcinside.com/m/smartthings/967
- 코딩프로그램 (비주얼스튜디오코드씀. 메모장이나 노트패드++같은것도 가능)
진행과정
1. 파일 트리구조를 만든다
여기가 파일
│ config.yml <- 엣지드라이버 깔때 설명나오는 부분
│ README.md <- 어떻게 까는지 알려주는 마크다운 문서
│ smartthings <- 이건 자동 생성됨
│
├─capabilities <- custom capability 만들때 필요한 폴더
│ steamPresence.yaml <- steamPresence라는 custom capability를 정의하는 문서
│
├─profiles <- 가상 재실센서 만들때 필요한 폴더
│ steam-presence.yaml <-steam-presence라는 가상 디바이스의 device profile을 정의하는 문서
│
└─src <- 나머지 파일들
capability_handlers.lua <- init.lua 파일의 일부인데 디바이스 타입의 구성을 다루는 로직만 따로 빼논 파일
init.lua <- 이새끼가 본체임. 처음 이니셜라이즈 이새끼로 다함. 이새끼가 엣지드라이버에 있는 파일 다 한번씩 불름
server.lua <- 실제 스팀 클라이언트에서 콜을 하는 펑션이랑 http 요청을 json 포맷으로 받아주는 로직이 여기 있음
새롭게 알게된 것
1.custom capability에 쓰이는 네임스페이스라는 개념은 그냥 스마트싱스에서 랜덤으로 할당을 해주고 개인이 변경이 불가능함.
네임스페이스가 뭐냐면 드라이버에서 고유한 식별할수있는 문자열로 된 키인데
열심히 만들고나서 딱 커스텀 capability를 올리니까 무슨 이상한 글자로 바뀌어있길래 버그인줄 알았음
알고보니 스마트싱스에서 아무렇게나 만들어주는데 이 만들어주는게 계속 고정되는것
그런데 스마트싱스 개발자 사이트에 생성된다고 나와있긴 했었음. 뭐냐 나 병신이었노
https://developer.smartthings.com/docs/devices/capabilities/custom-capabilities
네임스페이스는 개발자의 기능 또는 기본 설정을 그룹화하는 데 사용되는 식별자입니다. 사용자 지정 기능 또는 장치 기본 설정을 만들면 네임스페이스 아래에 생성됩니다. 개발자 계정에 대한 첫 번째 사용자 지정 기능 또는 기본 설정을 만들면 고유한 네임스페이스가 생성됩니다. 계정당 네임스페이스는 하나만 생성됩니다. 네임스페이스는 다음과 같습니다 perfectlife6617.
사용자 지정 기능은 표준 기능과 유사하며 속성과 명령을 포함합니다. 기능은 를 참조하여 액세스합니다 namespace.capabilityName. 이 조합을 라고 합니다 capabilityId. 기능 ID의 예는 다음과 같습니다 perfectlife6617.customGarageDoor.
나 핑프였노ㅋㅋㅋㅋ
2. 토큰 만들때 동의해야 하는 게 많음
채널 만들 때 쓰는 명령어로
smartthings edge:channels:invites 뒤에 채널 ID
가 있음. 존나 해도 안되길래 뭔가 했는데
AxiosError: Request failed with status code 403: "The supplied authentication is not authorized to access this
resource"
Code: ERR_BAD_REQUEST
이 오류 존나 뜨길래 뭐지 해서 봤더니 토큰에 체크가 안돼있다고 하더라
이것들이 원인이었음
동의했더니 잘됨
3.SmartThings의 custom capability는 schema 안에 반드시 additionalProperties: false를 써야함.
커스텀 capability 등록하려고 smartthings capabilities:create -i capabilities/steamPresence.yaml 이거 존나 쳤는데 계속 오류 나는거임
AxiosError: Request failed with status code 422:
생략생략생략생략"details":[{"code":"UnprocessableEntityError","target":"Steam
Presence.attributes.presence.schema","message":"Steam Presence.attributes.presence.schema.additionalProperties: is
missing but it is required","details":[]}]}}
Code: ERR_BAD_REQUEST
왜그런지 찾아보니 이건 JSON Schema의 요구사항인데, 스마트싱스에서도 반드시 쓰도록 하고 있음.
그래서
이걸 추가해서 썻더니 잘되.ㅁ ㅋㅋㅋㅋㅋㅋㅋ
4. 스팀에는 여러 상태가 있음.
스팀 API 찾아보고 확인한 스팀의 모든 로그인 상태는 다음과 같음
offline - online - busy - away - snooze - looking_to_trade - looking_to_play
그리고 이것을 인트타입으로 정리하고 있어서 엣지드라이버 안에서 반복문으로 확인한 다음에 걸린 수에 맞춰서 enum 문자열을 순서대로 추가해줘야함.,
https://partner.steamgames.com/doc/webapi/ISteamUser
스팀에 공식 문서가 있으니까 참고 ㄱㄱ
엑윽 채널까지 허브에 잘 추가했는데 정작 시발 허브에 안뜬다
smartthings edge:channels
이거 하고 내 허브까지 잘 선택함 그런데
smartthings edge:drivers:install
뜰때 내 채널이 온데간데없음 ㅋㅋ 그래서 포기
애초에 엣지드라이버는 외부네트워크로 못나감 sasm 이용해라