AHU mixed air temperature
In an air-handling unit, 0.4 kg/s of outdoor air at 35 °C mixed with 1.6 kg/s of return air at 24 °C reaches the coil at 26.2 °C. Enter both streams and choose Celsius, Fahrenheit, kelvin or Rankine. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- T1
- 35 C
- M1
- 0.4
- T2
- 24
- M2
- 1.6
- Mixed temperature
- 26.2 C
- Mass flow total
- 2
- Fraction 1
- 0.2
- Fraction 2
- 0.8
Mixed air temperature is the dry-bulb temperature that leaves the mixing box of an air-handling unit when two air streams join. HVAC designers, test-and-balance technicians, and energy modelers compute it from the two stream temperatures and their mass flow rates, using the adiabatic mixing identity for dry air of equal specific heat.
What mixed air temperature is and why the mixing box needs it
Every air-handling unit that brings in outdoor air also recirculates return air from the occupied zone. Those two streams meet in a mixing box or mixing plenum, and the temperature of the blend is the mixed air temperature that the cooling coil or heating coil actually sees. The quantity is not a comfort index and it is not a wet-bulb or dew-point calculation: it is the dry-bulb temperature of the mixture under the usual HVAC assumption that both streams are air of the same specific heat.
With that assumption the energy balance collapses to a mass-weighted average of the two stream temperatures. Designers use the mixed air temperature to size coils, to set economizer changeover, and to check that a minimum outdoor-air fraction will not freeze a coil in winter or overload it in summer. Commissioning and test-and-balance teams measure the two temperatures and the two flow rates, then compare the predicted mix against a sensor in the mixed-air plenum.
A calculator that applies the same identity the textbook uses — mixed temperature equals m1 times t1 plus m2 times t2, all divided by m1 plus m2 — keeps that check honest.
Input contract, the mixing formula, and the zero-sum error
An optional unit field selects C, F, K, or R and defaults to Celsius; the mixed temperature is returned in that same unit. Temperatures at or below absolute zero on the chosen scale are rejected. A single mass flow may be zero — that is the damper-closed case, and the mix then equals the remaining stream temperature — but the two flow rates must not sum to zero.
Example: t1 equals thirty-five, m1 equals four tenths, t2 equals twenty-four, m2 equals one point six, unit C yields a mixed temperature of twenty-six point two degrees Celsius, because four tenths of the mass is outdoor air at thirty-five and eight tenths is return air at twenty-four.
Where a mixed air temperature calculator earns its keep
Air-handling-unit sequences use mixed air temperature as the coil entering condition, so a wrong mix guess sizes the coil against the wrong load. Economizer logic compares outdoor air with return air and mixed air to decide when to open the outdoor damper; a live calculator lets a controls engineer check the predicted mix at several outdoor-air fractions before the sequence is loaded.
Test-and-balance reports often include a mixed-air sensor that disagrees with the two stream sensors: computing the mass-weighted average from measured flows shows whether the sensor is biased or the damper positions are not the flows the sequence thinks they are. Classrooms teaching psychrometrics start with this dry-air mix before adding humidity, so a deterministic oracle that rejects a zero total flow is more useful than a spreadsheet cell that shows a divide-by-zero warning. Failed validation does not consume balance.
Keep requests small, pin the rounded mixed temperature in tests, and you get a reproducible HVAC mix for sequences, TAB, and models without standing up a psychrometric library of your own.
What you can do with it
Air-handling unit mixing box
Compute the coil entering dry-bulb from outdoor-air and return-air temperatures and mass flows before sizing or sequencing the cooling or heating coil.
Economizer outdoor-air fraction
Sweep mixed air temperature across outdoor-air fractions to check changeover, freeze protection, and damper positions against the design mix.
Commissioning mixed-air sensor check
Compare a mixed-air plenum sensor with the mass-weighted average of the two stream temperatures and measured flow rates during TAB.
FAQ
How is mixed air temperature calculated from two air streams?
Send finite numbers t1, m1, t2, and m2. The mixed temperature is the mass-weighted average (m1·t1 + m2·t2) / (m1 + m2), returned in the same unit as t1 and t2.
What happens if the mass flow rates sum to zero?
Mixed temperature is undefined when total mass flow is zero, so a closed pair of dampers or an m1 equals negative m2 pair is not billed as a successful mix.
Which temperature units can I use?
Set unit to C (default), F, K, or R. The formula is a convex combination, so the result stays on the scale you entered; the calculator does not convert between scales.
Does this mix humidity or wet-bulb temperature?
Humidity ratio and enthalpy mixing are a different psychrometric calculation.
What is the mixed air temperature used for?
It is the condition entering the cooling or heating coil, so designers size coils with it, set economizer changeover and check that a minimum outdoor-air fraction will not freeze a coil in winter or overload it in summer.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/phys/mixed-air-temperature \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"t1":35,"m1":0.4,"t2":24,"m2":1.6}'const res = await fetch("https://api.kit.forhosting.com/phys/mixed-air-temperature", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"t1": 35,
"m1": 0.4,
"t2": 24,
"m2": 1.6
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/phys/mixed-air-temperature",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"t1": 35,
"m1": 0.4,
"t2": 24,
"m2": 1.6
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/phys/mixed-air-temperature", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"t1":35,"m1":0.4,"t2":24,"m2":1.6}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"t1":35,"m1":0.4,"t2":24,"m2":1.6}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/phys/mixed-air-temperature", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"t1": 35,
"m1": 0.4,
"t2": 24,
"m2": 1.6
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "phys.mixed_air_temperature",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_abs | 1000000000000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
This calculator applies that identity, returns the mixed temperature in the same unit you entered, and fails with invalid_input when the two mass flow rates sum to zero so a division by zero never becomes a silent NaN.
What mixed air temperature is and why the mixing box needs it
This endpoint takes those four numbers, an optional temperature unit, and returns the mixed temperature in that same unit without converting scales, because a convex combination is valid on Celsius, Fahrenheit, kelvin, and Rankine alike.
Input contract, the mixing formula, and the zero-sum error
POST a JSON body with four required finite numbers: t1, the dry-bulb of the first air stream; m1, its mass flow rate in any consistent mass-per-time unit; t2, the dry-bulb of the second stream on the same temperature scale; and m2, the second mass flow rate in the same flow unit as m1. Each numeric field may arrive as a JSON number or as a numeric string; missing fields, empty strings, and non-finite values fail with invalid_input naming the field. When m1 plus m2 is zero the mixed temperature is undefined, so the task fails with invalid_input and is not billed. On success the body echoes t1, m1, t2, m2 and unit; returns mixed_temperature as the primary result; and includes mass_flow_total, the two mixing fractions m1 over total and m2 over total, the formula string, and method mass_weighted_average.
Where a mixed air temperature calculator earns its keep
Energy models and spreadsheet load calculations need the same identity for every hour of an outdoor-air schedule, and calling a tiny parse API avoids re-implementing the division-by-zero guard in every workbook.
Technical questions
What does the mixed air temperature calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.