Onion Omega2: LCD con pronóstico del tiempo (en Python)
Omega2 es una placa de desarrollo para construir prototipos de dispositivos IoT. Es extremadamente barata y tiene con un soporte oficial muy bueno en forma de una documentación detallada y actualizaciones frecuentes.
En este tutorial explicaré como usar Python para conectar una Omega2 a la API de Yahoo! Weather para mostrar el tiempo actual y el pronóstico para hoy en una pantalla LCD.
Materiales necesarios:
- Omega2 Plus
- Omega2 Expansion Dock
- Pantalla LCD I2C de 4×20
- 1 Cable USB para energía y 4 Cables puente para conectar el LCD
Preparación del Software
Lo primero de todo es poner en marcha el entorno. Partimos de una Omega2 con conexión a Internet. Este proyecto se ha hecho con Python 2 y requiere la librería pyOnionI2C y pyOmegaExpansion, conéctate a la Omega2 y ejecuta estos comandos para instalarlo:
opkg update
opkg install python-light pyOnionI2C pyOmegaExpansion python-openssl
El código
Llamadas a la API de Yahoo Weather
Las llamadas a la API de Yahoo requieren un mínimo de 2 parámetros: la URL de la API, y la query en formato YQL, y nos retornará los datos en formato JSON. Para la previsión del tiempo la consulta es la siguiente:
URL de Servicio: https://query.yahooapis.com/v1/public/yql
Consulta YQL: select units,location,atmosphere,item from weather.forecast where woeid=[CÓDIGO DE POBLACIÓN] and u='c'
El [CÓDIGO DE POBLACIÓN] es un id para que Yahoo Weather sepa de que lugar nos tiene que retornar los datos. La manera más fácil de obtenerlo es buscar la ciudad en Yahoo Weather y apuntarse los números que aparecen al final de la URL, por ejemplo para Barcelona de España el código de población sería 753692 como se puede ver aquí: https://www.yahoo.com/news/weather/spain/catalonia/barcelona-753692/
Para consumirlo desde Python uso los módulos urllib y json, el primero hace la llamada y recupera la respuesta en texto y el segundo transforma la respuesta en un array de clave valor:
#!/usr/bin/env python
import json
import urllib
import urllib.request
woeid = "753692" # Barcelona, Spain
api_url = "https://query.yahooapis.com/v1/public/yql?"
api_query = "select units,location,atmosphere,item from weather.forecast where woeid=" + woeid + " and u='c'"
yql_url = api_url + urllib.parse.urlencode({'q':api_query}) + "&format=json"
result = urllib.request.urlopen(yql_url).read()
data = json.loads(result)
results = data['query']['results']['channel']
Control del LCD por I2C
Lo primero es conseguir la librería para controlar el LCD, hay que ir a la documentación de Omega2 donde explica como controlar una pantalla I2C, creamos un archivo lcdDriver.py en la misma carpeta que el script de antes y copiamos el código de la web. En la misma página están los pasos para conectar la pantalla a la placa.
El siguiente ejemplo muestra como incluir y usar la librería en nuestro código:
#!/usr/bin/env python
import lcdDriver
# setup LCD
lcd = lcdDriver.Lcd(lcdAddress)
lcd.backlightOn()
lcd.lcdDisplayStringList([
location['city'] + ', ' +
location['country'],
'Forecast: ' + forecast['text'],
'Now => ' + condition['text']
])
Aplicación práctica
He juntado el código de las llamadas a Yahoo Weather y el del controlador LCD para construir una pantalla que me muestre el tiempo y la he colocado encima de mi despertador, así cuando me levante sabré si tengo que abrigarme o no.
Podéis consultar el código en mi repositorio de Github
Próximos pasos
Hay cosas que se pueden mejorar, pero eso os lo dejo a vosotros. Aquí algunas sugerencias:
- Traducir los mensajes de la API de Yahoo Weather al Español
- Añadir control de errores, porque tal y como está ahora no se sabe que pasa cuando la API retorna un valor erróneo o deja de funcionar internet
- Ejecutar el script automáticamente cuando se enciende la Omega2
- Construir una caja para el dispositivo