имеется некое устройство на 8266 с поддержкой mqtt. к контроллеру оно подключилось и видит его топики (можно вытащить значение температуры).
топик данных light/tasmota/123456/state
Данные публикуются в таком виде
{
“temp”: 24.3,
“relay”: 0,
“name”: tasmota-123456,
}
управление светом
light/tasmota/123456/power/set
как вытащить из json - файла и как управлять этим устройством?
Добрый день.
“Вытащить” - с помощью trackMqtt, “управлять”, то есть публиковать что-то в топики устройства - через publish
Описано с примерами тут:
Как я понимаю, это устройство на ESP*? Если есть доступ к исходникам - можно привести топики к виду, принятому в WB, описано тут:
https://wirenboard.com/wiki/MQTT#.D0.9F.D1.80.D0.B8.D0.BD.D1.86.D0.B8.D0.BF_.D1.80.D0.B0.D0.B1.D0.BE.D1.82.D1.8B_MQTT
То есть если заставить устройство опубликовать свои топики в “правильном” виде - они сразу появятся в интерфейсе и будут доступны. Если нет - то надо создавать виртуальное устройство и описывать конвертацию, преобразование полученных от устройства структур ну и при изменении полей виртуального устройства - писать его в топики в формате устройства.
Андрей, по поводу trackMqtt предполагал именно так и делать. вопрос в основном насчет вытащить из json и управления произвольными топиками.
Буду смотреть примеры. Спасибо.
с publish вопросов нет. а вот как вытащить данные из json стороннего топика при помощи trackMqtt подзавис немного. есть пример какой-нибудь посмотреть?
Возвращается в trackMqtt - что? Строка или объект? Выведите в лог, покажите.
2021-08-06 10:20:49 get_data {“ext_sensor”:“online”,“temp”:“24.9”,“relay”:“0”,“name”:“tasmota-123456”}
Здравствуйте! Думаю, что дальше уже работа со строками с помощью правил и Java Script.
вопрос в том как это сделать? пример какой-нибудь глянуть было бы хорошо
Так на просторах интернета разве нет информации?
Посмотрите, например, здесь: Как вытащить слова из строки на JS? — Хабр Q&A
стандартный парсинг можно попробовать.
вот:
“get_data” - это часть возвращаемой строки или часть записи в лог?
То есть значение, возвращаемое из топика содержит “get_data”, или оно добавляется в log.info?
Если первое - то его надо обрезать.
Зачем так сложно?
В JS есть встроенные функции для JSON:
var str = '{"ext_sensor":"online","temp":"24.9","relay":"0","name":"tasmota-123456"}';
var jsobject = JSON.parse(str);
log ( jsobject.temp );
Кроме того, некоторые пользователи уже сталкивались с такой проблемой и даже создали специальный конвертер. Жаль,что разработчики его проигнорировали:
вот такой код получился
function getdata(inValue){
log.info(“get_data”, inValue)
}
trackMqtt(“climate/tasmota/123456/state”, function(newValue) {
getdata(newValue.value);
var str = newValue.value;
var jsobject = JSON.parse(str);
dev[“tasmota”][“relay”] = jsobject.relay;
dev[“tasmota”][“temp”] = jsobject.temp;
log ( jsobject.temp,dev[“tasmota”][“temp”],jsobject.relay,dev[“tasmota”][“relay”]);
});
и вот что пишет в лог - 20.5 0 1 false
в чем я ошибаюсь?
//08_18_test_08.js
var str = '{"ext_sensor":"online","temp":"24.9","relay":"0","name":"tasmota-123456"}';
var jsobject = JSON.parse(str);
for (ob_key in jsobject) {
log.info("ob_key", ob_key, jsobject[ob_key] )
}
Выше я же давал способ перебрать свойства объекта. Там с подобектсами, правда.
Приведенный мной упрощенный код работает?
Чувствую - что типы у вас где-то не сходятся, используйте явное указание.
Ну и вот такое:
отлично меняется на
dev["tasmota"][ob_key] = jsobject.[ob_key];
в том же цикле, особенно когда имена совпадают.
Все значения/величины в JSON хранятся в виде строковых переменных (это же относится и к значениям в MQTT)
Если вы используете wb-rules версии 2.x.x - то (в отличии от старой версии) необходимо явно задавать преобразование величин одного типа (строк из JSON или MQTT) в другой.
В вашем случае:
dev[“tasmota”][“relay”] = Boolean(jsobject.relay);
dev[“tasmota”][“temp”] = Number(jsobject.temp);
В общем - учите мат. часть (программирование вообще и в частности на JS)
Ну, тут “не факт” что автоматическое приведение типов не сработает. хуже когда оно работает как попало. Или поведение меняется когда приводимое становится null, например.
Благодарю.
Спасибо. Я предполагал, что дело в несоответствии типов. Только сделал так:
var tasmota_power = Number(jsobject.relay);
if (tasmota_power ) {
dev[“tasmota”][“power”] = true;
} if ( !(tasmota_power) ) {
dev[“tasmota”][“power”] = false;
}
иначе было так 22.4 22.4 0 true, теперь все нормально.
Еще раз спасибо!
Если кто-то использует Tasmota, в ближайшее время не обновляйтесь
Вероятно, это относится не только к Tasmota
Да, статья на хабре вчера-позавчера была.
Вроде пока отбой
Парню объяснили, что он не прав и стремный код магически пропал
Но вообще, осторожность не помешает