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