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ć wiele węzłów action, które będą działać w kolejności sekwencyjnej:

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

Sekwencyjny z wieloma działaniami równoległymi

Sekwencyjny 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. Przerwa może trwać od 5 sekund do 24 godzin.

Aby na przykład 4 razy włączyć i wyłączyć światło z 5-sekundową przerwą 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 starter przez określony czas po początkowym zdarzeniu wywołującym. Jeśli na przykład automatyzacja ma starter, który jest wywoływany przez wykrywanie ruchu, a okres blokowania wyzwalacza wynosi 5 minut, to po wywołaniu starter nie zostanie on ponownie wywołany przez kolejne 5 minut. Zapobiega to częstemu i gwałtownemu uruchamianiu się 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.

Ograniczanie liczby uruchomień

Możesz ograniczyć liczbę uruchomień automatyzacji.

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

Aby to zrobić, ustaw pole metadanych maxExecutionCount automatyzacji. Poniżej znajdziesz przykład automatyzacji, którą można uruchomić 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 uruchomieniu i osiągnięciu wartości maxExecutionCount. Wpis w historii automatyzacji pozostanie 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ą 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. 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 update węzeł 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)
  }
}