docs: refresh README for current architecture
This commit is contained in:
96
README.md
96
README.md
@@ -11,12 +11,13 @@
|
|||||||
- Яркость 10--100% с шагом 10%
|
- Яркость 10--100% с шагом 10%
|
||||||
- Цветовая температура 2700--6500K с шагом 100K
|
- Цветовая температура 2700--6500K с шагом 100K
|
||||||
- RGB-цвет через HSV-пикер
|
- RGB-цвет через HSV-пикер
|
||||||
- Сцены (загружаются с сервера)
|
- Сцены (загружаются с сервера, отображаются с человекочитаемыми названиями)
|
||||||
- Таймер "включить на 4 часа"
|
- Таймер "включить на 4 часа"
|
||||||
- **Расписания** -- одноразовые таймеры и cron-задачи с выбором дней недели. Просмотр и отмена активных задач.
|
- **Расписания** -- одноразовые таймеры и cron-задачи с выбором дней недели. Просмотр и отмена активных задач.
|
||||||
- **API-ключи** -- просмотр, создание, отзыв и повторная активация гостевых ключей для администраторов.
|
- **API-ключи** -- просмотр, создание, отзыв и повторная активация гостевых ключей для администраторов.
|
||||||
- **Статистика и лог событий** -- просмотр сводки по группам и последних событий сервера.
|
- **Статистика и лог событий** -- просмотр сводки по группам и последних событий сервера.
|
||||||
- **Геофенс** -- опциональное автовыключение света при уходе от дома.
|
- **Геофенс** -- опциональное автовыключение света при уходе от дома.
|
||||||
|
- **Устойчивость к ошибкам** -- гранулярные состояния загрузки (`LoadState`), централизованная обработка сетевых сбоев, soft-ошибки при управлении ползунками без спама в UI.
|
||||||
|
|
||||||
## Стек
|
## Стек
|
||||||
|
|
||||||
@@ -31,32 +32,45 @@
|
|||||||
|
|
||||||
## Структура проекта
|
## Структура проекта
|
||||||
|
|
||||||
```
|
```text
|
||||||
lib/
|
lib/
|
||||||
├── app/
|
├── app/
|
||||||
│ └── app_bootstrap.dart -- bootstrap приложения и стартовые состояния
|
│ ├── app_bootstrap.dart -- bootstrap приложения и навигация
|
||||||
|
│ ├── build_info.dart -- метаданные сборки (дата, git hash)
|
||||||
|
│ ├── error_message.dart -- форматирование ошибок API и сети
|
||||||
|
│ └── load_state.dart -- универсальный стейт загрузки (idle/loading/data/error)
|
||||||
├── main.dart -- точка входа, тема, роутер
|
├── main.dart -- точка входа, тема, роутер
|
||||||
├── models/
|
├── models/
|
||||||
│ └── home_config.dart -- несекретная модель "дома" (сервер)
|
│ ├── api_key_info.dart -- типизированная модель API-ключа
|
||||||
|
│ ├── auth_info.dart -- информация об авторизации
|
||||||
|
│ ├── event_log_item.dart -- лог событий
|
||||||
|
│ ├── home_config.dart -- несекретная конфигурация сервера
|
||||||
|
│ ├── ignis_device.dart -- устройство умного дома
|
||||||
|
│ ├── ignis_group.dart -- группа устройств и её состояние
|
||||||
|
│ ├── ignis_scene.dart -- сцена освещения
|
||||||
|
│ ├── schedule_task.dart -- задача расписания
|
||||||
|
│ └── stats_summary.dart -- статистика
|
||||||
├── services/
|
├── services/
|
||||||
│ ├── api_client.dart -- обёртка Dio для Ignis API
|
│ ├── api_client.dart -- HTTP-клиент к Ignis Core API
|
||||||
│ ├── credentials_storage.dart -- безопасное хранение API-ключей
|
│ ├── credentials_storage.dart -- безопасное хранение ключей
|
||||||
│ ├── geofence_worker.dart -- фоновая проверка геофенса
|
│ ├── geofence_worker.dart -- фоновая логика геофенса
|
||||||
│ └── settings_service.dart -- хранение домов и миграция ключей
|
│ └── settings_service.dart -- хранение списка "домов"
|
||||||
├── providers/
|
├── providers/
|
||||||
│ └── providers.dart -- Riverpod-провайдеры
|
│ └── providers.dart -- Riverpod-провайдеры (god object, подлежит распилу)
|
||||||
├── screens/
|
├── screens/
|
||||||
│ ├── api_keys_screen.dart -- управление API-ключами
|
│ ├── api_keys_screen.dart
|
||||||
│ ├── event_log_screen.dart -- лог событий
|
│ ├── event_log_screen.dart
|
||||||
│ ├── homes_screen.dart -- список домов
|
│ ├── homes_screen.dart
|
||||||
│ ├── home_edit_screen.dart -- добавление/редактирование дома
|
│ ├── home_edit_screen.dart
|
||||||
│ ├── remote_screen.dart -- пульт управления группами
|
│ ├── remote_screen.dart
|
||||||
│ ├── group_edit_screen.dart -- создание группы
|
│ ├── group_edit_screen.dart
|
||||||
│ ├── schedules_screen.dart -- расписания
|
│ ├── schedules_screen.dart
|
||||||
│ └── stats_screen.dart -- статистика
|
│ └── stats_screen.dart
|
||||||
└── widgets/
|
└── widgets/
|
||||||
├── group_card.dart -- карточка группы с управлением
|
├── build_info_text.dart -- лейбл с версией сборки
|
||||||
└── color_picker.dart -- HSV-пикер цвета
|
├── group_card.dart
|
||||||
|
├── load_error_view.dart -- универсальный виджет ошибок и retry
|
||||||
|
└── color_picker.dart
|
||||||
```
|
```
|
||||||
|
|
||||||
## Сборка
|
## Сборка
|
||||||
@@ -68,8 +82,8 @@ flutter pub get
|
|||||||
# Debug-запуск
|
# Debug-запуск
|
||||||
flutter run
|
flutter run
|
||||||
|
|
||||||
# Release APK
|
# Release APK (с пробросом build info)
|
||||||
flutter build apk --release
|
flutter build apk --release --dart-define=IGNIS_BUILD_DATE="$(date -u +'%Y-%m-%dT%H:%M:%SZ')" --dart-define=IGNIS_GIT_SHA="$(git rev-parse --short HEAD)"
|
||||||
```
|
```
|
||||||
|
|
||||||
APK: `build/app/outputs/flutter-apk/app-release.apk`
|
APK: `build/app/outputs/flutter-apk/app-release.apk`
|
||||||
@@ -83,12 +97,7 @@ flutter analyze
|
|||||||
flutter test
|
flutter test
|
||||||
```
|
```
|
||||||
|
|
||||||
Текущий baseline зелёный: анализатор без issues, тесты проходят. Перед установкой на телефон дополнительно проверялась сборка:
|
Текущий baseline зелёный: анализатор без issues, юнит-тесты на парсинг домена и состояния проходят штатно.
|
||||||
|
|
||||||
```bash
|
|
||||||
flutter build apk --debug
|
|
||||||
flutter build apk --release
|
|
||||||
```
|
|
||||||
|
|
||||||
## Настройка
|
## Настройка
|
||||||
|
|
||||||
@@ -96,42 +105,19 @@ flutter build apk --release
|
|||||||
|
|
||||||
Для добавления второго дома: кнопка "домик" в левом верхнем углу пульта -> экран домов -> кнопка "+".
|
Для добавления второго дома: кнопка "домик" в левом верхнем углу пульта -> экран домов -> кнопка "+".
|
||||||
|
|
||||||
API-ключи хранятся отдельно от конфигурации домов в `flutter_secure_storage`. Старые ключи, сохранённые прежними версиями приложения в `SharedPreferences`, автоматически мигрируются при запуске.
|
API-ключи хранятся отдельно от конфигурации домов в `flutter_secure_storage`. Старые ключи из `SharedPreferences` мигрируются автоматически.
|
||||||
|
|
||||||
## API
|
## API
|
||||||
|
|
||||||
Приложение работает с [Ignis Core API](https://git.akokos.ru) -- self-hosted бэкенд на FastAPI для управления лампами WiZ по локальной сети. Используемые эндпоинты:
|
Приложение работает с [Ignis Core API](https://git.akokos.ru) -- self-hosted бэкенд на FastAPI (контракт OpenAPI 3.1.0).
|
||||||
|
Авторизация происходит через заголовок `X-API-Key`.
|
||||||
| Метод | Путь | Назначение |
|
Доменный слой на стороне клиента полностью типизирован.
|
||||||
|--------|-----------------------------------|-----------------------------|
|
|
||||||
| GET | `/devices` | Список ламп |
|
|
||||||
| GET | `/devices/groups` | Список групп |
|
|
||||||
| GET | `/devices/scenes` | Доступные сцены |
|
|
||||||
| POST | `/devices/groups` | Создать группу |
|
|
||||||
| DELETE | `/devices/groups/{id}` | Удалить группу |
|
|
||||||
| POST | `/devices/rescan` | Пересканировать сеть |
|
|
||||||
| POST | `/control/group/{id}` | Управление группой |
|
|
||||||
| GET | `/control/group/{id}/status` | Статус группы |
|
|
||||||
| POST | `/schedules/once` | Одноразовый таймер |
|
|
||||||
| POST | `/schedules/cron` | Cron-расписание |
|
|
||||||
| GET | `/schedules/tasks` | Список задач |
|
|
||||||
| DELETE | `/schedules/{job_id}` | Отменить задачу |
|
|
||||||
| GET | `/auth/me` | Информация о текущем ключе |
|
|
||||||
| GET | `/api-keys` | Список гостевых ключей |
|
|
||||||
| POST | `/api-keys` | Создать гостевой ключ |
|
|
||||||
| POST | `/api-keys/revoke` | Отозвать ключ |
|
|
||||||
| POST | `/api-keys/activate` | Активировать ключ |
|
|
||||||
| GET | `/stats/summary` | Сводная статистика |
|
|
||||||
| GET | `/stats/log` | Лог событий |
|
|
||||||
|
|
||||||
Авторизация: заголовок `X-API-Key`.
|
|
||||||
|
|
||||||
## Текущие ограничения
|
## Текущие ограничения
|
||||||
|
|
||||||
- Целевая платформа сейчас Android.
|
- Целевая платформа сейчас Android.
|
||||||
- Release APK пока подписывается debug-ключом из Flutter-шаблона.
|
- Release APK пока подписывается debug-ключом из Flutter-шаблона.
|
||||||
- Архитектура всё ещё содержит крупный `providers.dart` и много сырых `Map<String, dynamic>`.
|
- Архитектура всё ещё содержит крупный `providers.dart`, который подлежит разделению на feature-oriented модули в рамках грядущих рефакторингов.
|
||||||
- Обработка ошибок стала лучше на bootstrap/polling, но ещё не унифицирована по всем экранам.
|
|
||||||
|
|
||||||
## Лицензия
|
## Лицензия
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user