Remove AI docs and refresh project docs
This commit is contained in:
152
README.md
152
README.md
@@ -1,30 +1,40 @@
|
||||
# Ignis App
|
||||
|
||||
Android-клиент для self-hosted backend [Ignis Core](https://git.akokos.ru/artem.kokos/ignis-core). Приложение управляет группами ламп WiZ, расписаниями, API-ключами и гео-автоматизацией ухода из дома.
|
||||
`ignis_app` — Android-first Flutter-клиент для локального backend-проекта `../ignis-core`.
|
||||
|
||||
## Что умеет
|
||||
## Что умеет сейчас
|
||||
|
||||
- несколько домов с отдельными URL и API-ключами;
|
||||
- управление группами света: `on/off`, яркость, температура, RGB, сцены;
|
||||
- таймер "включить на 4 часа";
|
||||
- одноразовые и повторяющиеся расписания;
|
||||
- статистика и лог событий;
|
||||
- управление гостевыми API-ключами для администратора;
|
||||
- расстояние до дома и автовыключение света по geofence.
|
||||
- хранить несколько домов с разными URL и API-ключами;
|
||||
- переключать активный дом и проверять `auth/me` при выборе;
|
||||
- управлять группами света: `on/off`, яркость, температура, RGB, сцены;
|
||||
- ставить быстрый таймер на 4 часа;
|
||||
- создавать one-shot и cron-расписания;
|
||||
- смотреть stats summary и event log;
|
||||
- управлять гостевыми API-ключами;
|
||||
- показывать состояние geofence/permissions/notifications;
|
||||
- включать Android geofence для активного дома.
|
||||
|
||||
## Гео-автоматизация
|
||||
## Архитектура
|
||||
|
||||
Для активного дома приложение может зарегистрировать системный Android geofence. После подтверждённого `EXIT` запускается короткая фоновая задача, которая проверяет группы и выключает только те, что реально включены. После успешной фоновой обработки приложение может показать локальное подтверждение через Android notifications.
|
||||
- `lib/app/` — bootstrap, build info, load/error helpers.
|
||||
- `lib/features/*` — feature-specific providers и domain logic.
|
||||
- `lib/models/` — typed models для backend payloads.
|
||||
- `lib/screens/` — экраны приложения.
|
||||
- `lib/services/` — API client, settings, credentials storage.
|
||||
- `android/app/src/main/kotlin/...` — platform channel, geofence manager, worker, notifications.
|
||||
|
||||
Это не polling каждые 15 минут. Основной триггер здесь событийный:
|
||||
- geofence регистрируется нативно через Android geofencing API;
|
||||
- сетевое выключение выполняется отдельным one-off worker;
|
||||
- ошибки отдельных групп не должны блокировать выключение остальных;
|
||||
- при отсутствии координат или выключенной опции geofence не армится.
|
||||
Ключевые точки:
|
||||
|
||||
## Стек
|
||||
- `SettingsService` хранит список домов в `SharedPreferences`.
|
||||
- API-ключи лежат отдельно в `flutter_secure_storage`.
|
||||
- `CurrentHomeNotifier` переключает активный дом и переинициализирует `IgnisApi`.
|
||||
- `MainGate` делает bootstrap и отправляет пользователя либо в `HomesScreen`, либо в `RemoteScreen`.
|
||||
- `GeofenceAutomationService` синхронизирует активный дом с Android-side geofence.
|
||||
|
||||
## Технологии
|
||||
|
||||
- Flutter / Dart
|
||||
- Material UI
|
||||
- Riverpod
|
||||
- Dio
|
||||
- SharedPreferences
|
||||
@@ -33,34 +43,6 @@ Android-клиент для self-hosted backend [Ignis Core](https://git.akokos.
|
||||
- Android Geofencing API
|
||||
- Android WorkManager
|
||||
|
||||
## Структура
|
||||
|
||||
```text
|
||||
lib/
|
||||
├── app/ # bootstrap, build info, error/load helpers
|
||||
├── features/ # feature-level providers and logic
|
||||
│ ├── api_keys/
|
||||
│ ├── auth/
|
||||
│ ├── groups/
|
||||
│ ├── homes/
|
||||
│ ├── remote/
|
||||
│ ├── schedules/
|
||||
│ ├── shared/
|
||||
│ └── stats/
|
||||
├── models/ # typed domain models
|
||||
├── providers/ # public provider barrel
|
||||
├── screens/ # UI screens
|
||||
├── services/ # API client, settings, credentials
|
||||
└── widgets/ # reusable UI widgets
|
||||
|
||||
android/app/src/main/kotlin/ru/akokos/ignis_app/
|
||||
├── MainActivity.kt
|
||||
├── GeofenceAutomationManager.kt
|
||||
├── GeofenceBroadcastReceiver.kt
|
||||
├── GeofenceExitWorker.kt
|
||||
└── GeofenceRestoreReceiver.kt
|
||||
```
|
||||
|
||||
## Запуск
|
||||
|
||||
```bash
|
||||
@@ -82,6 +64,45 @@ flutter build apk --release \
|
||||
build/app/outputs/flutter-apk/app-release.apk
|
||||
```
|
||||
|
||||
Без `IGNIS_BUILD_DATE` и `IGNIS_GIT_SHA` экран настроек покажет `build info unavailable`.
|
||||
|
||||
## Настройка дома
|
||||
|
||||
1. Добавить дом: имя, URL backend и API-ключ.
|
||||
2. При необходимости добавить координаты дома.
|
||||
3. Выбрать дом активным.
|
||||
4. Для geofence выдать Android-доступ к геолокации, включая background location.
|
||||
5. Для подтверждающих уведомлений выдать permission на notifications.
|
||||
|
||||
URL нормализуется в `IgnisApi.normalizeBaseUrl()`:
|
||||
|
||||
- если схема не указана, добавляется `https://`;
|
||||
- хвостовые `/` убираются.
|
||||
|
||||
## Geofence и Android-side логика
|
||||
|
||||
Что есть:
|
||||
|
||||
- platform channel `ignis/geofence_automation`;
|
||||
- нативная регистрация geofence;
|
||||
- восстановление geofence после `BOOT_COMPLETED` и `MY_PACKAGE_REPLACED`;
|
||||
- delayed exit worker через WorkManager;
|
||||
- локальные уведомления о фоновой обработке;
|
||||
- Android-side шифрование geofence config и активного API-ключа.
|
||||
|
||||
Что важно понимать:
|
||||
|
||||
- это самая рискованная часть приложения;
|
||||
- поведение зависит от Android permissions, OEM battery policy и фоновых ограничений;
|
||||
- после изменений backend-контракта EXIT-поток нужно перепроверять вручную на устройстве.
|
||||
|
||||
## Хранение данных
|
||||
|
||||
- список домов, активный дом и тема — `SharedPreferences`;
|
||||
- API-ключи домов — `flutter_secure_storage`;
|
||||
- Android geofence config и активный API-ключ для worker'а дополнительно шифруются в native storage;
|
||||
- legacy `apiKey` внутри JSON списка домов мигрируется автоматически при чтении.
|
||||
|
||||
## Проверки
|
||||
|
||||
```bash
|
||||
@@ -89,32 +110,29 @@ flutter analyze
|
||||
flutter test
|
||||
```
|
||||
|
||||
Сейчас тестами прикрыты:
|
||||
- parsing и load-state основных backend-ответов;
|
||||
- сериализация `HomeConfig` и geofence radius;
|
||||
- синхронизация активного дома с geofence automation;
|
||||
- form logic для домов, групп и расписаний;
|
||||
- provider-мутаторы расписаний, API-ключей и group control;
|
||||
- widget-сценарии форм, `GroupCard` и error/retry потоков.
|
||||
На 2026-05-16 в `test/` лежит 74 unit/widget-теста.
|
||||
|
||||
## Настройка
|
||||
Покрыто:
|
||||
|
||||
1. Добавить дом: адрес сервера Ignis и API-ключ.
|
||||
2. При необходимости задать координаты дома.
|
||||
3. Включить "выключать свет при уходе".
|
||||
4. Выдать Android-разрешения на геолокацию, включая background location.
|
||||
5. Разрешить уведомления, если нужны подтверждения о срабатывании geofence.
|
||||
- `IgnisApi` и нормализация base URL;
|
||||
- сериализация `HomeConfig`;
|
||||
- миграция и хранение настроек;
|
||||
- bootstrap и auth/load-state;
|
||||
- provider mutations для групп, расписаний и API-ключей;
|
||||
- widget-потоки для `GroupCard`, форм домов/групп/расписаний и error/retry;
|
||||
- geofence sync на уровне Flutter-side provider/service логики;
|
||||
- permission/status providers для geofence и notifications.
|
||||
|
||||
API-ключи хранятся отдельно от списка домов в `flutter_secure_storage`. Для нативного geofence active-home config и текущий API-ключ дополнительно шифруются на Android-стороне. Старые ключи из `SharedPreferences` мигрируются автоматически.
|
||||
Не покрыто как следует:
|
||||
|
||||
При редактировании существующего дома приложение не требует онлайн-проверку backend, если URL и API-ключ не менялись: локальные правки имени, координат и geofence-параметров можно сохранять отдельно.
|
||||
- нативный Android geofence path;
|
||||
- `MainActivity` и platform-channel flow;
|
||||
- реальное фоновое поведение WorkManager на устройстве.
|
||||
|
||||
## Ограничения
|
||||
|
||||
- целевая платформа сейчас Android;
|
||||
- реальное поведение background execution, geofence delivery и OEM battery restrictions подтверждается в основном ручными проверками на устройстве;
|
||||
- force-stop приложения со стороны Android может ломать автоподъём фоновой логики до следующего ручного запуска.
|
||||
|
||||
## Лицензия
|
||||
|
||||
Частный проект.
|
||||
- продукт по факту поддерживается как Android-first клиент;
|
||||
- iOS, web, desktop каталоги присутствуют как Flutter scaffold, но не считаются поддерживаемыми продуктными платформами;
|
||||
- `apiProvider` конфигурируется мутирующим `init()`, поэтому переключение домов требует аккуратности;
|
||||
- крупные экраны вроде `SettingsScreen` и `SchedulesScreen` всё ещё держат много UI-ответственности;
|
||||
- release signing в репозитории не настроен.
|
||||
|
||||
Reference in New Issue
Block a user