☀️

cwop.rest

An easy way to submit weather reports to the NOAA Citizen's Weather Observer Program.

Getting Started

To submit your current readings to CWOP, send an HTTP GET or POST request to send.cwop.rest.

GET

For example, send a single GET request like so:

https://send.cwop.rest/?id=CW0001&lat=38.892954&long=−‌77.0328578&time=1672531200000&tempf=73&windspeedmph=1.5&windgustmph=2.7&winddir=270&pressure=980.0&humidity=42&solarradiation=170&rainin=0&dailyrainin=1.5&last24hrrainin=2.5

POST

Or, POST a request with the following body:

{
  "id": "CW0001", // Required. Your CWOP or Ham Radio ID.
  "lat": 38.892954, // Required. Your weather station's latitude in decimal degrees.
  "long": -77.0328578, // Required. Your weather station's longitude in decimal degrees.
  "time": "1672531200000", // Required. The time that your weather reading was taken in ISO Date or Epoch (milliseconds) format.
  "tempf": 73, // Required. The temperature in degrees fahrenheit.
  "windspeedmph": 1.5, // Required. The wind speed in miles per hour.
  "windgustmph": 2.7, // Required. The wind gust in miles per hour.
  "winddir": 270, // Required. The direction that the wind is coming from, 0–359 degrees.
  "pressure": 980.0, // Optional. The barometer pressure in Hectopascals/Millibars.
  "humidity": 42, // Optional. The relative humidity from 0 to 100 percent.
  "solarradiation": 170, // Optional. The solar radiation in W/m².
  "rainin": 0, // Optional. The amount of rain that has fallen over the past hour in inches.
  "dailyrainin": 1.5 // Optional. The amount of rain that has fallen since midnight in inches.
  "last24hrrainin": 2.5 // Optional. The amount of rain that has fallen over the past 24 hours in inches.
}
What is CWOP?

I'll let the National Weather Service explain:

Do you have a well-placed personal weather station at your home or business? Would you like to share your data with the world? You can if you send your data to the Citizen Weather Observing Program (CWOP)!

CWOP is a volunteer-based network that allows owners of personal weather stations to share their station’s live data with the National Weather Service, emergency managers, wild land fire fighters, and Universities worldwide. There are several options to getting your data online — inexpensive (even free) software programs, and extremely reliable, energy-efficient 'internet devices.' If you have a well-sited home weather station, and a broadband internet connection, you’re just a few steps away from contributing your data to CWOP.

CWOP is a public-private partnership with three goals:

  1. To collect weather data contributed by citizens.
  2. To make these data available for weather services and homeland security.
  3. To provide feedback to the data contributors so they have the tools to check and improve their data quality.

CWOP has been sending data to MADIS (the Meteorological Assimilation Data Ingest System) since MADIS started on July 1, 2001.


Why does this site in particular exist?

Submitting your weather station data to CWOP is a pain, technologically. Most weather station reporting services use a simple HTTP GET request with URL parameters to submit data. By requiring a direct TCP connection, it is difficult to submit your weather data to CWOP from many contexts. This service allows you to submit from any device that can make an HTTP request.

Scattered about the official website are the instructions:

Each TCP connection to port 14580 will begin with receiving at least one text line from the APRS server (terminated with cr/lf). This line identifies the server software you just connected to which you can safely ignore. A line is sent from the server upon connection and upon receiving that line, your client will send a login line. Suppose your CWOP identifier is EW9876. Your login line would be:

user EW9876 pass -1 vers YourSoftwareName 1.0

The CWOP identifier is the user name, the passcode is -1 (minus one), and the software identifier is your software name (no spaces) followed by the version number (containing no spaces). There is a single space between each keyword and each value. Once that is entered (terminate with cr/lf), you will receive an acknowledgement line from the server and it can be safely ignored. After receiving the login acknowledgement, the server is ready to take the single APRS "packet" with the weather data. After the packet is sent, your client can safely disconnect from the server. There will be no acknowledgement of the packet being received at the server (the acknowledgement is handled by the TCP underlying protocol). The APRS "packet" is also terminated by cr/lf. The APRS "packet" is a weather position packet with a very specific header:

EW9876>APRS,TCPIP*:rest of packet

The first "callsign" is the CWOP station identifier for that station as shown. The next item is TCPIP followed by an asterisk. All capital letters must be used for the packet header. The rest of the packet follows the format specified...

and

Use a server designator of "cwop.aprs.net" to send to servers (CWOP1, CWOP2, CWOP3, CWOP4) designated for CWOP non-ham use. These servers do not require a validation code or password.

Use a server designator of "rotate.aprs.net" to send to the APRS Core servers (FIRST, SECOND, THIRD) or "rotate.aprs2.net" to send to the Tier 2 servers. Note that these servers require a validation code which currently licensed amateur radio operators can obtain from cwop-support at noaa dot gov.

Use port 14580 first; but if that does not work, try port 23.

This website abstracts all of that out, so all you have to worry about is one HTTP request.


Are you related to CWOP, Findu, or the NWS/NOAA?

Nope! This was a service I built for myself (to integrate into my Apps Script Weather Station Forwarder) and I thought it might be useful to others.


How do I see my CWOP report(s) once I start sending data?

Your reports will show up (with some delay) in several places:


How does send.cwop.rest work? How can I trust you?

This website, and the send.cwop.rest service, are open source and powered by Cloudflare Pages and Cloudflare Workers. You are free to inspect the code, or copy it into your own Cloudflare Worker and run your own instance.

See the Source Code

I already have an APRS packet assembled from my software. Can I just submit it?

Sure! Instead of using parameters for each reading, just use a packet URL parameter in your GET request or packet key in your JSON POST payload and we will send it along.


What if I am using my Ham Radio callsign and have a validation code?

Just include a validation URL parameter in your GET request or validation key in your JSON POST payload and we will send your packet to the correct Ham-only CWOP server using your validation code.


What if I want to submit to a custom CWOP server, such as the "Tier 2 servers" or one specific CWOP server?

Just include a server URL parameter in your GET request or server key in your JSON POST payload and we will send your packet to your specified server instead of the defaults.