Глюк скрипта wb-press-actions

У меня иногда бывают перебои со светом и я заметил, что при восстановлении электричества некоторые лампочки самостоятельно загораются.
И это происходит только с теми лампочками, которые активируются при помощи скрипта wb-press-actions.
Что с этим делать?

var pa = require("wb-press-actions"); 

var commands = [
    { btnControl: "wb-mr6c_120/Input 6 Double Press Counter", actionControl: "wb-mr6c_128/K2", actionType: "toggle" },    
    { btnControl: "wb-mr6c_126/Input 6 Double Press Counter", actionControl: "wb-mr6c_128/K1", actionType: "toggle" },    
    { btnControl: "wb-mr6c_128/Input 1 Double Press Counter", actionControl: "wb-mr6c_126/K6", actionType: "toggle" },   
  ];

pa.init(commands);

Добрый день.
Какая ревизия контроллера, версия ПО? Какая ревизия модулей, версии прошивки?
Для диагностики проблемы пришлите, пожалуйста, архив с диагностической информацией контроллера. Создание архива описано в документации.
В модуле wb-press-actions при выборе типа действия «toggle» используется правило, похожее на то, что обсуждали в похожей теме — Отработка правил завязанных на счетчики при перезагрузке. Предполагаю, что у вас проблема аналогичная.

где все эти ревизии найти?

Ревизия написана на наклейках на корпусе, а версию прошивки можно посмотреть в веб-интерфейсе контроллера.

это мне все устройства на дин рейке раздвигать?

Batch No 7.3.4E/6 684
Current uptime 0d 10h 45m
DTS Version 733
HW Revision 7.3.4
Manufacturing Date 2023-03-24 11:39:19
Release name wb-2307
Release suite stable
Short SN AM363YRR
Temperature Grade industrial

приложен диагностический архив, доступен только сотрудникам поддержки
(233,3 КБ)

WB-MR6C 118
HW: v4.2D/S
FW:1.18.5
104985

WB-MR6C 120
HW: v4.2D/S
FW:1.18.5
104992

WB-MR6C 126
HW: v4.2D/S
FW:1.18.5
105026

WB-MR6C 128
HW: v4.2D/S
FW:1.18.5
105036

на всех устройствах полгода назад я обновлял версии прошивок

2023-08-29 15:00:56,202 Update: 4.22.1+wb1 -> 4.29.11 (WB-MSW v.3 (133, /dev/ttyRS485-1))
2023-08-29 15:00:57,667 Update: 4.26.0 -> 4.29.11 (WB-MSW v.3 (59, /dev/ttyRS485-1))
2023-08-29 15:00:59,089 Update: 1.18.5 -> 1.20.1 (WB-MR6C (128, /dev/ttyRS485-1))
2023-08-29 15:01:00,398 Update: 1.5.3 -> 1.6.1 (WB-MIO (70, /dev/ttyRS485-1))
2023-08-29 15:01:01,826 Update: 1.18.5 -> 1.20.1 (WB-MR6C (126, /dev/ttyRS485-1))
2023-08-29 15:01:03,303 Update: 1.18.5 -> 1.20.1 (WB-MR6C (120, /dev/ttyRS485-1))
2023-08-29 15:01:04,826 Update: 4.22.1+wb1 -> 4.29.11 (WB-MSW v.3 (62, /dev/ttyRS485-1))
2023-08-29 15:01:06,319 Update: 1.18.5 -> 1.20.1 (WB-MR6C (118, /dev/ttyRS485-1))
2023-08-29 15:01:07,772 Update: 2.3.8 -> 2.6.2 (WB-MAP3ET (145, /dev/ttyRS485-1))
2023-08-29 15:01:09,283 Update: 4.22.1+wb1 -> 4.29.11 (WB-MSW v.3 (127, /dev/ttyRS485-1))
2023-08-29 15:01:10,792 Update: 4.22.1+wb1 -> 4.29.11 (WB-MSW v.3 (136, /dev/ttyRS485-1))
2023-08-29 15:01:12,234 Update: 4.22.1+wb1 -> 4.29.11 (WB-MSW v.3 (112, /dev/ttyRS485-1))

Попробуйте использовать следующие правила без использования модуля wb-press-actions, т.е. замените приведенный вами код на следующий:

