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 после изменения настройки).
Спасибо!