Приветствую, Хабр!
Несколько недель назад свет увидел MQTT control rs – инструмент для визуального создания логики автоматизации поверх MQTT.
Рад сообщить, что в новой версии 0.3 наконец реализованы значительные улучшения. Для собственного удобства, а также с целью упрощения жизни пользователей, добавил полнофункциональный встроенный брокер, а для расширения функционала была встроена поддержка Lua-скриптов, что значительно расширило потенциал кастомной логики.
В прошлый раз в комментариях собственно и прозвучал вопрос о возможности для написания скриптов. Не сказать, что не думал об этом до того, но ранее встроенный скриптинг казался мне дырой безопасности, но беседа позволила взглянуть иначе.
Выгода понятна: скрипт элегантно закрывает то, что визуальным программированием делать избыточно громоздко. А часто и неоправданно сложно.
Поглядим же подробнее!
Встроенный MQTT-брокер – для удобства и упрощения работы

Старт с отдельным Mosquitto, лично мне, не сказать что слишком удобен. Нет, я люблю cli, но это время. Для быстрого запуска, отладки и тестов не очень то сподручно поднимать отдельный брокер. Чтобы упростить этот процесс для себя и для вас, я интегрировал MQTT брокер NanoMQ (лицензия MIT), ныне доступный на вкладке LocalBro. Теперь он поставляется вместе с программой.
Здесь:
Мгновенный старт: Запустите программу, добавьте пользователя и активируйте брокер одной кнопкой. Тут же настройки работы. Никакой дополнительной установки, конфигурации или управления внешними сервисами.
Упрощенное обучение: Новички в MQTT могут начать экспериментировать с протоколом, не отвлекаясь на сложности развертывания брокера.
Добавляйте, влючайте/отключайте и удаляйте пользователей с упрощенной настройкой прав(чтение/публикация). Тут же добавлена защита от непроизвольной правки - для изменения нужно щелкнуть на значок замка в начале строки, и тогда строка разблокируется. Защита от неловких рук.
Можно настроить мост ко внешнему брокеру, мягко интегрировав в действующую инфраструктуру.
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 (как помним, возможно потребуется особый доступ к интернету), либо, взять напрямую с гита.
Присоединяйтесь в телеграм.
Прошлая статья