Контекст и задача: Необходимо разработать self-hosted веб-приложение для мониторинга и динамической визуализации топологии домашней сети и устройств умного дома. Сеть состоит из разнородного оборудования (гетерогенная среда): Роутеры WiFi: Asus, MikroTik, Ubiquiti, OpenWRT Коммутаторы: D-Link, SNR, Cisco Серверы: Linux-сервер с Docker-контейнерами, серверы VM Proxmox NAS: Synology IoT-устройства: Zigbee и Matter, заведенные в Home Assistant Главная цель приложения — опрашивать все системы, приводить данные к единому формату: Узлы (Nodes) Связи (Edges) Отрисовка интерактивной живой карты сети: Толщина линий зависит от скорости сетевого интерфейса (10G/1G/100M и т.д.) Цвет линии отражает нагрузку Тап по узлу показывает его состояние и сервисы (например, список Docker-контейнеров или VM) Тап по линии — график нагрузки Возможность автоматического сопоставления MAC-адресов (например, между коммутатором и сервером) и ручного редактирования карты. Архитектура системы: Backend (Python / FastAPI) Скрипт-коллектор, который по расписанию (раз в 30–60 секунд) собирает данные из источников Эндпоинт /api/topology — отдает JSON для фронтенда База данных (Redis / SQLite) Кэширование последнего состояния сети Предотвращение частых запросов к роутерам при обновлении страницы Frontend (HTML5 / JS) Одна страница с использованием библиотеки vis.js или Cytoscape.js Запрашивает JSON и строит граф с поддержкой физики Требования к модулям сбора данных (Backend): Модуль роутеров и коммутаторов (Asus, MikroTik, Ubiquiti, OpenWRT, D-Link, Cisco, SNR): Реализовать абстрактный класс или универсальный метод сбора через SNMPv1/v2/v3 (используя pysnmp или аналоги) Собирать: Список подключенных MAC-адресов по интерфейсам/портам Сопоставлять с другими устройствами Утилизацию трафика (In/Out octets) Для MikroTik — дополнительно собирать Wi-Fi клиентов через RouterOS v7 REST API Модуль Docker: Использовать docker-py Собирать список запущенных контейнеров, их ID, статус и связывать с “родительским” узлом — сервером Модуль умного дома (Zigbee/Matter): Интеграция с Home Assistant REST API Запрашивать /api/states, фильтровать устройства по признаку интеграции (например, zha, zigbee2mqtt) Привязывать устройства к узлу “Home Assistant” Требования к структуре данных (JSON вывода): Выходной JSON должен соответствовать формату для vis.js: ``` { "nodes": [ { "id": "уникальный_ключ", "label": "Имя устройства (или IP/MAC)", "group": "категория_для_стилей", "status": "online/offline" } ], "edges": [ { "from": "id_источника", "to": "id_приемника", "label": "Метрика трафика (например, 45 Mbps)", "value": "число_для_цвета_линии" } ] } ``` Что нужно сгенерировать: Чистая архитектура проекта — структура файлов Полный рабочий код бэкенда на FastAPI с реализацией модулей сбора данных (с заглушками под реальные IP/токены) Пример фронтенд-страницы (index.html) — обновление графа каждые 10 секунд без перезагрузки Docker-compose файл — для быстрого деплоя всей системы (FastAPI + Redis + Frontend) одной командой Дополнительные требования: Код должен быть написан с соблюдением принципов SOLID Обработка исключений — чтобы падение одного устройства не ломало весь сбор Подробные комментарии на русском языке