Нейронные сети с каждым днем становятся умнее и дешевле. Сейчас уже никого не удивить приложениями, позволяющими проводить инференс на современных домашних ПК. Но сами по себе они всего лишь инструмент, потенциал которого начинает раскрываться в более сложных сценариях автоматизации. Сегодня покажу, как старый добрый Node-Red может общаться с некоторыми нейросетями и в каких сценариях это будет более эффективно. Поехали!

Как не программисту самостоятельно написать программу? До появления термина «вайб-кодинг» единственным решением было использовать no-code-платформы. Их главное достоинство — возможность абстрагироваться от необходимости разбираться в коде и сосредоточиться на построении алгоритма действий, которые приведут к нужному результату.
Распространение подобных сервисов дало неоднозначный эффект. Это сильно снизило порог входа, позволив людям, далеким от программирования, сделать первые шаги в эту сторону. Яркий пример — организация умного дома. Теперь простые задачи легче решить самому, чем нанимать разработчика.
Последнее обстоятельство продолжает сохранять на плаву многие продукты, предназначенные для no-code-автоматизации, в частности Node-Red. Его я использую уже несколько лет на разных устройствах — от перепрошитого шлюза Xiaomi до одноплатника Raspberry Pi. Его сильные стороны — наглядность и модульность. Первое важно при построении сложных сценариев, а второе позволяет без труда соединять между собой сервисы разных вендоров.
Предварительная подготовка
Добавлять расширения в Node-Red очень просто. В правом верхнем углу нажимаем на значок с тремя полосками, в меню выбираем пункт Manage palette. После этого щелкаем на вкладку Install и в поисковой строке вводим интересующие ключевые слова. Начнем с интеграции Ollama, добавляя возможность взаимодействовать с нейросетями по API:

Устанавливаем node-red-contrib-ollama нажатием на кнопку Install. Ну или если вам нравится работать в командной строке, то через CLI:
$ npm install node-red-contrib-ollama
Через пару секунд в палитре отобразится много новых блоков, которые могут выполнять большинство операций с Ollama API — от скачивания моделей из библиотеки до их создания при помощи modelfile. В моей домашней лабе есть сервер с GPU, который последнее время безраздельно отдан под инференс локальных нейросетей. Ollama там развернута в виде Docker-контейнера вместе с интерфейсом OpenWebUI.
Особенность этого способа в том, что Ollama готова принимать подключения лишь с localhost и никак наружу его не выставляет. Поскольку все это находится внутри периметра домашней локалки, я могу без особых проблем пробросить порт наружу. Помимо этого, нужно пересобрать контейнер с новой переменной OLLAMA_HOST. Если присвоить ей значение 0.0.0.0, то сервер станет принимать подключения с любых адресов. Только после выполнения обоих действий получится напрямую обращаться к Ollama.
Проверить, все ли правильно настроено, можно, отправив пустой POST-request на следующий адрес:
http://[server_ip]:11434/api/generate
В ответ на это сервер плюнет кодом 400:
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Date: Wed, 14 May 2025 17:40:47 GMT
Content-Length: 32
{"error":"missing request body"}
Ошибка выдается, так как в теле запроса ничего нет. Зато понятно, что Ollama отвечает и можно переходить к тестированию через Node-Red.
Тестовый запрос
Самым простым вариантом будет использование ноды ollama-generate. В ее свойствах указываем сервер, имя предварительно скачанной модели и запрос в поле Prompt:

Если оставить этот блок в одиночестве, то он, разумеется, не сработает. Нам нужен триггер, который заставит ollama-generate сделать запрос. Проще всего взять стандартный блок inject. При добавлении на рабочее поле слева будет небольшая кнопка, при нажатии которой inject отправит некие данные в связанные с ним блоки. По умолчанию — метку времени, и менять это нет смысла. Важно то, что сам факт отправки послужит триггером для срабатывания.
Inject есть, запрос будет сгенерирован, но вот куда придет ответ? Чтобы можно было его увидеть, добавляем блок debug, который выведет в консоль справа содержимое объекта msg.payload. Минимально возможный воркфлоу для теста будет выглядеть так:

