Disease and pest risk models for potato, onion and coffee, hourly per threat

Risk per threat for the station's crop, every hour: percent, level, threat score, accumulated disease severity, the conducive hours behind the score and how much input data backed it. 22 models across potato, onion and coffee.

Catalogue entry: Disease + pest risk (v2). Risk Models v2 output per gateway and threat: risk percent, level, accumulated DSV, conducive hours and the data completeness behind the score.

Questions this data answers

  • Is late blight risk rising on this potato field this week, and how many conducive hours are behind the score?
  • Which 2 threats deserve a spray first today, and which are only on the watch list?
  • Is a high bacterial-wilt reading a real warning or a model running on incomplete data?
  • What is the onion thrips or downy mildew risk at a station in Machakos right now?
  • How has coffee berry disease risk moved over the last 30 days at a station in Uasin Gishu?
  • Which models run for this crop, and what does each one read from the station?

What a row says

1 row per station, threat and hour. Risk percent and level are the headline figures. Conducive hours count how many hours in the model’s own window met the threat’s conditions; the disease severity value is the running accumulator behind the fungal models specifically. Data completeness is simply the share of the window’s hours that had the readings the model needed in the first place. A threat score and a prioritised flag together decide which 2 threats a notification names, and model detail, the thresholds in force and the crop stage assumed, travels along in its own metadata field.

Read data completeness first

A risk computed off a third of the hours is a watch item, not a verdict, and the potato station at Naivasha makes the point cleanly: aphid risk reads 25 % with 0 % completeness, because the aphid model needs wind and the station has no anemometer, so that percentage is simply carried over from the last complete cycle. Bacterial wilt, by contrast, reads 100 % with 100 % completeness off a week-long multiplication run in warm, wet soil. The second row is a genuine warning; the first is a model running without its inputs, and the dataset says exactly that in the row itself rather than hiding it.

Which models run

The station’s crop decides the set. Potato runs 11 threats: late blight, early blight, bacterial wilt, blackleg and soft rot, common scab, rhizoctonia, potato tuber moth, aphid risk, whitefly, and 2 separate virus risks. Potato is also the calibrated set, built at 1,900 m in Naivasha, using event-based triggers and phenology gates pulled from sensor settings; models shipped only with temperate thresholds instead fire continuously as a fallback baseline. Onion runs 6 threats, coffee 5. The kind tag groups all of them: fungal severity accumulators, bacterial multiplication runs, soil temperature and moisture windows, insect phenology on degree-days, and vector flights tracked on wind and temperature.

Prioritisation

Every cycle, each threat gets scored on its risk tier, the economic severity of the threat itself, whether an action is available, and how recently it was last alerted. Low-tier threats never score at all. The top 2 get marked prioritised, a notification names exactly those, and everything else drops to a watch list instead.

History

The 30-day charts read this same dataset at its daily maximum. Late blight sat at 0 through a dry August; bacterial wilt held at 100 off a soil that never dried below its own run threshold. What triggers an advisory is a transition upward between 2 cycles, and every single transition gets written to the advisory history, whether it was sent or simply held.

Risk readings and the model list

Live risk at 3 stations, 2026-10-19T10:10Z

Potato, the potato station at Naivasha, 2,490 m

threatLevelRisk %Conducive hData completeness %Prioritised
bacterial_wiltHigh100168100
late_blightMedium5053100yes
early_blightMedium3019397yes
plrv_riskLow2732665
aphid_riskLow273260
whiteflyLow93210
potato_tuber_mothLow631045
rhizoctoniaLow033046
pvy_riskLow000
blackleg_soft_rotLow00100
common_scabLow0098

Bacterial wilt reads High on a 168-hour multiplication run in warm, wet soil, with full data behind it, and is the prioritised threat. Aphid and whitefly risk show 0 % completeness because those models read wind, which this station does not measure; their percentages are carried from the last complete cycle.

Coffee, a coffee station in Uasin Gishu, about 1,970 m

threatLevelRisk %Conducive hData completeness %Prioritised
coffee_berry_borerLow2025599
antestia_bugLow147299
bacterial_blight_coffeeLow00100
coffee_berry_diseaseLow00100
coffee_leaf_rustLow0199

Onion, an onion station in Machakos

threatLevelRisk %Conducive hData completeness %Prioritised
onion_thripsMedium3933499
onion_flyLow2733499
white_rotLow18612
downy_mildewLow1011100
purple_blotchLow41599
stemphylium_blightLow011100

The onion set is evaluated without wind on purpose: the Machakos station has no usable anemometer, and no onion model depends on wind.

30 days of daily maximum risk, potato station

late_blight
early_blight
bacterial_wilt
aphid_risk

The 22 models by crop

Potato, 11 threats

