La DSL de automatización se puede usar para crear automatizaciones más complejas que las que se analizan en la guía de DSL: automatizaciones básicas en iOS.
Secuencial con varias acciones
Una automatización puede hacer más de una acción. Por ejemplo, en lugar del único nodo action
, puedes tener varios nodos action
, que se ejecutan en orden secuencial:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
action {...}
action {...}
action {...}
}
Secuencial con varias acciones paralelas
Si colocas varios nodos action
en un nodo parallel
, las acciones se ejecutan de forma simultánea.
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
parallel {
action {...}
action {...}
action {...}
}
}
Si hay nodos action
en el nodo sequential
que vienen después del nodo parallel
, esperan a ejecutarse hasta que todos los nodos dentro del nodo parallel
terminen de ejecutarse.
Demoras
Puedes introducir pausas en tus automatizaciones con el método delay(for:)
, que toma un argumento Duration
que representa cuánto tiempo se debe pausar antes de continuar con la ejecución. La duración de la pausa puede ser de cinco segundos o de hasta 24 horas.
Por ejemplo, para activar y desactivar una luz cuatro veces con una pausa de cinco segundos entre cada activación, haz lo siguiente:
typealias OnOffLightDevice = Matter.OnOffLightDeviceType
typealias OnOffTrait = Matter.OnOffTrait
sequential {
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
delay(for:.seconds(5))
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
delay(for:.seconds(5))
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
delay(for:.seconds(5))
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
}
Supresión de activadores
La supresión de activadores es una función que permite que tu automatización omita un
starter
durante un período determinado después del evento de activación inicial. Por ejemplo, si la automatización tiene un starter
que se activa con la detección de movimiento y si especificas una duración de supresión del activador de cinco minutos, cuando se active el starter
, no se volverá a activar durante los próximos cinco minutos. Esto evita que la automatización se active rápidamente una y otra vez.
Para aplicar la supresión de activadores a tu automatización, usa la palabra clave
suppress(for:)
con un argumento
Duration
que represente cuánto tiempo esperar antes de responder a los activadores posteriores.
La duración de la supresión puede ser de cinco segundos o de hasta 24 horas.
typealias OccupancySensorDevice = Matter.OccupancySensorDeviceType
typealias OnOffLightDevice = Matter.OnOffLightDeviceType
typealias MotionDetectionTrait = Google.MotionDetectionTrait
typealias OnOffTrait = Matter.OnOffTrait
automation {
let starterNode = starter(device, OccupancySensorDevice.self, MotionDetectionTrait.self)
starterNode
suppress(for: .seconds(30 * 60) // 30 minutes
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
}
Ten en cuenta que la supresión de activadores afecta a todos los starters
en una automatización que precede a Suppression
.
Establece atributos de rasgos en una acción
Para establecer el valor de un atributo de rasgo, sigue estos pasos:
- Crea un nodo
update
dentro de un nodoaction
, y, luego, incluye el atributo relevante como argumento del nodoupdate
:action(deviceReference, deviceType) { update(trait) { } }
- Dentro del nodo
update
, para cada atributo que se modificará, usa una función de modificador y pásale el valor nuevo. Para formar el nombre de la función de mutador, haz lo siguiente:- Pon en mayúsculas el nombre del atributo
- Agrega el prefijo
set
.
defaultMoveRate
, usarías una función de mutador llamadasetDefaultMoveRate
.
Ten en cuenta que un nodo update
puede tener varias funciones de modificador. Este es un ejemplo en el que se actualizan dos atributos:
typealias FanDeviceType = Matter.FanDeviceType
typealias FanControlTrait = Matter.FanControlTrait
action(fan, FanDeviceType.self) {
update(FanControlTrait.self) {
$0.setFanMode(.on)
}
}