# Ignis App Android-клиент для self-hosted backend [Ignis Core](https://git.akokos.ru/artem.kokos/ignis-core). Приложение управляет группами ламп WiZ, расписаниями, API-ключами и гео-автоматизацией ухода из дома. ## Что умеет - несколько домов с отдельными URL и API-ключами; - управление группами света: `on/off`, яркость, температура, RGB, сцены; - таймер "включить на 4 часа"; - одноразовые и повторяющиеся расписания; - статистика и лог событий; - управление гостевыми API-ключами для администратора; - расстояние до дома и автовыключение света по geofence. ## Гео-автоматизация Для активного дома приложение может зарегистрировать системный Android geofence. После подтверждённого `EXIT` запускается короткая фоновая задача, которая проверяет группы и выключает только те, что реально включены. Это не polling каждые 15 минут. Основной триггер здесь событийный: - geofence регистрируется нативно через Android geofencing API; - сетевое выключение выполняется отдельным one-off worker; - при отсутствии координат или выключенной опции geofence не армится. ## Стек - Flutter / Dart - Riverpod - Dio - SharedPreferences - flutter_secure_storage - Geolocator - 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 flutter pub get flutter run ``` ## Release APK ```bash 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)" ``` Артефакт: ```text build/app/outputs/flutter-apk/app-release.apk ``` ## Проверки ```bash flutter analyze flutter test ``` Сейчас тестами прикрыты: - parsing и load-state основных backend-ответов; - сериализация `HomeConfig` и geofence radius; - синхронизация активного дома с geofence automation; - form logic для домов, групп и расписаний; - provider-мутаторы расписаний, API-ключей и group control; - widget-сценарии форм, `GroupCard` и error/retry потоков. ## Настройка 1. Добавить дом: адрес сервера Ignis и API-ключ. 2. При необходимости задать координаты дома. 3. Включить "выключать свет при уходе". 4. Выдать Android-разрешения на геолокацию, включая background location. API-ключи хранятся отдельно от списка домов в `flutter_secure_storage`. Старые ключи из `SharedPreferences` мигрируются автоматически. ## Ограничения - целевая платформа сейчас Android; - реальное поведение background execution, geofence delivery и OEM battery restrictions подтверждается в основном ручными проверками на устройстве; - force-stop приложения со стороны Android может ломать автоподъём фоновой логики до следующего ручного запуска. ## Лицензия Частный проект.