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 opisane 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. Przerwa może trwać 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

Tłumienie wyzwalaczy 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 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 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 węzeł update 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)
  }
}