Overall Equipment Effectiveness for a machine, line or whole plant — per shift, with downturn pareto
OEE is the single number a manufacturer tracks to answer "how much of the time are we making good product at the standard rate?". It is the product of three losses:
Machines rarely fail on the day you can afford them to. Most lost output is hidden in small, repeated stops — a jam here, a changeover there, a hopper that runs dry. OEE decomposes total loss into Availability (time lost), Performance (running below the ideal cycle rate) and Quality (scrap and rework), so the plant manager can see which loss class, which shift and which machine to attack first.
Availability = Operating time / Planned production time
Performance = Units x Ideal cycle time / Operating time (capped at 100%)
Quality = Good units / Total units started
OEE = Availability x Performance x Quality
- Planned production time — announced shift time minus scheduled idle (lunches, breaks, planned cleaning).
- Operating time — planned time minus unplanned stops (breakdowns, changeovers, no-material, operator waits…).
- Ideal cycle time — the standard time per unit (min/unit) for a well-running machine.
- Performance is capped at 100% so running faster than the ideal rate cannot inflate the score.
Reference bands used for the rating:
| OEE | Rating |
|---|---|
< 65% |
Typical — improvement needed |
65–75% |
Acceptable |
75–85% |
Good |
≥ 85% |
World Class |
oee.py— dependency-free OEE library + CLI. Computes Availability, Performance, Quality, OEE, the rating band, a downtime Pareto and the money lost to downtime at a given burden rate.test_oee.py— 11 unit tests, including the classic worked example (8 h shift, 30 min break, 90 min downtime, 400 units, 8 defective).index.html— standalone interactive dashboard: per-shift log, live OEE gauge, world-class reference bands and a downtime Pareto chart. No build step, no dependencies, works offline.
# web dashboard
open index.html # or: python3 -m http.server 8000
# CLI (OEE per demo shift + downtime pareto)
python3 oee.py
# library
python3 -c "
import oee
s = oee.shift(planned_min=450, downtime_min=90, units=400, good_units=392, ideal_cycle_min=0.5)
print(f'OEE = {s.oee:.1%} ({s.rating})')"
# tests
python3 -m unittest test_oee -vShift 1: A=89% P=89% Q=98% -> OEE=78.0% (Good)
Shift 2: A=92% P=94% Q=98% -> OEE=84.1% (Good)
Shift 3: A=81% P=88% Q=97% -> OEE=69.8% (Acceptable)
...
Downtime pareto
32.7% 85.0 min Breakdown — tablet press jam
23.1% 60.0 min Changeover between products
17.3% 45.0 min No raw material at hopper
oee-dashboard/
├── index.html # interactive dashboard (open this)
├── oee.py # OEE library + CLI
├── test_oee.py # unit tests
├── docs/ # README preview screenshot
└── README.md
MIT — take it into your plant and make the numbers honest.
