Remove AI docs and refresh project docs

This commit is contained in:
Artem Kokos
2026-05-16 15:50:40 +07:00
parent 894ba91095
commit 0a635115d4
3 changed files with 91 additions and 295 deletions

152
README.md
View File

@@ -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 в репозитории не настроен.