Język DSL automatyzacji można wykorzystać do tworzenia automatyzacji bardziej złożonych niż te omówione w przewodniku po języku DSL – podstawowe automatyzacje na Androidzie.
Sekwencyjne z wieloma działaniami
Automatyzacja może wykonywać więcej niż jedną 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ę action
węzły, które występują po węźle parallel
, czekają one na wykonanie, aż wszystkie węzły w węźle parallel
zakończą działanie.
Opóźnienia
W automatyzacjach możesz wprowadzać przerwy za pomocą słowa kluczowego delayFor
, które przyjmuje argument java.time.Duration
określający, jak długo ma trwać przerwa przed kontynuowaniem wykonywania. Czas trwania wstrzymania może wynosić od 5 sekund do 24 godzin.
Aby na przykład 4 razy włączyć i wyłączyć światło, odczekując 5 sekund między każdą zmianą stanu:
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()) }
}
Pomijanie aktywatorów
Blokowanie wyzwalaczy to funkcja, która umożliwia automatyzacji ignorowanie zdarzenia starter
przez określony czas po początkowym zdarzeniu wyzwalającym. Jeśli na przykład automatyzacja ma starter
, która jest wywoływana przez wykrywanie ruchu, a okres blokowania wyzwalacza wynosi 5 minut, to po wywołaniu starter
nie zostanie ona wywołana ponownie przez kolejne 5 minut. Zapobiega to wielokrotnemu, szybkiemu uruchamianiu automatyzacji.
Aby zastosować tłumienie wywołań w automatyzacji, użyj słowa kluczowego suppressFor
z argumentem java.time.Duration
, który określa, jak długo należy czekać przed zareagowaniem na kolejne wywołania.
Czas trwania wyciszenia 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 wyłączenie wyzwalacza wpływa na wszystkie starters
w automatyzacji, które poprzedzają suppressFor
.
Ogranicz liczbę uruchomień
Możesz ograniczyć liczbę uruchomień automatyzacji.
Możesz na przykład skonfigurować jednorazową automatyzację, która uruchomi odkurzacz, gdy nie będzie Cię w domu.
Aby to zrobić, ustaw pole metadanych automatyzacji maxExecutionCount
.
Poniżej znajdziesz przykład automatyzacji, którą można wykonać 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 zostanie natychmiast usunięta po ostatnim wykonaniu i osiągnięciu wartości maxExecutionCount
. Wpis w historii automatyzacji pozostaje na karcie Google Home app (GHA) Aktywność, w tym automation_id
.
Ustawianie atrybutów cech w działaniu
Aby ustawić wartość atrybutu cechy:
- Utwórz węzeł
update
w węźleaction
, uwzględniając odpowiedni atrybut jako argument węzłaupdate
:action(deviceReference, deviceType) { update(trait) { } }
- W węźle
update
dla każdego atrybutu, który ma zostać zmodyfikowany, użyj funkcji mutatora i przekaż jej nową wartość. Aby utworzyć nazwę funkcji mutatora:- Używaj wielkich liter w nazwie atrybutu
- Dodaj przed nim 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 aktualizacji 2 atrybutów:
action(device, Fan) {
update(FanControl) {
setPercentSetting(50u)
setRockSetting(FanControlCluster.RockBitmap.rockUpDown)
}
}