Przewodnik po DSL na iOS dotyczący 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 iOS.

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:

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

  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.

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

  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ą metody delay(for:), która przyjmuje argument 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:

typealias OnOffLightDevice = Matter.OnOffLightDeviceType
typealias OnOffTrait = Matter.OnOffTrait

sequential {
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
  delay(for:.seconds(5))
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
  delay(for:.seconds(5))
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
  delay(for:.seconds(5))
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
}

Pomijanie aktywatorów

Blokowanie wyzwalaczy to funkcja, która umożliwia automatyzacji ignorowanie wyzwalacza starter przez określony czas po początkowym zdarzeniu wywołują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 suppress(for:) z argumentem 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.

typealias OccupancySensorDevice = Matter.OccupancySensorDeviceType
typealias OnOffLightDevice = Matter.OnOffLightDeviceType
typealias MotionDetectionTrait = Google.MotionDetectionTrait
typealias OnOffTrait = Matter.OnOffTrait

automation {
  let starterNode = starter(device, OccupancySensorDevice.self, MotionDetectionTrait.self)
  starterNode
  suppress(for: .seconds(30 * 60)  // 30 minutes
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
}

Pamiętaj, że wyłączenie wyzwalacza wpływa na wszystkie starters w automatyzacji, które poprzedzają Suppression.

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:

typealias FanDeviceType = Matter.FanDeviceType
typealias FanControlTrait = Matter.FanControlTrait

action(fan, FanDeviceType.self) {
  update(FanControlTrait.self) {
    $0.setFanMode(.on)
  }
}