Downstream systems. Python relays, Astro fetch routes, and dashboard mappings, all assume a stable JSON shape. Changing keys without updating consumers breaks probe labels and history inserts silently.
Canonical document
{
"temp": {
"0": { "f": 38.2, "c": 3.4, "h": 41.0 },
"1": { "f": 36.8, "c": 2.7, "h": 43.5 },
"avg": { "f": 37.5, "c": 3.1, "h": 42.2 }
}
}
Field meanings
- Numeric keys match firmware probe indices and dashboard mapping entries.
- f / c: Fahrenheit and Celsius for the same sample.
- h: Relative humidity percent for that probe.
- avg: Mean across healthy probes only; omit or freeze if one sensor is offline.
Alternate formats (auto-detected)
Push ingest and pull feeds also accept SenML JSON (RFC 8428 array with Cel / %RH units) and Home Assistant REST responses (state + attributes.unit_of_measurement) when the native temp root is absent. Live samples: SenML, HA REST. Details: ingest & webhooks.
Consumers
The home page fetch reads this structure for public cards. Python feeds may cache the same payload. Map labels via probe mapping.
FAQ
What JSON shape does ProbeHarbor expect?
Default pull shape is a temp object with probe keys (f, c, h). Push also accepts flat keys, sensors[], SenML JSON arrays, and Home Assistant REST state objects. Optional battery_pct and rssi help diagnose weak devices. See /about/ingest-and-webhooks or the example feed at /api/feeds/example?format=document.