다음 가이드를 사용하여 다양한 자동화 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)))
}
날씨를 기반으로 하는 시작 조건
날씨 특성을 사용하여 시작 조건에서 현재 또는 예상 날씨 조건을 지정할 수 있습니다.
val weatherState = starter<_>(structure, trait = Weather)
예시 자동화 페이지에서 비가 올 가능성이 있는 경우 블라인드 닫기를 참고하세요.
수동 시작 조건
수동 시작 조건은 사용자가 자동화를 수동으로 실행할 수 있는 특별한 유형의 시작 조건입니다.
수동 시작 조건을 선언할 때는 다음을 실행합니다.
- 특성 또는 기기 유형을 지정하지 않습니다.
- `Automation.execute()`를 호출하는 UI 요소를 제공합니다.
Automation.execute()
수동 시작 조건을 다른 시작 조건과 함께 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의 표현식과 유사하게 형성되며 숫자, 문자, 문자열, 불리언과 같은 기본 값과 열거형 값을 포함할 수 있습니다. 괄호로 하위 표현식을 그룹화하면 평가되는 순서를 제어할 수 있습니다.
다음은 여러 하위 표현식을 단일 표현식으로 결합하는 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)
}
비교 및
논리 연산자를 사용하여 여러
stateReaders를 condition 노드에서 사용할 수 있습니다.
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))
}
기간은 5초에서 24시간까지 다양합니다.
작업 노드
작업 노드는 자동화 작업이 이루어지는 곳입니다.
이 예에서 작업은
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