Реализация AI-управления климатом умного дома (обучение привычкам) в мобильном приложении
Термостат Nest изменил ожидания пользователей умного дома: климатическая система должна учиться привычкам и настраиваться сама. Обычный умный термостат с расписанием требует ручной настройки и не адаптируется. Система с обучением наблюдает за поведением пользователя несколько недель и строит предиктивную модель: когда человек встаёт, когда приходит домой, когда ложится, какую температуру предпочитает утром против вечера.
Сбор контекстных данных
Модель обучения привычек требует нескольких входных потоков:
Присутствие в доме. Wi-Fi presence detection — анализ активных MAC-адресов в сети (ARP-таблица роутера через SSH или SNMP) без GPS. Работает надёжнее геозон при нестабильном GPS в квартире. Пассивный bluetooth scanning на мобильном — как вспомогательный сигнал.
Ручные корректировки. Каждый раз когда пользователь вручную меняет температуру в приложении — это обучающий сигнал. «В 22:30 в пятницу пользователь снизил температуру с 22°C до 20°C» — значимый паттерн.
Внешние условия. Температура на улице (OpenWeatherMap или датчик на фасаде), облачность, ветер — влияют на теплопотери дома и на предпочтительную внутреннюю температуру.
@Entity(tableName = "climate_events")
data class ClimateEvent(
@PrimaryKey(autoGenerate = true) val id: Long = 0,
val timestamp: Long,
val eventType: EventType, // MANUAL_ADJUST, AUTO_SETPOINT, PRESENCE_DETECTED, PRESENCE_GONE
val roomId: String,
val setTemperature: Float?,
val actualTemperature: Float,
val outdoorTemperature: Float,
val hour: Int, // 0-23
val dayOfWeek: Int, // 1=Mon
val isWeekend: Boolean,
val presenceCount: Int, // количество устройств в сети
)
Модель предсказания комфортной температуры
После накопления 2-3 недель данных — обучение модели. Для этой задачи хорошо работает простая модель, а не сложная нейросеть: Gradient Boosting (LightGBM) или даже Random Forest на признаках {hour, dayOfWeek, isWeekend, outdoorTemp, presenceCount}.
# Сервер: обучение персональной модели комфортной температуры
import lightgbm as lgb
from sklearn.model_selection import TimeSeriesSplit
def train_comfort_model(user_id: str) -> lgb.Booster:
events = load_manual_adjustments(user_id, days=30)
features = pd.DataFrame({
'hour_sin': np.sin(2 * np.pi * events.hour / 24),
'hour_cos': np.cos(2 * np.pi * events.hour / 24),
'dow': events.day_of_week,
'is_weekend': events.is_weekend.astype(int),
'outdoor_temp': events.outdoor_temperature,
'presence': events.presence_count,
})
target = events.set_temperature
model = lgb.LGBMRegressor(n_estimators=100, learning_rate=0.05, max_depth=4)
tscv = TimeSeriesSplit(n_splits=5)
# cross-val для оценки качества...
model.fit(features, target)
return model
Модель экспортируется в ONNX или TFLite, загружается в мобильное приложение. Прогноз на следующие 24 часа — массив уставок температуры по часам. Применяется автоматически или требует подтверждения пользователя (настройка).
Управление климатическим оборудованием
Мобильное приложение управляет оборудованием через несколько уровней:
Локальные термостаты с API. Nest Thermostat — Google Smart Device Management API. Ecobee — ecobee3 API. Heatmiser — Modbus TCP или хаб. Tado — REST API. У каждого своя авторизация (OAuth2 или API key) и лимиты запросов.
MQTT-контроллеры. Термостат на ESP32 с прошивкой ESPHome: управляется через MQTT home/thermostat/setpoint. Здесь мобильное приложение пишет напрямую или через Home Assistant REST API.
// iOS: отправка уставки термостата через Home Assistant
class ClimateController {
private let haBaseURL: String
private let bearerToken: String
func setTemperature(entityId: String, temperature: Double) async throws {
let url = URL(string: "\(haBaseURL)/api/services/climate/set_temperature")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Bearer \(bearerToken)", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try JSONEncoder().encode([
"entity_id": entityId,
"temperature": temperature
])
let (_, response) = try await URLSession.shared.data(for: request)
guard (response as? HTTPURLResponse)?.statusCode == 200 else {
throw ClimateError.setpointFailed
}
}
}
Адаптация модели и управление автоматизацией
Модель дообучается ежегодно, с переобучением на свежих данных и затуханием старых (seasonal drift: летние и зимние предпочтения различаются). Если пользователь несколько раз подряд корректирует автоматическую уставку — приложение предлагает переобучить модель немедленно.
Зоны доверия: пользователь может разрешить автоматическое применение уставок только в рамках допустимого диапазона — например, «автоматически, но не ниже 18°C и не выше 24°C». Выход за диапазон — запрос подтверждения через уведомление.
Мультирумный климат: отдельная модель на каждую комнату, разные паттерны (спальня vs гостиная vs детская). Синхронизация моделей — на сервере, мобильное приложение получает единый набор прогнозов через REST.
Разработка AI-модуля обучения климатическим привычкам для мобильного приложения умного дома: 8-12 недель. С многозонной поддержкой и интеграцией нескольких производителей термостатов: 4-5 месяцев. Стоимость рассчитывается индивидуально.