defineRule({
  whenChanged: "wb-mr6c_120/Input 6 Double Press Counter",
  then: function (newValue, devName, cellName) {
    if (this.prevValue === undefined) {
      this.prevValue = newValue;
      return;
    }
    if (this.prevValue == newValue) {
      return;
    }
    dev["wb-mr6c_128/K1"] = !dev["wb-mr6c_128/K1"];
    dev["wb-mr6c_128/K2"] = !dev["wb-mr6c_128/K2"];
    this.prevValue = newValue;
  },
});

defineRule({
  whenChanged: "wb-mr6c_128/Input 1 Double Press Counter",
  then: function (newValue, devName, cellName) {
    if (this.prevValue === undefined) {
      this.prevValue = newValue;
      return;
    }
    if (this.prevValue == newValue) {
      return;
    }
    dev["wb-mr6c_126/K6"] = !dev["wb-mr6c_126/K6"];
    this.prevValue = newValue;
  },
});

Будет ли повторяться данная проблема?

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

Есть ощущение, что после восстановления электричества кнопка срабатывает не каждый раз, а есть ещё какое-то условие.
Я попробовал вырубить автомат и включить заново, но реле сработало только при первом цикле ВЫКЛ/ВКЛ.
Потом ещё раз 5 пробовал, но все следующие попытки ничего не происходило.
Не понимаю что делать, чтобы каждый раз работало.
Сначала просто отключал, ждал пару секунд пока все лампочки на модулях реле потухли и потом включал.
Потом пробовал делать задержку 1 минуту до обратного включения.
В итоге минут 20 дёргал автомат туда сюда с разной задержкой, но сработало только в первый раз.

Сейчас внёс изменения в скрипт по вашему предложению.
Пока единственное что заметил - это что первое двойное нажатие после изменения скрипта не приводит к переключению реле.
Только начиная со второго раза работает.

Да, так и должно быть, поскольку выполняется условие на:

После изменений изначальная проблема не повторялась?

Вот сегодня утром проснулся и проблема повторилась.
Эти правила у меня есть в двух файлах gate.js и

И утром я обнаружил:

  1. Гаражные ворота открыты
  2. Викин ночник включен
  3. Люстра на кухне и Викина люстра были выключены.

Что-то сработало, а что-то нет

gate.js

var timeout = 100
gateTopics = ["wb-mio-gpio_70:3/K1",    "wb-mio-gpio_70:3/K2",    "wb-mio-gpio_70:3/K3", "wb-mio-gpio_70:3/K4",       "wb-mio-gpio_70:3/K8",]
gateNames =  ["открыть главные ворота", "закрыть главные ворота", "SBS главные ворота",  "остановить главные ворота", "SBS гаражные ворота",]


defineVirtualDevice("GarageGateControl", { 
    title: "Управление гаражными воротами",  
    cells: {
      Up: { 
        title: "ВВЕРХ",
        type: "switch",
        value: false,
      }, 
      Down: { 
        title: "ВНИЗ",
        type: "switch",
        value: false,
      }, 
      Stop: { 
        title: "СТОП",
        type: "switch",
        value: false,
      }
  }
});

defineRule("GateControl", { 
  whenChanged: gateTopics,
  then: function (newValue, devName, cellName) {
    var index = gateTopics.indexOf(devName + '/' + cellName);
    if (newValue == true) {
      setTimeout(function (){
        dev[gateTopics[index]]=false;
      }, timeout);
      SendTelegramMsg('Нажата кнопка ' + gateNames[index] + ' в Южном');
    }
  }
});


// гаражные ворота открываются от длинного нажатия левого выкл в коридоре
defineRule({
  whenChanged: "wb-mr6c_118/Input 5 Long Press Counter",
  then: function (newValue, devName, cellName) {
    if (this.prevValue === undefined) {
      this.prevValue = newValue;
      return;
    }
    if (this.prevValue == newValue) {
      return;
    }
    dev["wb-mio-gpio_70:3/K8"] = !dev["wb-mio-gpio_70:3/K8"];
    this.prevValue = newValue;
  },
});

