Guida al DSL per iOS per automazioni complesse

Il linguaggio DSL di automazione può essere utilizzato per creare automazioni più complesse di quelle descritte nella Guida DSL - Automazioni di base su iOS.

Sequenziale con più azioni

Sequenziale con più azioni

Un'automazione può fare più di una cosa. Ad esempio, al posto del singolo nodo action, potresti avere più nodi action, che vengono eseguiti in ordine sequenziale:

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

  starter(...)
  condition {...}
  action {...}
  action {...}
  action {...}

}

Sequenziale con più azioni parallele

Sequenziale con più azioni parallele

Se inserisci più nodi action in un nodo parallel, le azioni vengono eseguite contemporaneamente.

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

  starter(...)
  condition {...}
  parallel {
    action {...}
    action {...}
    action {...}
  }

}

Se nel nodo sequential sono presenti action nodi successivi al nodo parallel, l'esecuzione viene rimandata finché tutti i nodi all'interno del nodo parallel non sono stati eseguiti.

Ritardi

Puoi introdurre pause nelle automazioni utilizzando il metodo delay(for:), che accetta un argomento Duration che rappresenta la durata della pausa prima di continuare l'esecuzione. La durata della pausa può variare da 5 secondi a 24 ore.

Ad esempio, per attivare/disattivare una luce quattro volte con una pausa di cinque secondi tra un'attivazione/disattivazione e l'altra:

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() }
}

Eliminazione dei trigger

La soppressione dei trigger è una funzionalità che consente all'automazione di ignorare un starter per un periodo di tempo specificato dopo l'evento di attivazione iniziale. Ad esempio, se l'automazione ha un starter attivato dal rilevamento del movimento e se specifichi una durata di soppressione del trigger di cinque minuti, quando il starter si attiva, non si attiverà di nuovo per i cinque minuti successivi. Ciò impedisce all'automazione di attivarsi rapidamente più volte.

Per applicare la soppressione dei trigger all'automazione, utilizza la parola chiave suppress(for:) con un argomento Duration che rappresenta il tempo di attesa prima di rispondere ai trigger successivi. La durata della soppressione può variare da 5 secondi a 24 ore.

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() }
}

Tieni presente che la soppressione dei trigger influisce su tutti i starters in un'automazione che precedono il Suppression.

Impostare gli attributi del tratto in un'azione

Per impostare il valore di un attributo caratteristica:

  1. Crea un nodo update all'interno di un nodo action, incluso il tratto pertinente come argomento del nodo update:
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
    
  2. All'interno del nodo update, per ogni attributo da modificare, utilizza una funzione mutatore e trasmetti il nuovo valore. Per formare il nome della funzione mutatore:
    1. Scrivi il nome dell'attributo con la prima lettera maiuscola
    2. Anteponi la parola set.
    Ad esempio, per aggiornare un attributo chiamato defaultMoveRate, devi utilizzare una funzione di modifica chiamata setDefaultMoveRate.

Tieni presente che un nodo update può avere più funzioni di mutazione. Ecco un esempio in cui vengono aggiornati due attributi:

typealias FanDeviceType = Matter.FanDeviceType
typealias FanControlTrait = Matter.FanControlTrait

action(fan, FanDeviceType.self) {
  update(FanControlTrait.self) {
    $0.setFanMode(.on)
  }
}