Guía de la DSL de iOS para automatizaciones complejas

La DSL de Automation se puede usar para crear automatizaciones más complejas que las que se describen en la guía de DSL: automatizaciones básicas en iOS.

Secuencial con varias acciones

Secuencial con varias acciones

Una automatización puede hacer más de una cosa. Por ejemplo, en lugar del único nodo action, podrías 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

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 hayan terminado de ejecutarse.

Demoras

Puedes introducir pausas en tus automatizaciones con el delay(for:) método, que toma un Duration argumento 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 24 horas.

Por ejemplo, para activar 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 capacidad que permite que tu automatización ignore un starter durante un período especificado 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 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 suppress(for:) palabra clave con un Duration argumento 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 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 de una automatización que preceden a Suppression.

Establece atributos de rasgos en una acción

Para establecer el valor de un atributo de rasgo, haz lo siguiente:

  1. Crea un nodo update dentro de un nodo action, incluido el rasgo pertinente como argumento para el nodo update:
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
    
  2. Dentro del nodo update, para cada atributo que se modificará, usa una función de mutador y pásale el valor nuevo. Para formar el nombre de la función de mutador, haz lo siguiente:
    1. Pon en mayúscula el nombre del atributo.
    2. Agrega el prefijo set.
    Por ejemplo, para actualizar un atributo llamado defaultMoveRate, usarías una función de mutador llamada setDefaultMoveRate.

Ten en cuenta que un nodo update puede tener varias funciones de mutador. 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)
  }
}