Скрипт для кнопочного выключателя

Здравствуйте. 3й день не могу написать скрипт для кнопочных выключателей без фиксации. Выключатели сидят на WBIO-DI-WD-14
Нагрузки сидят на WBIO-DO-R1G-16
Всякие варианты перебрал, форум читал, сторонние сайты читал, не получается и всё.
Дайте пример такого скрипта, пожалуйста

То что крутится у меня сейчас, оригинал нашел тут на форуме. скрипт

Что пока не понятно для меня - при перезагрузке случайно включаются различные группы освещения. Когда скрипт убираю старт контроллера происходит без включения реле.

Выключатели заведены также на WD14 и HVD16, нагрузка на MRC6

Тут можно или “принудительно” устанавливать реле так:

или поправить скрипт. Где лежит, у меня ссылка не отрабатывает?

Известная проблема, упоминается здесь: Движок правил: примеры кода - #138 от пользователя BrainRoot
Варианты решения:

  1. Добавить выключение после загрузки, пример указан выше.
  2. Внутрь defineRule добавить проверку на null, но для начала - проверить, null ли значение при перезапуске serial.
    IMG_20210823_195044_214

У меня работает первый вариант, тайм-аут 15-20 секунд после запуска.

1 лайк

Именно в класс - не надо. А вот в самом правиле проверять на значение - полезно.

Скорректировал

Я себе так сделал:

function maketoggle(name, detector_control, relay_control) {
    defineRule(name, {
        whenChanged: "wb-gpio/" + detector_control,
        then: function (newValue, devName, cellName) {
          if (newValue == true && dev[relay_control] == false) {
                  dev[relay_control] = true; 
          }
          else 
            if (newValue == true && dev[relay_control] == true){
           dev[relay_control] = false;
          }
        }
    });
}
maketoggle("kitchen_spot", "EXT1_IN2", "wb-mdm3_108/K2");
maketoggle("kitchen_table", "EXT1_IN4", "wb-mr6c_71/K3");
maketoggle("zal_divan", "EXT1_IN3", "wb-mdm3_108/K1");
maketoggle("zal_tv", "EXT1_IN5", "wb-mdm3_108/K3");
maketoggle("kitchen_fartuk_top", "EXT1_IN6", "wb-mr6c_71/K2");
maketoggle("zal_lustra", "EXT1_IN1", "wb-mr6c_71/K6");

Как то все сложно, упрощение:

  1. Замена whenChanged на when.
  2. Замена внутренней логики на: dev[relay_control] = !dev[relay_control]

И получить не подписку на событие а постоянную проверку значения?

Не подписку… Просто оставлю работающее “это” здесь:

defineRule({ //B7.Кухня Лоджия
	when: function() { return dev["wb-gpio/EXT4_IN5"]; },
	then: function (newValue, devName, cellName) {
		mFunctions.switchRelay("wb-mr6cu_98","K5"); //10R.Лоджия.Светильники
	}
});