// гаражные ворота открываются от длинного нажатия выкл в гараже
defineRule({
  whenChanged: "wb-mr6c_118/Input 2 Long Press Counter",
  then: function (newValue, devName, cellName) {
    if (this.prevValue === undefined) {
      this.prevValue = newValue;
      return;
    }
    if (this.prevValue == newValue) {
      return;
    }
    dev["wb-mio-gpio_70:3/K8"] = !dev["wb-mio-gpio_70:3/K8"];
    this.prevValue = newValue;
  },
});

light.js

// master switch OFF all light when leave home
defineRule("MasterSwitch", {
	whenChanged: "wb-mr6c_118/Input 6 Long Press Counter",
	then: function (newValue, devName, cellName) {
		dev["wb-mr6c_118"]["K1"] = false; // свет в подсобке 
		dev["wb-mr6c_118"]["K2"] = false; // свет в гараже 
		dev["wb-mr6c_118"]["K3"] = false; // 							резерв для парковки
		dev["wb-mr6c_118"]["K4"] = false; // свет в гардеробной
		dev["wb-mr6c_118"]["K5"] = false; // свет в коридоре
		dev["wb-mr6c_118"]["K6"] = false; // свет на крыльце
		dev["wb-mr6c_120"]["K1"] = false; // 							резерв для подсветки крыши 
		dev["wb-mr6c_120"]["K2"] = false; // свет на чердаке 
		dev["wb-mr6c_120"]["K3"] = false; // свет в холле 2 этажа 
		dev["wb-mr6c_120"]["K4"] = false; // свет в сортире
		dev["wb-mr6c_120"]["K5"] = false; // люстра в гостиной
		dev["wb-mr6c_120"]["K6"] = false; // свет на веранде
		dev["wb-mr6c_126"]["K1"] = false; // Варькин ночник
		dev["wb-mr6c_126"]["K2"] = false; // Варькина люстра
		dev["wb-mr6c_126"]["K3"] = false; // Люстра в спальне
		dev["wb-mr6c_126"]["K4"] = false; // Настин ночник
		dev["wb-mr6c_126"]["K5"] = false; // Свет в ванной 2 эт
		dev["wb-mr6c_126"]["K6"] = false; // Викин ночник
		dev["wb-mr6c_128"]["K1"] = false; // Викина люстра
		dev["wb-mr6c_128"]["K2"] = false; // Люстра на кухне
		dev["wb-mr6c_128"]["K3"] = false; // Точечные светильники на кухне
		dev["wb-mr6c_128"]["K4"] = false; // свет в кабинете
		dev["wb-mr6c_128"]["K5"] = false; // 
		dev["wb-mr6c_128"]["K6"] = false; // 
      
		SendTelegramMsg('MasterSwitch ON - весь свет выключен.'); 
		log ('MasterSwitch ON - весь свет выключен.');
	}
});


// Люстра на кухне включается от двойного нажатия выкл на кухне (который управляет светом на веранде)
defineRule({
  whenChanged: "wb-mr6c_120/Input 6 Double Press Counter",
  then: function (newValue, devName, cellName) {
    if (this.prevValue === undefined) {
      this.prevValue = newValue;
      return;
    }
    if (this.prevValue == newValue) {
      return;
    }
    dev["wb-mr6c_128/K2"] = !dev["wb-mr6c_128/K2"];
    this.prevValue = newValue;
  },
});

// Викина люстра включается от двойного нажатия выкл у Викиной кровати
defineRule({
  whenChanged: "wb-mr6c_126/Input 6 Double Press Counter",
  then: function (newValue, devName, cellName) {
    if (this.prevValue === undefined) {
      this.prevValue = newValue;
      return;
    }
    if (this.prevValue == newValue) {
      return;
    }
    dev["wb-mr6c_128/K1"] = !dev["wb-mr6c_128/K1"];
    this.prevValue = newValue;
  },
});

// Викин ночник включается от двойного нажатия главного выкл в Викиной комнате
defineRule({
  whenChanged: "wb-mr6c_128/Input 1 Double Press Counter",
  then: function (newValue, devName, cellName) {
    if (this.prevValue === undefined) {
      this.prevValue = newValue;
      return;
    }
    if (this.prevValue == newValue) {
      return;
    }
    dev["wb-mr6c_126/K6"] = !dev["wb-mr6c_126/K6"];
    this.prevValue = newValue;
  },
});

Доброго дня.
Баг выявили, готовим исправление.
Как только будут новости, я вас сразу оповещу.

