Hardware components | ||||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 |
Coming off learning how to pull in and display GPS data, I want to add on to that actually taking the GPS information and getting the weather at that location and displaying it on the OLED.
This is so I can keep improving on my coding skills (as meager as they are) so I can get to a point of doing some real projects and eventually build out my wireless garage door opener.
[UPDATE] I am working on the main script, but what I have now has not been tested yet. I am checking for the GPS signal and making sure the Weather info file gets populated so the script errors out nicely.
Initial Setup
Plain textThere is a few things you will need to do in order for this to all work. First and foremost, you will need to have a Weather Underground API Key in order to utilize this script. It is free for the casual developer and can be obtained from the following location: https://www.wunderground.com/weather/api
Below are the modules from OPKG that need to be installed. Also, do not forget to make your shell script executable.
Below are the modules from OPKG that need to be installed. Also, do not forget to make your shell script executable.
opkg update
opkg install python3 python-light python-urllib3 pyOledExp pyOmegaExpansion oled-exp ogps
chmod +x getweather.sh
getweather.sh
SHThis script calls the GPS chip to get the current location, writes that to a file (just like the GetGPS script) and then calls the showweather.py script that does the meat of the work. Do not forget to change this file to be an executable file with the "chmod +x getweather.sh" command.
#!/bin/ash
# Remove the original gpsweather.txt. Start with fresh file.
rm /root/gpsweather.txt
# Get the GPS information and write it to a file.
ubus -S call gps info > /root/gpsweather.txt
# Call the python script to write to the OLED.
python /root/showweather.py
# Exit the script.
exit 0
showweather.py
PythonThis script will read GPS info from the chip and using the Lat/Lon and pull the weather data from the nearest weather station and display the requested information on the OLED screen. My own tests have been successful.
#!/usr/bin/env python
#=====================================================
# Pull in the weather information from the Weather
# Underground based on the current GPS Location and
# display the results on the OLED screen.
#
# Written by: Brad Buskey
# Contact me: deckyon@gmail.com
#=====================================================
# Initialize required libraries
from OmegaExpansion import oledExp
import time
import json
import os
import urllib2
# Initialize and clear the OLED expansion module
oledExp.setVerbosity(0)
oledExp.setTextColumns()
oledExp.driverInit()
# Use your API key here. Get it from https://www.wunderground.com/weather/api
apikey = ""
# Check for the existence of the gpsweather.txt file.
if os.path.getsize('/root/gpsweather.txt') == 0:
# File is empty or doesnt exist
oledExp.setCursor(3, 0)
oledExp.write("GPS Info doesnt seem")
oledExp.setCursor(4, 0)
oledExp.write("to exist.")
oledExp.setCursor(6, 0)
oledExp.write("Check GPSInfo file.")
exit()
#Read in the gps information from the file generated by the shell script.
with file('/root/gpsweather.txt', 'r') as gpsfile:
gpsinfo = json.load(gpsfile)
# Check for the existence of the GPS signal.
if gpsinfo.has_key('signal'):
# If the GPS chip could not get a signal, then display that and quit.
oledExp.setCursor(3, 0)
oledExp.write("No GPS signal found")
oledExp.setCursor(5, 0)
oledExp.write("Please try later!")
exit()
elif gpsinfo.has_key('latitude'):
# If the location information exists, grab the required lat and lon for the script to continue.
lat=gpsinfo['latitude']
lon=gpsinfo['longitude']
# Pull in the data from the Weather Underground website
GetURL = "http://api.wunderground.com/api/"+apikey+"/conditions/q/"+lat+","+lon+".json"
weatherdata = urllib2.urlopen(GetURL)
weatherdict = weatherdata.read()
weatherinfo = json.loads(weatherdict)
# Pull in the information from the URL to put together the output
cty = weatherinfo['current_observation']['display_location']['city']
sta = weatherinfo['current_observation']['display_location']['state']
cur = weatherinfo['current_observation']['weather']
tem = weatherinfo['current_observation']['temperature_string']
wsp = weatherinfo['current_observation']['wind_string']
rai = weatherinfo['current_observation']['precip_today_string']
loc = cty + ", " + sta
# Start writing the data to the OLED display.
oledExp.setCursor(0, 0)
oledExp.write(loc)
oledExp.setCursor(1, 0)
oledExp.write("_____________________")
oledExp.setCursor(2, 0)
oledExp.write(cur)
oledExp.setCursor(3, 0)
oledExp.write(tem)
oledExp.setCursor(4, 0)
oledExp.write(rai)
oledExp.setCursor(5, 0)
oledExp.write(wsp)
# Exit the script cleanly.
exit()
{
"response": {
"version":"0.1",
"termsofService":"http://www.wunderground.com/weather/api/d/terms.html",
"features": {
"conditions": 1
}
}
, "current_observation": {
"image": {
"url":"http://icons.wxug.com/graphics/wu2/logo_130x80.png",
"title":"Weather Underground",
"link":"http://www.wunderground.com"
},
"display_location": {
"full":"Louisville, KY",
"city":"Louisville",
"state":"KY",
"state_name":"Kentucky",
"country":"US",
"country_iso3166":"US",
"zip":"40201",
"magic":"1",
"wmo":"99999",
"latitude":"38.25000000",
"longitude":"-85.76000214",
"elevation":"128.0"
},
"observation_location": {
"full":"Louisville, Kentucky",
"city":"Louisville",
"state":"Kentucky",
"country":"US",
"country_iso3166":"US",
"latitude":"38.220798",
"longitude":"-85.751801",
"elevation":"491 ft"
},
"estimated": {
},
"station_id":"ME1143",
"observation_time":"Last Updated on January 30, 2:16 PM EST",
"observation_time_rfc822":"Mon, 30 Jan 2017 14:16:39 -0500",
"observation_epoch":"1485803799",
"local_time_rfc822":"Mon, 30 Jan 2017 14:28:37 -0500",
"local_epoch":"1485804517",
"local_tz_short":"EST",
"local_tz_long":"America/New_York",
"local_tz_offset":"-0500",
"weather":"Clear",
"temperature_string":"36.0 F (2.2 C)",
"temp_f":36.0,
"temp_c":2.2,
"relative_humidity":"49%",
"wind_string":"From the SW at 2.0 MPH Gusting to 8.0 MPH",
"wind_dir":"SW",
"wind_degrees":219,
"wind_mph":2.0,
"wind_gust_mph":"8.0",
"wind_kph":3.2,
"wind_gust_kph":"12.9",
"pressure_mb":"1018",
"pressure_in":"30.07",
"pressure_trend":"-",
"dewpoint_string":"19 F (-7 C)",
"dewpoint_f":19,
"dewpoint_c":-7,
"heat_index_string":"NA",
"heat_index_f":"NA",
"heat_index_c":"NA",
"windchill_string":"36 F (2 C)",
"windchill_f":"36",
"windchill_c":"2",
"feelslike_string":"36 F (2 C)",
"feelslike_f":"36",
"feelslike_c":"2",
"visibility_mi":"10.0",
"visibility_km":"16.1",
"solarradiation":"--",
"UV":"3","precip_1hr_string":"-999.00 in ( 0 mm)",
"precip_1hr_in":"-999.00",
"precip_1hr_metric":" 0",
"precip_today_string":"0.02 in (1 mm)",
"precip_today_in":"0.02",
"precip_today_metric":"1",
"icon":"clear",
"icon_url":"http://icons.wxug.com/i/c/k/clear.gif",
"forecast_url":"http://www.wunderground.com/US/KY/Louisville.html",
"history_url":"http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=ME1143",
"ob_url":"http://www.wunderground.com/cgi-bin/findweather/getForecast?query=38.220798,-85.751801",
"nowcast":""
}
}
weathergps.txt (No Signal)
Plain textThis is the output if there is no GPS signal. This is the final piece for me to do for this project to work completely. The script will check for this instance of the file, as well as an empty gpsinfo.txt
{"signal":"false"}
weathergps.txt
Plain textThis is the file created by the Shell script and read by the Python script. This is just an example of when there is a good GPS signal and it can get a lock and return the location.
{"age":6357,"latitude":"38.1234","longitude":"-80.1234","elevation":"1234.5","course":"12.34","speed":"N"}
Brad Buskey
6 projects • 14 followers
Just getting started.. Currently have the Onion Omega 2+, Raspberry Pi 3 B +, Raspberry Pi Zero W. Working in Python.
Comments