AI-оптимизация систем HVAC
HVAC (Heating, Ventilation, Air Conditioning) — крупнейший потребитель энергии в зданиях (40-60% счёта). ML-оптимизация не меняет оборудование, а управляет им умнее: снижение энергопотребления 15-30% при сохранении или улучшении теплового комфорта.
Физика тепловых процессов
Тепловой баланс помещения:
Q_hvac = Q_transmission + Q_solar + Q_occupants + Q_lighting + Q_equipment - Q_ventilation
RC-модель теплового узла:
class ThermalZone:
"""
Lumped capacitance model: зона = один тепловой узел
dT/dt = (Q_total) / (C × mass)
"""
def __init__(self, C_kJ_per_K, R_wall_K_per_kW, volume_m3):
self.C = C_kJ_per_K # тепловая ёмкость
self.R = R_wall_K_per_kW # тепловое сопротивление
self.V = volume_m3
def predict_temperature(self, T0, T_outdoor, Q_hvac, Q_internal, dt_minutes):
Q_loss = (T0 - T_outdoor) / self.R
Q_net = Q_hvac + Q_internal - Q_loss
dT = Q_net * dt_minutes * 60 / (self.C * 1000)
return T0 + dT
Калибровка параметров: R и C оцениваются из исторических данных по методу наименьших квадратов. Kalman Filter поддерживает актуальность параметров при изменении условий (ремонт, добавление оборудования).
Источники данных
BMS/BACnet:
bms_points = {
# Температуры
'zone_temp_actual': bacnet.read('AI:101'), # факт
'zone_temp_setpoint': bacnet.read('AO:201'), # уставка
'supply_air_temp': bacnet.read('AI:105'),
'return_air_temp': bacnet.read('AI:106'),
# Потоки
'ahu_supply_flow_cfm': bacnet.read('AI:110'),
'vav_damper_position_pct': bacnet.read('AO:210'),
# Энергопотребление
'chiller_power_kw': bacnet.read('AI:120'),
'ahu_fan_power_kw': bacnet.read('AI:121'),
'heating_coil_kbtu': bacnet.read('AI:122')
}
Внешние данные:
- Прогноз погоды (Open-Meteo API): температура, влажность, солнечная радиация на 48 часов
- CO₂ сенсоры: прокси для занятости помещений (ASHRAE 62.1: поддерживать < 1100 ppm)
- Счётчики доступа / бронирования переговорных
Прогнозирование нагрузки
Occupancy Prediction:
def predict_occupancy(building_id, forecast_horizon_hours=8):
occupancy_features = {
'hour_of_day': hour,
'day_of_week': weekday,
'is_holiday': holiday_calendar[date],
'calendar_bookings': meeting_room_bookings[next_4h],
'access_control_history': avg_arrivals_by_hour[weekday][hour],
'weather': weather_forecast['conditions'] # плохая погода → меньше людей
}
return occupancy_model.predict(occupancy_features)
Thermal Load Forecast:
cooling_load_features = {
'outdoor_temp_forecast': weather['temp_forecast'],
'solar_radiation_forecast': weather['solar_w_m2'],
'occupancy_forecast': predicted_occupancy,
'hour_of_day_sin_cos': cyclic_encode(hour),
'building_thermal_mass': zone.C,
'recent_load_history': last_24h_cooling_load
}
MPC (Model Predictive Control)
Горизонт оптимизации — 24 часа:
from scipy.optimize import minimize
import numpy as np
def optimize_hvac_setpoints(zone_model, weather_forecast_24h,
occupancy_forecast, tariff_schedule,
comfort_min=20, comfort_max=24):
"""
Оптимизируемые переменные: setpoints по каждому часу
Цель: минимизация стоимости энергии
Ограничение: температура в зоне комфорта
"""
n_hours = 24
def total_energy_cost(setpoints):
T_zone = zone_model.current_temp
total_cost = 0
for h in range(n_hours):
Q_required = zone_model.compute_hvac_power(T_zone, setpoints[h],
weather_forecast_24h[h],
occupancy_forecast[h])
energy_kwh = Q_required / 3.5 / 1000 # COP = 3.5
total_cost += energy_kwh * tariff_schedule[h]
T_zone = zone_model.predict_temperature(T_zone, weather_forecast_24h[h],
Q_required, occupancy_forecast[h] * 100, 60)
return total_cost
def comfort_violation(setpoints):
violations = []
T_zone = zone_model.current_temp
for h in range(n_hours):
if occupancy_forecast[h] > 0.1: # только когда есть люди
violations.append(max(0, comfort_min - setpoints[h]))
violations.append(max(0, setpoints[h] - comfort_max))
return -sum(violations)
result = minimize(
total_energy_cost,
x0=np.ones(n_hours) * 22, # начальная уставка
bounds=[(18, 26)] * n_hours,
constraints={'type': 'ineq', 'fun': comfort_violation},
method='SLSQP'
)
return result.x
Pre-cooling стратегия: В ночные часы (дешёвый тариф) охлаждаем здание ниже нормы → дорогие дневные часы — HVAC работает меньше.
Demand Ventilation (DCV)
CO₂-управляемая вентиляция:
def compute_ventilation_setpoint(co2_ppm, target_co2=1000):
"""
ASHRAE 62.1: вентиляция = функция от занятости
Вместо фиксированного объёма — по CO₂
"""
if co2_ppm < 600:
return 0.3 # минимальная вентиляция (нет людей)
elif co2_ppm > 1200:
return 1.0 # максимальная
else:
# Линейная интерполяция
return 0.3 + (co2_ppm - 600) / (1200 - 600) * 0.7
DCV экономит 10-20% от потребления вентиляции: нет смысла вентилировать пустую комнату на 100%.
Fault Detection and Diagnostics (FDD)
Аномалии в работе HVAC:
hvac_faults = {
'frozen_coil': 'supply_air_temp < 5°C при cooling mode',
'stuck_damper': 'vav_flow не меняется при изменении command',
'refrigerant_leak': 'supply_air_temp аномально высокий при max cooling',
'sensor_drift': 'temperature_sensor отклоняется от соседних сенсоров',
'short_cycling': 'compressor starts > 6/hour'
}
# Правила + ML: isolation forest на нормализованных операционных данных
fdd_model = IsolationForest(contamination=0.05)
anomaly_scores = fdd_model.fit_predict(hvac_operational_data)
Эффект FDD: диагностика неисправностей до видимого ухудшения → устранение до поломки → экономия 10-15% от эксплуатационных затрат на ремонт.
Интеграция и внедрение
BACnet/IP gateway: ML-система читает данные через BACnet/IP стек (bacpypes библиотека Python) и записывает setpoints обратно в BMS.
ASHRAE Guideline 36: Стандарт оптимизированного управления HVAC. MPC реализует его принципы автоматически.
Сроки: BACnet интеграция + RC-модель калибровка + базовые setpoint правила + FDD — 5-6 недель. MPC оптимизатор + DCV + occupancy prediction + energy reporting — 3-4 месяца.