threatModelkindWindow or driverInputs
late_blightLate Blight (Phytophthora infestans)fungal_dsv48 hair temperature, humidity, leaf wetness
early_blightEarly Blight (Alternaria solani)fungal_dsv48 hair temperature, humidity, leaf wetness
bacterial_wiltBacterial Wilt (Ralstonia solanacearum R3bv2)bacterial_run168 hsoil temperature, soil moisture
blackleg_soft_rotBlackleg and Soft Rot (Pectobacterium / Dickeya spp.)bacterial_run72 hrainfall, soil moisture, air temperature
common_scabCommon Scab (Streptomyces scabies)soil_window720 hsoil moisture, soil temperature
rhizoctoniaRhizoctonia (R. solani AG-3)soil_window720 hsoil temperature, soil moisture
potato_tuber_mothPotato Tuber Moth (Phthorimaea operculella)insect_phenology720 hsoil temperature, air temperature
aphid_riskAphid Risk (Myzus persicae)insect_phenology336 hair temperature, humidity, wind speed
whiteflyWhitefly (Bemisia tabaci)insect_phenology336 hair temperature, humidity
plrv_riskVirus PLRV (M. persicae population-driven)insect_phenology336 hair temperature
pvy_riskVirus PVY (aphid flight-driven)flight_events336 hwind speed, air temperature

Onion, 6 threats

threatModelkindWindow or driverInputs
onion_thripsOnion Thrips (Thrips tabaci)insect_phenologydegree-days base 11.5 °C, 200 DD per generationair temperature, humidity, rainfall
purple_blotchPurple Blotch (Alternaria porri)fungal_dsvTOMCAST DSV on leaf-wetness runsleaf wetness, air temperature
downy_mildewDowny Mildew (Peronospora destructor)fungal_dsvsaturated nights 4–24 °C plus wet morningshumidity, air temperature, leaf wetness
stemphylium_blightStemphylium Leaf Blight (Stemphylium vesicarium)fungal_dsvwet-run severity at 18–26 °Cleaf wetness, air temperature
white_rotWhite Rot (Sclerotium cepivorum)soil_windowsoil 10–20 °C and VWC ≥ 30 %soil temperature, soil moisture
onion_flyOnion Fly / Maggot (Delia antiqua)insect_phenologydegree-days base 4.4 °C, mild-humid flight hoursair temperature, humidity

Coffee, 5 threats

threatModelkindWindow or driverInputs
coffee_berry_diseaseCoffee Berry Disease (Colletotrichum kahawae)fungal_dsvwet-run severity 12–28 °C with rain-splash dispersal, 7 dair temperature, leaf wetness, rainfall
coffee_leaf_rustCoffee Leaf Rust (Hemileia vastatrix)fungal_dsvnight wet runs ≥ 6 h at 15–28 °C, 14 dair temperature, leaf wetness
coffee_berry_borerCoffee Berry Borer (Hypothenemus hampei)insect_phenologydegree-days base 15 °C cap 32 °C, 300 DD per generationair temperature
bacterial_blight_coffeeBacterial Blight of Coffee (Pseudomonas syringae pv. garcae)bacterial_runcold wet hours below 18 °C, chill wounds, splashair temperature, leaf wetness, rainfall
antestia_bugAntestia Bug (Antestiopsis spp.)insect_phenologycool-humid favourability shareair temperature, humidity

Risk Models v2 per crop, from cropThreatRegistry.js. Potato is field-calibrated at Naivasha (1,900 m); onion and coffee sets use literature defaults until tuned.

Dataset idfarm.disease_risk
Cadencehourly
EndpointGET /farm/disease-risk
Key scopefarm:read
Declared fields8
History2026-05 to today
Coverageyour own stations
StatusOwn sensors, own account

Narrowed to your own gateways and to devices approved for API exposure.

Only for the account that owns the hardware. Readings and everything computed from them are served to keys on the owning account and to nobody else. The way to get this dataset is a station on your own field, or your own sensors sent in through Sensor Ingest. A NuaSense station on the field is what produces these rows; the hardware is described at nuasense.com/products.

Fields

FieldUnitNote
risk_percent%
risk_level—low/moderate/high
threat_score—
dsv_accumulated—disease severity values
conducive_hoursh
data_completeness_pct%how much input data backed this score
prioritized0/1
metadata_json—model detail

Filters

gateway_idkindthreat

The same call, three ways

curl -G https://api.nuasense.com/api/nuasense/v1/farm/disease-risk \
  -H "Authorization: Bearer nua_live_…" \
  -d start=-30d -d start=-2h -d threat=late_blight

Through the MCP connector the same read is the platform_dataset tool with dataset=farm.disease_risk. Through a scheduled export it is one job with the same filters, delivered as a file. Every dataset takes the same arguments: start and end, every with agg, fields, limit up to 5,000, order, and the tags it declares.