Приветствую, Хабр!

Несколько недель назад свет увидел MQTT control rs – инструмент для визуального создания логики автоматизации поверх MQTT.

Рад сообщить, что в новой версии 0.3 наконец реализованы значительные улучшения. Для собственного удобства, а также с целью упрощения жизни пользователей, добавил полнофункциональный встроенный брокер, а для расширения функционала была встроена поддержка Lua-скриптов, что значительно расширило потенциал кастомной логики.

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

Поглядим же подробнее!

Встроенный MQTT-брокер – для удобства и упрощения работы

UI брокера
UI брокера

Старт с отдельным Mosquitto, лично мне, не сказать что слишком удобен. Нет, я люблю cli, но это время. Для быстрого запуска, отладки и тестов не очень то сподручно поднимать отдельный брокер. Чтобы упростить этот процесс для себя и для вас, я интегрировал MQTT брокер NanoMQ (лицензия MIT), ныне доступный на вкладке LocalBro. Теперь он поставляется вместе с программой.

Здесь:

  • Мгновенный старт: Запустите программу, добавьте пользователя и активируйте брокер одной кнопкой. Тут же настройки работы. Никакой дополнительной установки, конфигурации или управления внешними сервисами.

  • Упрощенное обучение: Новички в MQTT могут начать экспериментировать с протоколом, не отвлекаясь на сложности развертывания брокера.

  • Добавляйте, влючайте/отключайте и удаляйте пользователей с упрощенной настройкой прав(чтение/публикация). Тут же добавлена защита от непроизвольной правки - для изменения нужно щелкнуть на значок замка в начале строки, и тогда строка разблокируется. Защита от неловких рук.

  • Можно настроить мост ко внешнему брокеру, мягко интегрировав в действующую инфраструктуру.

Lua-скрипты: Новая мощь

Редактор Lua
Редактор Lua

Почему Lua? Lua — это легковесный, высокопроизводительный и широко используемый скриптовый язык, особенно популярный во встраиваемых системах, играх и автоматизации. Он довольно прост и хорошо знаком многим разработчикам, что снижает порог входа для создания логики.

Lua-скрипты выполняются внутри специальной ноды автопилота, что позволяет создавать реактивную логику: скрипт запускается при поступлении нового сообщения на вход узла или при активации по триггеру. Добавьте ноду Lua script на поле автопилота и сделайте на ней двойной щелчок(или выделите и нажмите соответствующую кнопку в инспекторе справа). Там же, в инспекторе, можно настроить входы и выходы ноды, чтобы обратиться к ним из кода.

Доступный API для Lua-скриптов

Для обеспечения безопасности и предсказуемости выполнения, скрипты запускаются в “песочнице” и имеют доступ к ограниченному, но мощному API в виде глобальных переменных и функций:

  • inputs (таблица): Глобальная таблица, содержащая значения, поданные на входные порты узла. Доступ к значениям осуществляется по имени порта, например: inputs.in1, inputs.in2 и т.д.

  • mem (таблица): Глобальная таблица, предназначенная для хранения состояния узла между выполнениями. Вы можете читать и записывать в нее данные, которые сохранятся до следующего вызова скрипта.

  • emit(port_name, value) (функция): Глобальная функция, которая отправляет данные value на указанный выходной порт узла port_name. В качестве value может выступать число, строка, булево значение.

  • log(text) (функция): Глобальная функция, которая выводит текстовое сообщение text во внутренний лог mqtt-control-rs для отладки.

Для обеспечения стабильности и безопасности, доступ к файловой системе, сети и другим системным ресурсам из скриптов Lua ограничен. Недоступны стандартные библиотеки Lua, такие как os, io, package и debug. Тем не менее, это первая функциональная версия API и вполне возможно расширение. Но не будем забегать вперед паровоза.

-- Инициализация состояния в таблице 'mem', если оно отсутствует.
-- Эти значения сохраняются между запусками скрипта.
if mem.threshold == nil then
    mem.threshold = 20.0 -- Порог температуры
end
if mem.heater_on == nil then
     mem.heater_on = false -- Текущее состояние нагревателя
end

-- Обрабатываем значение, пришедшее на первый входной порт "in1".
local current_temp = tonumber(inputs.in1)

if current_temp ~= nil then
    -- Логируем текущую ситуацию для отладки
    log("Получена температура: " .. current_temp .. "°C. Порог: " .. mem.threshold .. "°C.")

    -- Логика управления нагревателем
    if current_temp < mem.threshold and not mem.heater_on then
        -- Температура ниже порога, и нагреватель выключен - включаем его
        log("Температура ниже порога. Включаю нагреватель.")
        mem.heater_on = true -- Обновляем состояние в 'mem'
        emit("heater_command", "ON") -- Отправляем команду на выходной порт
    elseif current_temp >= mem.threshold and mem.heater_on then
        -- Температура достигла или превысила порог, и нагреватель включен - выключаем его
        log("Температура нормализовалась. Выключаю нагреватель.")
        mem.heater_on = false -- Обновляем состояние в 'mem'
        emit("heater_command", "OFF") -- Отправляем команду на выходной порт
    end
else
    log("Ошибка: значение на входе 'in1' не является числом или пусто.")
end

Скрипт демонстрирует, как можно использовать глобальную таблицу inputs для получения данных, mem для поддержания внутреннего состояния, log для отладки и emit для отправки управляющих сигналов. Можете попробовать его в песочнице(справа от поля ввода кода в редакторе).

Приглашаю к тестированию и обратной связи!

Уверен, что встроенный MQTT-брокер и расширенные возможности скриптов на Lua значительно упростят вашу работу с IoT-проектами и позволят создавать еще более гибкие и мощные решения.

Скачивайте последнюю версию, пробуйте новые функции и делитесь своими впечатлениями и предложениями. Ваша обратная связь помогает мне делать MQTT Control RS лучше.

Последующая разработка пока что будет сосредоточена на доработке справки, и патчей найденных недоработок. Новые фичи это весело, но качество в приоритете.

Ссылки:

Скачать с сайта MQTT Control RS (как помним, возможно потребуется особый доступ к интернету), либо, взять напрямую с гита.

Присоединяйтесь в телеграм.

Прошлая статья

Комментарии (0)