Skip to content

Push ingest ​

Create a push device under Dashboard → Devices on the live app. You receive a per-device ingest key in a 30-minute callout (survives refresh until dismissed). Lost it later? Use Reveal ingest key on the device card when key recovery is enabled on the server, or Rotate key for a new one.

Full UI walkthrough (push and pull): Adding push and pull devices.

http
POST https://probeharbor.dev/api/ingest/<device-key>
Content-Type: application/json

Optional top-level health fields (any payload style):

FieldMeaning
battery / battery_pctBattery percent (0–100)
rssiWi-Fi / radio RSSI (dBm)

Sensors auto-import on first POST ​

Sensor keys import automatically from your JSON (flat keys, classic temp object, typed sensors[], SenML, or Home Assistant REST). Rename labels on the Devices page afterward. Manual mapping under Advanced is optional if you want to pre-map keys before the first POST.

After the first successful POST, open Home while signed in to confirm live values. History collects from the 15-minute background poll and successful ingests.

No hardware yet? On Overview, use Try without hardware to save the public example pull feed in one click.

Home Assistant ​

REST sensors, MQTT bridge, and inbound webhook examples: Home Assistant integration.

Product page: probeharbor.dev/integrations/home-assistant · HACS: github.com/doodersrage/thermaltrace-home-assistant

curl smoke test ​

bash
curl -X POST "https://probeharbor.dev/api/ingest/YOUR_DEVICE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"temp1": 42.5, "door1": false, "battery": 87, "rssi": -62}'

Expect HTTP 200 when the key is valid. Keys temp1 / door1 appear as sensors after the first POST; rename labels on Devices if needed.

Payload styles ​

Flat keys ​

Simplest for ESP32 / Pico W sketches. Keys become sensor IDs on first POST.

json
{
  "temp1": 42.5,
  "humidity1": 41,
  "door1": true,
  "rssi": -62
}

Classic Arduino temp object ​

Matches the Ethernet garage firmware JSON shape. Sample sketch: ethernet_dht22_ingest (Uno + W5100; HTTP only — use push_https_forward.py on a LAN host for TLS).

json
{
  "temp": {
    "0": { "c": 18.5, "f": 65.3, "h": 42 },
    "1": { "c": 19.0, "f": 66.2, "h": 40 },
    "avg": { "f": 37.5, "c": 3.1, "h": 42.2 }
  },
  "battery": 87,
  "rssi": -62
}

Typed sensors[] ​

json
{
  "sensors": [
    { "key": "garage_temp", "kind": "temperature", "value": 65.3, "unit": "F" },
    { "key": "garage_rh", "kind": "humidity", "value": 42, "unit": "%" },
    { "key": "door1", "kind": "door", "bool": true },
    { "key": "co2", "kind": "co2", "value": 820, "unit": "ppm" },
    { "key": "pm25", "kind": "pm25", "value": 12, "unit": "µg/m³" },
    { "key": "sump", "kind": "level", "value": 22, "unit": "%" }
  ],
  "battery": 87,
  "rssi": -62
}

Supported kind values: temperature, humidity, co2, pressure, pm25, voc, level, energy, door, power, flood, motion, generic.

SenML (RFC 8428) ​

SenML JSON arrays are auto-detected when native shapes are absent. Temperature uses unit Cel or degF; humidity uses %RH. Probe keys come from the SenML name (last path segment).

json
[
  { "bn": "probeharbor/garage/", "n": "0", "u": "Cel", "v": 18.5 },
  { "n": "0", "u": "%RH", "v": 42 },
  { "n": "door", "vb": true }
]

Example feed: https://probeharbor.dev/api/feeds/example?format=senml

Home Assistant REST sensor ​

Single-entity REST responses (state + attributes.unit_of_measurement) are also auto-detected:

json
{
  "state": "65.3",
  "attributes": {
    "unit_of_measurement": "°F",
    "friendly_name": "Garage temperature"
  }
}

Example feed: https://probeharbor.dev/api/feeds/example?format=homeassistant

MQTT-over-HTTP bridge ​

Cloudflare Workers are not an MQTT broker. Keep Mosquitto / Home Assistant MQTT on your LAN and mirror readings with:

http
POST https://probeharbor.dev/api/ingest/mqtt
X-Ingest-Key: <device-key>
Content-Type: application/json

Body may include topic, payload (JSON string), or message (object). The Worker unwraps and forwards into the same ingest path.

Recipes (Home Assistant + Node-RED import): MQTT bridge. Product page: Adding devices § MQTT.

Common mistakes ​

SymptomCheck
401Wrong or rotated device key
Readings missing on HomeFirst POST not received yet, or device disabled
No historyNeed successful ingest and 15-minute poll / signed-in Home
TLS failures on MCUUse a local HTTPS relay (python feeds). Uno + W5100: ethernet_dht22_ingest + push_https_forward.py
Can't recover keyOperator must set INGEST_KEY_ENCRYPTION_SECRET; older devices need one Rotate key

App & product guides: probeharbor.dev · This site: developer reference