Move from Met Office to weatherapi.com
This commit is contained in:
parent
75b6b1c3c2
commit
3d5249272d
4
README.md
Normal file
4
README.md
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
# Weather Exporter
|
||||||
|
Pulls weather data from weatherapi.com and provides it in Prometheus-style exporter format over HTTP.
|
||||||
|
|
||||||
|
Used to monitor weather conditions over time.
|
10
docker-compose.yaml
Normal file
10
docker-compose.yaml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
version: '3.7'
|
||||||
|
services:
|
||||||
|
weather-exporter:
|
||||||
|
image: weather-exporter:latest
|
||||||
|
container_name: weather-exporter
|
||||||
|
environment:
|
||||||
|
- WEATHER_LOCATION=<Location search string>
|
||||||
|
- WEATHER_APIKEY=<weatherapi.com API key>
|
||||||
|
restart: unless-stopped
|
23
main.py
23
main.py
|
@ -12,15 +12,16 @@ from flask import Flask, Response
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
|
||||||
def fetch_metoffice_data(location: int, apikey: str) -> dict:
|
def fetch_weather_data(location: int, apikey: str) -> dict:
|
||||||
"""
|
"""
|
||||||
Fetch current data from the Met Office for the provided postcode
|
Fetch current data from the Met Office for the provided postcode
|
||||||
"""
|
"""
|
||||||
|
|
||||||
obs_data = requests.get(
|
obs_data = requests.get(
|
||||||
f'http://datapoint.metoffice.gov.uk/public/data/val/wxobs/all/json/{location}?'
|
f'http://api.weatherapi.com/v1/current.json?'
|
||||||
f'key={apikey}&'
|
f'key={apikey}&'
|
||||||
'res=hourly'
|
f'q={location}&'
|
||||||
|
f'aqi=yes'
|
||||||
)
|
)
|
||||||
|
|
||||||
return json.loads(obs_data.content)
|
return json.loads(obs_data.content)
|
||||||
|
@ -31,29 +32,27 @@ def metrics():
|
||||||
"""
|
"""
|
||||||
Output Prometheus-style metrics
|
Output Prometheus-style metrics
|
||||||
"""
|
"""
|
||||||
metoff_apikey = os.environ.get('METOFF_APIKEY')
|
apikey = os.environ.get('WEATHER_APIKEY')
|
||||||
metoff_location = os.environ.get('METOFF_LOCATION')
|
location = os.environ.get('WEATHER_LOCATION')
|
||||||
|
|
||||||
hour_data = fetch_metoffice_data(metoff_location, metoff_apikey,)['SiteRep']['DV'][
|
latest_data = fetch_weather_data(location, apikey)['current']
|
||||||
'Location'
|
|
||||||
]['Period'][-1]['Rep'][time.gmtime().tm_hour]
|
|
||||||
|
|
||||||
ret_data = [
|
ret_data = [
|
||||||
{
|
{
|
||||||
'key': 'sensor_weather_outdoor_temperature_celsius',
|
'key': 'sensor_weather_outdoor_temperature_celsius',
|
||||||
'labels': {
|
'labels': {
|
||||||
'location': metoff_location,
|
'location': location,
|
||||||
},
|
},
|
||||||
'type': 'gauge',
|
'type': 'gauge',
|
||||||
'value': float(hour_data['T']),
|
'value': float(latest_data['temp_c']),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'key': 'sensor_weather_outdoor_humidity_percent',
|
'key': 'sensor_weather_outdoor_humidity_percent',
|
||||||
'labels': {
|
'labels': {
|
||||||
'location': metoff_location,
|
'location': location,
|
||||||
},
|
},
|
||||||
'type': 'gauge',
|
'type': 'gauge',
|
||||||
'value': float(hour_data['H']),
|
'value': float(latest_data['humidity']),
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue