Post Your Weather Data to Azure Log Analytics

As part of my blog series on APIs and Powershell, this first post will show you how you to post your weather data to Azure Log Analytics using Weather Underground. While I’m not the first to put weather data in Azure Log Analytics, it’s still a great example and I’m not using the same weather provider as them.

Why Weather Underground? I’m using a Acurite 5 in 1 sensor at my house. Acurite has the ability to pass your data to Weather Underground and Weather Underground offers free API keys. So I’m not putting just any weather up in the cloud, I’m putting my weather data from my house.

Getting Setup

I’m not going to step by step how to connect your weather station to Weather Underground, because, its very easy and there other guides out there that help you do that.

You’ll need your API key from Weather Underground, which you can get here.

You need need to signup with Weather Underground account to get add your Personal Weather Station and get its ID, it is used in the URL to get the data.

You’ll obviously need an Azure Log Analytics workspace. Signup here.
Once setup, you’ll need your Workspace and Primary keys.

Also need Powershell and you’ll need the Powershell Module OMSIngestionAPI, which I talked about in this post.

Determining the Best CMDLet to use

As of Powershell 3.0 and later we have two cmdlets that let us access web data. Invoke-WebRequest and Invoke-RestMethod. Determining which one to use requires either knowledge of the website you are going to be access, or two simply run each cmdlet against the URL and deciding which one is better. Here, I’ve run both against Weather Underground to determine which result I like better. Writing this post after having already looking at Weather Underground data I know that I am looking for a field called “current_observations”

$APIKey = "your weather underground key"

$url = "$apikey/conditions/q/tx/pws:KTXMANVE16.json"

$result = invoke-webrequest -uri $url

If we use Invoke-webrequest we get this as the result. We would then have to do the following to get our current observations

$JSON = ConvertFrom-Json $Result.Content

$weather = $JSON.current_observation

apis and powershell

However, if we use Invoke-Restmethod we get a much cleaner result right off the bat.


powershell apis

It has already been converted from JSON to a Powershell object.


powershell apis

That’s a lot of data and the screen grab doesn’t even show it all.

Convert to JSON

Some of that data is useless to me, so I want to pare it down. I also want to trim it because Azure Log Analytics didn’t like some of the fields from Weather Underground.

$weather = $jsonresult.current_observation | Select-Object temp_f, relative_humidity, dewpoint_f, feelslike_f, feelslike_c, wind_dir, wind_mph, uv, weather, precip_1hr_in, precip_today_in

Now that we have the fields we want, we need to convert it back to JSON to post to Azure Log Analytics.

$weather = ConvertTo-Json $weather

The Code

# Replace with your Workspace ID
$CustomerId = "OMS Workspace ID"

# Replace with your Primary Key
$SharedKey = "Primary Key"

# Specify the name of the record type that you'll be creating
$LogType = "Current_Conditions"

# Specify a field with the created time for the records
$TimeStampField = get-date
$TimeStampField = $TimeStampField.GetDateTimeFormats(115)

$APIKey = "api key here"

# Gets Weather Data via Weather Underground from my Personal Weather Station
$URL = "$apikey/conditions/q/tx/pws:KTXMANVE16.json"

#get weather from weather underground
$JSONResult = Invoke-RestMethod -Uri $URL

#select fields to upload
$weather = $jsonresult.current_observation | Select-Object temp_f, relative_humidity, dewpoint_f, feelslike_f, feelslike_c, wind_dir, wind_mph, uv, weather
#convert back to json
$weather = ConvertTo-Json $weather

# Submit the data to the API endpoint
Send-OMSAPIIngestionFile -customerId $customerId -sharedKey $sharedKey -body $weather -logType $logType


Log Analytics Queries

Now that we have our data in Log Analytics, lets run some quick simple queries. One of the things I’m considering is wind turbines. On our property we get a lot of wind. Thats one of the things we loved about the property after we bought it, save for August, there’s almost always a breeze.

A lot of wind turbines have a start up speed of about 5mph, so lets find the wind for the last 7 days that was greater than 5mph and graph it visually.


| where wind_mph_d > 5
| summarize avg(wind_mph_d) by TimeGenerated
| render timechart 

Stepping through this query, Current_Conditions_CL is the custom log we’ve uploaded to Log Analytics. Where wind is greater than 5. Using summarize we take the average of the wind vield by time generated and then render a time chart.

azure log analytics

As you can see we get some pretty good peak wind speed. But the really cool thing is the purple dots that Analytics has put on the graph, where it suspects some outliers. Clicking the last one auto produced this query and the graph, which is really cool.

azure log analytics Granted this information is pointless to me as its not really an out-liar its likely because it went from 6mph to over 10mph. I’m only sending my data up every 15 minutes, so its not going to report any ramp up or ramp down data points.


Next, lets get the average for the last 7 days, but only when its above 5mph.

| where wind_mph_d > 5
| project wind_mph_d
| summarize avg(wind_mph_d)

The first two lines as the query above, so project pares the data down to only the field or fields we tell it to and again summarize avg() to get the result.

azure log analytics

8mph is a pretty good constant speed for the types of turbines I’m looking at.

And, per Weather Undergrounds TOS, I have to display the WU badge whenever presenting data. So here is live data from my weather station outside my house. If you’re reading during the day, its probably hot, now that its summer.

Find more about Weather in Manvel, TX
Click for weather forecast

3 thoughts on “Post Your Weather Data to Azure Log Analytics”

Comments are closed.