다음 가이드를 사용하여 다양한 자동화 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
시작 조건 노드는 자동화를 활성화하는 초기 상황을 정의합니다. 예를 들어 상태 또는 값의 변경입니다. 자동화에는 시작 조건이 하나 이상 있어야 합니다. 그러지 않으면 유효성 검사에 실패합니다. 자동화에 두 개 이상의 시작 조건을 추가하려면 노드 선택을 사용해야 합니다.
트레잇 속성을 기반으로 한 시작 조건
트레잇 속성을 기반으로 하는 시작 노드를 선언할 때 다음을 지정합니다.
- 기기
- 트레잇이 속한 기기 유형
- 트레잇
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