Руководство по 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)
  }
}