Files
ignis_app/README.md
2026-04-22 21:13:16 +07:00

127 lines
7.2 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
Мобильное приложение для управления умными лампами WiZ через self-hosted сервер [Ignis Core](https://git.akokos.ru).
## Возможности
- **Мульти-дом** -- поддержка нескольких серверов Ignis (квартира, дача, друзья). Каждый дом -- отдельный сервер со своим URL и API-ключом.
- **Группы ламп** -- создание, удаление, управление. При создании группы можно выбрать нужные лампы из списка обнаруженных устройств, пересканировать сеть.
- **Управление освещением:**
- Включение/выключение
- Яркость 10--100% с шагом 10%
- Цветовая температура 2700--6500K с шагом 100K
- RGB-цвет через HSV-пикер
- Сцены (загружаются с сервера)
- Таймер "включить на 4 часа"
- **Расписания** -- одноразовые таймеры и cron-задачи с выбором дней недели. Просмотр и отмена активных задач.
- **API-ключи** -- просмотр, создание, отзыв и повторная активация гостевых ключей для администраторов.
- **Статистика и лог событий** -- просмотр сводки по группам и последних событий сервера.
- **Геофенс** -- опциональное автовыключение света при уходе от дома.
## Стек
- Flutter 3.x / Dart
- Riverpod -- управление состоянием
- Dio -- HTTP-клиент
- SharedPreferences -- локальное хранение настроек
- Geolocator -- геолокация
- Workmanager -- периодические фоновые задачи
- Flutter Local Notifications -- локальные уведомления
## Структура проекта
```
lib/
├── main.dart -- точка входа, тема, роутер
├── models/
│ └── home_config.dart -- модель "дома" (сервер)
├── services/
│ ├── api_client.dart -- обёртка Dio для Ignis API
│ ├── geofence_worker.dart -- фоновая проверка геофенса
│ └── settings_service.dart -- хранение домов в SharedPreferences
├── providers/
│ └── providers.dart -- Riverpod-провайдеры
├── screens/
│ ├── api_keys_screen.dart -- управление API-ключами
│ ├── 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/
├── group_card.dart -- карточка группы с управлением
└── color_picker.dart -- HSV-пикер цвета
```
## Сборка
```bash
# Зависимости
flutter pub get
# Debug-запуск
flutter run
# Release APK
flutter build apk --release
```
APK: `build/app/outputs/flutter-apk/app-release.apk`
> Сейчас release APK подписывается debug-ключом из Flutter-шаблона. Для личной установки на телефон этого достаточно, для настоящего релиза подпись нужно заменить.
## Проверки
```bash
flutter analyze
flutter test
```
Текущий baseline после коммита `ffc2ea1` зелёный: анализатор без issues, тесты проходят.
## Настройка
При первом запуске приложение попросит добавить "дом" -- указать адрес сервера Ignis и API-ключ. После этого откроется пульт управления группами.
Для добавления второго дома: кнопка "домик" в левом верхнем углу пульта -> экран домов -> кнопка "+".
## API
Приложение работает с [Ignis Core API](https://git.akokos.ru) -- self-hosted бэкенд на FastAPI для управления лампами WiZ по локальной сети. Используемые эндпоинты:
| Метод | Путь | Назначение |
|--------|-----------------------------------|-----------------------------|
| GET | `/devices` | Список ламп |
| GET | `/devices/groups` | Список групп |
| GET | `/devices/scenes` | Доступные сцены |
| POST | `/devices/groups` | Создать группу |
| DELETE | `/devices/groups/{id}` | Удалить группу |
| POST | `/devices/rescan` | Пересканировать сеть |
| POST | `/control/group/{id}` | Управление группой |
| GET | `/control/group/{id}/status` | Статус группы |
| POST | `/schedules/once` | Одноразовый таймер |
| POST | `/schedules/cron` | Cron-расписание |
| GET | `/schedules/tasks` | Список задач |
| DELETE | `/schedules/{job_id}` | Отменить задачу |
| GET | `/auth/me` | Информация о текущем ключе |
| GET | `/api-keys` | Список гостевых ключей |
| POST | `/api-keys` | Создать гостевой ключ |
| POST | `/api-keys/revoke` | Отозвать ключ |
| POST | `/api-keys/activate` | Активировать ключ |
| GET | `/stats/summary` | Сводная статистика |
| GET | `/stats/log` | Лог событий |
Авторизация: заголовок `X-API-Key`.
## Текущие ограничения
- Целевая платформа сейчас Android.
- API-ключи пока хранятся в `SharedPreferences`; это следующий приоритетный технический долг.
- Архитектура всё ещё содержит крупный `providers.dart` и много сырых `Map<String, dynamic>`.
## Лицензия
Частный проект.