A yield drop that goes unnoticed for a full shift can mean hundreds of scrapped units. TofuPilot's alerting features notify you when something goes wrong, so you can intervene before the damage spreads.
Why Real-Time Alerting Matters
Production problems rarely announce themselves. A solder paste machine runs low and starts producing weak joints. A fixture contact wears down and adds resistance to every measurement. A new component lot has slightly different characteristics.
In all these cases, the yield drop starts small and grows. The earlier you catch it, the fewer units are affected. Waiting for end-of-shift reports or weekly quality reviews is too slow.
Produce Clean, Structured Test Data
Alerts are only as good as the data behind them. Write your OpenHTF tests with clear, measurable outputs so TofuPilot can track trends and trigger alerts on the right signals.
import openhtf as htf
from openhtf.util import units
from tofupilot.openhtf import TofuPilot
@htf.measures(
htf.Measurement("charge_voltage")
.in_range(minimum=4.15, maximum=4.25)
.with_units(units.VOLT),
htf.Measurement("charge_current")
.in_range(minimum=0.450, maximum=0.550)
.with_units(units.AMPERE),
htf.Measurement("thermal_shutdown_temp")
.in_range(minimum=80, maximum=90)
.with_units(units.DEGREE_CELSIUS),
)
def test_charging_circuit(test):
test.measurements.charge_voltage = 4.19
test.measurements.charge_current = 0.498
test.measurements.thermal_shutdown_temp = 85.2
def main():
test = htf.Test(
test_charging_circuit,
station_id="LINE-A-FCT-02",
)
with TofuPilot(test):
test.execute(test_start=lambda: "CHG-2026-03318")
if __name__ == "__main__":
main()Each measurement with defined limits feeds TofuPilot's analytics. The tighter and more consistent your naming, the more useful your alerts will be.
What TofuPilot Can Alert On
TofuPilot monitors your production data and can notify you about several conditions:
| Alert type | What it catches |
|---|---|
| Yield threshold | FPY drops below your target (e.g., below 95%) |
| Consecutive failures | Multiple units fail the same test in a row |
| Measurement drift | A measurement's mean shifts toward a limit |
| Station inactivity | A station stops reporting results |
These cover the most common production problems. Yield threshold alerts catch broad issues. Consecutive failure alerts catch acute problems like a broken fixture. Measurement drift alerts catch slow degradation before it causes failures.
Configure Alerts in TofuPilot
Set up alerts from the TofuPilot dashboard. Navigate to your procedure, then configure notification rules:
- Yield alerts: Set a yield floor. When FPY over a rolling window drops below the threshold, TofuPilot notifies your team.
- Consecutive failure alerts: Set the count. Three consecutive failures on the same measurement is a strong signal that something changed.
- Drift alerts: TofuPilot watches measurement distributions and flags when the mean shifts significantly. You don't need to set manual thresholds for this.
- Station offline alerts: TofuPilot tracks when each station last reported. If a station goes silent during expected production hours, you get notified.
Design Tests for Better Alerting
You can make alerts more useful by how you structure your tests.
import openhtf as htf
from openhtf.util import units
from tofupilot.openhtf import TofuPilot
@htf.measures(
# Separate measurements for each channel make alerts specific
htf.Measurement("led_current_ch1")
.in_range(minimum=0.018, maximum=0.022)
.with_units(units.AMPERE),
htf.Measurement("led_current_ch2")
.in_range(minimum=0.018, maximum=0.022)
.with_units(units.AMPERE),
htf.Measurement("led_current_ch3")
.in_range(minimum=0.018, maximum=0.022)
.with_units(units.AMPERE),
htf.Measurement("led_current_ch4")
.in_range(minimum=0.018, maximum=0.022)
.with_units(units.AMPERE),
)
def test_led_channels(test):
test.measurements.led_current_ch1 = 0.0201
test.measurements.led_current_ch2 = 0.0198
test.measurements.led_current_ch3 = 0.0203
test.measurements.led_current_ch4 = 0.0200
def main():
test = htf.Test(
test_led_channels,
station_id="LINE-B-FCT-01",
)
with TofuPilot(test):
test.execute(test_start=lambda: "LED-2026-05519")
if __name__ == "__main__":
main()Splitting measurements by channel (instead of a single pass/fail for all channels) means TofuPilot can alert you that channel 3 is drifting specifically. That's actionable. A generic "LED test failing more" is not.
Respond to Alerts
When an alert fires, act on it:
- Check the measurement data in TofuPilot. Look at the trend chart and histogram to understand what changed.
- Narrow down the scope. Is it one station or all stations? One shift or all shifts? This points to the root cause.
- Fix the root cause. Recalibrate the equipment, replace the fixture, retrain the operator, quarantine the component lot.
- Verify the fix. Watch the next batch of results in TofuPilot to confirm yield recovers and measurements return to nominal.
Alerts are a starting point, not the answer. They tell you something changed. The measurement data in TofuPilot tells you what.