1-wire watchdog


#1

У меня такая ситуация с датчиками: появляются “левые” датчики непонятно откуда. Всего подключено два датчика, купленных у вас, топология - “звезда” (ну или параллельное подключение". С контактами должно быть всё в порядке, подключение через клеммники 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 занимают порядочно места. Поскольку я знаю свои датчики, можно ли как-то ограничить набор, чтобы новые каналы автоматом не создавались для этих устройств?


#2

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

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