Руководство по iOS DSL для комплексной автоматизации

Язык автоматизации Automation DSL позволяет создавать автоматизации, более сложные, чем те, которые описаны в руководстве по DSL — базовые автоматизации на iOS .

Последовательный, с несколькими действиями

Последовательный, с несколькими действиями

Автоматизация может выполнять несколько действий. Например, вместо одного узла action можно использовать несколько узлов action , которые выполняются последовательно:

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

  starter(...)
  condition {...}
  action {...}
  action {...}
  action {...}

}

Последовательный, с множеством параллельных действий

Последовательный, с множеством параллельных действий

Если разместить несколько узлов action в parallel узле, действия будут выполняться одновременно.

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

  starter(...)
  condition {...}
  parallel {
    action {...}
    action {...}
    action {...}
  }

}

Если в sequential узле есть узлы action , следующие за parallel узлом, они ожидают завершения выполнения всех узлов в parallel узле.

Задержки

Вы можете вводить паузы в свои автоматизации, используя метод delay(for:) , который принимает аргумент Duration , указывающий, как долго нужно приостановить выполнение перед его продолжением. Длительность паузы может составлять от пяти секунд до 24 часов.

Например, чтобы четыре раза переключить свет с пятисекундной паузой между каждым переключением:

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

Подавление триггера

Функция подавления срабатывания позволяет вашей автоматизации игнорировать starter в течение заданного периода времени после первоначального срабатывания. Например, если в автоматизации есть starter , срабатывающее при обнаружении движения, и вы задали продолжительность подавления срабатывания в пять минут, то после срабатывания starter оно не будет срабатывать снова в течение следующих пяти минут. Это предотвращает быстрое и многократное срабатывание автоматизации.

Для подавления срабатывания триггеров в вашей автоматизации используйте ключевое слово suppress(for:) с аргументом Duration , указывающим, как долго нужно ждать перед реагированием на последующие триггеры. Длительность подавления может составлять от пяти секунд до 24 часов.

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

Обратите внимание, что подавление триггеров затрагивает все starters в автоматизации, предшествующие Suppression .

Задайте атрибуты характеристик в действии

Чтобы задать значение атрибута признака:

  1. Создайте узел update внутри узла action , включив соответствующий признак в качестве аргумента для узла update :
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
    
  2. Внутри узла update для каждого изменяемого атрибута используйте функцию-мутатор и передайте ей новое значение. Чтобы сформировать имя функции-мутатора:
    1. Напишите название атрибута с заглавной буквы.
    2. Добавьте к нему слово " set ".
    Например, для обновления атрибута с именем defaultMoveRate вы используете функцию-мутатор с именем setDefaultMoveRate .

Обратите внимание, что узел update может иметь несколько функций-мутаторов. Вот пример обновления двух атрибутов:

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

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