En este nuevo tutorial vamos a ver cómo hacer un escáner código de barras ESP32 que nos va a permitir leer códigos EAN para obtener información sobre ellos. De hecho lo vamos a ver con un ejemplo práctico donde el dispositivo se va a conectar a la API del Mercadona.
La idea es bastante simple y se trata de escanear códigos de barras para añadir los productos a la lista de la compra de Home Assistant donde se incluye el nombre y el precio. Todo esto lo vamos a hacer gracias a ESPHome.
A partir de aquí podrás crear tus propias automatizaciones según te convenga. No me enrollo más y vamos a ver cómo crear desde cero el escáner código de barras ESP32.
Indice de contenidos
Capítulos escáner código de barras ESP32
Aquí tienes los capítulos por si quieres ir a tiro hecho
00:00 Introducción y acceso al mini curso domótica gratuito
02:27 Cómo funciona el escáner código de barras del Mercadona
04:24 Cómo ensamblar la electrónica
06:37 Conexión con la API del Mercadona
13:15 Código ESPHome para escáner de código de barras
17:04 Integración en Home Assistant
20:40 Alternativas a la API del Mercadona
En qué consiste el escáner código de barras ESP32
Antes de empezar, este proyecto es una idea original de un alemán que tiene un canal en YouTube que se llama Smart Home Yourself y, como no podía ser de otra manera, me lo pasó Rita ¿La cantaora? No joder, Rita mi ángel de guarda tecnológico.
Lo que he hecho, aparte de copiarlo descaradamente, es adaptarlo a mis propias necesidades haciendo que sus ideas copulen con las mías y de toda esta orgía ha surgido este tutorial. Tienes toda la información del proyecto original en el GitHub del alemán.
Sigamos porque la idea detrás de este proyectos es muy sencilla. Se trata de hacer un dispositivo capaz de leer un código de barras de un producto para para poder añadirlo a la lista de la compra de Home Assistant, es decir, un escáner código de barras ESP32.
Aparte, gracias a la colaboración de Rita, voy a vincular cada producto que se escanée a un producto real del Mercadona, es decir, que el dispositivo va a ser capaz de leer el código, consultar el nombre del producto, la marca y el precio, mostrarlo por una pantalla y añadirlo a la lista de la compra de Home Assistant.
Y para conseguir hacer todo esto vamos a necesitar varios componentes electrónicos que te paso a detallar:
- Lector de código de barras GM60
- Placa Wemos ESP32 mini
- Pantalla OLED
- Shield de prototipado
- Buzzer
- Caja de plástico
Una vez tenemos el material el siguiente paso es montar el proyecto.
Ensamblado escáner código de barras ESP32
Para que esto rule es necesario conectarlo todo al cerebro de la bestia, es decir, al ESP32. Vamos a ir viendo paso por paso cada componente y cómo conectarlo empezando por la pantalla OLED. Este tipo de pantallas utilizan el protocolo I2C para comunicarse con el microcontrolador.
Si miras la pantalla esta tiene 4 pines que hay que conectarlos al ESP32.
- El pin VCC se conecta al pin 3,3V.
- El pin GND al pin GND.
- El pin SDA al pin 21.
- El pin SCL al pin 22.
A continuación conectamos los dos pines del buzzer o zumbador al ESP32.
- El pin negativo a GND.
- El pin positivo al pin 2 de la placa.
Por último hay que conectar el escáner código de barras ESP32. Este escáner utiliza la comunicación serie y por eso del lector GM60 salen cuatro cables.
- Cable rojo es el de alimentación y va conectado al pin 3,3V del ESP32.
- Cable negro es la tierra o masa y va conectado a GND.
- Cable cable verde es el RX y va conectado al TX del ESP32 que corresponde con el pin SD2.
- Cable amarillo es el TX y va conectado al RX del ESP32 que corresponde con el pin SD3.
Este sería el esquema que sobre el papel queda muy bien pero, ¿Cómo lo conectamos?. A ver, esto se puede hacer de muchas formas la más sencilla quizás se utilizando la típica protoboard. Pero si quiere hacer algo más curioso puedes utilizar un shield Wemos para conectarlo todo.
Es bastante sencillo de utilizar y queda muy curioso. Si además lo metes todo en una caja el resultado va a dejar con la boca abierta hasta a tu cuñado Mariano. Pero espera, todavía no lo llames porque para hacerle el zasca en toda la boca primero hay que programarlo.
Lo digo porque cuando vea que ese cacharro es capaz de conectarse al Mercadona para obtener el nombre, la marca y el precio del producto se va a quedar con la boca abierta. Y para ello vamos a conectar el escáner código de barras ESP32 a la API del Mercadona.
API del Mercadona
Continuamos, porque ahora vamos a ver otra de la perlas que me ha regalado Rita ya que vas a ver a continuación nos permite obtener la información de los productos del Mercadona utilizando su página web. La idea es utilizar una API “secreta” que nos permite obtener ciertos datos de los productos del Mercadona.
Pero empecemos por el principio ¿QuÉ carallos es una API?
API son las siglas en inglés de Application Programming Interface, que en cristiano significan interfaz de programación de aplicaciones. De forma muy muy resumida se puede decir que una API es un software o aplicación que se instala en un servidor o en una máquina y que permite que otros servidores, ordenadores o dispositivos se conecten para obtener información.
Y su objetivo es proporcionar las reglas para que dos máquinas se puedan comunicar. Si lo llevamos al mundo cotidiano una API viene a ser algo parecido a lo que sucede con la lengua de signos o cualquier otra lengua. Para que dos personas se puedan comunicar a través de una lengua es necesario que tanto el emisor como el receptor sepan las reglas y de eso es de lo que se encargan las API, de establecer esas reglas.
Normalmente las API suelen tener una documentación para que los desarrolladores de software sepan cómo comunicar y obtener la información.
Por ejemplo, una API bien documentada nos diría que para obtener la información del cartón de leche tienes que conectarte a la página «mitienda.com/producto/45» y eso te devolverá toda la información en un formato conocido como JSON. Eso sería lo ideal, me refiero a poder ver en algún sitio esta documentación para poder obtener la información de los productos.
Pero hay muchas API que utilizan las páginas web que no están documentadas porque los creadores la utilizan de forma exclusiva para uso interno. Este es el caso de la API del Mercadona. Sin embargo, las mentes preclaras que son más listos que los ratones colorados han descubierto cómo consultar la información a través de la API del Mercadona.
De hecho, tú mismo lo puedes ver si accedes a la consola para desarrolladores que suelen ofrecer los diferentes navegadores. Desde aquí vas a ver que cada que se consulta un producto en la tienda online del Mercadona se hace una llamada a la API utilizando la URL https://tienda.mercadona.es/api/products/ID donde ID es el identificador interno del producto y que también puedes ver en su página web.
Por ejemplo, si pones la URL «https://tienda.mercadona.es/api/products/10722» en un navegador obtienes la información de la leche semidesnatada sin lactosa en formato JSON.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
{ "id":"10722", "ean":"8480000107220", "slug":"leche-semidesnatada-sin-lactosa-hacendado-brick", "brand":"Hacendado", "limit":999, "badges":{ "is_water":false, "requires_age_check":false }, "origin":"Córdoba", "photos":[ { "zoom":"https://prod-mercadona.imgix.net/images/a2514f738a48df0eda58f805a06b5860.jpg?fit=crop&h=1600&w=1600", "regular":"https://prod-mercadona.imgix.net/images/a2514f738a48df0eda58f805a06b5860.jpg?fit=crop&h=600&w=600", "thumbnail":"https://prod-mercadona.imgix.net/images/a2514f738a48df0eda58f805a06b5860.jpg?fit=crop&h=300&w=300", "perspective":1 }, { "zoom":"https://prod-mercadona.imgix.net/images/18c98138368f17ff2ec502d7f8e8bb7e.jpg?fit=crop&h=1600&w=1600", "regular":"https://prod-mercadona.imgix.net/images/18c98138368f17ff2ec502d7f8e8bb7e.jpg?fit=crop&h=600&w=600", "thumbnail":"https://prod-mercadona.imgix.net/images/18c98138368f17ff2ec502d7f8e8bb7e.jpg?fit=crop&h=300&w=300", "perspective":9 } ], "status":null, "details":{ "brand":"Hacendado", "origin":"Córdoba", "suppliers":[ { "name":"COVAP S. COOP. AND. GANADERA DEL VALLE DE LOS PEDROCHES" }, { "name":"Iparlat, S.A." }, { "name":"LACTIBER LEON, S.L" }, { "name":"Naturleite" } ], "legal_name":"", "description":"Leche semidesnatada sin lactosa Hacendado", "counter_info":null, "danger_mentions":"", "alcohol_by_volume":null, "mandatory_mentions":"", "production_variant":"", "usage_instructions":"", "storage_instructions":"" }, "is_bulk":false, "packaging":"Brick", "published":true, "share_url":"https://tienda.mercadona.es/product/10722/leche-semidesnatada-sin-lactosa-hacendado-brick", "thumbnail":"https://prod-mercadona.imgix.net/images/a2514f738a48df0eda58f805a06b5860.jpg?fit=crop&h=300&w=300", "categories":[ { "id":6, "name":"Huevos, leche y mantequilla", "level":0, "order":373, "categories":[ { "id":72, "name":"Leche y bebidas vegetales", "level":1, "order":373, "categories":[ { "id":343, "name":"Leche semidesnatada", "level":2, "order":373 } ] } ] } ], "extra_info":[ null ], "display_name":"Leche semidesnatada sin lactosa Hacendado", "unavailable_from":null, "is_variable_weight":false, "price_instructions":{ "iva":4, "is_new":false, "is_pack":false, "pack_size":null, "unit_name":null, "unit_size":1.0, "bulk_price":"0.93", "unit_price":"0.93", "approx_size":false, "size_format":"l", "total_units":null, "unit_selector":true, "bunch_selector":false, "drained_weight":null, "selling_method":0, "price_decreased":false, "reference_price":"0.930", "min_bunch_amount":1.0, "reference_format":"L", "previous_unit_price":null, "increment_bunch_amount":1.0 }, "unavailable_weekdays":[ ], "nutrition_information":{ "allergens":null, "ingredients":"" } } |
De aquí podemos extraer la información que nos interesa:
- El nombre -> «description»:»Leche semidesnatada sin lactosa Hacendado»
- La marca -> «brand»:»Hacendado»
- El precio -> «unit_price»:»0.93″
Pero fíjate el algo muy curioso que nos va a servir para automatizar la lectura del código de barras y obtener los datos a través del escáner código de barras ESP32.
- «id»:»10722«
- «ean»:»8480000107220″
El ID del producto es 10722 y el EAN, es decir, el código de barras estandarizado es el 8480000107220.
¿Ves algo interesante? Equilicuá, el ID es parte del EAN, los 6 últimos dígitos menos el último son el ID.
En este punto te tengo que dar una noticia buena y otra mala.
La buena es que gracias a esta coincidencia vamos a poder escanear el código de barras con el GM60 y con un poco de programación vamos a poder sacar el ID para consultar los datos a través de la API del Mercadona.
La noticia mala es que esta coincidencia no es válida para todos los productos del Mercadona, es decir, hay productos cuyo ID no tiene ninguna relación con su código de barras. Es una pena pero es así. Cuando esto suceda, me refiero a que el ID no guarde relación con el EAN, vamos a tener que meter a manubrio el identificador en el código de ESPHome.
Esto pasa con los productos que cambiaron de distribuidor o que el ID empieza por cero. Luego veremos cómo solucionamos esto.
Por último, hay que añadir dos parámetros al final de la URL de la API indicando el idioma y la ubicación donde te encuentras. Este último parámetro es necesario ya que hay productos que solo se venden en ciertas regiones.
Para añadir el idioma vamos a utilizar el parámetro lang y para añadir la ubicación o tienda el parámetro wh quedando la URL de esta manera.
https://tienda.mercadona.es/api/products/10722/?lang=es&wh=alc1
En mi caso la ubicación o tienda es alc1 porque vivo en Alicante pero ¿De dónde sacar esta información?
Para obtener tu ubicación entra en la web tienda.mercadona.es y luego accede a cualquier producto. A partir de aquí dependerá del navegador que utilices ya que tenemos que entrar al modo inspeccionar o consola de desarrolladores. Con Chrome es pulsando F12.
Esto abrirá un panel lateral donde tienes que ir a Red o Network y filtrar por &wh. Verás los registros que tienen esta cadena y gracias a esto podrás obtener el código de tu tienda o ubicación de Mercadona. Cópialo ya que luego nos hará falta.
De hecho, aquí puedes ver la llamada a la API secreta de Mercadona.
Por lo tanto y resumiendo, ya tenemos el proyecto montado para poder escanear un código de barras y mostrarlo por una pantalla OLED y que cuando lo escanee haga un sonido el zumbador.
También tenemos la forma de comunicarnos con la API del Mercadona para obtener información de los productos a partir de su EAN o código de barras estandarizado.
Sólo nos queda una cosa y es darle vida al proyecto utilizando ESPHome.
Código ESPHome
Si quieres recibir el código de ESPHOme completo que he utilizado en este tutorial sólo tienes que hacer dos cosas:
- Apuntarte al mini curso de domótica gratuito dejando el email en el cajetín que hay justo aquí abajo.
- Una vez dentro me escribes un email y me dices: «Ehhh, chapapote, pásame el código please?
Y en cero coma te lo he enviado. Una vez lo tengas podrás entender todo lo que explico a continuación.
Vamos a ir viendo muy por encima parte por parte.
La parte de subtitutions sirve para configurar pines, dirección I2C de la pantalla OLED que normalmente es la 3C y el código de tienda. Aquí es donde tienes que poner el código que hemos obtenido antes. En mi caso es alc1.
Luego viene la típica configuración de cualquier nodo ESPHome con la WiFi, OTA, api para conectar con Home Assistant y la configuración del log o depuración.
A continuación he creado una variable global que identifica en qué estado está el dispositivo. Si su valor es 0 es que todavía no ha leído ningún parámetro, si es 1 es que ha leído una código de barras y ha obtenido la información de Mercadona y si es 2 es que ha leído el código de barras pero no ha podido obtener los datos del Mercadona.
Dependiendo del estado, es decir, del valor de la variable global mostramos una información u otra en la pantalla OLED.
La segunda variable sirve como contador y nos permitirá apagar la pantalla OLED después que haya pasado un tiempo.
El siguiente bloque de código es para configurar la comunicación con el escáner código de barras ESP32 a través de la comunicación serie utilizando el componente UART.
Luego pasamos a configurar el componente petición HTTP para poder conectar con la API del Mercadona. A continuación la configuración del buzzer o zumbador a través de un componente switch de ESPHome.
Un poco más abajo viene la configuración de la pantalla OLED donde he añadido un componente interval para pasar de página en página y para resetear la pantalla.
Luego está la configuración I2C de la pantalla OLED y el componente display que es donde se muestran los datos de EAN, nombre, marca y precio que se obtiene de la API del Mercadona.
A continuación he configurado diferentes sensores para mostrar la información del producto en la interfaz gráfica de Home Assistant. Aquí es donde tenemos que configurar las excepciones de productos, es decir, cuando el ID del producto en Mercadona no coincide con parte del EAN o código de barras. Luego veremos cómo añadir nuevos productos a través de un ejemplo.
Y por último viene el código donde está la lógica para obtener los datos de la API y hacer sonar el buzzer o zumbador a través de unos scripts que iremos llamando según convenga.
Si quieres tener el código completo apúntate al mini curso gratuito de domótica y una vez dentro me envías un email pidiendo el código y te lo envío.
Solo nos queda una cosa, compilar y subirlo a la placa. Como siempre la primera carga la tienes que hacer conectando la placa al mismo ordenador donde compilas el código y las cargas sucesivas las puedes hacer a través de OTA.
Solo con esto, si escaneamos un producto donde el ID coincide con EAN, vamos a obtener la información. Por ejemplo, leche semidesnatada sin lactosa a 0,93€ el litro.
Pero ¿Qué pasa si escaneamos un producto que no coincide? Esto lo veremos luego porque antes tenemos que añadir el escáner de código de barras a Home Assistant.
Escáner código de barras ESP32 en Home Assistant
La idea de añadir el escáner de código de barras a Home Assistant es poder automatizarlo a través de una automatización.
La integración es inmediata porque una vez has cargado el código a la placa aparecerá un nuevo dispositivo. Si entras en integraciones verás el nodo de ESPHome que acabamos de configurar. Sólo tienes que hacer clic en añadir para que añada el dispositivo a Home Assistant y donde podrás ver los diferentes sensores que hemos añadido como Marca, precio, producto y EAN.
Vamos a probar a escanear una lata de tomate Hida para que muestre la información. En este caso este producto coincide el ID con el EAN y por eso se puede comunicar con la API del Mercadona y obtiene la marca, el precio y el producto.
Ahora bien, si escaneo una lata de Fabada Litoral en Home Assistant muestra que el producto con ese EAN no se ha encontrado. Esto también lo puedes ver en la pantalla OLED.
Para añadir una excepción como esta donde el ID no coincide con el EAN es necesario ir a la tienda del Mercadona y buscar el producto “fabada Litoral”. Entra dentro del producto y en la URL verás que aparece el ID. En este caso es el 22726. Si te fijas en el EAN que hay en Home Assistant no coincide.
Para solucionarlo copia el código de barras que aparece en Home Assistant y te lo llevas al código de ESPHome.
Lo tienes que copiar donde hay un filtro de mapeo. Luego poner una flecha y a continuación vamos a copiar el ID que tiene asignado este producto en el Mercadona. Lo copias en el código y lo rellenas con ceros hasta completar los 13 dígitos del EAN. Tienes que poner uno al final y el resto al principio.
Pon una descripción para saber a qué producto corresponde este código, compila y sube de nuevo el código a la placa. Esta vez lo puedes hacer por OTA. Una vez ha terminado de cargar si vuelves a escanear la lata de Fabada Litoral ahora sí que consigue obtener la información de la API del Mercadona.
Esto es lo que tienes que hacer con todos los productos que no coincidan el ID y el EAN.
A partir de aquí podrías crear una automatización para añadir todos estos productos a la lista de la compra. El disparador sería un cambio de estado en el sensor del producto. Te recomiendo que añadas dos condiciones para comprobar si el sensor producto del escáner de código de barras es desconocido o no disponible.
Por último la acción es añadir el producto siempre y cuando sea un producto diferente a “No encontrado”. Tiene que añadirlo de forma dinámica utilizando una plantilla que indica el nombre del producto y el precio. Luego guarda la automatización y ponla un nombre.
A partir de ahora cada vez que escanees un producto se añadirá a la lista de la compra de Home Assistant.
Y de esta forma hemos conseguido automatizar nuestra despensa. Que venga ahora tu cuñado a comerte la oreja con su aplicación de la lista del móvil.
Pero ¿Qué pasa si tú no compras en el Mercadona? ¿Puedes utilizar este proyecto? Sí y no y me explico.
Alternativas a la API del Mercadona
Este proyecto es válido para escanear cualquier código de barras. Podrías utilizarlo para los productos del Carrefour por ejemplo. Pero también puede ser útil para llevar el stock de cacharros domóticos que tienes en casa o si tienes una tienda. Cualquier cosa que tenga código de barras estándar podrá ser leído por el lector.
La diferencia es que si no tienes acceso a una API que te facilite la información de los productos vas a tener que ser tú el que introduzca la información y en este sentido hay varias soluciones. Por ejemplo, hay bases de datos online de productos de todo tipo que mantiene la comunidad como OpenFoodFacts.org, es una base de datos abierta de alimentos mundial donde tú puedes dar de alta tus propios productos.
También está UPCDatabase.org que es una base de datos abierta pero en este caso de alimentos americanos donde también puedes añadir los tuyos propios. Tanto una base de datos como otra tiene una API documentada para que la puedas utilizar con tu propio escáner.
Y si quieres algo más general porque vas a añadir productos de todo tipo, no solo alimentos, hay diferentes base de datos y APIs grauítas como Grocy.info y Mealie.io. Tanto una como otra tienen acceso a través de API.
Y si quieres hacerlo totalmente maker y DIY puede utilizar Node-RED con una base de datos SQLite y montarte tu propia API. Lo bueno de este proyecto es que sirve tanto para un roto como para un descosido.
Hasta aquí este tutorial, cualquier duda en los comentarios.