Composants d’une CTA (hors batteries)
Cette page documente les composants unitaires d’une Centrale de Traitement
d’Air (CTA) fournis par le paquet AHU, à l’exclusion des batteries
chaudes/froides (voir le sous-paquet AHU.Coil). Chaque composant est une
classe Object qui échange l’air via des ports AirPort et expose une
méthode calculate() remplissant un DataFrame self.df de résultats.
Le connecteur AirPort
Tous les composants communiquent via des objets AHU.AirPort.AirPort. Un
AirPort porte l’état d’un flux d’air humide :
Attribut |
Signification |
Unité |
|---|---|---|
|
Débit massique d’air humide |
kg/s |
|
Débit massique d’air sec |
kg/s |
|
Pression (défaut |
Pa |
|
Enthalpie spécifique |
kJ/kg air sec |
|
Humidité absolue |
g H₂O / kg air sec |
Les propriétés T (°C), RH (%) et Pv_sat (Pa) sont calculées à la
demande à partir de h, w et P (propriétés Python en lecture seule) :
T=air_humide.Air_T_db(h, w);Pv_sat=air_humide.Air_Pv_sat(T);RH=air_humide.Air_RH(Pv_sat, w, P).
La méthode update_properties() force le recalcul (invalide le cache
_T / _RH / _Pv_sat). Elle est appelée par chaque composant après
mise à jour de son port de sortie.
Air neuf — FreshAir
Rôle. Point d’entrée d’air (air neuf, air repris, air extrait…). Convertit un couple température / humidité relative (et éventuellement un débit volumique) en état psychrométrique complet sur le port de sortie.
Connecteurs. Inlet (AirPort), Outlet (AirPort). La sortie
est une recopie de l’entrée une fois l’état calculé.
Équations (module AHU.FreshAir.FreshAir). Si T et RH sont
fournis :
Conversion optionnelle d’un débit volumique en débit massique :
Débit d’air sec :
Paramètres (__init__) :
Attribut |
Description |
Unité |
Défaut |
|---|---|---|---|
|
Identifiant |
— |
|
|
Température d’entrée |
°C |
|
|
Humidité relative d’entrée |
% |
|
|
Débit massique air humide |
kg/s |
|
|
Débit volumique air humide |
m³/h |
|
|
Pression |
Pa |
|
Exemple.
from AHU.FreshAir.FreshAir import Object as FreshAir
fa = FreshAir()
fa.T = -5.0
fa.RH = 80.0
fa.F_m3h = 10000
fa.calculate()
print(fa.Outlet.T, fa.Outlet.w, fa.Outlet.h, fa.Outlet.F)
Mélange air neuf / air repris — AirMix
Rôle. Mélange adiabatique de deux flux d’air humide (typiquement air neuf + air repris). Le mélange se fait par bilan sur l’air sec.
Connecteurs. Inlet1, Inlet2 (AirPort), Outlet (AirPort).
Équations (module AHU.FreshAir.AirMix). Débits d’air sec de chaque
flux :
Humidité absolue et enthalpie du mélange (moyennes pondérées par le débit d’air sec) :
Débit d’air humide et pression :
Si un seul flux est renseigné, la sortie reprend cet unique flux.
Paramètres. Aucun paramètre de réglage : Inlet1, Inlet2, Outlet,
id (défaut 1). Les débits d’air sec F_dry1 / F_dry2 sont déduits.
Exemple.
from AHU.FreshAir.AirMix import Object as AirMix
from AHU.FreshAir.FreshAir import Object as FreshAir
neuf = FreshAir(); neuf.T = -5; neuf.RH = 80; neuf.F_m3h = 3000; neuf.calculate()
repris = FreshAir(); repris.T = 20; repris.RH = 45; repris.F_m3h = 7000; repris.calculate()
mx = AirMix()
mx.Inlet1 = neuf.Outlet
mx.Inlet2 = repris.Outlet
mx.calculate()
print(mx.Outlet.T, mx.Outlet.w, mx.Outlet.F)
Récupérateur à plaques — HeatRecovery.Heat_plate_exchanger
Rôle. Échangeur air/air à plaques (récupération sensible). L’air neuf (flux 1) est préchauffé/rafraîchi par l’air extrait (flux 2) sans transfert d’humidité côté air neuf ; la condensation éventuelle est traitée côté air extrait.
Connecteurs. Inlet1 / Outlet1 (air neuf), Inlet2 / Outlet2
(air extrait). Tous des AirPort.
Équations (module AHU.HeatRecovery.Heat_plate_exchanger). Débit d’air
sec limitant :
Régime hivernal (Inlet2.T ≥ Inlet1.T et Inlet1.T ≤ T_target) — avec
plafonnement de l’efficacité pour ne pas dépasser la consigne T_target :
Température de sortie de l’air neuf (l’humidité absolue reste constante, \(w_{1o} = w_{1i}\)) :
Chaleur récupérée et efficacité enthalpique :
Enthalpie de sortie de l’air extrait (bilan de chaleur) et gestion de la condensation par comparaison des températures de rosée :
Si \(T_{dp,wet} \le T_{dp,dry}\) → condensation : \(w_{2o} = \mathrm{Air\_w}(h_{2o}, RH{=}100)\) ; sinon \(w_{2o} = w_{2i}\).
Régime estival (Inlet2.T < Inlet1.T) : l’air neuf est refroidi,
\(T_{1o} = T_{1i} - \dot m_{dry,min}\,(\eta_T/100)\,(T_{1i} - T_{2i})/F_{dry,1}\),
sans condensation modélisée (\(w_{2o} = w_{2i}\)). Entre les deux
(Inlet1.T > T_target) : aucun échange. Les débits d’air sec sont conservés.
Paramètres (__init__) :
Attribut |
Description |
Unité |
Défaut |
|---|---|---|---|
|
Identifiant |
— |
|
|
Efficacité en température de l’échangeur |
% |
|
|
Consigne de température de l’air neuf préchauffé (plafonne l’échange) |
°C |
|
|
Efficacité enthalpique (calculée) |
% |
|
|
Efficacité maxi admissible pour tenir |
% |
|
Exemple.
from AHU.HeatRecovery.Heat_plate_exchanger import Object as PlateExchanger
from AHU.FreshAir.FreshAir import Object as FreshAir
neuf = FreshAir(); neuf.T = -5; neuf.RH = 80; neuf.F_m3h = 10000; neuf.calculate()
extrait = FreshAir(); extrait.T = 22; extrait.RH = 50; extrait.F_m3h = 10000; extrait.calculate()
hx = PlateExchanger()
hx.T_efficiency = 75
hx.Inlet1 = neuf.Outlet
hx.Inlet2 = extrait.Outlet
hx.calculate()
print(hx.Outlet1.T, hx.heat_transfer, hx.h_efficiency)
Récupérateur à roue — HeatRecovery.Thermal_wheel_exchanger
Rôle. Roue thermique (échangeur rotatif). Contrairement à la plaque, la roue
transfère chaleur et humidité (échange enthalpique total). Le module
distingue transfert total (heat_transfer1/2), transfert sensible
(sensible_heat_transfer1/2) et transfert d’eau (delta_mw1/2).
Connecteurs. Inlet1 / Outlet1 (air neuf), Inlet2 / Outlet2
(air extrait). Tous des AirPort.
Équations (module AHU.HeatRecovery.Thermal_wheel_exchanger). Le
plafonnement d’efficacité et \(\dot m_{dry,min}\) sont identiques à la
plaque. En régime hivernal, l’efficacité s’applique à l”enthalpie :
Transferts total et sensible du flux air neuf :
Côté air extrait, bilan miroir (\(\dot Q_2 = -\dot Q_1\)) et transfert d’humidité :
Efficacité enthalpique : \(\eta_h = 100\,F_{dry,1}(h_{1o}-h_{1i}) / [\dot m_{dry,min}(h_{2i}-h_{1i})]\). Le régime estival est symétrique (air neuf refroidi) ; entre les deux, pas d’échange.
Paramètres (__init__) : identiques à la plaque (id défaut 2,
T_efficiency défaut 80 %, T_target défaut 16 °C), plus les
grandeurs calculées heat_transfer1/2, sensible_heat_transfer1/2,
delta_mw1/2 (g H₂O/s), T1o / T2o.
Exemple.
from AHU.HeatRecovery.Thermal_wheel_exchanger import Object as ThermalWheel
from AHU.FreshAir.FreshAir import Object as FreshAir
neuf = FreshAir(); neuf.T = -5; neuf.RH = 80; neuf.F_m3h = 10000; neuf.calculate()
extrait = FreshAir(); extrait.T = 22; extrait.RH = 50; extrait.F_m3h = 10000; extrait.calculate()
wheel = ThermalWheel()
wheel.T_efficiency = 75
wheel.Inlet1 = neuf.Outlet
wheel.Inlet2 = extrait.Outlet
wheel.calculate()
print(wheel.Outlet1.T, wheel.Outlet1.w, wheel.delta_mw1)
Humidificateur — Humidification.Humidifier
Rôle. Porte l’humidité absolue de l’air à une consigne wo_target. Deux
technologies : humidification adiabatique (à eau, enthalpie conservée) ou à
vapeur (apport d’enthalpie). L’état de sortie est résolu numériquement
(scipy.optimize.fsolve).
Connecteurs. Inlet, Outlet (AirPort).
Équations (module AHU.Humidification.Humidifier). L’humidification n’a
lieu que si wo_target > wi (sinon l’air traverse sans changement,
F_water = 0, Q_th = 0).
Adiabatique — enthalpie conservée (\(h_o = h_i\)). Le système résolu fixe \((P_{v,sat}, T_o, RH_o)\) par :
Vapeur — apport d’enthalpie de la vapeur injectée (variable supplémentaire \(h_o\)) :
Dans les deux cas, débit d’air sec, consommation d’eau et puissance thermique :
Le port de sortie prend \(w_{out} = w_{target}\), \(P_{out} = P_{in} - \Delta P\), \(h_{out} = h_o\).
Paramètres (__init__) :
Attribut |
Description |
Unité |
Défaut |
|---|---|---|---|
|
|
— |
|
|
Humidité absolue de consigne |
g/kg air sec |
|
|
Humidité relative de consigne |
% |
|
|
Perte de charge |
Pa |
|
|
Chaleur latente de vaporisation |
kJ/kg |
|
|
Température vapeur injectée |
°C |
|
|
Chaleur massique vapeur |
kJ/kg·K |
|
Exemple.
from AHU.Humidification.Humidifier import Object as Humidifier
from AHU.FreshAir.FreshAir import Object as FreshAir
amont = FreshAir(); amont.T = 18; amont.RH = 20; amont.F_m3h = 10000; amont.calculate()
hmd = Humidifier()
hmd.HumidType = "adiabatique"
hmd.wo_target = 8
hmd.Inlet = amont.Outlet
hmd.calculate()
print(hmd.Outlet.T, hmd.Outlet.RH, hmd.F_water, hmd.Q_th)
Capteur d’air — Sensor.AirSensor
Rôle. Capteur passif (observateur) qui lit un AirPort sans modifier
son état et restitue une grandeur choisie parmi dix types de mesure. Utile pour
instrumenter n’importe quel point de la CTA.
Connecteurs. Inlet (AirPort observé, non modifié). calculate()
retourne self.value (la grandeur sélectionnée) et renseigne self.df.
Types de mesure (attribut measurement_type) : Température (°C),
Humidité absolue (g/kg air sec), Humidité relative (%),
Débit air humide (kg/s), Débit air humide kg/h (kg/h),
Débit air sec (kg air sec/s), Débit volumique (m³/h),
Débit normal (Nm³/h), Enthalpie (kJ/kg air sec), Pression (bar).
Équations (module AHU.Sensor.AirSensor). Le port doit être complet
(w, h, F, P non nuls, sinon ValueError). Masses volumiques
humide et normale :
Débits dérivés :
Les autres mesures sont des recopies directes du port : \(T\), \(w\), \(RH\), \(F\) (kg/s et ×3600 en kg/h), \(h\), \(P/10^5\) (bar).
Paramètres (__init__) :
Attribut |
Description |
Unité |
Défaut |
|---|---|---|---|
|
Grandeur à restituer |
— |
|
|
Horodatage (reporté dans |
— |
|
|
Température des conditions normales |
°C |
|
|
Humidité relative des conditions normales |
% |
|
|
Pression des conditions normales |
Pa |
|
Exemple.
from AHU.Sensor.AirSensor import Object as AirSensor
from AHU.FreshAir.FreshAir import Object as FreshAir
air = FreshAir(); air.T = 20; air.RH = 50; air.F_m3h = 5000; air.calculate()
capteur = AirSensor()
capteur.Inlet = air.Outlet
capteur.measurement_type = "Débit volumique"
debit = capteur.calculate()
print(debit, capteur.unit) # m³/h
Modèle thermique de bâtiment — Building.BuildingRC
Rôle. Modèle RC à deux nœuds (air intérieur + enveloppe/mur) pour
simuler l’évolution de la température d’un local desservi par la CTA. Il ne
possède pas de port AirPort : l’action de la CTA est représentée par un
débit et une température de soufflage.
Structure RC. Deux capacités thermiques (\(C_{air}\), \(C_{mur}\)) et trois résistances : mur↔extérieur (\(R_{ext,mur}\)), air↔mur (\(R_{int,mur}\)), sol↔air (\(R_{sol,int}\)).
Équations (module AHU.Building.BuildingRC). Résistances (demi-mur de
part et d’autre du nœud d’enveloppe) :
Capacités thermiques :
Débit massique de soufflage : \(\dot m_{air} = \dot V_{souff}\,\rho_{air}/3600\). La consigne de soufflage est régulée : \(T_{souff} = T_{froid}\) si \(T_{int} > T_{froid}\), \(T_{chaud}\) si \(T_{int} < T_{chaud}\), sinon \(T_{int}\).
Intégration temporelle (Euler explicite, sous-pas de 30 s maxi) des deux nœuds :
Puissances et énergies stockées :
Paramètres (__init__, extrait) :
Attribut |
Description |
Unité |
Défaut |
|---|---|---|---|
|
Volume intérieur |
m³ |
|
|
Surface enveloppe / sol |
m² |
|
|
Épaisseur mur |
m |
|
|
Conductivité thermique mur |
W/m·K |
|
|
Masse volumique / chaleur massique mur |
kg/m³, J/kg·K |
|
|
Coefficients de convection ext / int / sol |
W/m²·K |
|
|
Température extérieure / sol |
°C |
|
|
Débit de soufflage |
m³/h |
|
|
Consignes chauffage / rafraîchissement |
°C |
|
Exemple.
from AHU.Building.BuildingRC import Object as BuildingRC
local = BuildingRC()
local.T_ext = -2.0
local.debit_soufflage = 500 # m³/h
local.T_int = 18.0
for _ in range(60): # 60 pas de 60 s = 1 h
local.calculate(dt=60)
print(local.T_int, local.Q_total, local.E_mur)