Ignis App

Мобильное приложение для управления умными лампами WiZ через self-hosted сервер Ignis Core.

Возможности

  • Мульти-дом -- поддержка нескольких серверов 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 -- локальные уведомления

Структура проекта

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    -- хранение списка "домов"
├── features/
│   ├── api_keys/providers/      -- управление гостевыми API-ключами
│   ├── auth/providers/          -- auth/me и auth-state
│   ├── homes/                   -- дома, геолокация, geofence sync
│   ├── remote/providers/        -- polling групп, устройства, сцены, control errors
│   ├── schedules/providers/     -- задачи расписания
│   ├── shared/providers/        -- базовые core providers
│   └── stats/providers/         -- статистика и лог событий
├── providers/
│   └── providers.dart           -- compatibility barrel для публичных provider-экспортов
├── 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        

Сборка

# Зависимости
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-шаблона. Для личной установки на телефон этого достаточно, для настоящего релиза подпись нужно заменить.

Проверки

flutter analyze
flutter test

Текущий baseline зелёный: flutter analyze, flutter test и release APK сборка проходят штатно.

Настройка

При первом запуске приложение попросит добавить "дом" -- указать адрес сервера Ignis и API-ключ. После этого откроется пульт управления группами.

Для добавления второго дома: кнопка "домик" в левом верхнем углу пульта -> экран домов -> кнопка "+".

API-ключи хранятся отдельно от конфигурации домов в flutter_secure_storage. Старые ключи из SharedPreferences мигрируются автоматически.

API

Приложение работает с Ignis Core API -- self-hosted бэкенд на FastAPI (контракт OpenAPI 3.1.0). Авторизация происходит через заголовок X-API-Key. Доменный слой на стороне клиента полностью типизирован.

Текущие ограничения

  • Целевая платформа сейчас Android.
  • Release APK пока подписывается debug-ключом из Flutter-шаблона.
  • Геофенс всё ещё требует отдельной продуктовой и технической доводки: multi-home semantics, background permissions и retry/cooldown поведение пока не доведены до конца.

Лицензия

Частный проект.

Description
Мобильное приложение для управления умными лампами WiZ через self-hosted сервер Ignis Core
Readme 1.5 MiB
Languages
Dart 82.1%
Kotlin 8.3%
C++ 5.8%
CMake 2.8%
Swift 0.4%
Other 0.6%