/// Модель "дома" -- один физический сервер Ignis. /// Содержит только несекретные настройки. API-ключ хранится отдельно. class HomeConfig { static const int defaultGeofenceRadiusMeters = 500; final String id; // уникальный идентификатор (uuid или timestamp) final String name; // человекочитаемое название ("Квартира", "Дача") final String url; // адрес сервера (например ignis.akokos.ru) final double? latitude; // GPS-широта дома (для гео-автоматизации) final double? longitude; // GPS-долгота дома (для гео-автоматизации) final bool geofenceEnabled; // автовыключение при уходе из дома final int geofenceRadiusMeters; // радиус geofence для автодействий HomeConfig({ required this.id, required this.name, required this.url, this.latitude, this.longitude, this.geofenceEnabled = false, this.geofenceRadiusMeters = defaultGeofenceRadiusMeters, }); /// Есть ли координаты у дома bool get hasCoordinates => latitude != null && longitude != null; /// Готов ли геофенс к работе: включён + координаты заданы bool get geofenceReady => geofenceEnabled && hasCoordinates; /// Сериализация в JSON для хранения в SharedPreferences Map toJson() => { 'id': id, 'name': name, 'url': url, if (latitude != null) 'latitude': latitude, if (longitude != null) 'longitude': longitude, 'geofenceEnabled': geofenceEnabled, 'geofenceRadiusMeters': geofenceRadiusMeters, }; factory HomeConfig.fromJson(Map json) => HomeConfig( id: json['id'] as String, name: json['name'] as String, url: json['url'] as String, latitude: (json['latitude'] as num?)?.toDouble(), longitude: (json['longitude'] as num?)?.toDouble(), geofenceEnabled: json['geofenceEnabled'] as bool? ?? false, geofenceRadiusMeters: ((json['geofenceRadiusMeters'] as num?)?.toInt() ?? defaultGeofenceRadiusMeters) .clamp(100, 5000), ); /// Копирование с изменениями HomeConfig copyWith({ String? name, String? url, double? latitude, double? longitude, bool? geofenceEnabled, int? geofenceRadiusMeters, bool clearCoordinates = false, }) => HomeConfig( id: id, name: name ?? this.name, url: url ?? this.url, latitude: clearCoordinates ? null : (latitude ?? this.latitude), longitude: clearCoordinates ? null : (longitude ?? this.longitude), // Если очищаем координаты -- геофенс тоже выключается geofenceEnabled: clearCoordinates ? false : (geofenceEnabled ?? this.geofenceEnabled), geofenceRadiusMeters: geofenceRadiusMeters ?? this.geofenceRadiusMeters, ); }