Получение полного списка устройств

Здравствуйте.
Каким образом из скрипта 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));
    }
});
1 лайк

А вот тут не соглашусь. парсить можно так: MQTT топик от внешнего устройства - #16 от пользователя BrainRoot
То есть получаем объект и перебираем его.

Но в общем реализации равнозначны, да.

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.