Guida al DSL per iOS per automazioni complesse

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

Sequenziale con più azioni

Sequenziale con più azioni

Un'automazione può eseguire più di un'azione. 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 nodi action che seguono il nodo parallel, questi attendono l'esecuzione fino al completamento di tutti i nodi all'interno del nodo parallel.

Ritardi

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

Ad esempio, per attivare/disattivare una luce quattro volte con una pausa di cinque secondi tra ogni attivazione/disattivazione:

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

Soppressione dell'attivazione

La soppressione dell'attivazione è una funzionalità che consente all'automazione di ignorare uno starter per un periodo di tempo specificato dopo l'evento di attivazione iniziale. Ad esempio, se l'automazione ha uno starter attivato dal rilevamento del movimento e specifichi una durata di soppressione dell'attivazione di cinque minuti, quando lo starter si attiva, non si attiverà di nuovo per i successivi cinque minuti. In questo modo, l'automazione non si attiva ripetutamente in rapida successione.

Per applicare la soppressione dell'attivazione all'automazione, utilizza la suppress(for:) parola chiave con un Duration argomento che rappresenta il tempo di attesa prima di rispondere alle attivazioni successive. La durata della soppressione può essere di soli cinque secondi o fino 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 dell'attivazione influisce su tutti gli starters di un'automazione che precedono la Suppression.

Impostare gli attributi dei tratti in un'azione

Per impostare il valore di un attributo del tratto:

  1. Crea un nodo update all'interno di un nodo action, includendo il tratto pertinente come argomento del nodo update nodo:
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
    
  2. All'interno del nodo update, per ogni attributo da modificare, utilizza una funzione mutatore e passagli il nuovo valore. Per formare il nome della funzione mutatore:
    1. Metti in maiuscolo il nome dell'attributo
    2. Aggiungi il prefisso set.
    Ad esempio, per aggiornare un attributo denominato defaultMoveRate, utilizzerai una funzione mutatore denominata setDefaultMoveRate.

Tieni presente che un nodo update può avere più funzioni mutatore. 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)
  }
}