Freeze Frame
P0128

Coolant Thermostat Below Regulating Temperature

Severity Moderate Safe to drive? Short term System Cooling Applies to All OBD-II vehicles, 1996 and newer

In plain English: The engine is not getting hot enough, fast enough, and nine times out of ten the thermostat is stuck open.

This one will not strand you and it will not damage anything quickly. But a cold running engine burns more fuel, wears faster, and will not give you proper cabin heat in winter — so it is worth fixing before the cold weather, not during it.

Most likely cause: thermostat stuck open (64% of cases). Cheapest first test: is the coolant level correct, with no air in the system. Typical repair runs $12–$80 in parts.

What P0128 actually means

The thermostat is a temperature controlled valve. While the engine is cold it stays shut, so coolant is trapped in the block and the engine warms quickly. Once it reaches its rated temperature, usually somewhere around one hundred and ninety five degrees Fahrenheit, it opens and lets coolant through the radiator to hold it there.

The computer knows how long warm up should take, given the outside air temperature and how long the engine has been running. If the coolant temperature sensor has not reached the thermostat's rating within that window, it sets this code. So it is a timing test, not a temperature limit.

Engine Radiator Thermostat shut when cold, so the engine warms fast coolant temp sensor stuck open = always circulating engine never reaches temperature
A warm-up that took too long — not a temperature limit.

Symptoms

Most likely causes, ranked

Thermostat stuck open 64%
The overwhelming favourite. They fail open far more often than shut, and the part is cheap.
Faulty coolant temperature sensor 15%
Reads colder than reality, so the engine is fine and the computer is being lied to.
Low coolant or air trapped in the system 9%
An air pocket around the sensor gives wild readings. Always check level before buying parts.
Cooling fan running constantly 6%
A failed relay or sensor holding the fan on will overcool the engine at speed.
Wrong thermostat fitted previously 4%
A lower rated thermostat from an earlier repair will set this code forever.
Wiring or ECM fault 2%
Rare, and only worth considering once everything above is genuinely ruled out.

Coolant temperature from a cold start — the whole diagnosis in one graph

Leave the car overnight so it is genuinely cold. Then start it, let it idle, and log coolant temperature for twenty minutes. This one graph answers the question on its own.

60.0 92.0 124.0 156.0 188.0 220.0 0 4 8 12 16 20 Coolant temperature (°F) Minutes since cold start Thermostat rating (195°F) Healthy — reaches and holds Stuck open — plateaus low
Plateaus below the rating = stuck open thermostat. Reaches it normally = sensor or fan.

A healthy engine climbs steadily and reaches the thermostat's rating within about ten minutes, then holds flat right there. That flat line at the top is the thermostat doing its job, opening and closing to hold temperature.

A stuck open thermostat looks like this. It climbs more slowly, then flattens out well below the rating and simply stays there, because coolant is circulating through the radiator the entire time and the engine can never catch up.

If your line plateaus below the thermostat rating, the thermostat is the answer. If it reaches temperature normally and the code still sets, you are looking at the sensor or the fan instead.

How to diagnose it, in order

  1. Is the coolant level correct, with no air in the system?
    Check it stone cold. A low level or an air pocket sitting around the temperature sensor produces nonsense readings, and it costs nothing to rule out. Top it up and bleed it properly before you condemn anything.
    Yes → go to step 2
    No → Top up and bleed the system, then re-test
  2. Log coolant temperature from a genuinely cold start for twenty minutes.
    This is the measurement that decides it, and it is the graph you just saw. Do not shortcut it with a warm engine, because a warm start tells you nothing about whether warm up is too slow.
    Then → step 3
  3. Did it reach the thermostat's rated temperature?
    Compare the plateau against the rating stamped on the thermostat or listed in the service data for your engine. If it settled ten or twenty degrees short and stayed there, that is your answer.
    Yes → go to step 4
    No → Replace the thermostat
  4. Does the sensor reading match an infrared thermometer on the housing?
    If the engine really is reaching temperature, then the computer is being told otherwise. Point an infrared thermometer at the thermostat housing and compare. More than about ten degrees apart and the sensor is lying.
    Yes → go to step 5
    No → Replace the coolant temperature sensor
  5. Is the cooling fan running when it should not be?
    A fan stuck on will hold the engine below temperature at road speed even with a perfect thermostat. Listen at idle from cold, and check the relay before you order anything else.
    Yes → Repair the fan relay or its control circuit
    No → Re-check for a wrong-rated thermostat fitted previously

This is one of the few codes where the cheap part really is the answer most of the time — but check the level and the fan first, because both are free.

What you need to do this yourself

Some links may be affiliate links. They cost you nothing extra and do not change which tools are recommended — the diagnostic order on this site is the same either way.

What it costs to fix

RepairPartsLabour
Coolant top up and bleed
Cheapest possible outcome and genuinely worth checking first.
$15–$40 0.5 h
Thermostat
The part is trivial. The labour depends entirely on how buried the housing is.
$15–$80 1.5 h
Coolant temperature sensor
Usually accessible, usually quick.
$15–$60 0.5 h
Cooling fan relay
Rare as the cause, but very cheap to rule out.
$12–$45 0.5 h

This is one of the friendlier codes. On most vehicles the whole job lands between about sixty and two hundred and fifty dollars, and the part itself is almost never the expensive bit — the labour to reach it is.