Объясните про when функцию

Здравствуйте. Изучаю wb-rules , не понимаю как работает when. Читал несколько раз на GitHub про when и про просмотр правил, все равно не понял.
Вот код:

defineRule({
  whenChanged: "wb-mr6cv3_246/Input 3 Single Press Counter",
  then: function () {
    dev["wb-led_163/Channel 2"] = !dev["wb-led_163/Channel 2"]
  }
});

defineRule({
  whenChanged: "wb-mr6cv3_246/Input 1 Single Press Counter",
  then: function () {
    dev["wb-mr6cv3_246/K1"] = !dev["wb-mr6cv3_246/K1"]
  }
})

defineRule({
  when: function(){
    var a = dev["wb-mr6cv3_246/K1"]
    return (a)} ,
  then: function () {
    dev["wb-led_163/Channel 2"] = false
  }
})

Включаю wb-led_163/Channel 2 светодиодная лента работает.
Включаю wb-mr6cv3_246/K1 => выключается wb-led_163/Channel 2 тут все понятно.
Но если повторно включить wb-led_163/Channel 2, он включится не смотря на то что wb-mr6cv3_246/K1 включен и вро де как функция в when должна возвращать true. Если выключить и затем включить wb-mr6cv3_246/K1 то wb-led_163/Channel 2 выключается.
Объясните пожалуйста что я не понимаю.

Добрый день!

  1. whenChanged: срабатывает только при изменении значения указанного устройства или переменной.
  2. when: проверяет указанное условие каждый раз, когда любое значение в системе изменяется.

Ваша проблема связана с использованием триггера when:

  1. Работа when (level-triggered):
  • Проверка условий в when происходит только при изменении любого параметра в системе или по таймеру (если он используется).
  • Если wb-mr6cv3_246/K1 не изменялось, а wb-led_163/Channel 2 менялось вручную, правило не выполнится, поскольку wb-led_163/Channel 2 не указано в when.
  1. Ручное управление wb-led_163/Channel 2:
  • Изменение wb-led_163/Channel 2 вручную не вызывает срабатывания третьего правила, так как это устройство не упомянуто в триггере.
  1. Изменение wb-mr6cv3_246/K1:
  • При изменении значения параметра wb-mr6cv3_246/K1 происходит проверка всех правил. Если условия выполняются, срабатывает действие, например, отключение wb-led_163/Channel 2.

Чтобы третье правило работало корректно при ручных изменениях wb-led_163/Channel 2:

  • Используйте whenChanged для отслеживания изменений этого параметра.

Почти понял, объясните почему эти две цитаты не противоречат друг другу?

Добрый день!
Не совсем понимаю почему оно должно противоречить.

" каждый раз, когда любое значение в системе изменяется должно проверятся условие в when, так? А при включении wb-led_163/Channel 2 меняется его значение в системе с false на true, и как я предполагал должно проверятся условие в when и отключать wb-led_163/Channel 2. Или when следит только за теми событиями которые прописаны в его функции?

Добрый день
Он следит только за теми событиями которые прописаны в его функции.

Огромное спасибо, теперь понятно.

1 лайк