Files
ignis_app/README.md
2026-05-12 11:27:01 +07:00

117 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 может ломать автоподъём фоновой логики до следующего ручного запуска.
## Лицензия
Частный проект.