125 lines
7.4 KiB
Markdown
125 lines
7.4 KiB
Markdown
# Ignis App
|
||
|
||
Мобильное приложение для управления умными лампами WiZ через self-hosted сервер [Ignis Core](https://git.akokos.ru).
|
||
|
||
## Возможности
|
||
|
||
- **Мульти-дом** -- поддержка нескольких серверов Ignis (квартира, дача, друзья). Каждый дом -- отдельный сервер со своим URL и API-ключом.
|
||
- **Группы ламп** -- создание, удаление, управление. При создании группы можно выбрать нужные лампы из списка обнаруженных устройств, пересканировать сеть.
|
||
- **Управление освещением:**
|
||
- Включение/выключение
|
||
- Яркость 10--100% с шагом 10%
|
||
- Цветовая температура 2700--6500K с шагом 100K
|
||
- RGB-цвет через HSV-пикер
|
||
- Сцены (загружаются с сервера, отображаются с человекочитаемыми названиями)
|
||
- Таймер "включить на 4 часа"
|
||
- **Расписания** -- одноразовые таймеры и cron-задачи с выбором дней недели. Просмотр и отмена активных задач.
|
||
- **API-ключи** -- просмотр, создание, отзыв и повторная активация гостевых ключей для администраторов.
|
||
- **Статистика и лог событий** -- просмотр сводки по группам и последних событий сервера.
|
||
- **Геофенс** -- опциональное автовыключение света при уходе от дома.
|
||
- **Устойчивость к ошибкам** -- гранулярные состояния загрузки (`LoadState`), централизованная обработка сетевых сбоев, soft-ошибки при управлении ползунками без спама в UI.
|
||
|
||
## Стек
|
||
|
||
- Flutter 3.x / Dart
|
||
- Riverpod -- управление состоянием
|
||
- Dio -- HTTP-клиент
|
||
- SharedPreferences -- локальное хранение несекретных настроек
|
||
- Flutter Secure Storage -- безопасное хранение API-ключей
|
||
- Geolocator -- геолокация
|
||
- Workmanager -- периодические фоновые задачи
|
||
- Flutter Local Notifications -- локальные уведомления
|
||
|
||
## Структура проекта
|
||
|
||
```text
|
||
lib/
|
||
├── app/
|
||
│ ├── app_bootstrap.dart -- bootstrap приложения и навигация
|
||
│ ├── build_info.dart -- метаданные сборки (дата, git hash)
|
||
│ ├── error_message.dart -- форматирование ошибок API и сети
|
||
│ └── load_state.dart -- универсальный стейт загрузки (idle/loading/data/error)
|
||
├── main.dart -- точка входа, тема, роутер
|
||
├── models/
|
||
│ ├── api_key_info.dart -- типизированная модель API-ключа
|
||
│ ├── auth_info.dart -- информация об авторизации
|
||
│ ├── event_log_item.dart -- лог событий
|
||
│ ├── home_config.dart -- несекретная конфигурация сервера
|
||
│ ├── ignis_device.dart -- устройство умного дома
|
||
│ ├── ignis_group.dart -- группа устройств и её состояние
|
||
│ ├── ignis_scene.dart -- сцена освещения
|
||
│ ├── schedule_task.dart -- задача расписания
|
||
│ └── stats_summary.dart -- статистика
|
||
├── services/
|
||
│ ├── api_client.dart -- HTTP-клиент к Ignis Core API
|
||
│ ├── credentials_storage.dart -- безопасное хранение ключей
|
||
│ ├── geofence_worker.dart -- фоновая логика геофенса
|
||
│ └── settings_service.dart -- хранение списка "домов"
|
||
├── providers/
|
||
│ └── providers.dart -- Riverpod-провайдеры (god object, подлежит распилу)
|
||
├── screens/
|
||
│ ├── api_keys_screen.dart
|
||
│ ├── event_log_screen.dart
|
||
│ ├── homes_screen.dart
|
||
│ ├── home_edit_screen.dart
|
||
│ ├── remote_screen.dart
|
||
│ ├── group_edit_screen.dart
|
||
│ ├── schedules_screen.dart
|
||
│ └── stats_screen.dart
|
||
└── widgets/
|
||
├── build_info_text.dart -- лейбл с версией сборки
|
||
├── group_card.dart
|
||
├── load_error_view.dart -- универсальный виджет ошибок и retry
|
||
└── color_picker.dart
|
||
```
|
||
|
||
## Сборка
|
||
|
||
```bash
|
||
# Зависимости
|
||
flutter pub get
|
||
|
||
# Debug-запуск
|
||
flutter run
|
||
|
||
# Release APK (с пробросом build info)
|
||
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)"
|
||
```
|
||
|
||
APK: `build/app/outputs/flutter-apk/app-release.apk`
|
||
|
||
> Сейчас release APK подписывается debug-ключом из Flutter-шаблона. Для личной установки на телефон этого достаточно, для настоящего релиза подпись нужно заменить.
|
||
|
||
## Проверки
|
||
|
||
```bash
|
||
flutter analyze
|
||
flutter test
|
||
```
|
||
|
||
Текущий baseline зелёный: анализатор без issues, юнит-тесты на парсинг домена и состояния проходят штатно.
|
||
|
||
## Настройка
|
||
|
||
При первом запуске приложение попросит добавить "дом" -- указать адрес сервера Ignis и API-ключ. После этого откроется пульт управления группами.
|
||
|
||
Для добавления второго дома: кнопка "домик" в левом верхнем углу пульта -> экран домов -> кнопка "+".
|
||
|
||
API-ключи хранятся отдельно от конфигурации домов в `flutter_secure_storage`. Старые ключи из `SharedPreferences` мигрируются автоматически.
|
||
|
||
## API
|
||
|
||
Приложение работает с [Ignis Core API](https://git.akokos.ru) -- self-hosted бэкенд на FastAPI (контракт OpenAPI 3.1.0).
|
||
Авторизация происходит через заголовок `X-API-Key`.
|
||
Доменный слой на стороне клиента полностью типизирован.
|
||
|
||
## Текущие ограничения
|
||
|
||
- Целевая платформа сейчас Android.
|
||
- Release APK пока подписывается debug-ключом из Flutter-шаблона.
|
||
- Архитектура всё ещё содержит крупный `providers.dart`, который подлежит разделению на feature-oriented модули в рамках грядущих рефакторингов.
|
||
|
||
## Лицензия
|
||
|
||
Частный проект.
|