esp_time/bom_xml.py

74 lines
1.9 KiB
Python
Raw Normal View History

2019-11-26 23:42:51 +11:00
#!/usr/bin/env python3
import xmltodict
import urllib
import datetime
import json
import collections
# BOM Weather XML URL for my area:
#
# see http://www.bom.gov.au/catalogue/data-feeds.shtml
# Adjust aac for your forecast region and the URL as required.
aac = "NSW_PT254";
bom_url = "ftp://ftp.bom.gov.au/anon/gen/fwo/IDN11060.xml";
bom_icons = {
'1': 'SUNNY.JPG',
'2': 'CLEAR.JPG',
'3': 'PCLOUD.JPG',
'4': 'CLOUDY.JPG',
'6': 'HAZE.JPG',
'8': 'LRAIN.JPG',
'9': 'WIND.JPG',
'10': 'FOG.JPG',
'11': 'SHOWER.JPG',
'12': 'RAIN.JPG',
'13': 'DUST.JPG',
'14': 'FROST.JPG',
'15': 'SNOW.JPG',
'16': 'STORM.JPG',
'17': 'LSHOWE.JPG',
'18': 'HSHOWE.JPG',
'19': 'CYCLON.JPG'
}
content = urllib.request.urlopen(bom_url)
xmldict = xmltodict.parse(content.read())
belco = [a for a in xmldict['product']['forecast']['area'] if a['@aac'] == aac][0]
new = {}
#current = a['forecast-period'][0]
weather = {}
# THe first forecast perios doesn't always have the temperature and other bits
# I chose to just switch to tomorrow
if (type(belco['forecast-period'][0]) == type(collections.OrderedDict())):
start = 1
else:
start = 0
weather['today'] = belco['forecast-period'][start]
weather['tomorrow'] = belco['forecast-period'][start+1]
weather['day_after'] = belco['forecast-period'][start+2]
for day in weather.keys():
new[day] = {}
new[day]['day'] = datetime.datetime.strptime(weather[day]['@start-time-local'], "%Y-%m-%dT%H:%M:%S%z").strftime("%A")
for el in weather[day]['element']:
if type(el) == type(collections.OrderedDict()):
if el['@type'] == "forecast_icon_code":
new[day]['icon'] = bom_icons[el['#text']]
elif el['@type'] == 'air_temperature_maximum':
new[day]['max'] = el['#text']
with open('bom.json', 'w') as output:
output.write(json.dumps(new))
output.close()