TapHome

Ecowitt WS2910 (Cloud API)

Packet Parser → HTTP
Submitted by
Last updated: 03. 2026
Ecowitt WS2910 (Cloud API)

The Ecowitt WS2910 template connects TapHome to the WS2910 Color Display Wi-Fi Weather Station through the Ecowitt Cloud API v3. The WS2910 console collects data from its outdoor 7-in-1 solar-powered wireless sensor array (temperature, humidity, wind, rain, light/UV) and its built-in indoor sensors, then uploads readings to the Ecowitt cloud server via Wi-Fi. TapHome queries the cloud API via HTTPS and receives all sensor data in a single JSON response.

The template provides 16 read-only monitoring devices covering outdoor and indoor conditions, wind measurements, rainfall accumulation at four time scales, barometric pressure, solar irradiance and UV index. The only requirements are an Ecowitt account, the WS2910 connected to Wi-Fi and uploading to ecowitt.net, and three API credentials.

Configuration

Ecowitt account and Wi-Fi setup

The WS2910 console must be connected to Wi-Fi and uploading data to ecowitt.net. Initial setup is done through the WSView Plus mobile app (iOS / Android):

  1. Power the console with the included 5V DC adapter (Wi-Fi only works with DC power, not batteries)
  2. Hold the WIND + PRESSURE buttons for approximately 5 seconds until the Wi-Fi icon and M-B flash
  3. In the WSView Plus app, press Configure New Device and follow the on-screen instructions to connect the console to the local Wi-Fi network
  4. Enable uploading to Ecowitt Weather (ecowitt.net) in the server configuration screen

Once configured, sensor data appears on the ecowitt.net dashboard within several minutes.

Obtaining API credentials

Three credentials are required for the TapHome integration. All are created and managed at ecowitt.net:

  1. Register an account at www.ecowitt.net (if not already done during Wi-Fi setup)
  2. Ensure the WS2910 appears on the dashboard with live data
  3. Navigate to API Management section
  4. Create an Application Key — this identifies the application accessing the API
  5. Create an API Key — this is a user-specific UUID string
  6. Find the MAC address of the WS2910 — visible in the WSView Plus app under Device List, or on the ecowitt.net dashboard
Import parameters

When importing the template in TapHome, enter:

ParameterDescriptionWhere to find
Application keyApplication identifier from ecowitt.netAPI Management → Application Key
API keyUser API key (UUID format)API Management → API Key
Mac addressDevice MAC address (XX:XX:XX:XX:XX:XX)WSView Plus app → Device List, or ecowitt.net dashboard

The default poll interval is 60 seconds (60,000 ms), matching the console’s indoor sensor reporting interval. The outdoor sensor reports to the console every 16 seconds, but data is aggregated by the console before upload.

Internet dependency

This is a cloud-only integration. All data flows through the Ecowitt cloud server (api.ecowitt.net:443). The template will not work without an active internet connection on both the TapHome Core and the WS2910 console.

The WS2910 console acts as both a display and a Wi-Fi gateway — no separate gateway device is needed. As long as the console is powered by the DC adapter and connected to Wi-Fi, data is uploaded automatically.

Device capabilities

Temperature and humidity

The Outdoor Temperature device reads temperature (°C) and humidity (%) from the 7-in-1 wireless sensor array. The outdoor sensor has a range of -40 °C to 60 °C with ±1 °C accuracy, and humidity from 1% to 99% with ±5% accuracy. Humidity is divided by 100 for the TapHome 0–1 analog input range.

The Indoor Temperature device reads temperature and humidity from the console’s built-in sensors. Indoor temperature range is -10 °C to 60 °C, humidity 1% to 99%.

Two additional computed values are available:

  • Outdoor Feels Like Temperature — perceived temperature accounting for wind chill (below ~10 °C) and heat index (above ~27 °C), calculated by the Ecowitt cloud from air temperature, humidity and wind speed
  • Outdoor Dew Point — the temperature at which outdoor air reaches water vapor saturation, calculated from temperature and humidity
Wind measurements

Three devices cover wind data from the anemometer and wind vane on the outdoor sensor array:

  • Wind Speed — sustained wind speed in km/h. Range 0–180 km/h, accuracy ±1 m/s (below 5 m/s) or ±10% (above 5 m/s)
  • Wind Gust — peak wind speed over the measurement interval (highest 3-second average) in km/h
  • Wind Direction — compass direction the wind is blowing from, in degrees (0° = North, 90° = East, 180° = South, 270° = West)
Precipitation

Four devices track rainfall accumulation at different time scales, plus an instantaneous rate:

  • Hourly Precipitation — accumulated rainfall in the last 60 minutes (rolling window) in mm
  • Daily Precipitation — accumulated rainfall since midnight in mm
  • Weekly Precipitation — accumulated rainfall since the start of the current week in mm
  • Monthly Precipitation — accumulated rainfall since the first day of the current month in mm
  • Rain Rate — current rainfall intensity, extrapolated to mm/hr. Rain volume accuracy is ±10% with 0.3 mm resolution
