Pull to refresh

Как я хотел сделать говорящую банку, а получилось нечто гораздо большее: история RuFA Hub

Level of difficultyMedium
Reading time4 min
Views2.4K

В декабре 2024 года я сел за написание дипломного проекта. Хотелось сделать не просто формальность для зачёта, а что-то реально рабочее, полезное и интересное. Так родилась идея RuFA Станции — по сути, «говорящей банки» с пинами, через которую можно было управлять внешними устройствами. Представьте себе что-то вроде умной колонки, которой можно сказать: «RuFA, подай 5V на пин 13», — и она выполнит.

Я поделился этой задумкой с одним знакомым, хорошо разбирающимся в схемотехнике. Мы встретились в кофейне, я начал описывать идею, а он выдал фразу, которая определила дальнейший путь:

«Слушай, ну это... идея так себе. Ты можешь лучше».

Это немного сбило с настроя, но и дало толчок. Прямо там за кофе мы начали крутить новую концепцию: а что если сделать не просто коробку с пинами, а систему маршрутизации пакетов между микроконтроллерами? Что-то вроде роутера, но не для интернета, а для логики и взаимодействия между устройствами.

А потом стало понятно, что это уже не просто диплом

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

На четвёртом месяце я решил проверить всё в «полевых условиях» — и написал плагин для Minecraft-сервера.

Minecraft + Telegram = первые тесты

Плагин ловил событие входа игрока на сервер и отправлял пакет в RuFA Hub. Пример:

{

  "api": "f7643450b89d5ef7867b1a92144cab58",

  "module": "TG_Bot",

  "data": {

    "name": "Steve",

    "pos": "X:123 Y:64 Z:321"

  }

}

RuFA Hub получал пакет, определял нужный модуль (TG_Bot.py) и передавал данные в него. Модуль запускал Telegram-бота, который отправлял мне сообщение:

🟢 Игрок Steve зашёл на сервер на координатах X:123 Y:64 Z:321.

Именно в этот момент я понял — это уже не просто проект для диплома, а универсальный центр взаимодействия между чем угодно: микроконтроллерами, внешними программами, скриптами, оборудованием, софтом.

Немного контекста: почему я вообще за это взялся?

В 2024 году я участвовал в чемпионате по профессиональному мастерству в компетенции Интернет вещей. Для работы с оборудованием нам выдали закрытое ПО под названием ControlCenter — оно просто принимало пакеты и передавало их дальше в жёстко заданном формате. Никакой гибкости, минимум логики, всё работало «на костылях».

Говорили, что его дорабатывали год. Я посмотрел на это и подумал: «Почему бы не сделать нормальное решение, с открытым кодом, удобное, модульное, гибкое и не привязанное к конкретному оборудованию?»
Так и началась работа над RuFA Hub.

Как RuFA Hub почти стал ООО (и чуть не угробил меня за сутки)

Когда RuFA Hub уже почти вышел из стадии «бумажного концепта» и превратился во что-то живое, я случайно встретил знакомого, который на тот момент учился в УГНТУ в Уфе. За вечерним разговором я вскользь упомянул, что сейчас пилю интересный проект. Он заинтересовался, а потом говорит:

«А ты знал, что послезавтра у нас в “Точке кипения” будет презентация стартапов перед Газпромом? Можешь выступить, я тебя запишу».

Я, особо не думая, согласился. И только по дороге домой понял... Презентация — через сутки, а мой софт едва дышит, модулей почти нет, интерфейс пустой. Короче, ад и дичь.

Это были самые тяжёлые сутки в моей жизни. Я не ел, не спал — просто писал код. Параллельно мой одногруппник-инженер собирал «умную лампу» из ESP32, сантехнической трубы и светодиодной ленты. Я писал под неё прошивку, готовил демо, натягивал хоть какой-то интерфейс.

С колледжа мне разрешили взять ноутбук, роутер Keenetic и Raspberry Pi 4, на котором и крутился тот самый сырой RuFA Hub. Мы буквально собрали экспозицию на коленке.

Презентация получилась... странной. Это было моё первое публичное выступление в жизни, и тут сразу Газпромовцы, камеры, люди в костюмах. Было кринжово, неловко, но я рассказал, как мог.

И неожиданно — сработало. На следующий день мне написал один из участников, попросил рассказать о RuFA Hub подробнее. С тех пор я подал проект на грант «Студенческий стартап» и теперь вместе с небольшой командой развиваю RuFA Hub в сторону сетевых и универсальных решений для взаимодействия оборудования.

Как всё устроено внутри

В текущем виде RuFA Hub — это сервер на Python, работающий через Flask и WebSocket. Он принимает входящие пакеты, разбирает их и перенаправляет в нужный модуль. Основная идея: разделить логику, маршрутизацию и действия, чтобы они не мешали друг другу.

Устройства и внешние источники (например, плагины, скрипты, контроллеры) отправляют пакеты в формате JSON. У каждого пакета есть поле module, которое указывает, куда именно его нужно направить.
Модули — это просто Python-скрипты, которые реализуют обработку этих данных. Всё максимально прозрачно.

В RuFA Hub нет жёсткой привязки: один модуль может быть как одним .py-файлом, так и полноценной директорией со своей структурой:

  • main.py — точка входа

  • config.json или .env — конфигурация

  • зависимости, вспомогательные утилиты — по необходимости

Если задача простая — достаточно и одного файла. Я постарался сделать так, чтобы модуль мог собрать даже новичок, знающий только базовые конструкции Python.

Дополнительно я сделал поддержку устройств на базе ESP (я называю их RuFA Connect) — они подключаются по Wi-Fi, могут управляться удалённо (вплоть до выключения питания), и даже прошиваться по сети. Всё это работает через внутренний API.

Архитектура довольно лёгкая: весь RuFA Hub весит около 89 МБ, включая веб-интерфейс, ядро, и всё необходимое для запуска. Я изначально ориентировался на то, чтобы он запускался хоть на Raspberry Pi, хоть на сервере с Xeon — и в этом плане всё получилось.

Что дальше?

Сейчас RuFA Hub находится в стадии альфы. Некоторые функции работают нестабильно или не реализованы вовсе. Периодически переписываю ядро с нуля — но так и должно быть в начале.

Мне 17 лет, я — единственный разработчик проекта. Это отражается на скорости, но даёт полное понимание происходящего. Каждая строчка кода написана с мыслью «а удобно ли это будет другим?».

Пока проект не претендует на продакшен-уровень, но я выкладываю исходники, веду разработку открыто и рад фидбеку от сообщества.

Финалочка

Впереди ещё куча задач, но я точно знаю, куда иду. И мне нравится этот путь.

Tags:
Hubs:
+18
Comments26

Articles