Guida al DSL di Android per automazioni complesse

Il DSL di automazione può essere utilizzato per creare automazioni più complesse di quelle descritte nella Guida al DSL: automazioni di base su Android.

Sequenziale con più azioni

Sequenziale con più azioni

Un'automazione può eseguire più di un'azione. Ad esempio, al posto del singolo nodo action, puoi avere più nodi action, che vengono eseguiti in ordine sequenziale:

automation {
  sequential {
    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.

automation {
  sequential {
    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 inserire delle pause nelle automazioni utilizzando la delayFor parola chiave, che accetta un java.time.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:

sequential {
  action(light, OnOffLightDevice) { command(OnOff.toggle()) }
  delayFor(Duration.ofSeconds(5))
  action(light, OnOffLightDevice) { command(OnOff.toggle()) }
  delayFor(Duration.ofSeconds(5))
  action(light, OnOffLightDevice) { command(OnOff.toggle()) }
  delayFor(Duration.ofSeconds(5))
  action(light, OnOffLightDevice) { command(OnOff.toggle()) }
}

Soppressione dell'attivazione

La soppressione dell'attivazione è 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 specifichi una durata di soppressione dell'attivazione di cinque minuti, quando l'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 suppressFor parola chiave con un java.time.Duration argomento che rappresenta la durata dell'attesa prima di rispondere alle attivazioni successive. La durata della soppressione può essere di soli cinque secondi o fino a 24 ore.

automation {
  sequential {
    val starterNode = starter<_>(device, OccupancySensor, MotionDetection)
    suppressFor(Duration.ofMinutes(30))
    action(light, OnOffLightDevice) { command(OnOff.toggle()) }
}

Tieni presente che la soppressione dell'attivazione influisce su tutti gli starters di un'automazione che precedono suppressFor.

Limita il numero di esecuzioni

Puoi limitare il numero di volte in cui è consentito eseguire un'automazione.

Ad esempio, potresti voler configurare un'automazione una tantum che avvii l'aspirapolvere mentre non sei a casa per la giornata.

Per farlo, imposta il campo dei metadati maxExecutionCount dell'automazione. L'esempio seguente mostra un'automazione che può essere eseguita una sola volta:

automation {
  // The automation can only be executed once.
  maxExecutionCount = 1
  // When the door lock state changes
  sequential {
    val doorLockEvent = starter<_>(doorLock, DoorLockDevice, LockOperationEvent)
    // if the door is unlocked
    condition() {
      expression = (doorLockEvent.lockOperationType equals LockOperationTypeEnum.Unlock)
    }
    // turn the light on
    action(light, DimmableLightDevice) { command(OnOff.on()) }
  }
}

L'automazione viene eliminata immediatamente al termine dell'ultima esecuzione e al raggiungimento di maxExecutionCount. La voce della cronologia dell'automazione rimane nella scheda Google Home app (GHA) Attività, incluso il automation_id.

Imposta 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 di mutazione e passagli il nuovo valore. Per formare il nome della funzione di mutazione:
    1. Metti in maiuscolo il nome dell'attributo
    2. Aggiungi il prefisso set.
    Ad esempio, per aggiornare un attributo denominato defaultMoveRate, utilizzerai una funzione di mutazione denominata setDefaultMoveRate.

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

action(device, Fan) {
  update(FanControl) {
    setPercentSetting(50u)
    setRockSetting(FanControlCluster.RockBitmap.rockUpDown)
  }
}