Есть WB 8.5, к ней подключены MR6C v2 и LED модули. Размещение выключателей и света и их комбинаций управления довольно замороченное, поэтому я не стал даже пытаться сводить их в схему input → output, а просто подвёл нужные мне кнопочные выключатели к “каким-то” input-ам (в MR6C, в LED). Настроил так:
на всех MR6C input → According to button mapping-matrix, везде по Output → no action, везде Input * Counter / Signle Press Counter / Long Press Counter → Fast ModBus.
На всех Output настроено .. after power on → safe state и, собственно, safe state → off.
на всех LED-input: input → button, все Action → Nothing, чтения * Counter → Fast ModBus. та же история с after power on/safe state.
А логику связки кнопок с устройствами сделал на rules. Всё работает, как надо до тех пор, пока не отключается свет. После восстановления питания wb загружается, модули стартуют и… включают весь свет во всём доме - все LED/MR6C output’ы загораются. Несмотря на все safe state.
Кстати, аналогично себя ведёт при обновлении прошивок через web ui - обновляю один модуль MR6C, он перегружается и… включается свет LED, который висит на правилах каунтеров кнопок с этого MR6C. Ощущение, что он при включении тригерит событие в mqtt по кнопке, но при этом каунтеры кнопок таки остаются в 0.
ЧЯДНТ?
Добрый день!
Проведите требуемые вам настройки безопасного режима (см. Настройка безопасного режима).
А при чём здесь safety mode? Это ж режим для потери связи с контроллером. У меня связь не теряется. У меня питание теряется. И после возобновления - модуль выходит не в то состояние, которое задано для “состояние после восстановления питания”.
Да даже если - сейчас в настройках safety mode стоит всё по-дефолту: 10 секунд и “ничего не менять”. Так что даже если предположить, что модуль загружается раньше, чем сам контроллер, то он не должен НИЧЕГО ДЕЛАТЬ - почему он свет-то включает?
Пожалуйста, пришлите больше информации:
- версия прошивки модуля;
- серийный номер;
- диагностический архив;
- убедитесь что на включение не оказывает влияние ваши правила. Временно отключите их.
Создание архива описано в документации.
Добрый день!
Вам удалось решить проблему?
Кажется, удалось. Проблема, похоже, в инициализации движка rules. У меня все правила такого вида
defineRule(“K_LED_toggle-1”, {
whenChanged: “wb-mr6c_196/Input 1 counter”,
then: function(newValue, deviceName, cellName) {
dev[“wb-led_209/Channel 4”] = !dev[“wb-led_209/Channel 4”];
}
})
Похоже, что после перезапуска происходит сброс счётчиков в 0 с тригером rules. Т.е. счётчики не просто инициализируются в 0 заново, а именно устанавливаются. Что прождает событие, которое ловится rules и срабатывает правило на change.
Вылечил добавлением во все правила условия if (newValue === 0) return;
Лютый костылище. По сути, этого вызова не должно происходить, потому что собственно change никакого не происходит, чтоб whenChanged тригерился. Сдаётся мне, это вам в прошивке надо бы править.
таки в первом же сообщении и было у меня корректное подозрение 
Уточните, пожалуйста, версии прошивок модулей WB-LED, WB-MR6C и версию wb-rules. Лучше все же выслать диагархив. Я уточню у разработчиков про поведение движка.
приложен диагностический архив, доступен только сотрудникам поддержки
(716.9 KB)
вот диаг архив
прошивки всех модулей последние (из стабильных) :
MR6C: 1.26.3
LED: 3.7.1
голова: HW Revision 8.5.3, Release name wb-2606
Благодарю. Узнаю информацию и вернусь с ответом.
Удалось разобраться — поведение ожидаемое: это не баг прошивки модуля, а штатная реакция движка правил на изменение значения.
Счётчик срабатываний входа у модулей реле (WB-MR6C) хранится в оперативной (энергозависимой) памяти — это 16-битный счётчик для детектирования нажатий, а не счётчик учёта. Поэтому при пропадании питания на самом модуле он сбрасывается в 0.
Для движка правил этот сброс — обычное изменение значения счётчика (было N, стало 0). Правило с whenChanged на этом счётчике реагирует на любое изменение значения, поэтому при обнулении и срабатывает и переключает свет. Контроллер и само реле при этом работают корректно. Поэтому ваш подход — проверка значения в начале правила — здесь отлично подходит.
Если нужны именно энергонезависимые счётчики (чтобы значение переживало пропадание питания) — это про модуль счётных входов WB-MCM8, там счётчики 32-битные и хранятся в энергонезависимой памяти.
Скажем так, это “объяснение” - больше похоже на натягивание совы на глобус, уж извините :). Попытка выдать технически сложившуюся логику за нормальное поведение.
С точки зрения здравого смысла и ожиданий пользователя - происходит change (событие изменения) там, где на самом деле изменения нет. Кнопка не нажималась. А событие есть.
Вы предлагаете изменить логику работы whenChanged в WB-Rules или хранить энергонезависимой памяти значения счётчика?
Мне кажется, что wb-rules не должен получать whenChanged при обнулении счётчика. Это логический уровень приложения. А обнуление счётчика - это уровень инфраструктурный.
И его можно хоть 50 раз подряд сбросить в 0, но ни один из этих разов не будет означать реальное событие замыкания контакта.
Почему? То есть почему не должен срабатывать если поведение функции описано в документации как раз на изменение?
Нет, неверно. Функция реагирует на изменение значения.
Исключение случаев когда значение меняется после перезапуска периферийных модулей - вопрос программирования обработки. Я использовал исключение, например когде текущее 0 и предыдущее менее 65500.
Либо когда uptime модуля менее 100.
В документации как раз написано, что это событие, которое возникает при изменении состояния контакта (инкрементится каунтер). Здесь не происходит с контактом ничего, а событие срабатывает. Если не слушать Count, а слушать чистый топик кнопки - не будет мусорного события. Т.е. получается, что если подписаться на все события, то при сбросе счётчика произойдёт и одинарное и двойное и длинное нажатие (по топикам Channel X .... Count, но НЕ произойдёт просто нажатие по топику Channel X. Это нормально?
А значение (по документации) изменяется при замыкании контакта. Формально, конечно, можно позаниматься софистикой и представить себе, что это просто какой-то счётчик и что никакого модуля, замыкания контактов которого он обрабатывает, не существует..
Но, кстати, классный пример про 65500. Там 1 байт чтоль на счётчик? Т.е. после 65535 он обнулится? И код, который должен игнорировать 0 не сработает? Или вы и там костылик сделали и вместо 0 сразу в 1 выставляется при переполнении?
Ну серьёзно - есть железный девайс. Есть его контакт. При замыкании контакта посылается сигнал. “НО ещё сигнал может посылаться без замыкания контакта” - звучит странно, неправда ли? 
В случае аварии (а снятие питания с периферии - авария) - да, счетчик сбросится.
Один регистр. И это описано в таблице регистров.
Да.
Нет, не странно. ПО работает не с железом а с значениями. Да, занчения могут сбрасываться при выключении питания. Выключение питания - это нештатное поведение, авария.