1-wire watchdog

У меня такая ситуация с датчиками: появляются “левые” датчики непонятно откуда. Всего подключено два датчика, купленных у вас, топология - “звезда” (ну или параллельное подключение". С контактами должно быть всё в порядке, подключение через клеммники WAGO. Подключено тремя проводами, т.е. +5 вольт присутствует, длина линий примерно метра 4-5, подключено всё витой парой 5-й категории, не экранированной. Основную часть времени всё в порядке, но периодически значения пропадают и появляются новые устройства. Например, у меня есть два датчика:

/devices/wb-w1/controls/28-0516812aa2ff
/devices/wb-w1/controls/28-800000046354

но через какое-то время появляются посторонние:

вот что выходит

/devices/wb-w1/controls/28-000000000000
/devices/wb-w1/controls/28-000000000001
/devices/wb-w1/controls/28-000000000354
/devices/wb-w1/controls/28-000000046354
/devices/wb-w1/controls/28-0516812aa2ff
/devices/wb-w1/controls/28-080000046354
/devices/wb-w1/controls/28-100000000000
/devices/wb-w1/controls/28-100000046354
/devices/wb-w1/controls/28-200000000000
/devices/wb-w1/controls/28-200000000001
/devices/wb-w1/controls/28-200000046354
/devices/wb-w1/controls/28-280000046354
/devices/wb-w1/controls/28-300000046354
/devices/wb-w1/controls/28-400000000000
/devices/wb-w1/controls/28-400000000001
/devices/wb-w1/controls/28-400000046354
/devices/wb-w1/controls/28-480000046354
/devices/wb-w1/controls/28-500000000000
/devices/wb-w1/controls/28-500000046354
/devices/wb-w1/controls/28-600000000000
/devices/wb-w1/controls/28-600000000001
/devices/wb-w1/controls/28-600000046354
/devices/wb-w1/controls/28-680000046354
/devices/wb-w1/controls/28-700000046354
/devices/wb-w1/controls/28-800000000000
/devices/wb-w1/controls/28-800000000001
/devices/wb-w1/controls/28-800000046354
/devices/wb-w1/controls/28-880000046354
/devices/wb-w1/controls/28-900000000000
/devices/wb-w1/controls/28-900000046354
/devices/wb-w1/controls/28-a00000000000
/devices/wb-w1/controls/28-a00000000001
/devices/wb-w1/controls/28-a00000046354
/devices/wb-w1/controls/28-a80000046354
/devices/wb-w1/controls/28-b00000046354
/devices/wb-w1/controls/28-c00000000000
/devices/wb-w1/controls/28-c00000000001
/devices/wb-w1/controls/28-c00000046354
/devices/wb-w1/controls/28-c80000046354
/devices/wb-w1/controls/28-d00000046354
/devices/wb-w1/controls/28-e00000000000
/devices/wb-w1/controls/28-e00000000001
/devices/wb-w1/controls/28-e00000046354
/devices/wb-w1/controls/28-f00000046354

как видите, их очень много. Большую часть составляют вариации датчика 28-800000046354, видимо что-то с ним не так. Но т.к. он отвечает за тёплый пол, то сложно что-то поменять - замурован… Помогает передёргивание питания +5 вольт. Пришлось написать 1-wire watchdog:

1w_watchdog.js
var wOne_1 = "wb-w1/28-0516812aa2ff"; 
var _1w_check_interval = 5* 1000;     //частота проверки устройств 1-wire, достаточно 1 раз в 5 сек
var _5V_OUT_OFF_time = 2* 1000; // время, на которое отключается +5V
defineAlias("_5V_OUT", "wb-gpio/5V_OUT");

//Останавливаем таймеры, нужно при отладке
//timers._1w_check_timer.stop(); 
//timers.sleep_interval.stop();

// создаем таймера: раз в 1w_check_interval проверяем устройства 1-wire на доступность (1w_check_timer)

// таймер типа startTicker() обеспечивает периодическое срабатывание
// А вот интервал, в течение которого лампочка будет мигать, задаем  таймером setTimeout()  -- он как раз обеспечивает однократность выполнения

startTicker("_1w_check_timer", _1w_check_interval);

// Правило для проверки -- на каждое срабатываение таймера отключить напряжение 5V OUT если 1-wire устройство недоступно

defineRule("_1w_check", {
  when: function () { return timers._1w_check_timer.firing; },
  then: function () {
    if (dev[wOne_1]) { 
//      log ("device exists"); 
    } else 
    { 
      _5V_OUT = false;
      log ("1w device doesn't exist, turning OFF 5V_OUT")
      
      // В правиле мы запускаем таймер проверки 1w_check_timer и взводим таймер sleep_interval (сколько выждать до включения 5V обратно)
      startTimer("sleep_interval", _5V_OUT_OFF_time);
    };
   }
});


// Таймер sleep_interval сработал -- останавливаем таймер проверки, включаем 5V_OUT.

defineRule("Stop_1w_check_timer", {
  when: function () { return timers.sleep_interval.firing; },
  then: function () {
//    timers._1w_check_timer.stop();
    _5V_OUT = true; 
    log ("5V_OUT is turned ON back again!");
   }
});

Да, при этом в логах есть ошибки, как и у остальных:

из логов

messages.0:Jan 1 12:39:14 wirenboard-A2DBKZPK user.warn kernel: [1469485.870984] w1_slave_driver 28-000000046354: Read failed CRC check
messages.0:Jan 1 12:39:35 wirenboard-A2DBKZPK user.warn kernel: [1469507.470387] w1_slave_driver 28-000000046354: Read failed CRC check
messages.0:Jan 1 12:39:56 wirenboard-A2DBKZPK user.warn kernel: [1469528.189491] w1_slave_driver 28-000000046354: Read failed CRC check
messages.0:Jan 1 17:48:55 wirenboard-A2DBKZPK user.info kernel: [1488067.044185] w1_master_driver w1_bus_master1: Family 0 for 00.800000000000.8c is not registered.
messages.0:Jan 1 17:50:03 wirenboard-A2DBKZPK user.info kernel: [1488135.057552] w1_master_driver w1_bus_master1: Family 0 for 00.400000000000.46 is not registered.
messages.0:Jan 1 17:50:57 wirenboard-A2DBKZPK user.info kernel: [1488189.032947] w1_master_driver w1_bus_master1: Family 0 for 00.c00000000000.ca is not registered.
messages.0:Jan 1 17:52:18 wirenboard-A2DBKZPK user.info kernel: [1488269.842159] w1_master_driver w1_bus_master1: Family 0 for 00.200000000000.23 is not registered.

Но что меня смущает - это постоянно появляющиеся mqtt устройства, они никуда не уходят и в разделе MQTT Channels занимают порядочно места. Поскольку я знаю свои датчики, можно ли как-то ограничить набор, чтобы новые каналы автоматом не создавались для этих устройств?

Это физические ошибки на линии, причём их так много, что часто случайно совпадает контрольная сумма. Думаю, что нужно решать именно эту проблему, а не пытаться из плохих данных отфильтровать что-то подходящее.

Функция фильтрации 1-Wire датчиков пока не планируется. Теоретически, вы можете реализовать её самостоятельно. Исходные коды соответствующего сервиса вот: https://github.com/contactless/wb-homa-w1