Sistemas embebidos en SBC A. A. González-Molina, y N. N.Rodriguez-Villarruel Universidad Pedagógica y Tecnológica de Colombia, Facultad de Ingeniería, Escuela de Ingeniería Electrónica Resumen—En este informe se investiga y desarrolla un sistema de telemetría utilizando una SBC como Raspberry Pi 4, la cual cumple la función de plataforma central para adquirir datos de sensores en tiempo real y transmitirlos sobre una dashboard en grafana, la cual muestra de manera gráfica los datos adquiridos por los sensores (DTH11, MQ135 Y BH1750). recopilación tanto de extracción como de inserción basados en el uso del complemento. También está equipado para manejar el análisis de una cantidad considerable de formatos de datos, incluidos Prometheus , JSON, XML, CSV y muchos más. [8] Abstract-- This report investigates and develops a telemetry system using a SBC like Raspberry Pi 4, which serves as a central platform to acquire sensor data in real time and transmit them on a dashboard in grafana, which graphically displays the data acquired by the sensors (DTH11, MQ135 and BH1750). I. INTRODUCCIÓN Más y más empresas se suman a tener un mayor control de su infraestructura , ya sea en la nube o en sus instalaciones. Comprendiendo que, entre las mejores herramientas para manejo de datos de series temporales, agentes para recopilar métricas y monitorizar por medio de un análisis de datos de alta calidad es clave para manejar mejor los costes y mitigar incidencias dentro de la organización.[6] Fig. 2. Arquitectura de telegraf InfluxDB: Es donde Telegraf manda toda esta información, InfluxDB está especialmente diseñado para almacenar de manera eficiente una cantidad importante de información, además se pueden definir periodos de retención de la información en caso de que tengamos un problema de performance.[7] InfluxDB tiene la capacidad de abordar casos de uso tanto de monitoreo como de observabilidad. Veamos la diferencia entre las dos: Fig. 1.Esquema lógico de la infraestructura. La stack de desarrollo TIG es la que se implementa para hacer la recolección de datos y visualización en Dashboard. A continuación se muestra contenido detallado de su estructura[Fig.1]: Telegraf: Se encarga de recolectar todos los datos que le pasamos mediante el fichero de configuración, Telegraf colecciona el resultado de los outputs que tenemos configurados, como son CPU/RAM/LOAD o servicios como Nginx, MariaDB,etc.[7] Telegraf es nuestro agente de recopilación de datos de código abierto diseñado específicamente para recopilar métricas y eventos. Equipado con más de 300 complementos para ingerir, transformar y generar datos, es un agente versátil para datos de series temporales. La comunidad se refiere a él como la navaja suiza de la recopilación de datos de monitoreo y observabilidad debido a su capacidad para implementar métodos de El monitoreo implica la recopilación y análisis de métricas, registros y eventos para realizar un seguimiento del rendimiento del sistema. Utilizando reglas y umbrales predefinidos, el proceso de monitoreo detecta problemas potenciales y genera alertas cuando se producen violaciones de los umbrales, lo que ayuda a mantener la salud del sistema. Puede aplicar este enfoque en varios tipos de infraestructura, tanto en el ámbito físico como en el digital. La Observabilidad lleva al monitoreo un paso más allá para incluir la instrumentación tanto del código como de la infraestructura para exponer los datos pertinentes. Esto permite a los equipos comprender profundamente el comportamiento de sus sistemas. Al correlacionar datos de diversas fuentes, facilita el diagnóstico de problemas y la identificación de las causas fundamentales. Esto, a su vez, proporciona conocimientos prácticos para una resolución eficaz de problemas. El rastreo , que mapea el recorrido de las solicitudes o transacciones a través de los componentes de un sistema, es la herramienta de observabilidad por excelencia.[8] 1 A primera vista, el monitoreo y la observabilidad pueden parecer tener el mismo propósito, pero abordan el estado del sistema desde ángulos distintos. El monitoreo es proactivo y establece reglas y umbrales predefinidos para garantizar que los sistemas funcionen dentro de los parámetros deseados. Se trata de garantizar que todo esté "en el buen camino" y alertar cuando no lo esté. Por otro lado, la observabilidad es de naturaleza más diagnóstica. Se trata de comprender "por qué" sucedió algo y profundizar en el comportamiento del sistema. Si bien ambos tienen como objetivo mantener la salud y el rendimiento del sistema, el monitoreo se trata más de detectar problemas conocidos, mientras que la observabilidad se centra en explorar problemas desconocidos. Sin embargo, en el panorama de la gestión de sistemas modernos, son complementarios. Juntos, proporcionan una visión holística del estado, el rendimiento y el comportamiento del sistema, garantizando tanto solidez como resiliencia.[8] Grafana: Es el Dashboard que se encarga de mostrar toda la información que InfluxDB tiene almacenado en las bases de datos. [7] Al obtener los datos se procede a realizar algo con estos. Esto depende de las propias iniciativas o de la infraestructura actual de la empresa. Grafana es una plataforma de monitoreo y visualización de datos de código abierto.Permite a los usuarios crear paneles interactivos para el análisis de datos en tiempo real y el seguimiento de métricas en varias fuentes de datos. Es una de las plataformas más utilizadas con InfluxDB.[8] II. Fig. 3.Magnetización como una función del campo aplicado. B. Configuración de telegraf Para la configuración de telegraf se necesita modificar ciertas opciones que se encintan en el archivo telegraf.conf que se encuentra en la dirección /etc/telegraf/telegraf.conf como se muestra en la [Fig.4 ] y la [Fig.5 ] DESARROLLO DE LA PRÁCTICA Como primera medida se tuvo en cuenta que el sistema operativo de la SBC utilizada en este laboratorio (Raspberry Pi 4) estuviese funcionando en óptimas condiciones, para no tener inconvenientes a la hora de la instalación de la stack TIG. A. Instalación telegraf Para la instalación de telegraf se buscó en la página principal de influxdb las sentencias para instalar telegraf curl -s https://repos.influxdata.com/influxdata-archive.key > influxdata-archive.key echo '943666881a1b8d9b849b74caebf02d3465d6beb716510d86a39f 6c8e8dac7515 influxdata-archive.key' | sha256sum -c && cat influxdata-archive.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive.gpg > /dev/null echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list sudo apt-get update && sudo apt-get install telegraf Fig. 4 .Configuración Telegraf 2 D. Instalación grafana Para la instalación de grafana primero se creó un archivo llamado ssh en el directorio de inicio. Esto con el fin de habilitar SSH para que se pueda iniciar la sesión de forma remota. Para ello se utiliza el comando “sudo nano ssh”.[2] [Fig.8]. Para la instalación de Grafana primero se debe agregar la clave APT utilizada para autenticar paquetes.[2] [Fig.] Fig.8 .Clave APT para autenticar paquetes. Se procede a instalar grafana mediante los comandos: “sudo apt-get update” y “sudo apt-get install -y grafana”. [Fig.9]. Fig. 5.Configuración Telegraf Después se muestra el status de telegraf para ver si la instalación fue correcta, en ocasiones se requiere reiniciar el paquete para ser correctamente leído como se muestra en la [Fig. 6 ]. Fig.9 Primeros comandos para la instalación de grafana. Luego de ello Grafana ya se encuentra instalado, pero aún no se está ejecutando. Para asegurar que Grafana se inició, se debe habilitar e iniciar el servidor de Grafana. [Fig.10] Fig.10 .Habilitar e iniciar el servidor Grafana. Fig. 6.Status Telegraf C. Instalación Influxdb Posterior a ello Grafana se está ejecutando en la máquina por lo que se procede a abrir el navegador con la dirección http://localhost:3000 , dado que “localhost” es la ip de la raspberry pi 4 para otros sistemas simplemente sería http://<ip_rasberry_pi>:3000 . Al colocar la dirección respectiva se visualiza una interfaz de usuario que tiene Grafana por defecto para ingresar “usuario” y la contraseña, para este caso se coloca en ambos espacios “admin”.[Fig.]. Fig. 7. Instalación InfluxDB. 3 Fig. 14 Se selecciona InfluxDB. Fig.11 Interfaz de inicio Grafana. Al ingresar se muestra la interfaz principal [Fig.]. Fig.15 Configuración InfluxDB. Se colocan los datos de la base de datos creada, para este caso se llama “telegraf”.[Fig.]. Fig.12 Interfaz principal Grafana. E. Configuración de grafana Se necesita añadir la base de datos que se creó en InfluxDB , para ello se busca la opción añadir “Data sources” y se escoge InfluxDB.[Fig.]. Fig.16 Información de la base de datos creada. Finalmente se coloca el id de la Dashboard “10578”. [Fig.]. Fig.13 Data sources Grafana. 4 Fig.17 Load Dashboard. Fig.21 . Dashboard de las métricas por defecto de la Raspberry Pi 4. Ahora se crea la database mediante el comando “create database telegraf”, posterior a ello “use telegraf”, “create user telegraf_linux with password ‘12345’ with all privileges”, finalmente se otorgan todos los privilegios utilizando “grant all privileges on telegraf to tpi”. [Fig.21]. G. Configuración de la carpeta telegraf Antes de avanzar con el panel de Grafana primero se debe configurar el archivo telegraf.conf en la Raspberry Pi 4. Fig.18 Import Dashboard Al cargar la página nuevamente, se puede observar métricas de la raspberry pi 4 en la Dashboard configurada.[Fig.19]. Se ubica en este archivo “ [[outputs.InfluxDB]]”, para así descomentar las líneas “urls, database,username,password” y llenarlas con sus respectivos datos.[Fig.22]. Fig.22 . Configuración del archivo telegraf.conf mediante comando “sudo nano /etc/telegraf/telegraf.conf”. Se guarda los cambios hechos en el archivo telegraf.conf y cargamos de nuevo el servicio de telegraf mediante el comando “sudo systemctl reload telegraf.service”. Luego para verificar que los datos que se colocaron en el archivo se aplicaron correctamente, se comprueba mediante el comando “sudo systemctl status telegraf.service”. [Fig.23]. Fig. 19 Dashboard de las métricas por defecto de la Raspberry Pi 4. F. Creación de una database para grafana Luego de la instalación del stack de desarrollo TIG, ahora se debe crear una base de datos para Grafana mediante influxDB. Primeramente se digita comandos.[Fig.20]. “influx” en la ventana de Fig.23. Estado del servicio de telegraph.Muestra que está “activo” H. Configuración e instalación de MQTT Uno de los métodos de adquisición de datos que se manejaron es MQTT, el cual es un protocolo de comunicación de datos mediante “Topics” y las funciones de suscriptor y publicador 5 de mosquitto. Para la instalación de siguientes comandos: mosquitto primero se ponen los sudo apt-get update sudo apt-get install mosquitto mosquitto-clients mensajes publicados en un “ Topic”, o varios, esto depende de la aplicación. En cuanto al publicador mosquitto su principal función es enviar los datos respectivos. Es así que para definir un “Topic” , se debe digitar el siguiente comando: sudo mosquitto_sub -h localhost -t “topic_name” Posterior a ello, se da inicio al servidor mosquitto mediante el comando: Para verificar el estado del servidor mosquitto: El nombre del “Topic” que se definió es “datasensor”, como el comando inicia con mosquitto_sub, esto quiere decir que al cliente suscriptor le va a llegar los datos en esa ventana de comandos. Para comprobar esto, se abre otra ventana de comandos y se digita: sudo systemctl status mosquitto mosquitto_pub -h localhost -t “datasensor” -m “mensaje”. En cuanto a la configuración del archivo de texto mosquitto.conf : En la parte de “mensaje”, se digita lo que se quiera enviar de manera manual directamente desde la ventana de comandos. sudo nano /etc/mosquitto/mosquitto.conf La verificación de los comandos anteriormente mencionados se evidencian desde la [Fig.24] y [Fig.25]. sudo systemctl start mosquitto Al cual se verifica que contenga las siguientes líneas habilitadas para su correcto funcionamiento: allow_anonymous false password_file /etc/mosquitto/passwd Se guardan los cambios hechos mediante el atajo Ctrl+O, y Ctrl+X para salir de archivo mosquito.conf. Para personalizar el broker mosquitto con un usuario y contraseña, se debe colocar el siguiente comando: Fig. 24. Comandos de instalación de MQTT y configuración. sudo mosquitto_passwd -c /etc/mosquitto/passwd nombre_usuario Para este caso se definió como nombre de usuario “santiago”, con su respectiva contraseña. Fig.25 . Ejemplo de interacción entre suscriptor y publicador de mosquitto. Para que mosquitto cargue toda está configuración lo que se hace es restaurar el protocolo de mensajería MQTT, así: I. sudo systemctl restart mosquitto Los sensores que se escogieron para la toma de datos desde la SBC Raspberry Pi 4 son los siguientes: Elección y conexión de sensores. Se inicia nuevamente MQTT: sudo systemctl start mosquitto Para probar si la comunicación entre “publicador” y “suscriptor” es correcta, lo que se hace es definir un “ Topic”, esto con el fin de que el suscriptor sepa a donde ir, o qué es lo que va a leer. Se debe tener presente que el suscriptor de mosquitto es un cliente que se conecta al servidor mosquitto para recibir Fig.26 . Sensor DTH11 [3]. 6 El sensor DHT11 es un sensor que arroja métricas de Temperatura y Humedad del ambiente, entregando una señal digital calibrada, por lo cual, cumple con las necesidades del sistema de telemetría. [3] Fig.29 . Conexión de los sensores a la Raspberry Pi-4B. Fig.27 . Sensor MQ135 [4]. El sensor MQ135 es un sensor de gas que detecta la presencia de dióxido de carbono, amoniaco, benceno, humo, entre otros, por lo cual, es útil para el sistema de telemetría, pues permite detectar la presencia de humo en el datacenter. Tiene una salida digital y analógica, para este caso, se hace uso de la salida digital. [4] J. Programación en el script de python. Como primera medida en este apartado se instalan todas las librerías desde el entorno virtual de python respectivas para cada uno de los sensores : Instalación Python [9] Para instalar Python y todas las dependencias y herramientas esenciales de compilación en la placa Raspberry Pi, se deben ejecutar los siguientes comandos: sudo apt-get update sudo apt-get install build-essential python3-dev Antes de iniciar la instalación de las librerías adicionales para permitir la lectura de los sensores y la conexión con el servidor MQTT, se debe crear un entorno virtual, pues la placa Raspberry Pi 4B no permite la instalación directa de dichas librerías en la placa, por ende se hace necesario crear el entorno virtual y trabajar completamente en él todo el script de python. Fig.28 . Sensor BH1750 [5]. Por último, se tiene el sensor de luminosidad BH1750. Cuenta con una salida digital en formato I2C, que entrega la intensidad luminosa en Lux (Lx) desde 0 hasta 65534 lux. La conexión respectiva de la sensórica con la SBC de desarrollo Raspberry Pi es la siguiente: Para crear el entorno virtual se deben ejecutar los siguientes comandos que crean una carpeta llamada SENSORES, ingresan a la carpeta creada y se crea y activa el entorno virtual dentro de la carpeta. mkdir SENSOR cd SENSOR python3 -m venv myenv source myenv/bin/activate Una vez creado y activo el entorno virtual, se procede con la instalación de todas las librerías adicionales necesarias para el funcionamiento adecuado del script. 7 Instalación librería DHT11 [10] Para instalar la librería que garantiza la correcta lectura del sensor DHT 11 se deben ejecutar los siguientes comandos: pip3 install adafruit-circuitpython-dht sudo apt-get install libgpiod2 Instalación librería BH1750 [11] Para la correcta lectura del sensor BH1750 se debe instalar la librería correspondiente a dicho sensor, para ello se ejecuta el siguiente comando: pip3 install adafruit-circuitpython-bh1750 Instalación librería Paho [13] Para poder conectarse con el servidor local MQTT es necesaria la librería paho-mqtt. Esta librería proporciona una clase cliente que permite a las aplicaciones conectarse a un broker MQTT para publicar mensajes (enviar mensajes a Telegraf), suscribirse a temas y recibir mensajes publicados. También proporciona algunas funciones de ayuda para que la publicación de mensajes únicos a un servidor MQTT sea muy sencilla. [13] K. Pruebas y evaluación. Como primera medida la primera comprobación realizada es que el sistema operativo instalado en el disco duro se encuentre óptimo para la debida instalación del stack de desarrollo TIG. Por otro lado uno de los principales objetivos era visualizar las métricas de la raspberry pi 4 en grafana esto para la familiarización del proceso TIG, para ya luego proceder a implementar en el sistema de sensado . En un script de python 3 se realiza la respectiva creación del código base de la guia de laboratorio que tiene como fin la lectura de datos a través de variables definidas, el montaje realizado de la sensórica y los datos que toma este sistema en tiempo real se puede visualizar en las siguientes [Fig.30]. y [Fig.31]. Ahora, para la instalación adecuada se deben ejecutar una serie de comandos. Primero se escribe el siguiente comando en la terminal: pip install paho-mqtt Adicionalmente se descarga el repositorio de paho donde se encuentran ejemplos y material complementario a la librería y se instalan otras dependencias: git clone https://github.com/eclipse/paho.mqtt.python cd paho.mqtt.python pip install -e . Por último se descargan e instala otro repositorio que permite realizar pruebas a MQTT: git clone https://github.com/eclipse/paho.mqtt.testing.git cd paho.mqtt.testing git checkout a4dc694010217b291ee78ee13a6d1db812f9babd Fig. 30. Montaje de los sensores en la placa de desarrollo Raspberry Pi 4. El sensor MQ135 no necesita librerías adicionales para este propósito. En cuanto al código fuente, esté se puede encontrar bajo la siguiente referencia. [14] 8 rojo). Es decir, este tipo de “alertas” facilitan la interpretación de los datos. MQTT fue indispensable para la lectura de los sensores. No fue posible usar Telegraf por sí solo para la adquisición de las métricas de los sensores, por ende, se usó finalmente MQTT como intermediario entre la lectura de los sensores y la recopilación de los mismos en Telegraf . MQTT funciona similar a Telegraf, recopila la información de los sensores, y puede transmitir dicha información (en este caso a Telegraf). Y Telegraf cuenta con un plugin que permite adquirir los datos que MQTT recopila, todo en tiempo real. Por ende, MQTT resultó siendo una herramienta bastante útil e indispensable para el desarrollo del Sistema de Telemetría. Fig.31 . Data que se muestra desde la ventana de comandos III. ANÁLISIS DE RESULTADOS Uno de los factores importantes a tener en cuenta es el tipo de sistema operativo que se haya utilizado, por tal razón es necesario saber la versión que se ha instalado en la raspberry para que de esta manera se pueda instalar los paquetes de stack TIG correctamente sin ningún tipo de problema. Además es necesario reiniciar los stack TIG instalados para que de esta manera cualquier problema o fallo se pueda solucionar, siempre y cuando sean de un nivel superior, es decir, para errores temporales, paquetes de instalación que no responden y de esta manera se logre instalar las actualizaciones faltantes para que los servicios stack TIG puedan arrancar satisfactoriamente. Si se elige, por ejemplo, el formato influx para transmitir la lectura de los sensores, pero se escribe incorrectamente y se tiene una estructura errónea de la cadena de datos a transmitir, Telegraf será incapaz de recuperar las métricas transmitidas, por ende, el Sistema de Telemetría fallará. En la placa Raspberry Pi 4B, instalar librerías adicionales para la lectura de los sensores y la conexión y transmisión de información con MQTT queda imposible. Esta placa tiene ciertas limitaciones que no se presentan con la placa Raspberry Pi 3. Por ende, es necesario instalar todas las librerías adicionales en un solo entorno virtual, de esta manera, si falla la instalación o hay algún error, se puede borrar el entorno virtual y crear uno nuevo sin afectar la instalación del STACK TIG o el propio sistema de la Raspberry. Además usar un entorno virtual facilita el correcto funcionamiento del script de python, pues todas las librerías necesarias se instalan sin ningún tipo de problema. El uso de Dashboard (Grafana) permite que cualquier usuario con conocimientos básicos pueda ver e interpretar la información recopilada y almacenada de los sensores, además de saber si el sistema presenta temperaturas bajas (color azul del panel), aceptables (color amarillo del panel) o altas (color A pesar de que al final por motivos de configuración del archivo telegraf.conf, no se pudo mostrar las métricas en tiempo real de los sensores. Se comprendió el funcionamiento de la Stack TIG. Eso sí es un mundo por estudiar, para la próxima práctica se mostrará el manejo de esta Stack de desarrollo. Cabe notar que en la práctica también se intentó por varios métodos de adquisición de datos como los archivos.log y lo que es docker. Aún con estos se nos complicó la manipulación de los archivos de configuración. IV. CONCLUSIONES Debido a la gran capacidad de procesamiento de la SBC utilizada se puede realizar la adquisición y almacenamiento de los datos en tiempo real y poder tener acceso a estos de manera instantánea y remota con el fin realizar diagnósticos o análisis de datos para cumplir con el objetivo propuesto en alguna determinada aplicación, como lo es en el caso del control de variables ambientales y garantizar un ambiente óptimo para el adecuado funcionamiento de servidores en los datacenters. El sistema de telemetría basado en el stack de desarrollo TIG, permite tener un mayor análisis en los datos de la sensórica que se esté midiendo, facilitando así su análisis para futuras investigaciones. REFERENCIAS [1] Khan, A. (1969) Monitoring raspberry pi system using influxdb, Telegraf and Grafana. Available at: https://linuxhint.com/monitor-raspberry-pi-system-using-influxdb-telegra f-grafana/ (Accessed: 06 April 2024). [2] Install grafana on raspberry pi (no date) Grafana Labs. Available at: https://grafana.com/tutorials/install-grafana-on-raspberry-pi/ (Accessed: 06 April 2024). [3] Sensor de temperatura Y Humedad dht11 (no date) Ferretrónica. Available at: 9 https://ferretronica.com/products/sensor-de-temperatura-y-humedad-dht1 1?_pos=1 (Accessed: 06 April 2024). [4] Sensor Gas MQ135 Dioxido de Carbono, Amoniaco, Benceno (no date) Ferretrónica. Available https://ferretronica.com/products/sensor-de-gas-mq135?_pos=1 (Accessed: 06 April 2024). at: [5] Sensor de Luminosidad Digital BH1750 (no date) Ferretrónica. Available at: https://ferretronica.com/products/sensor-de-luminosidad-digital-bh1750? _pos=1 (Accessed: 06 April 2024). [6] Mart&iacute;nez, J. (2023) Monitorizando Datos Con influxdb, Telegraf Y grafana, OpenWebinars.net. Available at: https://openwebinars.net/blog/monitorizando-datos-con-influxdb-telegrafy-grafana/ (Accessed: 10 April 2024). [7] J. de la Cruz, “En busca del dashboard perfecto: Influxdb, Telegraf Y grafana – parte II, instalar agente en linux,” El Blog de Jorge de la Cruz, https://www.jorgedelacruz.es/2016/07/07/en-busca-del-dashboard-perfect o-influxdb-telegraf-y-grafana-parte-ii-instalar-agente-en-linux/ (accessed Apr. 10, 2024). [8] Jay Clifford / Product Aug 29, 2023 (2023) Infrastructure Monitoring Basics with telegraf, influxdb, and Grafana, InfluxData. Available at: https://www.influxdata.com/blog/infrastructure-monitoring-basics-telegra f-influxdb-grafana/ (Accessed: 10 April 2024). [9] H. Kumar, “Monitoring Temperature and Humidity Using InfluxDb and Grafana on RaspberryPi”, TerminalBytes, visitado el (10/04/2024), recuperado de:https://terminalbytes.com/temperature-using-raspberry-pi-grafana/ [10] Adafruit, “DHT Humidity Sensing on Raspberry Pi or Beaglebone Black with GDocs Logging”, visitado el (09/04/2024), recuperado de: https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdo cs-logging/python-setup [11] PyPi, “adafruit-circuitpython-bh1750 1.1.10”, visitado el (09/04/2024), recuperado de: https://pypi.org/project/adafruit-circuitpython-bh1750/ [12] Adafruit, “Adafruit BH1750 Ambient Light Sensor”, visitado el (09/04/2024), recuperado de: https://learn.adafruit.com/adafruit-bh1750-ambient-light-sensor/python-ci [13] PyPi, “paho-mqtt 2.0.0”, visitado el (09/04/2024), recuperado de: https://pypi.org/project/paho-mqtt/ [14] https://colab.research.google.com/drive/1qScAFBVK9R3NAT0IQ9KJfIn BACoU_Gt5?authuser=3#scrollTo=PMPOF-QThgQc link del video : https://www.youtube.com/watch?v=5Ch1 OQJxn58 10