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

Język DSL automatyzacji można wykorzystać do tworzenia automatyzacji bardziej złożonych niż te omówione w przewodniku po języku 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ę action węzły, które występują po węźle parallel, czekają one na wykonanie, aż wszystkie węzły w węźle parallel zakończą działanie.

Opóźnienia

W automatyzacjach możesz wprowadzać przerwy za pomocą słowa kluczowego delayFor, które przyjmuje argument java.time.Duration określający, jak długo ma trwać przerwa przed kontynuowaniem wykonywania. Czas trwania wstrzymania może wynosić od 5 sekund do 24 godzin.

Aby na przykład 4 razy włączyć i wyłączyć światło, odczekując 5 sekund między każdą zmianą stanu:

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

Pomijanie aktywatorów

Blokowanie wyzwalaczy to funkcja, która umożliwia automatyzacji ignorowanie zdarzenia starter przez określony czas po początkowym zdarzeniu wyzwalającym. Jeśli na przykład automatyzacja ma starter, która jest wywoływana przez wykrywanie ruchu, a okres blokowania wyzwalacza wynosi 5 minut, to po wywołaniu starter nie zostanie ona wywołana ponownie przez kolejne 5 minut. Zapobiega to wielokrotnemu, szybkiemu uruchamianiu automatyzacji.

Aby zastosować tłumienie wywołań w automatyzacji, użyj słowa kluczowego suppressFor z argumentem java.time.Duration, który określa, jak długo należy czekać przed zareagowaniem na kolejne wywołania. Czas trwania wyciszenia 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 wyłączenie wyzwalacza wpływa na wszystkie starters w automatyzacji, które poprzedzają suppressFor.

Ogranicz liczbę uruchomień

Możesz ograniczyć liczbę uruchomień automatyzacji.

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

Aby to zrobić, ustaw pole metadanych automatyzacji maxExecutionCount. Poniżej znajdziesz przykład automatyzacji, którą można wykonać 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 zostanie natychmiast usunięta po ostatnim wykonaniu i osiągnięciu wartości maxExecutionCount. Wpis w historii automatyzacji pozostaje na karcie Google Home app (GHA) Aktywność, w tym automation_id.

Ustawianie atrybutów cech w działaniu

Aby ustawić wartość atrybutu cechy:

  1. Utwórz węzeł update w węźle action, uwzględniając odpowiedni atrybut 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. Używaj wielkich liter w nazwie atrybutu
    2. Dodaj przed nim 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 aktualizacji 2 atrybutów:

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