Barometric pressure
  • Air Pressure (Absolute) — barometric pressure without altitude compensation, in hPa. Range 700–1100 hPa, accuracy ±3 hPa
  • Air Pressure (Relative) — barometric pressure compensated for altitude (sea-level equivalent), in hPa
Solar and UV
  • Solar Irradiance — solar radiation intensity in W/m². Light sensor range 0–200 klux, accuracy ±15%
  • UV Index — ultraviolet radiation index on the international 0–15 scale (0 at night, 10+ at midday summer sunlight)
Additional capabilities

The Ecowitt Cloud API also provides a rainfall event accumulation (resets when rain stops) and yearly precipitation total. These are available in the API response but not parsed by the current template. The WS2910 hardware supports up to 8 additional WN31 multi-channel temperature/humidity sensors and up to 2 WH41/WH43 PM2.5 air quality sensors — the API likely exposes these under additional data paths. Outdoor and indoor humidity are currently only available as part of their respective temperature devices; standalone humidity devices could be added in a future template update.

Troubleshooting

API returns error or no data
  1. Verify the WS2910 is online on ecowitt.net — log into the dashboard and check that live data is being displayed
  2. Confirm all three credentials are correct: application key, API key and MAC address
  3. Ensure the MAC address format matches exactly (XX:XX:XX:XX:XX:XX with colons)
  4. Check that the WS2910 console is powered by the DC adapter (Wi-Fi does not work on battery power alone)
Stale or delayed readings

The Ecowitt Cloud API returns the most recent data uploaded by the WS2910 console. The console uploads data at the interval configured during setup (default 5 minutes on ecowitt.net storage). The template polls the API every 60 seconds, but the underlying data may update less frequently depending on the upload interval.

Default units are Imperial

The Ecowitt API returns data in Imperial units (°F, inHg, mph, inches) by default. The template explicitly sets metric unit IDs in the API URL (temp_unitid=1, pressure_unitid=3, wind_speed_unitid=7, rainfall_unitid=12, solar_irradiance_unitid=16) to receive all values in metric units. These unit IDs should not be modified.

The Ecowitt Cloud API requires an active internet connection and depends on Ecowitt cloud server availability. During cloud outages or internet disruptions, the template will not receive updated data.

Available devices

Ecowitt WS2910 Module
Custom Variables
application_key (string)Ecowitt API application key for authentication (obtain from Ecowitt dashboard)
api_key (string)Ecowitt API key for device data access (obtain from Ecowitt dashboard)
mac_address (string)MAC address of the Ecowitt weather station (find in Ecowitt app or device settings)

Ecowitt

Read (module)
responseJson := "error";

IF(ISNULL(api_key) OR LENGTH(api_key) = 0)
   ADDERROR("Please set API key in module variables");
   RETURN(-1);
END

IF(ISNULL(application_key) OR LENGTH(application_key) = 0)
   ADDERROR("Please set Application key in module variables");
   RETURN(-2);
END

IF(ISNULL(mac_address) OR LENGTH(mac_address) = 0)
   ADDERROR("Please set MAC address in module variables");
   RETURN(-3);
END

VAR path := "api/v3/device/real_time?application_key=" + application_key + "&api_key=" + api_key + "&mac=" + mac_address + "&call_back=all&temp_unitid=1&pressure_unitid=3&wind_speed_unitid=7&rainfall_unitid=12&solar_irradiance_unitid=16";

VAR response := SENDHTTPREQUEST(path);

IF response.IsSuccess
    responseJson := response.Content;
ELSE
    VAR contentJson := response.Content;
    VAR errCode := response.StatusCode;
    VAR message := PARSEJSON(contentJson, "message");
    ADDERROR("Failed to read data - (" + errCode + ") " + message);
    RETURN(-4);
END

VAR code := PARSEJSON(responseJson, "code");

IF code != 0
    
    VAR msg := PARSEJSON(responseJson, "msg");
    ADDERROR("Failed to read data - " + msg);
    responseJson := "error";
END
Air Pressure (Absolute) Variable Read-only

Barometric pressure without altitude compensation — range 700–1100 hPa

numeric Unit: hPa JSON parsejson()

Air Pressure (Absolute)

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.pressure.absolute.value");
RETURN(TODOUBLE(value));
Air Pressure (Relative) Variable Read-only

Barometric pressure compensated for altitude — sea-level equivalent in hPa

numeric Unit: hPa JSON parsejson()

Air Pressure (Relative)

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.pressure.relative.value");
RETURN(TODOUBLE(value));
Daily Precipitation Variable Read-only

Accumulated rainfall since midnight in mm — resets at 00:00

