117 lines
4.7 KiB
Markdown
117 lines
4.7 KiB
Markdown
# 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 может ломать автоподъём фоновой логики до следующего ручного запуска.
|
||
|
||
## Лицензия
|
||
|
||
Частный проект.
|