Здравствуйте.
Каким образом из скрипта wb-rules я могу получить список ВСЕХ устройств, отображаемых на странице “Каналы MQTT”?
Добрый день.
Вызвать mosquitto_sub для пути devices/+ и распарсить его вывод, проще всего.
А каким образом mosquitto_sub
можно вызвать из скрипта?
Тем более, насколько я понимаю, это интерактивная команда, которая будет выводить сообщения, по мере их поступления в топики. Если в топики никто не писал, то вывод для них и не появится. Да и как понять, когда необходимо остановить выполнение команды?..
trackMqtt("/devices/+", function(msg) { log(msg.topic); });
не выводит ничего. Да и не понятно, как эта асинхронная штука будет в одноразовом скрипте работать (скрипт вызывается один раз для регистрации устройств в Home Assistant)…
Веб интерфейс откуда-то получает эту информацию, значит технически возможность в теории существует.
Достаточно вызвать
timeout 2 mosquitto_sub -v -t /devices/+/controls/+/meta/type
чтобы не выводить значения И, собственно, все.
Вот тут пример по работе с внешними программами: Как работать с базой данных HIstory. wb-mqtt-db - #73 от пользователя BrainRoot
Да, если есть желание “как веб-интерфейс” - то можно через mqtt rpc вызывать, вот тут пример: формат запроса rpc - #4 от пользователя KSK
Вот первый подход с mosquitto_sub рабочий и более практичен чем через rpc (там парсить куда сложнее). Выводим все девайсы и их дочерние контролы:
var command = "timeout 2 mosquitto_sub -v -t /devices/+/controls/+/meta/type";
runShellCommand(command, {
captureOutput: true,
exitCallback: function(exitCode, capturedOutput) {
if (exitCode !== 0 && exitCode !== 124) {
log.warning("Command exited with code: {}", exitCode);
return;
}
var devices = {};
capturedOutput.split(/\r?\n/).forEach(function (entry) {
var parts = entry.match("/devices/(.+)/controls/(.+)/meta/type (.+)");
if (parts != null && parts.length === 4) {
var device = parts[1];
var control = parts[2];
var control_type = parts[3];
if (!(device in devices)) {
devices[device] = {};
}
devices[device][control] = control_type;
}
});
log(JSON.stringify(devices, null, 2));
}
});
А вот тут не соглашусь. парсить можно так: MQTT топик от внешнего устройства - #16 от пользователя BrainRoot
То есть получаем объект и перебираем его.
Но в общем реализации равнозначны, да.
Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.