numeric Unit: mm JSON parsejson()

Daily Precipitation

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.rainfall.daily.value");
RETURN(TODOUBLE(value));
Hourly Precipitation Variable Read-only

Accumulated rainfall in the last 60 minutes (rolling window) in mm

numeric Unit: mm JSON parsejson()

Hourly Precipitation

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.rainfall.1_hour.value");
RETURN(TODOUBLE(value));
Indoor Temperature Temperature Sensor Read-only

Console-measured indoor temperature (°C) and humidity (0–1 range)

numeric Unit: °C / % JSON parsejson()

Indoor Temperature

Read humidity
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.indoor.humidity.value");
RETURN(TODOUBLE(value) / 100);
Read temperature
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.indoor.temperature.value");
RETURN(TODOUBLE(value));
Monthly Precipitation Variable Read-only

Accumulated rainfall since the first day of the current month in mm

numeric Unit: mm JSON parsejson()

Monthly Precipitation

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.rainfall.monthly.value");
RETURN(TODOUBLE(value));
Outdoor Dew Point Variable Read-only

Temperature at which outdoor air reaches water vapor saturation — calculated from temperature and humidity

numeric Unit: °C JSON parsejson()

Outdoor Dew Point

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.outdoor.dew_point.value");
RETURN(TODOUBLE(value));
Outdoor Feels Like Variable Read-only

Perceived temperature accounting for wind chill and heat index

numeric Unit: °C JSON parsejson()

Outdoor Feels Like

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.outdoor.feels_like.value");
RETURN(TODOUBLE(value));
Outdoor Temperature Temperature Sensor Read-only

Outdoor temperature (°C) and humidity (0–1 range) from the 7-in-1 wireless sensor array

numeric Unit: °C / % JSON parsejson()

Outdoor Temperature

Read humidity
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.outdoor.humidity.value");
RETURN(TODOUBLE(value) / 100.0);
Read temperature
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.outdoor.temperature.value");
RETURN(TODOUBLE(value));
Rain Rate Variable Read-only

Current rainfall intensity extrapolated to mm/hr

numeric Unit: mm/hr JSON parsejson()

Rain Rate

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.rainfall.rain_rate.value");
RETURN(TODOUBLE(value));
Solar Irradiance Variable Read-only

Solar radiation intensity in W/m² — range 0–200 klux

numeric Unit: W/m² JSON parsejson()

Solar Irradiance

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.solar_and_uvi.solar.value");
RETURN(TODOUBLE(value));
UV Index Variable Read-only

Ultraviolet radiation index on the 0–15 scale — 0 at night, 10+ at midday summer

numeric JSON parsejson()

UV Index

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.solar_and_uvi.uvi.value");
RETURN(TODOUBLE(value));
Weekly Precipitation Variable Read-only

Accumulated rainfall since the start of the current week in mm

numeric Unit: mm JSON parsejson()

Weekly Precipitation

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.rainfall.weekly.value");
RETURN(TODOUBLE(value));
Wind Direction Variable Read-only

Compass direction in degrees — 0° North, 90° East, 180° South, 270° West

numeric Unit: ° JSON parsejson()

Wind Direction

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.wind.wind_direction.value");
RETURN(TODOUBLE(value));
Wind Gust Variable Read-only

Peak wind speed over the measurement interval in km/h

numeric Unit: km/h JSON parsejson()

Wind Gust

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.wind.wind_gust.value");
RETURN(TODOUBLE(value));
Wind Speed Variable Read-only

Sustained wind speed from the anemometer in km/h — range 0–180 km/h

numeric Unit: km/h JSON parsejson()

Wind Speed

Read
IF(ISNULL(responseJson) | responseJson = "error")
    RETURN(NaN);
END

VAR value := PARSEJSON(responseJson,"data.wind.wind_speed.value");
RETURN(TODOUBLE(value));
Connection: Packet Parser → HTTP
Possible improvements (6)
  • Rainfall Event — Accumulated rainfall for the current rain event (resets when rain stops). Available in API response but not parsed by template
  • Yearly Precipitation — Accumulated rainfall since January 1st. Available in API response but not parsed by template
  • Outdoor Humidity (Standalone) — Outdoor humidity is only exposed as part of the Outdoor Temperature device (readhumidity script). A standalone humidity variable device could be useful for automations
  • Indoor Humidity (Standalone) — Indoor humidity is only exposed as part of the Indoor Temperature device (readhumidity script). A standalone humidity variable device could be useful for automations
  • Additional Temperature/Humidity Sensors (WN31) — WS2910 supports up to 8 WN31 multi-channel temperature/humidity sensors. API likely exposes these under additional data paths. Not implemented in template
  • PM2.5 Air Quality Sensors — WS2910 supports up to 2 WH41/WH43 PM2.5 air quality sensors. API likely exposes these under additional data paths. Not implemented in template

Sources