После обновления скрипт работает не корректно

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

function RulesForLight(relay,channel,inputup,inputdown,downlevel,uplevel) {

defineRule({
  whenChanged: inputdown + " Single Press Counter",
  then: function (newValue, devName, cellName) {
    if (dev[relay] == true && dev[channel] == downlevel) {
      dev[relay] = false;
    } else {
      dev[channel] = downlevel; 
      dev[relay] = true;   
      }
   log(channel,"level - ", dev[channel] = downlevel, dev[relay] ) // Вывод в лог состояние каналов

  }
});

defineRule({
  whenChanged: inputup + " Single Press Counter",
  then: function (newValue, devName, cellName) {
    if (dev[relay] == true && dev[channel] == uplevel) {
      dev[relay] = false;
    } else {
      dev[channel] = uplevel;
      dev[relay] = true;
      }
   log(channel,"level - ", dev[channel] = uplevel, dev[relay] ) // Вывод в лог состояние каналов
  }
});
RulesForLight("wb-mdm3_162/K1","wb-mdm3_162/Channel 1","wb-mdm3_162/Input 1","wb-mdm3_162/Input 2",100,20);
RulesForLight("wb-mdm3_162/K2","wb-mdm3_162/Channel 2","wb-mdm3_162/Input 3","wb-mdm3_162/Input 4",100,20);
RulesForLight("wb-mdm3_162/K3","wb-mdm3_162/Channel 3","wb-mdm3_162/Input 5","wb-mdm3_162/Input 6",100,20);

RulesForLight("wb-mdm3_205/K1","wb-mdm3_205/Channel 1","wb-mdm3_205/Input 1","wb-mdm3_205/Input 2",100,20);
RulesForLight("wb-mdm3_205/K2","wb-mdm3_205/Channel 2","wb-mdm3_205/Input 3","wb-mdm3_205/Input 4",100,20);
RulesForLight("wb-mdm3_205/K3","wb-mdm3_205/Channel 3","wb-mdm3_205/Input 5","wb-mdm3_205/Input 6",100,20);

Работало так:
Исходное состояние свет выключен.
При нажатии на “верхний” выключатель (положение выключателя в помещении) загорался свет на 100%.
Если свет горит на 100% и нажали на “верхний” выключатель свет выключался.
Если свет выключен и нажали на “нижний” выключатель свет загорался на 20%.
Если свет горит на 20% и нажали на “нижний” выключатель свет выключался.
Если свет уже горел на 100% и нажали на “нижний” выключатель свет переключается на 20% и на оборот если горел на 20% и нажали на “верхний” выключатель свет загорится на 100%.
Диммирование удержанием в нажатом состоянии кнопок так же работало. Реализовано через штатные “зашитые” в диммер алгоритмы.
Логика управления светом с учетом диммирования такая: при коротком нажатии на на кнопку проверялось стояние света (вкл или выкл) если свет вкл проверялось значение яркости. если оно не соответствовало значению кнопки (верхняя -100%, нижняя- 20%) свет переключался на эту яркость. Если яркость соответствовала, то свет выключался.
Так и работало на прошивках диммера 2.7.1. а на контроллере 7 версии стояла прошивка четвертый квартал 2023 года. Точную версию уже сказать не могу.
После обновления контроллера пару дней назад на версию wb-2401 начались странные вещи:
При нажатии на “верхнюю” кнопку свет не включался. Если нажать на “нижнюю” кнопку свет включался и после этого действия “верхняя” кнопка начинает “работать” Иногда кнопки переставали работать. Не включали не не выключали горящий свет. Через логи вижу, что состояние (

log(channel,"level - ", dev[channel] = downlevel, dev[relay]

реле меняется (dev[relay]) но при этом сам свет не переключается. Через несколько нажатий свет переключался.
За это время конфигурация системы не менялась, писал скрипты для других устройств, но они не затрагивали логику этих диммеров.
Прошу помощи победить это проблему!

Добрый день.
Для начала проверьте как у диммера настроено действие для короткого нажатия — оно должно быть отключено.
Приведите код к минимальному виду без использования дополнительных переменных как в примере. Корректно ли будет проходить переключение? Так же проверьте, корректно ли происходит переключение состояния каналов из веб-интерфейса. Если нет — пришлите диагностический архив.

В диммере включено действие на короткое нажатие. Это работало как резерный вариант управления светом при проблемах контроллера или связи с ним. И так работало всегда.
Поясните о каких дополнительных переменных говорите?

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

Речь о переменных relay, channel, downlevel и т.п. Вы указали, что писали скрипты для других устройств, возможно эти переменные ещё где-то используются? По присланному куску кода, к сожалению, этого не видно. Поэтому попробуйте привести пример к минимальному виду, что-то вроде:

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

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

Названия некоторых переменных повторяться в других скриптах. Теоретически это же не должно быть проблемой? Закомментировал все скрипты для чистоты эксперимента. Когда менял параметры диммера в окне отладки начали появляться такие ошибки
image
А теперь совсем странно:


Теперь когда свет горит значение в логе false, а когда не горит true. Все наоборот.
А если вернуть управление работает правильно. True-горит False-не горит.

Проверьте что топики в MQTT действительно есть (существуют) с указанными именами и доступны.


С ними все нормально.

В момент сохранения настроек wb-mqtt-serial такое может быть.

Ну так не все. Что за функция RulesForLight() ?
Приложите полностью весь код, проверю у себя.

function RulesForLight(relay,channel,inputdown,inputup,uplevel,downlevel) {
  
defineRule({
  whenChanged: inputdown + " Single Press Counter",
  then: function (newValue, devName, cellName) {
    if (dev[relay] == true && dev[channel] == downlevel) {
      dev[relay] = false;
    } else {
      dev[channel] = downlevel; 
      dev[relay] = true;   
      }

   log("inputdown- ", inputdown, "; level- ", dev[channel], "; relay- ", dev[relay] )  // Вывод в лог состояние каналов
  }
});

defineRule({
  whenChanged: inputup + " Single Press Counter",
  then: function (newValue, devName, cellName) {
    if (dev[relay] == true && dev[channel] == uplevel) {
      dev[relay] = false;
    } else {
      dev[channel] = uplevel;
      dev[relay] = true;
      }
   log("inputup - ", inputup, "; level- ", dev[channel], "; relay- ", dev[relay] ) // Вывод в лог состояние каналов
  }
});

}
RulesForLight("wb-mdm3_162/K1","wb-mdm3_162/Channel 1","wb-mdm3_162/Input 1","wb-mdm3_162/Input 2",100,20);
RulesForLight("wb-mdm3_162/K2","wb-mdm3_162/Channel 2","wb-mdm3_162/Input 3","wb-mdm3_162/Input 4",100,20);
RulesForLight("wb-mdm3_162/K3","wb-mdm3_162/Channel 3","wb-mdm3_162/Input 5","wb-mdm3_162/Input 6",100,20);

RulesForLight("wb-mdm3_205/K1","wb-mdm3_205/Channel 1","wb-mdm3_205/Input 1","wb-mdm3_205/Input 2",100,20);
RulesForLight("wb-mdm3_205/K2","wb-mdm3_205/Channel 2","wb-mdm3_205/Input 3","wb-mdm3_205/Input 4",100,20);
RulesForLight("wb-mdm3_205/K3","wb-mdm3_205/Channel 3","wb-mdm3_205/Input 5","wb-mdm3_205/Input 6",100,20);

RulesForLight("wb-mdm3_60/K1","wb-mdm3_60/Channel 1","wb-mdm3_60/Input 1","wb-mdm3_60/Input 2",100,20);
RulesForLight("wb-mdm3_60/K2","wb-mdm3_60/Channel 2","wb-mdm3_60/Input 3","wb-mdm3_60/Input 4",100,20);
RulesForLight("wb-mdm3_60/K3","wb-mdm3_60/Channel 3","wb-mdm3_60/Input 5","wb-mdm3_60/Input 6",100,20);// Гостинная

RulesForLight("wb-mdm3_73/K1","wb-mdm3_73/Channel 1","wb-mdm3_73/Input 1","wb-mdm3_73/Input 2",100,20);
RulesForLight("wb-mdm3_73/K2","wb-mdm3_73/Channel 2","wb-mdm3_73/Input 3","wb-mdm3_73/Input 4",100,20);
//RulesForLight("wb-mdm3_73/K3","wb-mdm3_73/Channel 3","wb-mdm3_73/Input 5","wb-mdm3_73/Input 6",100,20); //Дежурное освещение лестницы

//RulesForLight("wb-mdm3_75/K1","wb-mdm3_75/Channel 1","wb-mdm3_75/Input 1","wb-mdm3_75/Input 2",100,20); //Люстра на террасе
RulesForLight("wb-mdm3_75/K2","wb-mdm3_75/Channel 2","wb-mdm3_75/Input 3","wb-mdm3_75/Input 4",100,20);
//RulesForLight("wb-mdm3_75/K3","wb-mdm3_75/Channel 3","wb-mdm3_75/Input 5","wb-mdm3_75/Input 6",100,20); //Рабочий стол 3-й этаж

RulesForLight("wb-mdm3_84/K1","wb-mdm3_84/Channel 1","wb-mdm3_84/Input 1","wb-mdm3_84/Input 2",100,20);
RulesForLight("wb-mdm3_84/K2","wb-mdm3_84/Channel 2","wb-mdm3_84/Input 3","wb-mdm3_84/Input 4",100,20);
RulesForLight("wb-mdm3_84/K3","wb-mdm3_84/Channel 3","wb-mdm3_84/Input 5","wb-mdm3_84/Input 6",100,20);

RulesForLight("wb-mdm3_89/K1","wb-mdm3_89/Channel 1","wb-mdm3_89/Input 1","wb-mdm3_89/Input 2",100,20);
RulesForLight("wb-mdm3_89/K2","wb-mdm3_89/Channel 2","wb-mdm3_89/Input 3","wb-mdm3_89/Input 4",100,20);
RulesForLight("wb-mdm3_89/K3","wb-mdm3_89/Channel 3","wb-mdm3_89/Input 5","wb-mdm3_89/Input 6",100,20);

RulesForLight("wb-mdm3_99/K1","wb-mdm3_99/Channel 1","wb-mdm3_99/Input 1","wb-mdm3_99/Input 2",100,20);
RulesForLight("wb-mdm3_99/K2","wb-mdm3_99/Channel 2","wb-mdm3_99/Input 3","wb-mdm3_99/Input 4",100,20);
RulesForLight("wb-mdm3_99/K3","wb-mdm3_99/Channel 3","wb-mdm3_99/Input 5","wb-mdm3_99/Input 6",100,20);

Как-то странно в логе не отображается последнее действие. Поэтому у меня возникло ощущение, что значение что значение dev[relay] инвертировано

log("inputup - ", inputup, "; level- ", dev[channel], "; relay- ", dev[relay] )

Получается если нажимать одну кнопку подряд несколько раз свет вкл и выкл, а лог на шаг отстает. Вот и кажется, что значение реле не правильное.

Второе наблюдение. По рекомендации отключил действия по нажатию клавиш в контроллере. Стало работать стабильно, пока сбоев не наблюдал.
Ранее когда устройств на rs-485 интерфейсе было мало и длина линии была в рамках щита все работало стабильно даже при включенном действии контроллера по нажатию клавиш. Сейчас устройств стало больше. Может в этом частичная проблема. Пару раз замечал что при нажатии клавиши свет включался на доли секунд и опять выключался. Может так проявляется конфликт между моим скриптом и логикой контроллера. Увеличение линии увеличила время прохождения команд. Может это и приводит к конфликту логики контроллера и скриптов.

Проверил, в целом все работает как нужно.

Судя по всему при выводе лога состояние канала еще не успело поменяться, потому выводится значение до изменения.

В этом и была причина. Если вы в настройках указываете действие, например, “Переключить”, то из скрипта лучше не переключать состояние. В таком случае лучше создать правило, которое будет следить за переключением канала и менять яркость в зависимости от того, какой счетчик увеличился.