Трансляциия топика mqtt из PonyLab в Wirenboard

Добрый вечер, автоматизаторы.

Нужна помощь в обработке стороннего топика.
Имеем топик от контроллера удобрений, в котором интерес представляют данные из раздела values.
r - значение до калибровки (физический параметр измеряемый датчиком)
t - указывает на тип параметра
v - итоговое значение, фактическое значение параметра.
например:
t = 1 - pH
t = 2 - электропроводность
t = 3 - температура

Я справился с тем, чтобы получить в логе следующую строку:

INFO: [rule info] name: /devices/YLDN0079/state, value: {"ver":"v1.0.4218 - 2022-12-27 15:06:59.470853","values":[{"r":44.85816,"t":1,"v":6.183802},{"r":453.6171,"t":2,"v":2.190084},{"r":11184.41,"t":3,"v":21.8665},{"r":0,"t":4,"v":0},{"r":0,"t":5,"e":1},{"r":0,"t":6,"e":1},{"r":0,"t":10,"e":1},{"r":-1,"t":11,"e":1}],"raw_ec_msm":2.204502,"cfghsh":18491,"uptime":138227,"time":3520,"frhp":202188,"maxahp":113792,"mfrhp":184468,"hpsz":319828,"wifi":-36,"description":"ошибка датчика T air<br>\nошибка датчика H air<br>\nошибка датчика CO2<br>\n","outs":{"sum_on_s":[0,0,0,0,0,0,0,0,0],"func_cntdn_s":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ovrrd_time":[0,0,0,0,0,0,0,0,0],"ovrrd_state":[0,0,0,0,0,0,0,0,0]}}1

Простите, если вопрос банальный, но моей понималки не хватает, как собрать эти данные и передать их в переменные виртуального устройства, разобрав по типам :frowning:

Ниже привожу сам топик:

{
  "ver": "v1.0.4218 - 2022-12-27 15:06:59.470853",
  "values": [
    {
      "r": 48.89151,
      "t": 1,
      "v": 6.110975
    },
    {
      "r": 450.9679,
      "t": 2,
      "v": 2.204963
    },
    {
      "r": 11292.57,
      "t": 3,
      "v": 21.6548
    },
    {
      "r": 0,
      "t": 4,
      "v": 0
    },
    {
      "r": 0,
      "t": 5,
      "e": 1
    },
    {
      "r": 0,
      "t": 6,
      "e": 1
    },
    {
      "r": 0,
      "t": 10,
      "e": 1
    },
    {
      "r": -1,
      "t": 11,
      "e": 1
    }
  ],
  "raw_ec_msm": 2.217453,
  "cfghsh": 18491,
  "uptime": 119398,
  "time": 71091,
  "frhp": 202268,
  "maxahp": 113792,
  "mfrhp": 184468,
  "hpsz": 319828,
  "wifi": -39,
  "description": "ошибка датчика T air<br>\nошибка датчика H air<br>\nошибка датчика CO2<br>\n",
  "outs": {
    "sum_on_s": [      0,      0,      0,      0,      0,      0,      0,      0,      0    ],
    "func_cntdn_s": [      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      11410.82,      0,      0,      0,      0,      0    ],
    "ovrrd_time": [      0,      0,      0,      0,      0,      0,      0,      0,      0    ],
    "ovrrd_state": [      0,      0,      0,      0,      0,      0,      0,      0,      0    ]
  }
}

Например:

var test3 = "{   \"ver\": \"v1.0.4218 - 2022-12-27 15:06:59.470853\",  \"values\": [{\"r\": 48.89151,\"t\": 1,\"v\": 6.110975}, { \"r\": 450.9679, \"t\": 2, \"v\":2.204963 }, {\"r\": 11292.57,\"t\": 3, \"v\": 21.6548 }, {\"r\": 0,      \"t\": 4,      \"v\": 0    },    {      \"r\": 0,      \"t\": 5,      \"e\": 1    },    {      \"r\": 0,      \"t\": 6,      \"e\": 1    },    {      \"r\": 0,      \"t\": 10,      \"e\": 1    },    {      \"r\": -1,      \"t\": 11,      \"e\": 1    }  ],  \"raw_ec_msm\": 2.217453, \"cfghsh\": 18491,  \"uptime\": 119398,  \"time\": 71091,  \"frhp\": 202268,  \"maxahp\": 113792,  \"mfrhp\": 184468,  \"hpsz\": 319828,  \"wifi\": -39,  \"description\": \"ошибка датчика T air ошибкадатчика H airошибка датчика CO2\",  \"outs\": {    \"sum_on_s\": [      0,      0,      0,      0,      0,      0,      0,      0,      0    ],    \"func_cntdn_s\": [      0,      0,     0,     0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      11410.82,      0,      0,      0,      0,      0    ],    \"ovrrd_time\": [      0,      0,      0,      0,      0,     0,      0,      0,      0    ],    \"ovrrd_state\": [      0,      0,      0,      0,      0,      0,      0,      0,      0    ]  }}"
var objTest3 = JSON.parse(test3);
log.info("ver=", objTest3.ver)
log.info("r=", objTest3.values[0].r) 

Это обычный json, собственно. Формат JSON, метод toJSON

1 Like

Спасибо за быстрый ответ.

Вы добавили в строку " до и после переменных в строке.
Но я получаю сотни подобных строк, через:

trackMqtt("/devices/YLDN0079/state", function(message){
  var test3 = message.value;
  });

Точнее пытаюсь получить, но пока не выходит.

А где вы преобразуете json в объект?
Тут message - строка, а вы из нее сразу пытаетсь методом объекта свойство прочитать.

Вот подходящее: Подключение стороннего оборудования - #13 от пользователя BrainRoot
Да, я программист - весьма начинающий, так что прошу простить за код.

1 Like

Вопрос решён.
Шаг 1: Создаём виртуальное устройство
Шаг 2: Трекаем mqtt
Шаг 3: Парсим и передаём данные в контрол

Для потомков оставлю полезные ссылки и код.

Ссылки:
Знакомство с сабжем Что такое JSON / Хабр
Полезно для визуализации, при знакомстве с JSON: https://jsonviewer.stack.hu/

Код:

defineVirtualDevice('PVD79', {
    title: 'PVD79' ,
    cells: {
  pH: {
    title: "pH",
    type: "text",
    value: "" },
  EC: {
    title: "EC",
    type: "text",
    value: "" },
  t: {
    title: "t",
    type: "text",
    value: "" },

  }
})

trackMqtt("/devices/YLDN0079/state", function(message){
  var objPony79 = JSON.parse(message.value);
  dev["PVD79/pH"] = "ph = "+objPony79.values[0].v;
  dev["PVD79/EC"] = "EC = "+objPony79.values[1].v;
  dev["PVD79/t"] =  "t  = "+objPony79.values[2].v;
 });

1 Like

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