MQTT данные в массиве парсятся неверно? (v5)



  • Приветствую!
    Пытаюсь получить данные с датчика, отдающего массив вида:

    [{"n":"aaa","v":1}, {"n":"bbb","v":2}]
    

    Дальше планировал в обработчике канала выбирать нужный элемент массива по имени - "n" ибо формулы с JSONPATH не заявлены.

    Вопрос - как?

    Без переделки датчика и внешних обработок - хочу отказаться от NodeRed хоть в этой части.

    Во-первых, данные парсятся в JSON всегда (!) о чём говорит запись в логе "Not Valid JSON" для строк. И в тексте plugin-а это явно - или "Array" или в except - JSON.parse

    Во-вторых, после парсинга этой строки, данные, похоже, воспринимаются как исторические и не попадают в привязанный канал (тип Data/String например):

    25.12 10:29:22.417 GET: /test/js [{"n":"bmet","v":-5.05,"ok":0,"t":"ai"},{"n":"bmep","v":742.80,"ok":0,"t":"ai"}]
    25.12 10:29:22.422 IH: get archive[
      { id: 'msk_esp_sens_json', topic: '/test/js' },
      { id: 'msk_esp_sens_json', topic: '/test/js' }
    ]
    set []
    


  • @AV, попробуйте в Формуле входного значения для канала 'aaa' прописать

    JSON.parse(value).find(item => item.n == "aaa").v
    

    соответственно для 'bbb'

    JSON.parse(value).find(item => item.n == "bbb").v
    


  • @intrapro О! Про find я что-то не подумал.

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

    #==== 1 ====
    25.12 14:28:37.378 GET: /test/js {"v":"ON","n":"test"}
    25.12 14:28:37.379 IH: get [
      {
        id: 'msk_esp_sens_json',
        topic: '/test/js',
        value: '{"v":"ON","n":"test"}'
      }
    ]
    set { d0018: { json: '{"v":"ON","n":"test"}', ts: 1671967717379 } }
    
    #==== 2 ====
    
    25.12 14:28:52.539 GET: /test/js [{"v":"ON","n":"test"}, {"v":"OF","n":"test2"}]
    25.12 14:28:52.544 IH: get archive[
      { id: 'msk_esp_sens_json', topic: '/test/js' },
      { id: 'msk_esp_sens_json', topic: '/test/js' }
    ]
    set []
    
    #==== 3 ====
    
    25.12 14:36:03.955 GET: /test/js {[{"v":"ON","n":"test"}, {"v":"OF","n":"test2"}]}
    25.12 14:36:03.958 Invalid JSON.parse: {[{"v":"ON","n":"test"}, {"v":"OF","n":"test2"}]}
    25.12 14:36:03.961 IH: get [
      {
        id: 'msk_esp_sens_json',
        topic: '/test/js',
        value: '{[{"v":"ON","n":"test"}, {"v":"OF","n":"test2"}]}'
      }
    ]
    set {
      d0018: {
        json: '{[{"v":"ON","n":"test"}, {"v":"OF","n":"test2"}]}',
        ts: 1671968163960
      }
    }
    

    ЗЫ: Есть где подробнее почитать про "Расширения" MQTT - что-то не могу заставить срабатывать. Хочу сделать одно (для имитации last_seen из zigbee2mqtt) устройство с двухканальным выключателем Zigbee, привязанным вовне по MQTT. Думал делать команды on_1/off_1 через "расширения", но что-то не срабатывает команда (буду ещё копать тему).
    ЗЫЫ: Последний вопрос пока отменяется. Оказалось обработчик value не вызывается при setValue из скрипта - вроде решает задачу.



  • Пользователь @AV написал

    Но всё равно - не работает. Значение в виде текста или словаря приходят нормально, а если делаешь массив - в канал ничего не приходит.

    Упс, вы правы. В плагине MQTT поступление массива всегда интерпретируется как архив.
    Подумаем, как это исправить. Скорее всего, придется добавить параметр на уровне плагина.



  • @intrapro, Ок! Благодарю.

    Заодно поправьте запись в лог - та же беда, что с плагином d1 - много вызовов plugin.log без указания уровня - "publish" и прочее пишется в лог независимо от настроек. У себя временно заменил все вызовы .log(text) на log(text,1) и с третьей попытки %) (две перезагрузки плагина и одна всего сервера - не сохранялась настройка через веб) выставил уровень лога в "низкий", чтоб мусор не писался.



  • Пришло обновление 5.5.26.

    Вроде, всё работает (не забываем перезапустить mqttclient после изменения настройки).

    Спасибо!


Log in to reply