Подключение стороннего оборудования

имеется некое устройство на 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 );    

Кроме того, некоторые пользователи уже сталкивались с такой проблемой и даже создали специальный конвертер. Жаль,что разработчики его проигнорировали:

2 лайка

вот такой код получился
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, например.
Благодарю. :slight_smile:

Про типы:
https://wirenboard.com/wiki/Wb-jscript#.D0.9A.D0.B0.D0.BA_.D0.BE.D0.BF.D1.80.D0.B5.D0.B4.D0.B5.D0.BB.D0.B8.D1.82.D1.8C_.D1.82.D0.B8.D0.BF

Спасибо. Я предполагал, что дело в несоответствии типов. Только сделал так:
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

1 лайк

Да, статья на хабре вчера-позавчера была.

Вроде пока отбой

Парню объяснили, что он не прав и стремный код магически пропал

Но вообще, осторожность не помешает

1 лайк