다음 가이드를 사용하여 다양한 자동화 DSL 노드를 사용하여 자동화를 구성하는 방법을 알아보세요.
모든 자동화 DSL은 단일 automation
노드 내에 배치됩니다. automation
노드는 외부 Kotlin 언어 컨텍스트와 삽입된 DSL 컨텍스트 간의 경계를 형성합니다.
순차적 흐름
순차적 흐름은 기본 자동화 흐름 유형입니다.
다음은 시작 조건, 조건, 작업으로 구성된 순차적 흐름을 사용하는 매우 기본적인 자동화 DSL 템플릿입니다.
import com.google.home.automation.action
import com.google.home.automation.automation
import com.google.home.automation.condition
import com.google.home.automation.sequential
import com.google.home.automation.starter
...
automation {
sequential {
starter<_>(...)
condition {...}
action {...}
}
}
노드를 추가하여 이를 개선할 수 있습니다.
Starter
시작 조건 노드는 자동화를 활성화하는 초기 상황을 정의합니다. 예를 들어 상태 또는 값의 변경입니다. 자동화에는 스타터가 하나 이상 있어야 합니다. 그렇지 않으면 유효성 검사에 실패합니다. 자동화에 두 개 이상의 시작 요소를 추가하려면 select
노드를 사용해야 합니다.
특성 속성을 기반으로 한 스타터
특성 속성을 기반으로 하는 시작 노드를 선언할 때는 다음을 지정하세요.
- 기기
- 특성이 속한 기기 유형
- 특성
starter<_>(thermostat, TemperatureSensorDevice, TemperatureMeasurement)
기기 유형 매개변수는 자동화가 처리하는 기기 내 기기 유형을 지정할 수 있으므로 필수입니다. 예를 들어 기기는 FanDevice
와 HeatingCoolingUnitDevice
로 구성될 수 있으며 둘 다 OnOff
특성을 포함합니다. 기기 유형을 지정하면 기기의 어느 부분이 자동화를 트리거하는지 명확해집니다.
이벤트 기반 스타터
이벤트를 기반으로 하는 시작 노드를 선언할 때는 다음을 지정하세요.
- 기기
- 특성이 속한 기기 유형
- 이벤트
starter<_>(doorBell, GoogleDoorbellDevice, DoorbellPressed)
구조 및 이벤트 기반 시작 조건(매개변수 포함)
일부 이벤트에는 매개변수가 있을 수 있으므로 이러한 매개변수도 스타터에 포함해야 합니다.
예를 들어 이 스타터는 Time
특성의 ScheduledTimeEvent
를 사용하여 오전 7시에 자동화를 활성화합니다.
val earlyMorning = starter<_>(structure, Time.ScheduledTimeEvent) {
parameter(Time.ScheduledTimeEvent.clockTime(
LocalTime.of(7, 0, 0, 0)))
}
수동 스타터
수동 시작 조건은 사용자가 자동화를 수동으로 실행할 수 있는 특수한 유형의 시작 조건입니다.
수동 스타터를 선언할 때는 다음을 충족해야 합니다.
- 특성이나 기기 유형을 지정하지 마세요.
Automation.execute()
를 호출하는 UI 요소를 제공합니다.
select
흐름에 다른 스타터와 함께 수동 스타터를 배치하면 수동 스타터가 다른 스타터를 재정의합니다.
select {
manualStarter()
starter<_>(thermostat, TemperatureSensorDevice, TemperatureMeasurement)
}
수동 시작기 뒤에 오는 condition
노드는 평가되며, condition
표현식에 따라 자동화 실행을 차단할 수 있습니다.
condition
노드가 수동 스타터로 활성화된 자동화를 차단하지 않도록 자동화를 구성하는 한 가지 방법은 다른 스타터를 condition
와 함께 별도의 순차적 흐름에 배치하는 것입니다.
automation_graph {
sequential {
select {
sequential {
starter<_>(...)
condition {...}
}
sequential {
manualStarter()
}
}
action {...}
}
}
속성 값 참조
표현식에서 속성 값을 사용하려면 다음 구문을 사용하세요.
stateReader
사용:
val time = stateReader<_>(structure, Structure, Time)
val currTime = time.currentTime
starter
사용:
val starterNode = starter<_>(device1, LaundryWasherDevice, OnOff)
condition() {
expression = starterNode.onOff equals true
}
조건 노드 및 표현식
조건 노드는 자동화가 계속되는지 여부를 결정하는 결정 지점을 나타냅니다. 자동화에는 여러 condition
노드가 있을 수 있습니다.
condition
노드의 표현식이 false
로 평가되면 전체 자동화 실행이 종료됩니다.
condition
노드 내에서 표현식이 단일 불리언 값으로 평가되는 한 다양한 연산자를 사용하여 여러 조건 기준을 결합할 수 있습니다. 결과 값이 true
이면 조건이 충족되고 자동화가 다음 노드의 실행을 계속합니다. false
인 경우 자동화가 해당 시점에서 실행을 중지합니다.
표현식은 Kotlin의 표현식과 유사하게 형성되며 숫자, 문자, 문자열, 불리언과 같은 기본 값과 Enum 값을 포함할 수 있습니다. 괄호로 하위 표현식을 그룹화하면 평가 순서를 제어할 수 있습니다.
다음은 여러 하위 표현식을 단일 표현식으로 결합하는 condition
의 예입니다.
condition() {
val expr1 = starterNode.lockState equals DlLockState.Unlocked
val expr2 = stateReaderNode.lockState equals true
val expr3 = occupancySensingDevice.occupied notEquals 0
val expr4 = timeStateReaderNode
.currentTime
.between(
timeStateReaderNode.sunsetTime,
timeStateReaderNode.sunriseTime)
expression = (expr1 and expr2) or (expr3 and expr4)
}
스타터를 통해 액세스한 특성 값을 참조할 수 있습니다.
val starterNode = starter<_>(device, OnOff)
condition() { expression = starterNode.onOff equals true }
stateReader
condition
노드에서 특성 속성 값을 참조하는 또 다른 방법은 stateReader
노드를 사용하는 것입니다.
이렇게 하려면 먼저 stateReader
노드에서 특성 속성 값을 캡처합니다. stateReader
는 structure
와 특성을 인수로 사용합니다.
import com.google.home.automation.stateReader
...
val filterMonitoringState = stateReader<_>(structure, ActivatedCarbonFilterMonitoring)
그런 다음 condition
노드에서 stateReader
를 참조합니다.
condition() {
expression =
filterMonitoringState.changeIndication
.equals(ChangeIndicationEnum.Warning)
}
비교 및 논리 연산자를 사용하여 condition
노드에서 여러 stateReaders
를 사용할 수 있습니다.
val armState = stateReader<_>(doorLock, DoorLockDevice, ArmDisarm )
val doorLockState = stateReader<_>(doorLock, DoorLockDevice, DoorLock)
condition() {
expression =
(armState.armState equals true)
and
(doorLockState.lockState equals true)
}
조건 지속 시간
조건의 불리언 표현식 외에도 자동화를 실행하기 위해 표현식이 true여야 하는 기간을 지정할 수 있습니다. 예를 들어 조명이 10분 동안 켜져 있는 경우에만 트리거되는 조건을 정의할 수 있습니다.
condition {
expression(lightStateReader.onOff == true)
forDuration(Duration.ofMinutes(10))
}
기간은 1~30분입니다.
작업 노드
작업 노드는 자동화의 작업이 이루어지는 곳입니다.
이 예시에서 작업은 AssistantBroadcast
특성의 broadcast()
명령어를 호출합니다.
action(device, SpeakerDevice) {
command(AssistantBroadcast.broadcast("Intruder detected!"))
}
Import 문
자동화를 개발할 때 Home API의 다양한 요소를 코드에 가져오는 방법이 명확하지 않은 경우가 있습니다.
특성 속성은 특성의 Companion
객체에서 가져옵니다.
import com.google.home.matter.standard.OnOff.Companion.onOff
특성으로 정의된 데이터 구조는 이름이 '-Trait'로 끝나는 특성 클래스에서 가져옵니다.
import com.google.home.matter.standard.MediaPlaybackTrait.PlaybackStateEnum
특성 명령어는 특성의 Companion
객체에서 가져옵니다.
import com.google.home.matter.standard.Thermostat.Companion.setTemperatureSetpointHold