점점 더 많은 기기가 USB 전원으로 작동합니다. 이들 중 상당수는 인터넷 연결이나 홈 오토메이션 기능이 없는 "덤(dumb)" 기기들입니다(예: LED 조명). 이런 기기들을 어떻게 원격으로 자동화하거나 제어할 수 있을까요? 메인 스위치에 꽂힌 USB 어댑터를 쓰는 건 과한 데다, 4개 기기를 개별 제어하려면 더 복잡해집니다.
이 프로젝트는 USB 전원 기기의 전원 공급을 인터넷을 통해 제어하고, Tinamous SmartHome Skill for Alexa를 이용해 음성 제어를 가능하게 합니다.
배경
현재 USB 전원을 원격 제어하는 기기는 시장에 거의 없습니다. 프로젝트 시작 당시(영국 기준)엔 전혀 없었고, 최근 멀티탭 형태의 제품이 몇 가지 나왔지만 잘 알려진 홈 오토메이션 제조사가 아닌 무명 업체 제품들입니다(ZLD-34UK 등). 이런 제품들은 어떤 클라우드를 쓰는지, 데이터가 중국으로 가는지, 제조사가 사라지면 어떻게 되는지, 보안은 어떤지, 소프트웨어 사용성은 어떤지, 일주일 뒤 재활용함에 들어갈지 등 일반적인 IoT 기기의 우려가 따릅니다. 오픈소스 아두이노 기반 기기처럼 해킹(커스터마이징)하기도 어렵습니다.
활용 사례
USB 전원 조명
Kindle Fire / Chromecast 스틱 (특히 아이들 방 TV 시청 제한용)
USB 가습기
Echo Dot (밤에 알렉사 스스로 종료? 아니면 그냥 재부팅)
개발 보드. 무한 루프에 빠진 프로젝트 재부팅 필요할 때?
접근하기 어렵지만 가끔 재부팅 필요한 기기 (예: 다락방 센서)
클라이언트 현장에 설치된 기기 – 전류 소비량과 입력 전압 측정으로 전원 상태 확인
단순 전원 제어: 알렉사 음성 제어나 Tinamous 명령을 통한 인터넷 기반 전원 켜기/끄기.
스마트 전원 제어: 많은 USB 램프가 터치 컨트롤로 켜지는 방식이라 원격으로 켤 순 없지만, 끌 순 있습니다. 잘 때 램프 켜둔 것 끄기, 외출 시 모든 조명 끄기 등에 유용합니다. 하지만 알렉사로 끄고 나면 다시 켜기 위해 "켜줘"라고 해야 하는 건 번거롭습니다. 스마트 전원 모드를 쓰면 끄기 명령 시 잠시 전원을 끊었다가 다시 공급해 램프를 끄면서도 이후 정상 작동하게 합니다.
타이머 자동화: 설정된 시간에 기기 자동 종료. 아이들이 파이어 스틱으로 아마존 TV를 늦게까지 보면 오후 8시에 USB 전원 자동 차단.
전력 모니터링: USB 전원 하드웨어 개발 시 기기 소비 전류를 알 수 있습니다. 특히 처음 켤 때나 배터리 팩 충전 프로파일링 시 유용합니다. 온보드 INA219로 전류 소비 모니터링 가능(약 1kHz 샘플링 달성). 고용량 시 USB 케이블 전압 강하 문제도 INA219가 기기 측 전력을 모니터링해 저전압 경고 가능. 단자대도 제공돼 더 높은 전류와 굵은 케이블 사용 가능.
전원 장애 감지: MKR1000 배터리 옵션을 써 USB 공급 전압 모니터링하고 입력 전원 장애 시 알림 전송. USB 전원을 쓰는 원격(오프사이트) 솔루션에 추가 모니터링용으로 유용하거나, 단순 가정용 정전 감지기로도 활용 가능.
하드웨어
아두이노 MKR1000을 중심으로, 두 개의 LM3526M으로 하이사이드 스위칭과 결함 감지(저전압, 과전류) 구현, INA219로 전력 모니터링(전압/전류), LED와 스위치로 로컬 제어 옵션 제공.
DirtyPCBs.com에서 PCB 제작했고, OSHPark.com에도 .brd 파일 보내 제작 가능. 아두이노 소켓 양쪽에 각 핀마다 패드가 있어 해킹 용이(센서 추가, 소형 OLED 디스플레이로 전압/전류 표시 등).
깃허브 저장소에 2포트와 4포트 옵션이 있습니다. 2포트 PCB는 USB 소켓 레이아웃을 잘못 잡아(역방향 – 극성 오류!) 주의 필요합니다.
실패에서 얻은 승리:
USB 소켓을 보드 뒷면에 장착하니 핀 연결이 맞았고(2포트 보드에선 실크스크린이 반대편에 가는 단점도), 아두이노 헤더가 소켓에 꽂혀 높이가 나와 USB 소켓이 인클로저 밖으로 나오게 하니 오히려 공간 확보에 유리했습니다. 소켓, 스위치, LED를 뒷면으로 옮기고 포트 2개 추가해 4포트 버전 제작(2포트 버전엔 LED 정렬도 엉망이었음).
6~8포트 확장도 어렵지 않으나 LED와 스위치는 생략하거나 개선 필요.
회로도가 복잡해 보이지만 실제론 단순합니다. 많은 저항이 옵션입니다. R23, 19, 27, 26은 스위치 풀업, R20-22, R14, R15는 USB 제어/결함 감지 풀업으로 아두이노 INPUT_PULLUP 핀 모드로 대체 가능. 단, 저전력 슬립 모드에서 인터럽트로 깨우려면 플로팅 방지용으로 실장하는 게 좋습니다.
USB D+/D- 라인 주변 옵션 저항도 추가했습니다. 기기에 사용 가능 전력을 알려주지만, 많은 덤 기기는 무시합니다. 아래에선 LED 전류 제한용 R24만 필요하고 R2-5, R28은 비워둡니다.
LED와 스위치는 완전 옵션입니다. 원격 제어만 원하면 이 부품들 생략 가능.
전원 입력
세 가지 옵션으로 전원 공급 가능.
내부 (JP6 핀 1-2 연결): 아두이노 5V 핀(아두이노 USB 커넥터)에서 USB 전원 가져옴. 저전력 부하만 사용 권장.
외부 (JP6 핀 2-3 연결): J2(온보드 USB 마이크로 커넥터)나 JP8(단자대)로 5V 입력. 두 옵션 동시 사용 금지. 외부 전원은 아두이노 VIn 핀으로도 라우팅돼 아두이노 별도 전원 불필요.
보너스: R10, R11에 0옴 저항과 J2 장착 시 USB 3.0 패스스루 가능. 하드웨어 개발 시 PC USB 소켓 마모 없이 기기 재부팅에 편리.
Tinamous 타임라인은 디바이스용 프라이빗 트위터 같은 것. MQTT나 REST API(또는 봇)로 메시지 수신/처리하고 응답 게시 가능.
Tinamous SmartHome Skill 쓰면 코딩은 여기까지.
알렉사용 Tinamous Smart Home Skill
작성 시점 기준 Tinamous Smart Home Skill은 승인 대기 중(이제 스토어에 있을지도). 직접 만들 필요 없이 이 스킬 사용하면 됩니다.
이 스킬은 매우 범용적 – 디바이스나 통신 방식 모름. Tinamous에서 디바이스에 태그 달면 스킬이 알렉사용 적절한 디바이스 생성. 이 스킬과 Tinamous로 내 프로젝트 몇 줄 코드로 음성 제어 가능.
하지만 수정하거나 직접 스킬 만들고 싶을 수 있으니 개발 내용 공유.
C#으로 .Net Core 2.0 작성. 원래 BOFF 스마트 팬 프로젝트용이었는데, 이 프로젝트에서 디바이스가 여러 아웃렛(포트)을 갖고 각 포트가 알렉사 Smart Home 디바이스의 일급 시민이 되도록 확장.
전체 코드(테스트 포함)는 Tinamous SmartHome 저장소에. Visual Studio 2017에 AWS 툴 설치해 Lambda로 푸시.
프레임워크가 알렉사에서 들어오는 지시 메시지를 역직렬화해 객체로 접근, 헤더 네임스페이스와 지시명에 따라 적절한 액션 수행 후 응답 반환.
주요 메시지:
Account Linking
Discovery
State Report
Power Control
Account Linking
알렉사가 처리. 스킬 추가 후 알렉사가 인증 요청, Tinamous 인증 페이지로 이동해 디바이스의 계정 접근 허용. 계정명(AlexaExample), 사용자명(Steve), 비밀번호 입력.
Discovery
계정 연결 후 알렉사가 검색 요청. 스킬이 "Alexa.SmartDevice" 태그 달린 디바이스 쿼리. 태그 없는 디바이스는 무시.
태그는 Tinamous Devices 페이지에서 디바이스 편집 시 적용.
"MultiPort" 태그도 있으면 각 포트 열거해 별도 디바이스로 추가. 지원하는 알렉사 지시 기반 태그도 적용 – 여기선 "Alexa.PowerController"와 앱 내 표시 카테고리용 "SmartPlug" 태그.
다른 인터페이스(Alexa.BrightnessController 등)도 가능하나 여기선 덜 유용. 저장소 README 참고.
MultiPort 디바이스가 개별 포트를 알렉사에 노출하려면 State Variables 설정 필요(디바이스 편집 페이지).
PortCount로 포트 수 지정, "Port-1".."Port-n"으로 알렉사용 포트 이름 지정. 이름 없는 포트는 무시. 여기서 이름 바꾸고 재검색 하면 알렉사 업데이트.
검색 단계에서 스킬은 "powerState" 또는 "powerState-port-n" 태그/이름/레이블 가진 필드 찾음. 발견 시 디바이스 지원 기능으로 할당(State Report에서 자세히).
State Report
검색 단계에서 디바이스 기능 알렉사에 알림. 스킬 기본값으로 이 기능들 요청 가능하게 설정돼 알렉사가 StateReport 요청으로 값 조회.
필드 태그로 지원 설정 – 디바이스가 데이터 전송(아두이노 코드의 senml 메시지가 MQTT로 푸시)하면 Tinamous가 필드 생성. 필드 목록의 Advanced 옵션으로 편집. 태그 방식이 가장 범용적 – 펌웨어에서 필드명 정확히 맞출 필요 없고, 나중에 이름 바꿔도 문제없음.
포트별 필드 없으면 비포트별 필드(powerState)로 폴백.
Power Control
이게 없으면 알렉사에서 쓸모없음! 알렉사가 "TurnOn", "TurnOff" 두 지시 전송. 스킬 진입점에서 네임스페이스(Alexa.PowerController) 확인 후 적절한 컨트롤러 클래스(PowerController.cs)로 위임.
스킬은 Tinamous 타임라인에 Status Message 발행.
예: @UsbSwitch Turn On 또는 @UsbSwitch Turn On port-1
다른 인터페이스도 거의 동일 처리. 디바이스가 이 상태 메시지 감시하다 액션 수행. 알렉사는 StateReport로 상태 읽기.
이제 AWS Lambda에 푸시하고 알렉사 콘솔에 스킬 등록해 알렉사 접근 권한 부여만 남음.
AWS Lambda 함수 생성
Visual Studio 내 AWS 툴로 컴파일된 스킬 Lambda에 푸시. 먼저 Lambda 생성.
꿀팁: 지원 언어에 맞는 AWS 리전 생성. English (UK)는 eu-west(아일랜드).
새 Lambda 함수 생성(기존 블루프린트는 구식이고 제한적 – V2만 지원, 폐기됨. 우린 V3 사용).
Lambda가 필요한 리소스 접근할 새 역할 생성. 여기선 Simple Microservices 기본 선택(실제론 더 많이 줌). CloudWatch 로그 안 뜨면 IAM에서 권한 추가 필요.
Visual Studio에서 게시. AWS 툴 설치 후 프로젝트 우클릭 → "Publish to AWS Lambda..."
Lambda 표현식 세부사항 입력 후 업로드.
업로드 후 테스트 실행. Actions 드롭다운에서 "Publish new version".
게시 후 스킬에 Lambda 접근 권한 부여.
"Alexa Smart Home" 트리거 클릭하고 스킬 ID 입력(아직 없음...).
알렉사 콘솔에서 스킬 생성
Lambda 준비되면 https://developer.amazon.com 가서 Alexa Skills Kit 선택, 새 스킬 추가.
Smart Home Skill API, 대상 언어(영국은 English (UK)), V3 페이로드 버전 선택.
Lambda에서도 스킬의 "Application ID"/"Skill ID"/"ID" 복사 붙여넣기. amzn1.ask.skill.2_______________50 형태. Save 클릭 필수. 구 콘솔에선 헤더 아래 스킬 명 아래, 신 콘솔에선... 새 창 열기, 콘솔 스킬 목록 돌아가기, 적절한 링크 클릭(마치 직접 스킬 만들어본 적 없는 듯).
계정 연결용 OAuth 애플리케이션은 Tinamous의 Alexa Bot으로 생성. Tinamous 계정 Bots 페이지에서 Alexa Bot 추가. 생성 후 대화상자에 계정 연결 설정용 모든 정보 나옴.
참고: (곧 출시될) 공개 Tinamous SmartHome 스킬 쓰면 Alexa Bot 불필요.
봇이 생성한 애플리케이션으로 다른 Tinamous 계정 보유자도 내 스킬 써서 계정 연결 가능. 자연스럽게 스킬 비공개 유지 가능, 내 Tinamous 계정 아무것도 안 보임.
다른 디바이스 클라우드 쓰면(왜? ;-) ) 그쪽 OAuth 애플리케이션 정보 입력.
Test 페이지에서 "Show this skill in the Alexa App"을 "Yes"로.
저장 후 alexa.amazon.co.uk(또는 지역별) 또는 앱으로 이동. "Skills" → 우상단 "Your Skills" → "DEV SKILLS"에서 내 스킬 확인(초록 마커로 개발 스킬 표시).
"Alexa, turn off the usb light" 등 호출 문구와 스킬 선택 시 추가 정보는 "Publishing Information" 페이지에서 설정 – 개발 중에도 전체 퍼블리싱 없이 입력 가능.
스킬 코드 업데이트 시: 새 Lambda 함수 업로드 → 새 버전 생성 → SmartHome 트리거와 Skill ID 재추가 → 버전된 Lambda ARN을 스킬 콘솔에 붙여넣기(버전 없는 Lambda 쓸 수 있을지도 모르지만 당시 시도에선 안 됐음 – 다른 것도 많이 틀렸었지만).
성공!
Lambda에서 스킬 코드 실행되고 알렉사 계정에 스킬 설치되면 검색 실행 후 기기 제어 시작.
CloudWatch 로그로 스킬 작성 로그 확인 가능.
스킬 디버깅 & 팁
알렉사는 문제 발생 시 개발자 피드백 거의 없음. 왜 알렉사가 내 기대대로 안 동작하는지 추측하느라 시간 낭비하기 쉽습니다.
엔드포인트 ID에 영숫자 외 문자 피하기(* 썼다가 다 망가짐 – 분명한 에러도 아님. #은 괜찮음. 이유 모름).
모든 것 로깅. 스킬 호출 시 로그 확인. 로그 없으면 인증 문제거나 스킬이 Lambda에 권한 없음.
일상용 알렉사 계정 쓰기 싫으면 Amazon Households로 두 번째 성인 계정 추가. 단 2명으로 제한, 변경 시 지연 큼.
"Alexa, Switch Profiles"로 개발자/일반 프로필 전환 가능.
알렉사 콘솔 리디자인으로 더 나은 디버깅 정보 기대. 지금은 더 큰 박스와 약간 나은 검증뿐. 일부 로그 있지만 성공 로그만 – 관리자용 기분 좋은 지표, 36시간 지연돼 디버깅엔 무용지물!
하나의 스킬로 모든 (IoT) 것 제어!
Tinamous SmartHome 스킬로, 내 (IoT) 것이 Tinamous MQTT 서버에 연결되거나(또는 지원 봇 경유) 알렉사 SmartHome 제어 추가는 "Turn On", "Turn Off", "Set brightness 20" 같은 메시지 처리하는 몇 줄 코드와 Tinamous 태그 추가만으로 끝.