Przewodnik po DSL na Androida na potrzeby złożonych automatyzacji

Język DSL automatyzacji umożliwia tworzenie bardziej złożonych automatyzacji niż te omówione w przewodniku po DSL – podstawowe automatyzacje na Androidzie.

Sekwencyjne z wieloma działaniami

Sekwencyjne z wieloma działaniami

Automatyzacja może wykonywać więcej niż jedną czynność. Na przykład zamiast pojedynczego węzła action możesz mieć kilka węzłów action, które są uruchamiane w kolejności sekwencyjnej:

automation {
  sequential {
    starter<_>(...)
    condition {...}
    action {...}
    action {...}
    action {...}
    }
}

Sekwencyjne z wieloma działaniami równoległymi

Sekwencyjne z wieloma działaniami równoległymi

Jeśli umieścisz kilka węzłów action w węźle parallel, działania będą wykonywane jednocześnie.

automation {
  sequential {
    starter<_>(...)
    condition {...}
    parallel {
      action {...}
      action {...}
      action {...}
    }
  }
}

Jeśli w węźle sequential znajdują się węzły action, które występują po węźle parallel, czekają one na wykonanie, aż wszystkie węzły w węźle parallel zostaną wykonane.

Opóźnienia

Możesz wprowadzać przerwy w automatyzacjach za pomocą słowa kluczowego delayFor, które przyjmuje argument java.time.Duration reprezentujący czas wstrzymania przed kontynuowaniem wykonywania. Czas wstrzymania może wynosić od 5 sekund do 24 godzin.

Aby na przykład 4 razy przełączyć światło z 5-sekundową przerwą między przełączeniami:

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

Eliminowanie sygnałów aktywatora

Eliminowanie sygnałów aktywatora to funkcja, która umożliwia automatyzacji ignorowanie starter przez określony czas po początkowym zdarzeniu wyzwalającym. Jeśli na przykład automatyzacja ma starter, który jest wyzwalany przez wykrycie ruchu, a Ty określisz czas eliminowania sygnałów aktywatora na 5 minut, to gdy starter zostanie wyzwolony, nie zostanie wyzwolony ponownie przez następne 5 minut. Zapobiega to szybkiemu i powtarzającemu się wyzwalaniu automatyzacji.

Aby zastosować eliminowanie sygnałów aktywatora w automatyzacji, użyj słowa kluczowego z argumentem reprezentującym czas oczekiwania przed zareagowaniem na kolejne sygnały aktywatora.suppressForjava.time.Duration Czas eliminowania sygnałów aktywatora może wynosić od 5 sekund do 24 godzin.

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

Pamiętaj, że eliminowanie sygnałów aktywatora wpływa na wszystkie starters w automatyzacji, które poprzedzają suppressFor.

Ograniczanie liczby uruchomień

Możesz ograniczyć liczbę uruchomień automatyzacji.

Możesz na przykład skonfigurować automatyzację jednorazową, która uruchamia odkurzacz, gdy nie ma Cię w domu.

Aby to zrobić, ustaw pole metadanych automatyzacji maxExecutionCount. Poniższy przykład to automatyzacja, która może być wykonana tylko raz:

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

Automatyzacja jest natychmiast usuwana po ostatnim wykonaniu i osiągnięciu wartości maxExecutionCount. Wpis w historii automatyzacji pozostaje w Google Home app (GHA) na karcie Aktywność, w tym automation_id.

Ustawianie atrybutów cechy w działaniu

Aby ustawić wartość atrybutu cechy:

  1. Utwórz węzeł update w węźle action, w tym odpowiednią cechę jako argument węzła update:
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
  2. W węźle update dla każdego atrybutu, który ma zostać zmodyfikowany, użyj funkcji mutatora i przekaż jej nową wartość. Aby utworzyć nazwę funkcji mutatora:
    1. Zacznij nazwę atrybutu od wielkiej litery.
    2. Dodaj przed nią słowo set.
    Aby na przykład zaktualizować atrybut o nazwie defaultMoveRate, użyj funkcji mutatora o nazwie setDefaultMoveRate.

Pamiętaj, że węzeł update może mieć wiele funkcji mutatora. Oto przykład, w którym aktualizowane są 2 atrybuty:

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