- Luis Daniel Roa González - A01021960 - Santa Fe
- Juan Francisco Gortarez Ricardez - A01021926 - Santa Fe
- Gabriel Schlam Huber - A01024122 - Santa Fe
- Luis Armando Ortiz Revilla - A01022320 - Santa Fe
- Simón Metta Grego - A01377925 - Santa Fe
Desarrollar un modelo de IoT para supermercados, específicamente para la sección de refrigeradores del mismo, que permita optimizar el manejo de los inventarios y analizar los diferentes tipos de usuarios frecuentes y sus compras, para poder tomar decisiones rápidas y adecuadas para el mercado.
Esto se realizará por medio de sensores de movimiento, apertura / cierre de puertas, temperatura, lectores de tags RFID, cámara web y leds, además del uso de Machine Learning.
A continuación aparecen descritos los diferentes elementos que forman parte de la solución del proyecto.
Nuestra solución utiliza los servicios de reconocimiento facial de Microsoft Azure para detectar la edad y el género de los compradores. Consideramos que una utilización mínima es la más adecuada para nuestras necesidades, ya que únicamente usamos estos datos para detectar tendencias de compra entre grupos de personas, e incrementar la granularidad usando elementos como raza nos pareció falta de ética.
Se utilizaron los serivicios de Google Cloud Services para poder implementar el concepto de Big Data y realizar un reporte sobre los datos de usuarios, sus compras, el inventario y las condiciones del refrigerador (temperatura y humedad).
El programa realizado fue elaborado usando Python versión 3.6.8. Para más información sobre Python y sus usos, a continuación se encuentra la página web: https://docs.python.org/3/
Utilizamos los frameworks de MQTT con Google Cloud Services (principalmente Data Studio) para el manejo de los datos de los sensores y su presentación.
- Se usaron las siguientes librerías
- RPi.GPIO:
- Librería que se utiliza para controlar el GPIO en una Raspberry Pi, además de asignar los pines utilizados en el circuito.
- sys
- json
- time
- subprocess
- datetime
- requests
- jwt
- Librería que permite la comunicación del Raspberry Pi con un servicio que mande/reciba información dentro de un documento de tipo json. jwt significa json web token.
- Adafruit_DHT
- Librería utilizada para poder manejar la información enviada desde el sensor de temperatura y humedad con el nombre DHT11 y poder manipularlo a nuestro gusto.
- paho.mqtt.client
- Librería utilizada para poder mandar mensajes utilizando el protocolo MQTT , este es un protocolo utilizado especialmente para poder conectar dispositivos que pertenezcan a una red de IoT (Internet of Things)
- pprint
- Librería enfocada en poder imprimir de manera correcta y eficiente la información que requerimos para poder mandarla a nuestro servicio de Google Cloud.
- mfrc522
- Librería utilizada para poder manejar los datos de cualquier tag RFID, esta librería está enfocada para que el sensor RFID-RC522 pueda funcionar con el Raspberry Pi 3 B+.
- requests.exceptions
- RPi.GPIO:
Se utilizaron los servicios de Azure para el análisis de las imágenes de los usuarios, para poder determinar la edad y género, y poder enviarlo a la nube.
Además, se utilizó un mismo programa en Python para la compilación de todos los sensores usados como para el envío de datos a la nube, en Google Cloud Services.
Nuestro sistema manda tres tipos de tablas diferentes:
- Usuarios, enviando la fecha y hora, edad y género.
- Temperatura del refrigerador, enviando la fecha y hora, temperatura y humedad.
- Inventario y ventas, enviando el id del producto, el nombre y la cantidad.
El lenguaje de programación usado fue Python versión 3.6.8. Para más información sobre Python y sus usos, a continuación se encuentra la página web: https://docs.python.org/3/
Utilizamos los frameworks de Azure Cognitive Services para el reconocimiento facial, y MQTT con Google Cloud Services (Cloud Functions, IoT Core, PubSub, Data Studio) para el manejo de los datos de los sensores, almacenamiento de los mismos y su presentación.
- Se usaron las siguientes librerías
- RPi.GPIO:
- Librería que se utiliza para controlar el GPIO en una Raspberry Pi, además de asignar los pines utilizados en el circuito.
- sys
- json
- time
- subprocess
- datetime
- requests
- jwt
- Librería que permite la comunicación del Raspberry Pi con un servicio que mande/reciba información dentro de un documento de tipo json. jwt significa json web token.
- Adafruit_DHT
- Librería utilizada para poder manejar la información enviada desde el sensor de temperatura y humedad con el nombre DHT11 y poder manipularlo a nuestro gusto.
- paho.mqtt.client
- Librería utilizada para poder mandar mensajes utilizando el protocolo MQTT , este es un protocolo utilizado especialmente para poder conectar dispositivos que pertenezcan a una red de IoT (Internet of Things)
- pprint
- Librería enfocada en poder imprimir de manera correcta y eficiente la información que requerimos para poder mandarla a nuestro servicio de Google Cloud.
- mfrc522
- Librería utilizada para poder manejar los datos de cualquier tag RFID, esta librería está enfocada para que el sensor RFID-RC522 pueda funcionar con el Raspberry Pi 3 B+.
- requests.exceptions
- RPi.GPIO:
Nosotros tenemos cuatro endpoints que se conectan con la nube:
-
Azure Cognitive Services (Reconocimiento Facial):
- Descripción:
- Se envía una solicitud con una imagen para recibir los datos característicos de la misma, como edad, tamaño de la cara, género y el formato.
- Headers:
- {"Content-Type": "application/octet-stream", 'Ocp-Apim-Subscription-Key': '7e9cfbb244204fb994babd6111235269'}
- Formato JSON del cuerpo de la solicitud:
- face_uri, headers, data
- Donde:
- face_uri = "https://raspberrycp.cognitiveservices.azure.com/vision/v1.0/analyze?visualFeatures=Faces&language=en"
- data = imagen tomada
- Formato JSON de la respuesta:
- {'faces': [{'age': age, 'faceRectangle': {'height': height, 'left': left, 'top': top, 'width': width}, 'gender': 'gender'}], 'metadata': {'format': 'format', 'height': 'height', 'width': 'width'}, 'requestId': 'requestId'}
- Descripción:
-
Google Cloud Services #1 (Usuarios):
- Descripción:
- Se toman los datos importantes regresados por Azure para nuestro registro y se envían a Google Cloud, junto con la fecha y hora. Además del id del producto que está comprando.
- Formato JSON del cuerpo de la solicitud:
- '{{ "ts": {}, "age": {}, "gender": "{}", "id": {} }}';.format(int(time.time()), faces_list[0],faces_list[1], faces_list[2])
- Formato JSON de la respuesta:
- Como tal no hay un formato JSON de respuesta, sino hay un mensaje de "no error".
- Descripción:
-
Google Cloud Services #2 (Estatus Refrigerador):
- Descripción:
- Se envían a Google Cloud los datos recibidos del sensor de temperatura, siendo la temperatura y la humedad, junto con la fecha y hora.
- Formato JSON del cuerpo de la solicitud:
- '{{ "ts": {}, "temperature": {}, "humidity": "{}" }}';.format(int(time.time()), temper_list[0],temper_list[1])
- Formato JSON de la respuesta:
- Como tal no hay un formato JSON de respuesta, sino hay un mensaje de "no error".
- Descripción:
-
Google Cloud Services #3 (Estatus Almacén):
- Descripción:
- Se envían a Google Cloud los datos del inventario en ese momento, siendo el ID de producto, el nombre del producto y la cantidad en existencia.
- Formato JSON del cuerpo de la solicitud:
- '{{ "updated": {},"id": {}, "producto": "{}", "cantidad": {} }}'.format(int(time.time()), product_list[0],product_list[1],product_list[2].strip("\n"))
- Formato JSON de la respuesta:
- Como tal no hay un formato JSON de respuesta, sino hay un mensaje de "no error".
- Descripción:
Todos los sensores menos uno fueron consolidados en un solo programa de Python, e implementados de una manera selectivamente asíncrona. Lo que esto significa es que, en un caso de uso normal, al inicio solamente se tienen dos sensores funcionando: el detector magnético de apertura y el de temperatura. Esto prosigue hasta que se detecte una apertura de puerta: a partir de este momento, se toma una foto usando la webcam, y se empieza a detectar (asíncronamente) si la persona que abrió la puerta dejó o ingresó un producto, y también si la puerta se ha dejado abierta después que el usuario se ha ido.
Los sensores utilizados ( y la liga de donde obtuvimos su información) fueron los siguientes:
- Temperatura/Humedad: https://github.com/adafruit/Adafruit_Python_DHT
- Movimiento: https://www.internetdelascosas.cl/2013/05/13/sensor-de-presencia-en-raspberry-pi/
- Apertura Magnética: https://www.alexisabarca.com/2016/01/usar-un-sensor-de-puerta-magnetico-en-un-raspberry-pi/
- Webcam: https://github.com/vcubells/iot_supermercado/blob/master/demo_02/01_Sensors.py
- Lectoescritor de RFID: https://medium.com/coinmonks/for-beginners-how-to-set-up-a-raspberry-pi-rfid-rc522-reader-and-record-data-on-iota-865f67843a2d
El lenguaje de programación usado fue Python versión 3.6.8. Para más información sobre Python y sus usos, a continuación se encuentra la página web: https://docs.python.org/3/
Para los sensores no utilizamos ningún framework para su funcionamiento óptimo.
Para el funcionamiento de los sensores se usaron tres librerías importantes:
- RPi.GPIO, la cual es la librería para la utilización de los pines en la Rpi
- mfrc522, la cual es la librería/API para la escritura y lectura de chips RFID a partir de un sensor conectado por pines
- Adafruit, la cual es una librería general de I/O, que en este proyecto fue utilizada para el input del sensor de temperatura y humedad
Para poder utilizar este proyecto, se debe clonar este repositorio y seguir los pasos mencionados en el documento contenido en la carpeta "docs"
- Librería de Python
- Librería de RPi.GPIO
- Librería de jwt (Jason Web Token)
- Librería de Adafruit_DHT
- Librería de paho.mqtt.client
- Librería de pprint (pretty print)
- Librería de MFRC522
- Documentación de Microsoft Azure Cognitive Services