когда будет исправление? уже месяц прошёл

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

Есть какие то сроки?

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

Добрый день.
Проверил ваши скрипты на вашей конфигурации. По сути повторяются все изложенные мысли в данной теме: Отработка правил завязанных на счетчики при перезагрузке - #8 от пользователя vkl62. Используемые вами скрипты не покрывали ситуацию, когда занулялись счетчики после перезагрузки модуля по питанию.
Т.к. проблема еще не решена, могу предложить подобное решение как в указанной выше теме.

gate.js

var timeout = 100
gateTopics = ["wb-mio-gpio_70:3/K1",    "wb-mio-gpio_70:3/K2",    "wb-mio-gpio_70:3/K3", "wb-mio-gpio_70:3/K4",       "wb-mio-gpio_70:3/K8",]
gateNames =  ["открыть главные ворота", "закрыть главные ворота", "SBS главные ворота",  "остановить главные ворота", "SBS гаражные ворота",]


defineVirtualDevice("GarageGateControl", { 
    title: "Управление гаражными воротами",  
    cells: {
      Up: { 
        title: "ВВЕРХ",
        type: "switch",
        value: false,
      }, 
      Down: { 
        title: "ВНИЗ",
        type: "switch",
        value: false,
      }, 
      Stop: { 
        title: "СТОП",
        type: "switch",
        value: false,
      }
  }
});

defineRule("GateControl", { 
  whenChanged: gateTopics,
  then: function (newValue, devName, cellName) {
    var index = gateTopics.indexOf(devName + '/' + cellName);
    if (newValue == true) {
      setTimeout(function (){
        dev[gateTopics[index]]=false;
      }, timeout);
      SendTelegramMsg('Нажата кнопка ' + gateNames[index] + ' в Южном');
    }
  }
});


// гаражные ворота открываются от длинного нажатия левого выкл в коридоре
defineRule({
    whenChanged: "wb-mr6c_118/Input 5 Long Press Counter",
    then: function(newValue, devName, cellName) {
        log("Срабатывание правила newValue: {}, предыдущее значение: {}".format(newValue, this.prevValue));
        if (newValue === null) return;
        if (newValue == this.prevValue) return;
        if (newValue == 0) {
            if (this.prevValue < (65536 - 5)) {
                return;
            }
        }
        if (newValue > 0) {
            log("Выход переключился")
            dev["wb-mio-gpio_70:3/K8"] = !dev["wb-mio-gpio_70:3/K8"];
        }
        this.prevValue = newValue;
    }
});

// гаражные ворота открываются от длинного нажатия выкл в гараже
defineRule({
    whenChanged: "wb-mr6c_118/Input 2 Long Press Counter",
    then: function(newValue, devName, cellName) {
        log("Срабатывание правила newValue: {}, предыдущее значение: {}".format(newValue, this.prevValue));
        if (newValue === null) return;
        if (newValue == this.prevValue) return;
        if (newValue == 0) {
            if (this.prevValue < (65536 - 5)) {
                return;
            }
        }
        if (newValue > 0) {
            log("Выход переключился")
            dev["wb-mio-gpio_70:3/K8"] = !dev["wb-mio-gpio_70:3/K8"];
        }
        this.prevValue = newValue;
    }
});

light.js

