76 lines
3.0 KiB
Dart
76 lines
3.0 KiB
Dart
/// Модель "дома" -- один физический сервер 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<String, dynamic> 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<String, dynamic> 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,
|
||
);
|
||
}
|