Добавить данные из Mqtt в webUI

Добрый день.
У меня есть у меня имеются wifi устройства. Я с помощью python скрипта забираю с них данные и публикую в локальный топик WB6.
1)Подскажите пожалуйста, можно ли эти данные отобразить в web интерфейсе.
2)Как лучше работать с python скриптами? мне пришлось установить pip3 который в свою очередь за собой принес ~150Мб зависимостей. И скрипт я запускаю в вечном цикле (что думаю не есть хорошо) после создания подключения к брокеру , или можно например каждую минуту через crontab но тогда будут постоянно генерироваться подключения к локальному брокеру, что по моему мнению тоже не гуд.
Подключение в python выглядит так:

def connect_mqtt():
    broker = '127.0.0.1'
    port = 1883
    client_id = 'vol'
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            pass
        else:
            logger.error("Failed to connect, return code %d\n", rc)
    client = mqtt_client.Client(client_id)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client

Добрый день. Вопрос - довольно обширный, начну по порядку.

Да, можно. В этом собственно смысл веб-интерфейса и заключается. Для того чтобы он, веб-интерфейс что-то показал в MQTT должны быть нужные топики.
То есть сам веб-интерфейс только и делает что просто отображает MQTT.
Создать топики можно парой способов.

//08_12_test_01.js

defineVirtualDevice("pythonTest", {
  title: "Test for  Python",
  cells: {
    "testSwitch": {
    type: "switch",
    value: false
    },
    "testText": {
    type: "text",
    value: "",
    readonly: false
    }
  }
});

Наблюдаем:
Screenshot from 2021-08-12 12-35-48

  • Но скрипт выше просто создал топики в MQTT:
mosquitto_sub -v -t /devices/pythonTest/#
/devices/pythonTest/meta/name Test for  Python
/devices/pythonTest/meta/driver wb-rules
/devices/pythonTest/controls/testSwitch 0
/devices/pythonTest/controls/testSwitch/meta/type switch
/devices/pythonTest/controls/testSwitch/meta/order 1
/devices/pythonTest/controls/testSwitch/meta/readonly 0
/devices/pythonTest/controls/testText/meta/type text
/devices/pythonTest/controls/testText/meta/order 2
/devices/pythonTest/controls/testText/meta/readonly 0

Если те же топики создать откуда угодно, хоть с помощью mosquitto_pub - то веб-интерфейс их обработает и отобразит. Ну и начнет работать.
Для интереса - можно поменять значения /devices/pythonTest/controls/testSwitch/meta/order с “1” на “3”

mosquitto_pub -t /devices/pythonTest/controls/testSwitch/meta/order -m 3

и увидеть что switch перескочил вниз. :wink:
Ну и соответственно - в топики можно писать, значения отображаются.

Ну, все ж разработка “на котроллере” - это не совсем верный путь. Для дома - еще нормально, но для продакшена обычно готовят пакет.

Все способы хороши. Подключения к брокеру - они его, брокер не нагружают.
Можно:

  • вообще вызывать скрипт из скрипта wb-rules, пример запуска “внешнего”: Скрипт для пингования хоста и (или) выводить данные для публикации в stdout и рабирать-обновлять в топиках средствами wb-rules, через dev[]=
  • использовать “паузу” внутри python-скрипта
  • и по крону - тоже можно.

Если на что-то не ответил - спрашивайте, не стесняйтесь.

2 лайка

Спасибо! За развёрнутый ответ

Здравствуйте, хотелось бы уточнить один момент.
Когда я собираю данные с wifi устройств то я создаю топик /devices/IPaddr/controls/V и т.д
Я создал виртуальное устройство с такими же топиками и данные начали появляться в web интерфейсе.
изображение
изображение

Мне не сложно создать еще виртуальных устройств, но вы написали:
Если те же топики создать откуда угодно, хоть с помощью mosquitto_pub - то веб-интерфейс их обработает и отобразит. Ну и начнет работать.

У меня почему то не отображает без виртуальных устройств:
Вот структура топиков куда пишу данные.
изображение

Здравствуйте! Для отображения в веб-интерфейсе контроллера нужно опубликовать топик контрола с указанием его типа, например, такого вида:

mosquitto_pub -t /devices/Test_Device/controls/test_switch/meta/type -m switch

После этого в веб-интерфейсе появится окно с контролом типа “switch”:
image

Контролом можно будет управлять:

mosquitto_pub -t /devices/Test_Device/controls/test_switch -m 1

Результат:
image

1 лайк

Коллега абсолютно прав, “лишних” элементов в топиках нет. Есть необязательные, но “meta/type” должен быть.