Add project structure

This commit is contained in:
2025-12-30 14:05:39 +03:00
parent 0bcf52c7d1
commit 60169c4da7
3 changed files with 221 additions and 0 deletions

1
.cursorignore Normal file
View File

@@ -0,0 +1 @@
# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv)

55
chart.md Normal file
View File

@@ -0,0 +1,55 @@
---
id: 421a4a02-025a-4ab5-8ae3-fd52e2c738f0
---
flowchart LR
subgraph Vehicle["Автомобиль"]
OBD["OBD-II"]
CANBUS["HS-CAN\n500 kbps"]
OBD --> CANBUS
end
subgraph CANBoard["CAN-плата"]
PHY0["CAN PHY"]
PHY1["CAN PHY"]
MCP0["MCP2515\ncan0"]
MCP1["MCP2515\ncan1"]
ISO["Isolation"]
CANBUS --> PHY0
CANBUS --> PHY1
PHY0 --> MCP0
PHY1 --> MCP1
MCP0 --> ISO
MCP1 --> ISO
end
subgraph Edge["Raspberry Pi 5 (Edge)"]
SPI["SPI"]
SocketCAN["SocketCAN\nlisten-only"]
EdgeApp["Edge CAN Logger"]
LocalStore["SQLite WAL\nOffline Buffer"]
Forwarder["Store-and-Forward"]
ISO --> SPI
SPI --> SocketCAN
SocketCAN --> EdgeApp
EdgeApp --> LocalStore
LocalStore --> Forwarder
end
subgraph BackendHost["Backend Host"]
Influx["InfluxDB"]
Flask["Flask Backend"]
WS["WebSocket Server"]
end
subgraph UI["Web UI"]
Browser["Browser"]
Charts["Real-time Charts"]
end
Forwarder --> Influx
Influx --> Flask
Flask --> WS
WS --> Browser
Browser --> Charts

165
web/task_webui.md Normal file
View File

@@ -0,0 +1,165 @@
1.1 Цель
Разработать web-интерфейс реального времени для отображения CAN-данных, собираемых edge-устройством и сохраняемых в InfluxDB.
Система должна:
отображать данные в реальном времени,
работать на одном хосте с InfluxDB,
использовать Python / Flask,
использовать WebSocket для push-обновлений,
быть расширяемой под future-аналитику.
1.2 Общая архитектура
Edge (Raspberry Pi)
→ InfluxDB (write)
→ Flask Backend (read + stream)
→ Web UI (WebSocket)
InfluxDB — единый источник истины для UI
(не читаем данные напрямую с Edge).
1.3 Компоненты системы
1.3.1 Backend (Flask)
Назначение
HTTP API
WebSocket сервер
агрегация данных из InfluxDB
доставка данных в UI
Технологии
Python 3.11+
Flask
Flask-SocketIO (или websockets + ASGI)
InfluxDB Python Client
1.3.2 InfluxDB
Роль
time-series storage
буфер между Edge и UI
исторические запросы
Типы данных
CAN frames (raw)
декодированные сигналы (future)
1.3.3 Frontend (Web UI)
Назначение
визуализация CAN-данных
real-time обновление
базовая аналитика
Минимальный стек
HTML + JS
WebSocket клиент
Chart.js / ECharts (на ваш выбор)
1.4 Функциональные требования (MVP)
1.4.1 Real-time отображение
Обновление ≤ 500 мс
Push-модель (WebSocket)
Без polling
Отображать:
timestamp
CAN interface (can0 / can1)
CAN ID
DLC
DATA (hex)
frequency (msg/sec)
1.4.2 Исторический просмотр
выбор временного окна:
last 1 min / 5 min / 1 h
график:
частота сообщений
значение байтов (raw)
1.4.3 Фильтрация (UI)
по CAN ID
по интерфейсу
включение / выключение ID
Фильтрация не влияет на ingestion, только на отображение.
1.5 Нефункциональные требования
Производительность
≥ 510k msg/sec без деградации UI
batch-чтение из InfluxDB
Надёжность
UI не зависит от Edge availability
UI не ломается при временном отсутствии новых данных
Безопасность (минимум)
UI доступен только из доверенной сети
без write-доступа к InfluxDB
1.6 Поток данных (важно)
Write path
Edge → InfluxDB
Read / Stream path
InfluxDB → Flask → WebSocket → Browser
❗ Flask не принимает CAN напрямую
❗ WebSocket не ходит в InfluxDB
1.7 Ограничения (осознанные)
Flask — single logical service
Без auth (на MVP)
Без декодирования DBC (пока raw)