Para mi pequeña estación meteorológica podría haber optado por instalar un sensor similar al utilizado hasta ahora, pero en el exterior, para recoger la temperatura de la calle. Pero prefería probar otra cosa: conectarme a algún servicio meteorológico y recoger los datos mediante alguna API abierta.
El AEMET cuenta con una API REST que permite obtener datos de observaciones meteorológicas repartidas por España. Para poder interactuar con la API se solicita una API Key que se recibe en el correo electrónico. Las solicitudes de datos se pueden probar en la propia web, empleando la clave, para ver el resultado de las solicitudes. Ver el formato de la respuesta ayuda a tratar los datos durante el desarrollo de la aplicación.
Pero para empezar a lanzar peticiones a la API hay que conectarse a Internet mediante el Wifi. Conectar la Raspberry Pi Pico W al Wifi es tan sencillo como lo siguiente.
Se importan las librerías necesarias:
import network
import socket
Se programa este código:
# Configura el wifi de casa
ssid = 'El_nombre_de_tu_WIFI'
password = 'Contraseña'
# Conéctate al Wifi
def connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
while wlan.isconnected() == False:
print('Waiting for connection...')
utime.sleep_ms(1000)
ip = wlan.ifconfig()[0]
print(f'Connected on {ip}') #print(wlan.ifconfig()) -> For more complete info
try:
connect()
except KeyboardInterrupt:
machine.reset()
Mediante el siguiente ejemplo se pueden obtener las últimas observaciones. Este código requiere importar los módulos «urequests» y «ujson». Las solicitudes a la API se realizan mediante el método get() del módulo urequest.
# URLs del Aemet
AEMET_weather_api_key = "Tu_Clave_de_API"
AEMET_weather_url = 'https://opendata.aemet.es/opendata/api/observacion/convencional/datos/estacion/3129/?api_key=' + AEMET_weather_api_key
weather_data = requests.get(AEMET_weather_url)
print(weather_data.json())
finalData = weather_data.json().get('datos')
print(finalData)
Obs_data = requests.get(finalData)
Datos = Obs_data.json()
Ult_Obs=(Datos[len(Datos)-1])
datos_meteo['Temp_Ext'] = Ult_Obs['ta']
datos_meteo['Hum_Ext'] = Ult_Obs['hr']
Siempre que los datos obtenidos tengan formato JSON el método json() devolverá un objeto que puede manipularse como tupla y/o diccionario. En mi caso «Datos» es una tupla, cuyos elementos son las últimas observaciones en forma de diccionarios que contiene las mediciones de cada observación. Cada diccionario, que es un elemento de la tupla «Datos», tiene esta pinta:
"idema" : "3129",
"lon" : -3.555593,
"fint" : "2023-02-05T18:00:00",
"prec" : 0.0,
"alt" : 609.0,
"vmax" : 3.1,
"vv" : 1.2,
"dv" : 290.0,
"lat" : 40.46656,
"dmax" : 270.0,
"ubi" : "MADRID/BARAJAS",
"pres" : 960.1,
"hr" : 25.0,
"stdvv" : 0.2,
"ts" : 6.1,
"pres_nmar" : 1028.5,
"tamin" : 12.9,
"ta" : 13.3,
"tamax" : 18.3,
"tpr" : -6.4,
"vis" : 30.0,
"stddv" : 4.0,
"inso" : 27.0
Así que si accedo al último elemento de la tupla, obtengo la última medición «Ult_Obs». Luego accedo a los elementos que me interesan: «ta» (Temperatura) y «hr» (Humedad). Para saber el significado de cada elemento, cuando se hace la primera consulta (weather_data = requests.get(AEMET_weather_url), se podría acceder a los metadatos, en lugar de a los datos.