Onion Omega2: LCD con pronóstico del tiempo (en Python)

|
|
Tags:  Omega2,  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

Author

Sergio Monedero

I am excited to share my knowledge and insights on programming and devops through this personal website. I am a lifelong learner with a passion for technology, and I enjoy staying up-to-date on the latest industry trends.

Keep in touch with Me: SergioCoder@LinkedIn | Branyac@Github