Język DSL automatyzacji umożliwia tworzenie bardziej złożonych automatyzacji niż te omówione w przewodniku po DSL – podstawowe automatyzacje na Androidzie.
Sekwencyjne z wieloma działaniami
Automatyzacja może wykonywać więcej niż 1 czynność. Na przykład zamiast pojedynczego węzła action możesz mieć kilka węzłów action, które są uruchamiane w kolejności sekwencyjnej:
automation {
sequential {
starter<_>(...)
condition {...}
action {...}
action {...}
action {...}
}
}
Sekwencyjne z wieloma działaniami równoległymi
Jeśli umieścisz kilka węzłów action w węźle parallel, działania będą wykonywane jednocześnie.
automation {
sequential {
starter<_>(...)
condition {...}
parallel {
action {...}
action {...}
action {...}
}
}
}
Jeśli w węźle sequential znajdują się węzły action, które występują po węźle parallel, czekają one na wykonanie, aż wszystkie węzły w węźle parallel zostaną wykonane.
Opóźnienia
Możesz wprowadzać przerwy w automatyzacjach za pomocą słowa kluczowego
delayFor, które przyjmuje argument
java.time.Duration
reprezentujący czas wstrzymania przed kontynuowaniem wykonywania. Czas wstrzymania może wynosić od 5 sekund do 24 godzin.
Aby na przykład przełączyć światło 4 razy z 5-sekundową przerwą między każdym przełączeniem:
sequential {
action(light, OnOffLightDevice) { command(OnOff.toggle()) }
delayFor(Duration.ofSeconds(5))
action(light, OnOffLightDevice) { command(OnOff.toggle()) }
delayFor(Duration.ofSeconds(5))
action(light, OnOffLightDevice) { command(OnOff.toggle()) }
delayFor(Duration.ofSeconds(5))
action(light, OnOffLightDevice) { command(OnOff.toggle()) }
}
Eliminowanie wyzwalaczy
Eliminowanie wyzwalaczy to funkcja, która umożliwia automatyzacji ignorowanie starter przez określony czas po początkowym zdarzeniu wyzwalającym. Jeśli na przykład automatyzacja ma starter, który jest wyzwalany przez wykrywanie ruchu, a Ty określisz czas eliminowania wyzwalaczy na 5 minut, to gdy starter zostanie wyzwolony, nie zostanie wyzwolony ponownie przez następne 5 minut. Zapobiega to szybkiemu i powtarzającemu się wyzwalaniu automatyzacji.
Aby zastosować eliminowanie wyzwalaczy w automatyzacji, użyj słowa kluczowego
suppressFor
z argumentem
java.time.Duration
reprezentującym czas oczekiwania przed zareagowaniem na kolejne wyzwalacze.
Czas eliminowania może wynosić od 5 sekund do 24 godzin.
automation {
sequential {
val starterNode = starter<_>(device, OccupancySensor, MotionDetection)
suppressFor(Duration.ofMinutes(30))
action(light, OnOffLightDevice) { command(OnOff.toggle()) }
}
Pamiętaj, że eliminowanie wyzwalaczy wpływa na wszystkie starters w automatyzacji, które poprzedzają suppressFor.
Ograniczanie liczby uruchomień
Możesz ograniczyć liczbę uruchomień automatyzacji.
Możesz na przykład skonfigurować automatyzację jednorazową, która uruchamia odkurzacz, gdy nie ma Cię w domu.
Aby to zrobić, ustaw pole metadanych automatyzacji
maxExecutionCount.
Poniższy przykład to automatyzacja, która może być wykonana tylko raz:
automation { // The automation can only be executed once. maxExecutionCount = 1 // When the door lock state changes sequential { val doorLockEvent = starter<_>(doorLock, DoorLockDevice, LockOperationEvent) // if the door is unlocked condition() { expression = (doorLockEvent.lockOperationType equals LockOperationTypeEnum.Unlock) } // turn the light on action(light, DimmableLightDevice) { command(OnOff.on()) } } }
Automatyzacja jest natychmiast usuwana po ostatnim wykonaniu i osiągnięciu wartości maxExecutionCount. Wpis w historii automatyzacji pozostaje
w Google Home app (GHA) na karcie Aktywność, w tym automation_id.
Ustawianie atrybutów cech w działaniu
Aby ustawić wartość atrybutu cechy:
- Utwórz węzeł
updatew węźleaction, w tym odpowiednią cechę jako argument węzłaupdate:action(deviceReference, deviceType) { update(trait) { } } - W węźle
updatedla każdego atrybutu, który ma zostać zmodyfikowany, użyj funkcji mutatora i przekaż jej nową wartość. Aby utworzyć nazwę funkcji mutatora:- Zacznij nazwę atrybutu od wielkiej litery.
- Dodaj przed nią słowo
set.
defaultMoveRate, użyj funkcji mutatora o nazwiesetDefaultMoveRate.
Pamiętaj, że węzeł update może mieć wiele funkcji mutatora. Oto przykład, w którym aktualizowane są 2 atrybuty:
action(device, Fan) {
update(FanControl) {
setPercentSetting(50u)
setRockSetting(FanControlCluster.RockBitmap.rockUpDown)
}
}