// master switch OFF all light when leave home
defineRule("MasterSwitch", {
	whenChanged: "wb-mr6c_118/Input 6 Long Press Counter",
	then: function (newValue, devName, cellName) {
		dev["wb-mr6c_118"]["K1"] = false; // свет в подсобке 
		dev["wb-mr6c_118"]["K2"] = false; // свет в гараже 
		dev["wb-mr6c_118"]["K3"] = false; // 							резерв для парковки
		dev["wb-mr6c_118"]["K4"] = false; // свет в гардеробной
		dev["wb-mr6c_118"]["K5"] = false; // свет в коридоре
		dev["wb-mr6c_118"]["K6"] = false; // свет на крыльце
		dev["wb-mr6c_120"]["K1"] = false; // 							резерв для подсветки крыши 
		dev["wb-mr6c_120"]["K2"] = false; // свет на чердаке 
		dev["wb-mr6c_120"]["K3"] = false; // свет в холле 2 этажа 
		dev["wb-mr6c_120"]["K4"] = false; // свет в сортире
		dev["wb-mr6c_120"]["K5"] = false; // люстра в гостиной
		dev["wb-mr6c_120"]["K6"] = false; // свет на веранде
		dev["wb-mr6c_126"]["K1"] = false; // Варькин ночник
		dev["wb-mr6c_126"]["K2"] = false; // Варькина люстра
		dev["wb-mr6c_126"]["K3"] = false; // Люстра в спальне
		dev["wb-mr6c_126"]["K4"] = false; // Настин ночник
		dev["wb-mr6c_126"]["K5"] = false; // Свет в ванной 2 эт
		dev["wb-mr6c_126"]["K6"] = false; // Викин ночник
		dev["wb-mr6c_128"]["K1"] = false; // Викина люстра
		dev["wb-mr6c_128"]["K2"] = false; // Люстра на кухне
		dev["wb-mr6c_128"]["K3"] = false; // Точечные светильники на кухне
		dev["wb-mr6c_128"]["K4"] = false; // свет в кабинете
		dev["wb-mr6c_128"]["K5"] = false; // 
		dev["wb-mr6c_128"]["K6"] = false; // 
      
		SendTelegramMsg('MasterSwitch ON - весь свет выключен.'); 
		log ('MasterSwitch ON - весь свет выключен.');
	}
});


// Люстра на кухне включается от двойного нажатия выкл на кухне (который управляет светом на веранде)
defineRule({
    whenChanged: "wb-mr6c_120/Input 6 Double Press Counter",
    then: function(newValue, devName, cellName) {
        log("Срабатывание правила newValue: {}, предыдущее значение: {}".format(newValue, this.prevValue));
        if (newValue === null) return;
        if (newValue == this.prevValue) return;
        if (newValue == 0) {
            if (this.prevValue < (65536 - 5)) {
                return;
            }
        }
        if (newValue > 0) {
            log("Выход переключился")
            dev["wb-mr6c_128/K2"] = !dev["wb-mr6c_128/K2"];
        }
        this.prevValue = newValue;
    }
});

// Викина люстра включается от двойного нажатия выкл у Викиной кровати
defineRule({
    whenChanged: "wb-mr6c_126/Input 6 Double Press Counter",
    then: function(newValue, devName, cellName) {
        log("Срабатывание правила newValue: {}, предыдущее значение: {}".format(newValue, this.prevValue));
        if (newValue === null) return;
        if (newValue == this.prevValue) return;
        if (newValue == 0) {
            if (this.prevValue < (65536 - 5)) {
                return;
            }
        }
        if (newValue > 0) {
            log("Выход переключился")
            dev["wb-mr6c_128/K1"] = !dev["wb-mr6c_128/K1"];
        }
        this.prevValue = newValue;
    }
});

// Викин ночник включается от двойного нажатия главного выкл в Викиной комнате
defineRule({
    whenChanged: "wb-mr6c_128/Input 1 Double Press Counter",
    then: function(newValue, devName, cellName) {
        log("Срабатывание правила newValue: {}, предыдущее значение: {}".format(newValue, this.prevValue));
        if (newValue === null) return;
        if (newValue == this.prevValue) return;
        if (newValue == 0) {
            if (this.prevValue < (65536 - 5)) {
                return;
            }
        }
        if (newValue > 0) {
            log("Выход переключился")
            dev["wb-mr6c_126/K6"] = !dev["wb-mr6c_126/K6"];
        }
        this.prevValue = newValue;
    }
});

Для временного решения вашей проблемы, попробуйте данный вариант и сообщите, пожалуйста, о результате.

здравствуйте,

а зачем вот это log("Выход переключился")?

можете немного пояснить, что тут происходит?

        log("Срабатывание правила newValue: {}, предыдущее значение: {}".format(newValue, this.prevValue));
        if (newValue === null) return;
        if (newValue == this.prevValue) return;
        if (newValue == 0) {
            if (this.prevValue < (65536 - 5)) {
                return;
            }
        }

На постоянной основе лучше строку с логгированием убрать. Была нужна для отладки/проверки.

Часть кода для исключения ложных срабатываний.
Не реагирует при появлении null в счетчике.
Сохраняет текущее значение для последующего сравнения.
Обработка переполнения счетчика и обнуления при переподаче питания на модуль.