Guida al DSL di Android 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 Android.

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:

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 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 la parola chiave delayFor, che accetta un argomento java.time.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:

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

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 suppressFor con un argomento java.time.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.

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

Tieni presente che la soppressione dei trigger influisce su tutti i starters in un'automazione che precedono il 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 sei fuori casa per la giornata.

Per farlo, imposta il campo maxExecutionCount dei metadati dell'automazione. Il seguente esempio è 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'esecuzione per l'ultima volta e al raggiungimento di maxExecutionCount. La voce della cronologia dell'automazione rimane nella scheda Google Home app (GHA) Attività, incluso il automation_id.

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:

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