Последний месяц (после пары лет работы) начали происходит аномалии со вторым каналом mdm3. То свет не выключается, то не включается. Раньше решалось - перегрузкой устройства (запись в регистр). Сейчас опять это всплыло - никто ничего не трогает, хотим через Вас попробовать выявить причину. К сожалению на объекте бываю редко и по месту бабушке что-то тяжело сделать, но всё же возможно. Я сделал скриншот:
Это скриптом попытка выключить по нажатию кнопки. Свет не горит! Скрипт соответственно делает обратное значение от текущего, а как видно на скриншоте switch К2 включен, скрипт пытается всегда выключить. Но это у него не получается.
В контролах этот switch так же всегда true: /devices/wb-mdm3_233/controls/K2 true
кусок скрипта:
if (dev["wb-mdm3_233"]["K2"]){
log ("Свет в ванной выключаем...");
...
dev["wb-mdm3_233"]["K2"] = false;
}
В данный момент по логам всегда попадаем в эту ветку выключения.
Есть устройство wb-gpio с подключенной к входу EXT1_IN12 кнопочным выключателем.
Есть модуль MDM3 с адресом 233.
Есть скрипт:
defineRule("switchbath", {
whenChanged: "wb-gpio/EXT1_IN12",
then: function (newValue, devName, cellName){
if (newValue>0){
....
if (dev["wb-mdm3_233"]["K2"]){
log ("Свет в ванной выключаем...");
...
dev["wb-mdm3_233"]["K2"] = false;
...
}
Ошибок обмена в логах не находит:
root@wirenboard-AYFITZ72:~# less /var/log/messages | grep mdm
root@wirenboard-AYFITZ72:~#
Если остановить движок правил и управлять только из интерфейса - диммер включается-выключается?
да работает. и после того как его “сдернуть” (заставить включаться и выключатся) с web интерфейса или ребутом устройства - все работает какое-то время нормально.
journalctl -b 0 -p 4 -u wb-mqtt-serial
– Logs begin at Thu 2022-07-28 11:14:16 MSK, end at Thu 2022-07-28 12:47:35 MSK. –
Jul 28 11:14:21 wirenboard-AYFITZ72 wb-mqtt-serial[1958]: WARNING: [serial device] TSerialDevice::ReadRegister(): Serial protocol error: request timed out [slave_id is mercury200:40637969]
…
и т.д. всё касаемо mercury200
Хороший вопрос, но наверное отвечу - что так издавна сложилось, причем во всех скриптах. Как надо верно? Просто везде на этом объекте все работает 2 года и именно в этом месте что-то идет не так.
efineRule("switchbath", {
whenChanged: "wb-gpio/EXT1_IN12",
then: function (newValue, devName, cellName){
if (newValue>0){
//log ("Свет в ванной выключаем1");
if (dev["wb-mdm3_233"]["K2"]){
log ("Свет в ванной выключаем...");
if (true){ // по логу работы выражение истина и мы входим в If, по логике это проверка времени последнего включения
dev["wb-mdm3_233"]["K2"] = false; // собственно в этом месте мы и посылаем в топик 0 (который на первом скрине)
}
}
}else{
dev["wb-mdm3_233"]["K2"] = true;
}
}
}
});
Согласен, но тут логика намного сложнее и завязана с датчиками пере переключением. Поэтому проще было просто написать false. Это выжимка из скрипта, как просил Андрей.
Все ж не в скрипте дело. Драйвер при публикиции нового значение в /on пишет его, значение в устройство. При следующем чтении из устройства уже должно вернуться значение.
Тут - либо не записалось (но была б ошибка)
Все же что выводит в логи, покажите без параметра “-p”
может я не совсем понял с журналом, но лог начинается с Thu 2022-07-28 14:48:17 MSK. Что бы я не задавал по глубине - лог с этого момента.
Поэтому прикрепляю файл что есть. log-file.zip (226.2 КБ)
А Debug режим включен и был? То есть оно в продакшене с ним работало?
По логу: не вижу ни одного чтения ReadFrame: e9 01 02
Для этого входа настроено чтение в wb-mqtt-serial.conf?
Покажите секцию настроек диммера из конфига, настройте чтение входа.
Хорошо, настроил. Вопрос на будущее, что нужно подготовить если вдруг опять подзависнет. Зависает один и тот же канал, другие работают без проблем при настройках по дефолту.