Как установить wb-mqtt-timestamper?

Добрый день! Не устанавливается пакет. Можете поправить зависимости? Контроллер WB6, прошивка установлена отсюда с полным сбросом.

The following packages have unmet dependencies:
wb-mqtt-timestamper : Depends: libjsoncpp0 but it is not installable

это что-то древнее и ненужное. Экспериментировали когда-то, но в стандартную прошивку не пошло.

это что-то древнее и ненужное. Экспериментировали когда-то, но в стандартную прошивку не пошло.

К сожалению, любое ПО не защищено от ошибок и подвисаний. Поэтому, дополнительная телеметрия просто необходима. И ее так не хватает в софте WB.
Приходится “рисовать” свои костыли

К счастью, в модбас устройствах от WirenBoard есть регистр показывающий uptime девайса. Я добавил сооттвествующий канал:

{
  "slave_id": "63",
  "device_type": "WB-MR6C",
  "name": "MR6C",
  "id": "MR6C",
  "enabled": true,
  "poll_interval": 1000,
  "channels": [
    {
      "name": "Uptime",
      "type": "value",
      "reg_type": "input",
      "address": 104,
      "format": "u32",
      "channel_readonly": true,
      "poll_interval": 60000
    }
  ]
}

По таймеру отслеживаю, изменения этого регистра. Если значение не меняется - “пинаю” wb-mqtt-serial и шлю оповещение.

2 Likes

Добрый вечер. Я правильно понял, сейчас нет возможности добавить timestamp в пакет mqtt ? Если только брать из mqtt-db?

А для чего это нужно? В правилах, где нужно что-то делать в зависимости от даты и времени, просто создаю вирт. девайс и пихаю в него текущую дату.

Например, вот кусок кода, где отслеживается актуальность показаний счетчика воды (он опрашивается через BLE и случается что bluetooth в контоллере зависает).

    // Проверка актуальности показаний
    var now = new Date();  // дата и время сейчас
    var timestamp_cold = new Date(dev["water_meter_cold"]["timestamp"]);
    timestamp_cold.setHours(timestamp_cold.getHours() - 3);   // TimeZone fix 
    var timestamp_age_cold = parseFloat((now - timestamp_cold)/1000/3600).toFixed(0);
        if (timestamp_age_cold > 24) {   // Нет данных больше 24 часов
          var message_short = "Cold water meter - values " + timestamp_age_cold + " hours old!";
          var message_long = "Показания счетчика холодной воды не обновлялись больше " + timestamp_age_cold + " часов!";
          log (message_short);
            if (dev["alarm_level"]["email_enable"] == true) {
              Notify.sendEmail (me_email, message_short, message_long);
            }
            if (dev["alarm_level"]["sms_enable"] == true) {
              Notify.sendSMS (me_phone, message_short);
            }         
        }

Данные передаются на сервер, и бывает связь теряется, а при восстановление он присылает последнее значение

У себя я не пробрасываю все топики через мост mosquitto, а упаковываю новые значения в json добавляя поле получения сообщения. И отправляю на сервер уже обработанные данные.

а можете расписать по подробнее, а то мне кажется я не до понял. И если не секрет как это делается

А зачем?
ну, путь возможный, но довольно сложный. Ведь есть же

Также предусмотрен доступ к топкам /devices/.../controls/.../meta/... как внешних устройств (только чтение), так и локально определённых виртуальных (чтение и запись).

Синтаксис получения доступа к значению мета-топика выглядит следующим образом: dev["wb-mr3_48/K1#error"] или dev["wb-mr3_48/K1#readonly"]

Синтаксис для установки значений локальных устройств аналогичен: dev["virDev1/cell1#error"] = "some error" или dev["virDev1/cell2#max"] = 255

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

Пример, будет отправлено смс каждый раз, когда первое реле на модуле WB-MR3 станет недоступно

defineRule("onRelayLost", {
    asSoonAs: function () { // также возможно использовать параметр when
        return (dev["wb-mr3_48/K1#error"]);
    },
    then: function () {
        log("!!!!!!!!!!!!!! when fired !!!!!!!!!!!!!!");
        log("ERROR: " + dev["wb-mr3_48/K1#error"]);
        Notify.sendSMS(...);
    }
});

Написал отдельный модуль, который подписан на топики, которые нужно прокинуть на сервер.
При получении нового значения формирую JSON с меткой времени и отправляю в топик, который прокинут на сервер.

Ваш путь не сработает, в случае “подвисания” службы wb-mqtt-serial - в мета error просто не кому будет сигнализировать.