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

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

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

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

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

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

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

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

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

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

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

Задержки

Вы можете добавлять паузы в свои автоматизационные процессы с помощью ключевого слова delayFor , которое принимает аргумент java.time.Duration , указывающий длительность паузы перед продолжением выполнения. Продолжительность паузы может составлять от пяти секунд до 24 часов.

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

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

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

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

Чтобы применить подавление триггеров к вашей автоматизации, используйте ключевое слово suppressFor с аргументом java.time.Duration , указывающим время ожидания перед реакцией на последующие триггеры. Продолжительность подавления может составлять от пяти секунд до 24 часов.

automation {
  sequential {
    val starterNode = starter<_>(device, OccupancySensor, MotionDetection)
    suppressFor(Duration.ofMinutes(30))
    action(light, OnOffLightDevice) { command(OnOff.toggle()) }
}

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

Ограничить количество казней

Вы можете ограничить количество запусков автоматизации.

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

Для этого задайте поле метаданных maxExecutionCount автоматизации. В следующем примере показана автоматизация, которая может быть выполнена только один раз:

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

Автоматизация немедленно удаляется после завершения её последнего выполнения и достижения maxExecutionCount ). Запись истории автоматизации сохраняется на вкладке «Активность» Google Home app (GHA) , включая идентификатор automation_id .

Установить атрибуты черты в действии

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

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

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

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