Availability для ZigBee устройств

Здравствуйте. Есть следующая проблема - есть zigbee устройства (датчики контроля протечки), и хотелось бы видеть, что устройства в сети. По логам я увидел, что устройства отправляют свои данные каждые 4 часа даже если ничего не произошло. Но, чтобы как то выполнить проверку на условие что устройство не так давно что то присылало - из идей использовать только last_seen и вычислять сколько времени прошло, что не очень удобно.

В документации по zigbee2mqtt нашел, что есть еще такой параметр как availability. Включив его - я в логах вижу, что есть сообщения в топике “zigbee2mqtt/zigbee_leakage_sensor_2_flor/availability”, но не понятно как из этого топика получить значения, потому что его не видно в “Настройки => Каналы MQTT”

Вот часть настройки availability в /mnt/data/root/zigbee2mqtt/data/configuration.yaml:

availability:
  active:
    # Time after which an active device will be marked as offline in
    # minutes (default = 10 minutes)
    timeout: 10
  passive:
    # Time after which a passive device will be marked as offline in
    # minutes (default = 1500 minutes aka 25 hours)
    timeout: 1500
devices:
  '0xa4c138f82b88857a':
    friendly_name: 'zigbee_leakage_sensor_2_flor'
    description: 'Water leakage sensor 2 flor'
    availability:
      timeout: 300

Обычная отправка от устройства (из лога):

Zigbee2MQTT:info  2023-11-07 01:57:33: MQTT publish: topic 'zigbee2mqtt/zigbee_leakage_sensor_2_flor', payload '{"battery":100,"battery_low":false,"last_seen":1699322253567,"linkquality":109,"tamper":false,"water_leak":false}'

availability сообщение от устройства (из лога):

Zigbee2MQTT:info  2023-11-07 01:57:33: MQTT publish: topic 'zigbee2mqtt/zigbee_leakage_sensor_2_flor/availability', payload '{"state":"online"}'

Собственно сам вопрос - подскажите пожалуйста как получить доступ к ‘zigbee2mqtt/zigbee_leakage_sensor_2_flor/availability’ state из wb-rules, если такого топика в “Настройки => Каналы MQTT” нет (есть только топики просто zigbee2mqtt/zigbee_leakage_sensor_2_flor)?

Спасибо.

Добрый день.

Как обычно, два способа:
Первый - редактировать шлюз wb-zigbee2mqtt,
Второй - использовать в wb-rules trackMqtt для доступа к произвольным топикам.

Ок, спасибо. Если вариант первый - скажите в каком файле необходимо редактировать? /usr/share/wb-rules-system/rules/wb-zigbee2mqtt.js - тут?

Да, в нем.

В общем разобрался. На всякий случай отпишу тут, вдруг кому пригодится.
Вносим следующие изменения в файл /usr/share/wb-rules-system/rules/wb-zigbee2mqtt.js:

  • добавляем функцию в самом низу:
function initTrackerAvailability(ctrlName) {
  trackMqtt(base_topic + '/' + ctrlName + '/availability', function (obj) {
    JSON.parse(obj.value, function (k, v) {
      if (k != '') {
        var obj = JSON.parse(topicType);
        var ks = Object.keys(obj);
        var resultIndex = ks.indexOf(k, 0);
        if (resultIndex >= 0) {
          if (!getDevice(ctrlName).isControlExists(k)) {
            getDevice(ctrlName).addControl(k, {
              type: obj[ks[resultIndex]],
              value: v,
              readonly: true,
            });
          }
          dev[ctrlName][k] = v;
        } else {
          if (!getDevice(ctrlName).isControlExists(k)) {
            getDevice(ctrlName).addControl(k, {
              type: 'text',
              value: v,
              readonly: true,
            });
          }
          dev[ctrlName][k] = v != null ? v.toString() : '';
        }
      }
    });
  });
}

и добавляем после строчки “initTracker(v);” (в моем случае это внутри функции “trackMqtt(base_topic + ‘/bridge/devices’, function (obj) {”) вызов “initTrackerAvailability(v);”, чтобы получилось так:

          initTracker(v);
          initTrackerAvailability(v);

После этого в “Настройки => Каналы MQTT” появится топик “/devices/название_устройства/controls/state” со статусом устройства online или offline.

1 лайк

Я в общем предлагал просто добавить в обьект

var topicType = JSON.stringify({
  battery: 'value',
  linkquality: 'value',
  temperature: 'temperature',
  humidity: 'rel_humidity',
  pressure: 'atmospheric_pressure',
  co2: 'concentration',
  voc: 'value',
  illuminance: 'value',
  illuminance_lux: 'value',
  noise: 'sound_level',
  occupancy_level: 'value',
  power: 'power',
  voltage: 'voltage',
});

нужное, не добавляя лишнюю функцию.
Но, в общем, и так будет работать.

Так там топики разные.
Все данные в топике: zigbee2mqtt/zigbee_leakage_sensor_2_flor
А статус в zigbee2mqtt/zigbee_leakage_sensor_2_flor/availability.

Поэтому без добавления еще одной функции из топика zigbee2mqtt/zigbee_leakage_sensor_2_flor/availability данные не забираются.

Верно, подписывается без подтопиков, это я проглядел. Что ж, отличное решение.

1 лайк

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.