루틴 저장 기능을 설계하면서 가장 핵심이 되었던 구조 중 하나는 CommandDevice를 활용한 직렬화(Serialization) 과정이다.
객체(Object) 형태의 데이터를 → 문자열(String) 형태로 변환하는 작업.
주로 JSON이나 XML 같은 포맷으로 변환하며, 다음과 같은 목적에서 사용됨:
→ 이와 반대로 JSON을 다시 객체로 복원하는 건 역직렬화(Deserialization)
LUMOS에서는 루틴 생성 시 선택한 각 기기의 제어 상태를 CommandDevice라는 데이터 클래스로 관리함.
예시:
data class CommandDevice(
val deviceId: String,
val commands: List<Command>
)
data class Command(
val component: String = "main",
val capability: String,
val command: String,
val arguments: List<Any>? = null
)
예를 들어, 조명을 켜고 밝기를 80%로 설정한다면 다음과 같이 생성됨.
CommandDevice(
deviceId = "abc123",
commands = listOf(
Command(capability = "switch", command = "on"),
Command(capability = "switchLevel", command = "setLevel", arguments = listOf(80))
)
)
위 데이터를 루틴에 저장하기 위해 JSON 문자열로 직렬화
{
"deviceId": "abc123",
"commands": [
{
"component": "main",
"capability": "switch",
"command": "on"
},
{
"component": "main",
"capability": "switchLevel",
"command": "setLevel",
"arguments": [80]
}
]
}
SmartThings에 연동된 IoT 기기들은 기기마다 제어 방식이 다름.
예를 들어:
| 기기 | 주요 capability | 명령 |
|---|---|---|
| 조명 | switch, switchLevel | on/off, setLevel |
| 스피커 | audioVolume, mediaPlayback | setVolume, play, stop |
| 공기청정기 | fanMode, switch | setFanMode, on/off |
→ 이처럼 기기마다 제어 커맨드 구성이 다르기 때문에 기기별 명령을 하나의 공통 구조로 관리할 필요가 있었다.
그게 바로 CommandDevice
LUMOS에서는 다음과 같은 구조로 루틴 저장이 진행됨:
CommandDevice 객체 생성또 루틴을 수정할 때는:
CommandDevice로 복원| 개념 | 설명 |
|---|---|
| 직렬화 | 객체 → JSON 변환 |
| 역직렬화 | JSON → 객체 복원 |
| CommandDevice | 기기 ID + 제어 명령 리스트로 구성된 커맨드 데이터 클래스 |
| 목적 | 루틴 저장/복원, API 연동, 기기별 명령 통합 관리 |
LUMOS에서의 직렬화는 단순히 저장의 목적을 넘어,
기기 제어 커맨드 구조의 유연한 확장성과 재사용성을 확보하는 데 중요한 역할을 함.