Этот подход дает множество преимуществ. Во-первых, блоку ollama-generate можно без проблем вместе с триггером подавать на вход промпт, и он в виде запроса будет успешно отправлен на сервер. Во-вторых, полученный ответ в объекте msg.payload можно легко распарсить или направить в другие блоки.
Голосовой помощник
Чуть более интересной задачей может стать распознавание голоса при помощи нейросети Whisper. Если локально развернуть ее на домашнем сервере, то можно будет скармливать ей записанные WAV-файлы (например, с микрофона для Raspberry Pi), а распознанный текст передавать в виде запроса другим нейросетям, таким как DeepSeek. Полученный ответ при этом воспроизводить с помощью движка TTS (Text-To-Speech). Получится локальная версия голосового ассистента вроде Алисы или Siri.
Сервер распознавания
Начать стоит с развертывания Whisper. Проще всего использовать порт whisper.cpp, поскольку последний работает быстро и имеет простейший HTTP-сервер.
Обновим кэш и установим необходимые пакеты для компиляции:
$ sudo apt update && sudo apt -y install build-essential cmake python3-pip ffmpeg libfftw3-dev
Клонируем репозиторий:
$ git clone https://github.com/ggerganov/whisper.cpp
Переходим в директорию и запускаем сборку:
$ cd whisper.cpp && make
Софт готов, теперь нужна модель. Для примера скачаем base-версию (также доступны варианты tiny / small / medium / large):
$ ./models/download-ggml-model.sh base
И запустим в виде сервиса:
$ ./build/bin/whisper-server -m models/ggml-base.bin --host 192.168.88.88 --port 1111
Whisper слушает HTTP-запросы на порту 1111. Для проверки с другой машины можно также клонировать репозиторий whisper.cpp, где в директории samples лежит пара тестовых файлов. Отправим один из них на распознавание:
$ curl -X POST -F "file=@/home/user/whisper.cpp/samples/jfk.wav" http://192.168.88.88:1111/inference
Образец был залит, успешно распознан, получен ответ:
{"text":" And so my fellow Americans, ask not what your country can do for you,\n ask what you can do for your country.\n"}
Теперь, когда у нас есть рабочий Whisper-сервер, можно подумать над воркфлоу.
Запись и отправка
Если у вас, как и у меня, Node-Red развернут на Raspberry Pi, то решить вопрос можно банальным подключением микрофона и вести запись с него. В общем виде это будет выглядеть следующим образом:

Здесь я намеренно не использую уже готовые ноды вроде ollama-generate, а создам схему исключительно штатными инструментами Node-Red. Теперь расскажу о каждом блоке чуть более детально.
«Старт» — обычный inject, который запустит процесс по нажатию кнопки. В дальнейшем можно будет задать иную активацию. «Запись аудио (5 сек.)» — штатная exec-нода, которая исполнит команду:
$ arecord -f cd -d 5 /home/user/prompt.wav
Она запишет звук с микрофона в файл prompt.wav. Длину фрагмента можно легко отрегулировать под свои нужды. Чуть ниже еще один exec, который закинет записанный файл на сервер для распознавания, фактически аналог команды:
curl -X POST http://192.168.88.88:1111/inference -F file=@/home/user/prompt.wav -F temperature=0.0 -F response_format=text
Следующий блок называется «В Whisper» и представляет собой обычный http request node с типом запроса POST и адресом эндпойнта http://192.168.88.88:1111/inference.
Перед отправкой данных в Ollama нужно указать имя модели в payload, для чего служит еще одна function-нода «Промпт для Ollama». Особенность в том, что Node-Red не умеет парсить потоковый NDJSON, поэтому нужно дополнительно указать это параметром stream:false:
msg.payload = {
model: "deepseek-r1:8b",
prompt: msg.payload.trim(),
stream: false
};
return msg;
Сформированный payload отправляем при помощи блока http request node. Тип запроса — POST, а вот эндпойнт меняем на предварительно проброшенный наружу из контейнера сервер Ollama — http://192.168.88.88:11434/api/generate.

Полученный ответ прилетит в debug и может быть использован для дальнейшей отправки на TTS-движок.
Вместо заключения
Говорят, старый конь борозды не испортит. Node-Red в этом плане однозначно заслуживает внимания, ведь он способен легко взаимодействовать с нейросетями, инференс которых запущен локально, не говоря уже об облачных решениях вроде ChatGPT. Для них есть масса блоков, а это позволяет связать нейросети с физическими устройствами и объектами. Например, соединив сервис генерации изображений, можно создать фоторамку, ежедневно удивляющую новым нейроартом.
Генеративные нейросети потенциально смогут лучше управлять умным домом, уходя от жесткой логики автоматизации и гибко разрешая ситуации, которые невозможно предусмотреть на этапе проектирования и эксплуатации. Разумеется, при создании таких систем нужно учитывать особенности работы с ИИ, в частности возможность статистических галлюцинаций.
А вы пробовали добавлять генеративные нейросети в умный дом? Рассказывайте в комментариях.
Комментарии (3)
YuryZakharov
22.05.2025 07:29А можно поподробнее о целях этой интеграции?
Чтобы сказать в микрофон "Включить свет в ванной"?
Я бы понял, если, например, скормить нейронке логи моего Home Assistant, а на выходе получить, ну, хотя бы рекомендации по улучшению сценариев.
А тут просто инструкция по подключению, коих и так достаточно.
buratino
В заголовке заявлен умный дом, да еще и без боли, в заключении говорится о возможности галлюцинаций. Интеграции с галлюцинациями есть, но чем оно умное и чем лучшее, чем без нейросетей?