Guida al DSL per iOS per automazioni complesse

Il 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 action, puoi 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 rimangono in attesa fino al completamento dell'esecuzione di tutti i nodi all'interno del nodo parallel.

Ritardi

Puoi introdurre interruzioni nelle automazioni utilizzando il metodo delay(for:), che accetta un argomento Duration che indica il tempo di interruzione prima di continuare l'esecuzione. La durata della pausa può essere compresa tra cinque secondi e 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() }
}

Eliminazione degli attivatori

La soppressione dell'attivatore è una funzionalità che consente all'automazione di ignorare un starter per un determinato periodo di tempo dopo l'evento di attivazione iniziale. Ad esempio, se l'automazione ha un starter attivato dal rilevamento di movimento e se specifichi una durata di soppressione dell'attivatore di cinque minuti, quando starter si attiva, non si attiverà di nuovo per i cinque minuti successivi. In questo modo, l'automazione non si attiva più volte di seguito.

Per applicare la soppressione degli attivatori all'automazione, utilizza la parola chiave suppress(for:) con un argomento Duration che indica il tempo di attesa prima di rispondere agli attivatori successivi. La durata dell'eliminazione può variare da un minimo di cinque secondi a un massimo di 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 l'eliminazione degli attivatori interessa tutti i starters in un'automazione che precede il Suppression.

Impostare gli attributi dei tratti in un'azione

Per impostare il valore di un attributo tratto:

  1. Crea un nodo update all'interno di un nodo action, includendo 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 di modificatore e passa il nuovo valore. Per formare il nome della funzione di mutazione:
    1. Usare lettere maiuscole per il nome dell'attributo
    2. Anteponi la parola set.
    Ad esempio, per aggiornare un attributo denominato defaultMoveRate, dovrai utilizzare una funzione di modificatore denominata setDefaultMoveRate.

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