← Back to blog

Stream Your Ecowitt Gateway into Garden.gg: Per-Plot Weather and Soil Moisture

Garden.gg Team ·

If you own an Ecowitt gateway (GW1100, GW2000, HP2553, WS2000) you already have one of the best prosumer weather stations on the market. Until now, that data mostly lived in the Ecowitt app — useful for checking conditions, not useful for understanding which plot in your garden is drying out this afternoon.

Garden.gg can now ingest the gateway’s data directly and fan it out to individual plots. One POST from the gateway lands as up to ten independent environment readings on ten different plots.

The problem Ecowitt users run into

Ecowitt’s “Customized Upload” server lets the gateway POST to any URL you choose. But the Path field is short — 64 characters max on modern firmware, often less on older gateways. A typical API-style URL like /api/v1/iot/ecowitt?api_key=gg_live_…&plot_id=UUID won’t fit.

More importantly: one gateway aggregates a WS90 outdoor array, the indoor console sensor, and up to 8 WH31/WH51/WH41 channel sensors. Each of those is measuring a different place. Forcing all of that data onto a single “plot” loses the whole point.

How Garden.gg solves it

A device token is 16 characters (ggd_ + 12 base62). The gateway uploads to a compact URL:

POST /i/e/ggd_XXXXXXXXXXXX

Each token has a channel map — a small JSON object you edit from the web app that says:

{
  "outdoor": "plot-uuid-back-yard",
  "indoor":  "plot-uuid-greenhouse",
  "ch1":     "plot-uuid-raised-bed-1",
  "ch2":     "plot-uuid-tomato-row",
  "ch3":     "plot-uuid-pepper-bed"
}

When the gateway POSTs, Garden.gg inspects each field, figures out which logical channel it belongs to (tempf → outdoor, tempf1 → ch1, soilmoisture3 → ch3, tempinf → indoor, etc.), looks up the plot that channel maps to, and writes one environment reading per plot. Unmapped channels are silently dropped.

Setup — 5 minutes, start to finish

1. Create the device in Garden.gg

Sign in, open Profile → Sensor Devices → Connect Device. Give it a descriptive name (e.g. Backyard Ecowitt).

In the channel routing panel, map each physical sensor:

  • Outdoor → your main outdoor plot. This captures anything from the WS90: temperature, humidity, wind, rain, solar.
  • Indoor → a greenhouse or indoor growing area if you have one. Otherwise leave unmapped.
  • Ch 1–8 → one plot per channel that actually has a sensor paired on it. Check your Ecowitt app to confirm which channel each physical sensor is on.

Click Connect Ecowitt and Garden.gg generates a token. Copy the /i/e/ggd_… path.

2. Configure the gateway

Open the Ecowitt app → Device → your gateway → Weather Services → Customized. Enable it and fill in:

FieldValue
Protocol TypeEcowitt
Server IP / Hostnameiot.garden.gg
Path(paste the full /i/e/ggd_… path)
Port80
Upload Interval60 seconds (or longer)

Save. The gateway will start uploading on its next interval.

Why iot.garden.gg on port 80? Ecowitt gateway firmware only POSTs over plain HTTP. garden.gg itself redirects HTTP → HTTPS which Ecowitt doesn’t follow, so uploads silently fail. iot.garden.gg is a dedicated hostname that accepts HTTP at the edge and forwards upstream over HTTPS internally — the data still travels encrypted between our edge and origin, the gateway just doesn’t have to do TLS.

If you’re on a newer GW2000 firmware that actually supports HTTPS in Customized Upload, you can use garden.gg on port 443 with the same path instead. Both hostnames work.

3. Watch the data arrive

Navigate to each plot you mapped. The Environment Dashboard populates within 2–3 minutes. You’ll see:

  • Temperature & Humidity — line chart with a “comfortable” band shaded.
  • Soil Moisture — smoothed line with the comfort band (30–60%) highlighted and a “dry” threshold at 20%. Only appears for plots whose channel has a WH51 probe.
  • Rain Rate — bar chart in in/hr. Only appears for plots mapped to the outdoor channel if the WS90 detects rain.
  • VPD and CO₂ — if you have the relevant sensors.

Which fields go where

Readings are split per channel. For each channel Garden.gg promotes these Ecowitt fields into dedicated database columns:

ChannelPromoted fieldsChart
outdoortempf, humidity, rainrateinTemp/Humidity, Rain Rate
indoortempinf, humidityinTemp/Humidity
ch1..ch8tempf<N>, humidity<N>, soilmoisture<N>, co2_ch<N>Temp/Humidity, Soil Moisture, CO₂

Everything else the gateway sends (PM2.5, wind speed/direction/gust, rain totals, solar radiation, UV index, leaf wetness, battery levels) lands in a raw JSONB column per reading — no data is lost. Dedicated charts for those fields ship as the product grows.

Troubleshooting

401 Unauthorized Your token has been revoked or mistyped. Delete the Customized Upload and re-paste the path from the Sensor Devices card.

429 Rate Limited Uploads are capped at 1 per minute per device. Raise the gateway’s Upload Interval to 60s or higher.

“But my ch3 WH31 doesn’t show any chart” Most likely that channel isn’t mapped to a plot. Open Sensor Devices, click Edit on the device, and route ch3 to whichever plot has that physical sensor.

Data arrived once, then stopped Check the Ecowitt app’s Upload Status screen. A flaky outbound connection on the gateway’s Wi-Fi will cause silent upload failures; Ecowitt tends not to surface them clearly.

Why device tokens and not API keys

Ecowitt gateways can’t configure custom headers. They can’t configure query strings. The Path field is short. A device token collapses credentials + plot binding into a single 21-character URL that fits every gateway firmware variant I’ve tested. It’s also scoped to one device — revoking it stops that sensor’s uploads without touching your general-purpose API keys.

Next steps


Garden.gg ingests Ecowitt, ESP32, and custom sensor data into per-plot environment dashboards. Free account includes device tokens, soil moisture + rain charts, and iOS / Android apps for on-the-go checks.