Archivo de la etiqueta: Raspberry Pi

Presentación del Curso: Raspberry Pi y Node-RED para IoT 2ªed

Título: “Raspberry Pi y Node-RED para IoT 2ªed”

Motivación

En la industria conectada, cada vez se está haciendo más popular el uso de Node-RED debido a su estabilidad, continuo desarrollo y aportaciones externas que hacen de ella una herramienta de programación utilizada para conectar dispositivos de hardware, APIs y servicios de internet.

Dado que la mayoría de dispositivos IoT para industria 4.0 posibilitan realizar un programa de control con la herramienta de Node-Red, el dominio de dicha herramienta permitirá a una empresa explorar y ampliar las soluciones que ofrece.

Raspberry Pi es un ordenador de placa reducida, ordenador de placa única u ordenador de placa simple (SBC) de bajo costo muy popular en la industria conectada y con gran apoyo de la comunidad. Es el complemento perfecto para Node-RED en el entorno de trabajo.

Este curso es una introducción práctica para aprender a manejar Raspberry Pi y para aprender a programar en en entorno de IoT/Industria 4.0/digitalización incluso para quien no está familiarizado con la programación por código.

Este curso surge de diversas conversaciones con gente de empresas, alumnos de los cursos de Arduino y especialmente personal del Think TIC en los últimos años donde se ha habla de la necesidad de que las pequeñas y medianas empresas puedan acceder a las ventajas de soluciones IoT o Industria 4.0 con herramientas sencillas de usar y de bajo coste.

Curso: https://www.larioja.org/thinktic/es/cursos-eventos/cursos-comenzados-completos/curso-raspberry-pi-node-red-iot 

Gracias a las herramientas libres/Open Source es posible democratizar el IoT y la industria 4.0. Antes se necesitaba muchísimo dinero no solo en HW y licencias de SW, sino en consultores que hacen un diseño a medida y realizan la integración de los sistemas, ahora no solo el SW libre y el HW libre y barato, sino que la comunidad da soporte a las dudas, hace documentación y tutoriales, así como librerías para facilitar el trabajo.

Muchas empresas no dan el salto de digitalización porque la inversión inicial puede ser muy alta al necesitar contratar a una empresa externa o herramientas profesionales, pero quién mejor que el personal de la propia empresa que es quien mejor conoce los procesos internos, gracias a la tecnología abiertas, es posible con una pequeña inversión económica y una formación centrada en la digitalización de los procesos.

Propuesta Formativa

Este curso está diseñado para que cualquier trabajador cualificado de una empresa pueda introducir el concepto de IoT y la automatización de tareas  aplicado al sector en que trabaje, usando tecnologías libres y pueda ver resultados rápidos y con una inversión económica mínima.

El curso se basa en la programación mediante Node-RED que es una programación por flujos.

Este curso está enfocado a profesionales cualificados de diversos sectores que deseen hacer una aplicación de IoT en sus empresas y pueda montar un piloto de IoT en sus instalaciones, así como realizar tareas de automatización.

Conceptos:

  • Raspberry Pi es un ordenador de placa reducida, ordenador de placa única u ordenador de placa simple (SBC) de bajo costo desarrollado en el Reino Unido por la Raspberry Pi Foundation. Se ha convertido en un hardware muy popular debido a su bajo coste y gran potencia ampliamente utilizado en proyectos IoT e Industria conectada.
  • Node-RED es una herramienta de programación que se utiliza para conectar dispositivos de hardware, APIs y servicios de internet. Adecuado para los equipos dedicados al Internet de las cosas Industrial( IIoT) y personal dedicado al diseño y prueba de soluciones para la comunicación de equipos de planta con aplicaciones de IT. Dado que la mayoría de dispositivos IoT para industria 4.0 posibilitan realizar un programa de control con la herramienta de Node-Red, el dominio de dicha herramienta permitiría al equipo IIoT explorar y ampliar las soluciones que ofrece a la empresa que lo use.

Objetivo

El objetivo de este curso es que el alumno obtenga un conocimiento de la placa Raspberry Pi basada en linux y sea capaz de instalar, configurar y realizar proyectos sencillos usando Node-RED y la programación visual mediante flujos, para su uso en entornos IoT o de automatización.

Al finalizar el curso el alumno será capaz de:

  • Conocer el HW Raspberry Pi
  • Instalar Raspberry Pi OS
  • Conocer comandos básicos de Linux
  • Instalar servicios en Raspberry Pi OS
  • Conocer el protocolo MQTT
  • Instalar Node-RED en diversas plataformas
  • Configurar y usar de forma segura Node-RED
  • Usar la programación de flujos de forma eficiente
  • Hacer debug de los programas Node-RED
  • Instalar y utilizar nodos
  • Configurar un dashboard

Palabras Clave:

  • Raspberry Pi
  • Node-RED
  • IoT
  • Automatización
  • Low-Code Programming
  • Edge Computing
  • OT vs IT

Requisitos

Para la realización de este curso no es necesario ningún conocimiento previo. Es recomendable un conocimiento medio de Inglés puesto que gran parte de la documentación está en Inglés.

Metodología

El curso es principalmente práctico donde se empieza a instalar, configurar y usar una Raspberry Pi para posteriormente, programar una serie de retos usando Node-RED instalado en Raspberry Pi interactuando en nodos remotos basados en placas ESP8266 con diferentes shields, que hacen de nodos remotos conectados con protocolo MQTT. También desde Node-RED se interactuará con aplicaciones de terceros.

La duración total del curso es de 30 horas.

Los recursos utilizados para la realización de este curso son:

Además están disponibles otros recursos para ampliar información:

Para realizar las prácticas de este curso se usará el material disponible en el Think TIC que veremos a fondo en un apartado posterior.

Toda la documentación será on-line con el objetivo de mantenerla actualizada y no con un documento físico que se queda obsoleto rápidamente. Después de finalizar el curso toda la documentación on-line seguirá estando disponible de forma pública.

Todo el material entregado es en préstamo y debe cuidarse al máximo, a la hora del montaje de las prácticas se seguirán las instrucciones para evitar dañar los componentes.

Toda la documentación está liberada con licencia Creative Commons.

Reconocimiento – NoComercial – Compartir Igual (by-nc-sa): No se permite un uso comercial de la obra original ni de las posibles obras derivadas, la distribución de las cuales se debe hacer con una licencia igual a la que regula la obra original.

Aprendiendo Arduino by Enrique Crespo is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.

Organización del curso

El curso tiene una duración total de 30 horas. El curso se celebra del 13 al 24 de junio de 2022 de Lunes a Viernes en horario de 18.00 a 21.00. Se hará un descanso de 10-15 minutos aproximadamente a mitad de la sesión.

Diario de curso donde se seguirá lo explicado cada día y puntos adicionales que se traten en el curso: https://aprendiendoarduino.wordpress.com/2022/06/04/diario-curso-raspberry-pi-y-node-red-2a-ed/

Contenido del Curso

Toda la documentación del curso y el código usado es libre y accesible desde: https://www.aprendiendoarduino.com/cursos/raspberry-pi-y-node-red-para-iot-2a-ed/

Contenido

  • Presentación del Curso
  • Material del Curso
  • Qué es Raspberry Pi
  • HW Raspberry Pi
  • Instalación Raspberry Pi OS
  • Raspberry Pi en la Industria
  • Conceptos básicos de Linux
  • Programación Básica en Python
  • GPIO
  • Instalación de Servicios en Raspberry Pi OS
  • Edge Computing
  • Uso de Raspberry Pi y Node-RED en la convergencia IT-OT
  • Protocolo MQTT
  • Qué es Node-RED
  • Instalación de Node-RED
  • Configurar y securizar Node-RED
  • Paso a Paso: Instalar, Configurar y Securizar Node-RED en Raspberry Pi
  • Fundamentos Programación Node-RED
  • Uso del Editor de Node-RED
  • Mensajes Node-RED
  • Dashboard Node-Red
  • Nodos de Configuración en Node-RED
  • Nodos Node-RED
  • Debug Node-RED

Presentaciones

  • ¿Nombre?
  • ¿Experiencia con Linux y/o Node-RED?
  • ¿Sector de aplicación o aplicaciones que se quieran hacer?

Contacto

Para cualquier consulta durante el curso y en cualquier otro momento mediante email: aprendiendoarduino@gmail.com

Twitter @jecrespo: https://twitter.com/jecrespom

Y más información sobre el curso y el autor: http://www.aprendiendoarduino.com/acerca-de/

Diario Curso: Raspberry Pi y Node-RED. 2ª ed

Curso «Raspberry Pi y Node-RED para IoT 2022. 2ª ed.»: https://www.aprendiendoarduino.com/raspberry-pi-y-node-red-para-iot-2a-ed/

Día 1 (13/06/2022) – «Presentación del Curso»

Hoja de préstamo de material.

Capítulos vistos:

Día 2 (14/06/2022) – «Raspberry Pi OS y Linux»

Resumen de lo hecho el día 1: Raspberry Pi instalada y configurada con acceso remoto por VNC, incluso por cloud. ¿Dudas del proceso?

ssh: https://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-es-4/ch-ssh.html

Raspberry Pi Compute Module 4s: https://www.muycomputer.com/2022/04/06/raspberry-pi-compute-module-4s/

mDNS: https://en.wikipedia.org/wiki/Multicast_DNS

Capítulos vistos:

Día 3 (15/06/2022) – «Linux e Instalación Servicios»

Resumen de lo hecho el día 2: Configurado acceso remoto a Raspberry Pi y redes virtuales.

Planificación para jueves o viernes: Node-RED y MQTT

Acceso a Raspberry Pi de casa con Zero Tier:

  • Instalar Zero Tier en Raspberry Pi de casa: curl -s https://install.zerotier.com | sudo bash
  • Unirse a la red: sudo zerotier-cli join [network-id] with [device-id]
  • Autorizar a la Raspberry Pi a entrar en la red desde el panel de control de Zero Tier
  • Comprobar que está en la red: sudo zerotier-cli listnetworks
  • Probar desde las otras Raspberry Pi en red Zero Tier que hace ping a Raspberry de Casa
  • Instalar Zero Tier en los PCs del aula y unirse a la red
  • Comprobar que se llega a los Node-RED (puertos 1880, 1881 y 1882) y Grafana (puerto 3000) de Raspberry Pi casa
  • Abandonar la red: sudo zerotier-cli leave [network-id]
  • Eliminar Raspberry Pi del panel de control de Zero Tier

Servicios como ZeroTier o Remote.it nos permite administrar redes virtuales y entender el funcionamiento de las VPNs o los túneles.

Zero Tier self-hosted: https://docs.zerotier.com/self-hosting/network-controllers/?utm_source=ztp

Acceso P2P con remote.it

MOOCs recomendados:

Capítulos vistos:

Día 4 (16/06/2022) – «Node-RED»

Resumen de lo hecho: Configurado acceso remoto a Raspberry Pi, acceso remoto y gestión Raspberry Pi via web.

  • Podemos programarla Node-RED
  • Podemos administrarla con Webmin
  • Podemos almacenar datos con SQLite
  • Y todo en local o en remoto.

Todo lo aprendido con Raspberry Pi es extensible a cualquier dispositivo con Linux, especialmente sistemas embebidos, gateways y servidores (publicos o privados).

Capítulos vistos:

Día 5 (17/06/2022) – «MQTT»

Open Weather Map:

Servidor MQTT:

  • Host: aprendiendonodered.com
  • Port: 8883
  • username: cursomqtt
  • Topic: cursomqtt/#

Instrucciones instalación Node-RED: https://nodered.org/#get-started

Capítulos vistos:

Día 6 (20/06/2022) – «Node-RED y MQTT»

Ecuador del curso: Todo listo para configurar Node-RED y programar con Node-RED.

Documentación final actualizada y publicada.

Control de Acceso con MQTT: https://es.aliexpress.com/item/1005003127209417.html

Dispositivos instalados, número de clientes en broker y carga del servidor

top -p `pgrep "mosquitto"`
tail -f /var/log/mosquitto/mosquitto.log

MOOCs:

Conectar los Arduinos

Capítulos vistos:

Día 7 (21/06/2022) – «Desarrollo Node-RED»

Más de MQTT en: 4.1.- Protocolo MQTT

Software MQTT: https://mqtt.org/software/

Broker MQTT público: https://www.hivemq.com/mqtt-cloud-broker/

Broker privado con MQTT en 1 min. Aedes: https://flows.nodered.org/node/node-red-contrib-aedes

MQTT Clean Session: http://www.steves-internet-guide.com/mqtt-clean-sessions-example/

Topic restriction: http://www.steves-internet-guide.com/topic-restriction-mosquitto-configuration/

Automatizar con Node-RED y MQTT:

  • Encender y apagar tras dos segundos con delay
  • Encender y apagar tras dos segundos con trigger
  • Encender con una pulsación y apagar con otra con toggle
  • Encender con temperatura > 25 grados y apagar cuando es menor

Programación distribuida. Envío de mensaje e instrucciones entre instancias de Node-RED para delegar funciones:

  • Publicar en cursomqtt/{nombre}/clima el nombre de una ciudad española mediante un inject
  • Suscribirse a cursomqtt/enrique/clima/resultado devuelve el clima para esa ciudad
  • Si se usara el mismo topic para responder a todos, todos recibiríamos las respuestas a las preguntas de todos.
  • Si usamos el mismo topic para responder, creamos un bucle

Lógica para programar la función anterior:

  • Suscribirse al topic cursomqtt/{nombre}/clima y consultar el clima actual con openweathermap, de la ciudad española que pasemos
  • Devolver el resultado en un JSON en cursomqtt/{nombre}/clima/resultado
  • No devolver el mensaje en el mismo topic. Peligro de hacer un bucle!!!

Capítulos vistos:

Día 8 (22/06/2022) – «Dashboard Node-RED»

Precio electricidad: https://www.ree.es/es/apidatos

Catálogo de datos del gobierno: https://datos.gob.es/es/catalogo

Programación visual para microcontroladores: https://xod.io/

Capítulos vistos:

Día 9 (23/06/2022) – «Configuración Node-RED»

Resumen de lo visto en el curso y lo que haremos los dos últimos días.

Owntracks: https://owntracks.org/

Worldmap : https://flows.nodered.org/node/node-red-contrib-web-worldmap

Ejemplo terremotos mejorado: https://flows.nodered.org/flow/002f4173484dabaf3d6742b8da9642ee

Demo 2N. Integrar control de accesos de 2N:

Capítulos vistos:

Día 10 (24/06/2022) – «Proyectos Finales con Node-RED»

Resumen de lo visto en el curso

MOOC Introducción a Docker y Contenedores: https://www.coursera.org/learn/introduccion-a-contenedores-con-docker

Netflix usa MQTT: https://www.hivemq.com/case-studies/netflix/

Nodo generador y decodificador de códigos QR: https://flows.nodered.org/node/node-red-contrib-image-tools

Curso Node-RED Developer: https://www.aprendiendoarduino.com/cursos/node-red-developer-professional/

Seguridad Node-RED:

  • Node-RED usa oauth2.0 para securiza la admin api
  • Usa auth bearer token. Expira en: 604800 segundos (7 días)
  • El navegador guarda el token y luego cuando vuelves a acceder no pide la contraseña. Puedes ver los token en el fichero /home/pi/-node-red/.sessions.json

El acceso al Dashboard y rutas HTTP usa basic Auth:

Eliminar contraseñas de los ordenadores!!!!

Recoger material.

Y cualquier duda a aprendiendoarduino@gmail.com

Capítulos vistos:

Capítulos para más información:

Material Curso Smart Cities

Para el curso on-line “Fundamentos IoT y Desarrollo con Node-RED para Smart Cities”, el material necesario por parte de los Asistentes para realizarlo es:

  • 1 PC o Portátil con conexión a internet
  • Para seguir el curso on-line es recomendable dos pantallas, una para seguir el vídeo y otra para programar en Node-RED.

El PC de cada asistente deberá tener un sistema operativo instalado, ya sea un sistema Windows, MacOS o Linux. Las licencias del Sistema Operativo y el software que tenga correrán a cargo del cliente/alumno.

  • Nodo Edge/Gateway. Instalación Node-RED. Recomendable usar Raspberry Pi + tarjeta SD 16Gb + alimentador conectada a Internet por alumno, pero podría usarse una máquina virtual o en un servidor cloud. Opcionalmente puede usarse instancias en la nube de Node-RED desde el servidor de https://www.aprendiendoarduino.com/ 

Las Raspberry Pis se usarán como instancias de Node-RED y nodos edge a los que se conectan los nodos remotos, por lo que no conectaremos sensores/actuadores/periféricos a las Raspberry Pi.

  • Nodos remotos por asistente compuesto por el siguiente material:
    • 2x Wemos D1 min o NodeMCU o equivalente
    • 1x shields para wemos D1 mini relé o equivalente
    • 1x shields para wemos D1 mini neopixel o equivalente
    • 1x shields para wemos D1 mini oled o equivalente
    • 1x shields para wemos D1 mini temperatura (puede ser DHT o
    • de temperatura) o equivalente
    • 1 x Cable USB para programar Wemos

Si el alumno tiene algún HW con que quiera interactuar, puede presentarlo y lo integramos en las prácticas. El HW puede estar tanto en el aula como remotamente en su casa, oficina, etc…

Servicios Cloud para el Curso

Se usará un broker común para comunicar todos los dispositivos: mqtts://aprendiendonodered.com:8883

Los alumnos recibirán usuario y contraseña para acceder al broker con permisos de lectura y escritura en smartcities/#

Base de datos MySQL en https://enriquecrespo.com/phpmyadmin/ donde los alumnos podrán usar para almacenar datos. Los alumnos recibirán las credenciales de acceso.

Base de datos InfluxDB en https://enriquecrespo.com:8086/ donde los alumnos podrán usar para almacenar datos. Los alumnos recibirán las credenciales de acceso.

Grafana en https://enriquecrespo.com:3000/ para representar gráficamente los datos. Recibirán por correo las credenciales de acceso.

Otros servicios programados con Node-RED en aprendiendonodered.com: API, Open Data, servidor FTP, gateway servicios de terceros, simulación de datos, etc… y servicios self hosted (gotify, thingsboard, thinger.io, etc…)

Interacción con servicios cloud de terceros como: APIs, Open Data, Cámaras/Imágenes, Plataformas IoT, Redes Sociales, Servicios de Mensajería, Servicios de alertas, email, etc…

Topología de Prácticas

Programación Básica Python

Introducción a Python

Python es un lenguaje interpretado, es decir, no requiere del proceso de escribir / compilar / volcar. Simplemente escribir la instrucción y listo el ordenador la “interpreta” o sea ejecuta sobre la marcha sin más complicación.

Python también es:

Esto hace que los lenguajes interpretados sean más fáciles de aprender porque nos parecen más naturales, y aunque el programa corre más lento que en los compilados, pero con la potencia actual no es tan importante.

Python es un lenguaje diseñado para ser fácil sin comprometer su potencia. Muy al contrario, la potencia y capacidad de cálculo que muestra suelen sorprender a la gente acostumbrada a otros lenguajes.

Para quienes vengáis de Arduino, C++ es un lenguaje compilado, esto significa que el compilador lee lo escrito en una primera pasada y después compila, es decir traduce a un lenguaje propio del micro de Arduino qué es lo que se vuelca y ejecuta la placa que usemos.

Hay dos versiones de Python 2 y 3, pero la versión 2 ya no tiene soporte desde el 1 de enero de 2020. En Raspberry Pi OS viene instalada la versión 3 de Python.

Para comprobar que tenemos python instalado ejecutar: python –version

Para iniciar python se puede hacer desde consola: python

O usar el entorno gráfico con IDLE. IDLE significa Integrated Development Environment, o Integrated Development and Learning Environment.

Para instalarlo ejecutar: sudo apt-get install idle3

Dentro de la consola ya es posible ejecutar comandos.

Otra opción es usar el Thonny Python IDE incluido en Raspbian: https://thonny.org/

Práctica: Ejecutar los comandos directamente en el terminal de Python

  • 3.8 + 7
  • 2 * (3+5) / 4
  • «Hola»
  • x=3
  • H=»Buenos dias»
  • print(x)
  • print(h)
  • print(H)
  • print(x,H)
  • 123 ** 1234

Python puede con grandes números mientras le quede memoria RAM, pero tu Raspberry puede quedarse un tanto bloqueada mientras calcula.

El resumen es que Python tiene una precisión ilimitadamente grande en los enteros mientras tenga recursos disponibles, un detalle sorprendente para cualquiera que esté acostumbrado a programar en otros lenguajes, y una de las razones por las que Python se ha convertido en lenguaje de facto para la ciencia y especialmente para la investigaciones numéricas.

Más información: Introducción a Python.

Ejecutar un Script de Python en Raspberry Pi

Pasos:

  • Abre el terminal o conecta por SSH
  • nano holamundo.py
  • Escribe en el fichero
#!/usr/bin/python
# -*- encoding: utf-8 -*-
print (“Hola Mundo”)
  • ctrl + o y ctrl + x para guardar y salir
  • Ejecutar con python holamundo.py
  • chmod u+x holamundo.py
  • ./holamundo.py (Hecho el fichero ejecutable)

Práctica: crear un fichero llamado hello.py que saque por pantalla el texto “Hola Mundo” desde consola conectado por ssh y ejecutarlo.

Variables y Tipos de Datos en Python

Una variable es algo parecido a un contenedor o cajón con un nombre. Una cosa es el nombre del cajón y otra su contenido y conviene entender desde ya la diferencia.

Las variables pueden tomar distintos valores e ir cambiandolo en función del programa, de la misma manera que un cajón puede ir variando su contenido sin que se mueva de sitio.

En Python no es necesario definir las variables antes de usarlas, a diferencia de C y similares. Basta con que la declares asignándole un valor.

Por ejemplo escribe directamente:

  • base = 86
  • iva = base * 0.21
  • total = base + iva
  • print (total)
  • print(base, iva, total)
  • base = input («Dame el precio del artículo, por favor : «)
  • print(base + base * 0.21)
  • type(base)
  • print (int(base) + int(base) * 0.21)
  • iva = float(base) * 0.21
  • print (int(base) +iva)

Práctica: Hacer un programa llamado iva.py y que pida el valor del artículo y devuelva el valor con iva.

Más información: Variables y tipos en Python.

En Python existen 4 tipos diferentes de variables numéricas:

  • int Número entero con precisión fija (ℤ).
  • long Número entero en caso de sobrepasar el tamaño de un int.
  • float Número en coma flotante de doble precisión (ℝ).
  • complex Número complejo (parte real + j parte imaginaria) (ℂ)

Una función muy útil, que sirve para conocer el tipo de una variable es: type()

El tipo booleano es un tipo de variable que sólo puede contener dos valores: True y False.

Se definen como caracteres al poner entre comillas simples ‘ o dobles «.

Tipo listas

Se definen poniendo el contenido de la lista entre corchetes, separando cada uno de los elementos mediante una coma. Cada posición de la lista puede contener elementos de distinto tipo. Además, las listas son mutables, es decir, sus elementos pueden ser modificados. En Python los elementos de una lista se numeran desde 0 hasta longitud−1. Hay numerosas funciones que pueden aplicarse a una lista.

Para acceder al elemento de una lista se pone el nombre de la lista y a continuación el índice al que queremos acceder entre corchetes(si ponemos el índice con signo negativo empezará por el final de la lista). Para acceder a un rango dentro de una lista tenemos diferentes opciones:

  • Desde el inicio tomar a elementos (no incluye a):
    lista[:a]
  • Desde la posición a (incluida) tomar todos los elementos hasta el final
    lista[a:]
  • Tomar los elementos desde a hasta b (sin incluir b)
    lista[a:b]

Las listas tienen asociadas una serie de métodos que permiten una gran variedad de operaciones sobre ellas:

  • .append(), añade un elemento al final de la lista.
  • .insert(), se usa para insertar un elemento en el índice asignado.
  • .pop(), elimina y devuelve el valor en la posición del índice asignado.
  • .reverse(), reordena la lista de forma reversa.
  • .sort(), reordena la lista de forma ascendente.

Más en listas: https://docs.python.org/3/tutorial/datastructures.html#more-on-lists

Ejercicio: probar estos ejemplos de listas https://docs.python.org/3/tutorial/datastructures.html#more-on-lists

Tipo tuplas

Las tuplas son similares a las listas, se definen con paréntesis en vez de corchetes. Tienen la peculiaridad de ser inmutables.

Tipo diccionarios

Los diccionarios definen una relación uno a uno entre claves y valores y son mutables. Se definen colocando una lista separada por comas de pares clave:valor. Una vez definido, podemos acceder al valor asociado a una clave buscando por la clave. Además, podemos buscar si una determinada clave existe o no en nuestro diccionario.

Los diccionarios se definen con {}

  • .keys()
  • .values()
  • .items() – devuelve una lista de tuplas clave – valor del diccionario

zip me permite coger dos listas y hacer un diccionario: diccionario = dict(zip(lista_claves,lista_valores))

del(diccionario[‘clave’]) – borra la entrada de un diccionario

Ojo, al copiar un diccionario con ciudades_2 = ciudades, no creo una copia sino dos variables que apuntan a un mismo objeto.

id(diccionario) – me devuelve el número del puntero al diccionario

ciudades_2 = ciudades.copy() -> así tengo una copia independiente de un diccionario

Diccionarios en python: https://devcode.la/tutoriales/diccionarios-en-python/

Ejercicio: ejecutar algunos ejemplos con diccionarios https://recursospython.com/guias-y-manuales/diccionarios/

Ver:

Operadores aritméticos

Las diferentes operaciones aritméticas en Python son los siguientes:

  • +
  • ∗∗  – elevado
  • / – división entera
  • // – división
  • %

Operadores de asignación

Los diferentes operadores de asignación en Python son los siguientes:

  • =: Asigna a la variable del lado derecho aquello que pongamos en el lado derecho.
  • +=: Suma a la variable del lado izquierdo la variable del lado derecho.
  • −=: Resta a la variable del lado izquierdo la variable del lado derecho.
  • ∗=: Multiplica la variable del lado izquierdo por la variable del lado derecho.
  • /=: Divide la variable del lado izquierdo por la variable del lado derecho.
  • ∗∗=: Eleva la variable de la izquierda a la potencia de la variable de la derecha.
  • //=: División entera de la variable de la izquierda entre la de la derecha.
  • %=: Resto de la división de la variable de la izquierda entre la de la derecha.

Operadores relacionales

Los operadores relacionales de Python son:

  • ==: Evalúa que los valores sean iguales.
  • !=: Evalúa que los valores sean distintos.
  • <: Evalúa que el valor de la izquierda sea menor que el de la derecha.
  • >: Evalúa que el valor de la izquierda sea mayor que el de la derecha.
  • <=: Evalúa que el valor de la izquierda sea menor o igual que el de la derecha.
  • >=: Evalúa que el valor de la izquierda sea mayor o igual que el de la derecha.
  • not: negación de una variable booleana

Librerías

Python es un lenguaje pensado para ser ampliado con lo necesario y hace tiempo que se ha convertido en el pilar de la investigación en numerosos campos de ciencia y tecnología

pip es el gestor de paquetes más usado en python: https://pypi.org/project/pip/ 

La forma más sencilla de instalar una librería es pip install <module_name>

Disponemos de infinidad de librerías que podemos usar llamando a la clausula import <module_name>

La librería estándar de python incluye muchos módulos: https://docs.python.org/dev/library/index.html

Ejecutar:

  • from fractions import *
  • F1 = Fraction(2,3)
  • F2 = Fraction(3,4
  • print(F1, F2)
  • print (F1 + F2)
  • print (F1 * F2)
  • print (F1 / F2)
  • import math
  • math.factorial(4)
  • math.factorial(432)
  • import numpy
  • a = numpy.array(([1,2,3],[4,5,6],[7,8,9]))
  • print (a)
  • print (a * a)
  • from matplotlib import pyplot
  • pip install matplot lib
  • x = numpy.linspace(0, 2 * numpy.pi, 100)
  • y = numpy.sin(x)
  • pyplot.plot(x, y)
  • pyplot.show()

NumPy es una extensión de Python, que le agrega mayor soporte para vectores y matrices, constituyendo una biblioteca de funciones matemáticas de alto nivel para operar con esos vectores o matrices.

Estos módulos externos que podemos descargar e importar a nuestros programas reciben en Python el nombre de packages. Existen packages que podemos importar, más o menos estándar para lo que se te ocurra.

Python Package Index: https://pypi.org/

Más información: Imports en Python

Módulos en Python: http://research.iac.es/sieinvens/python-course/source/modulos.html

Módulos y paquetes: https://www.learnpython.org/en/Modules_and_Packages 

Diferencia entre módulos, Paquetes y librerías

Standar Library: https://docs.python.org/3/library/ 

Métodos de instalación de Paquetes:

Como instalar y usar pip: https://pip.pypa.io/en/latest/installing.html

Por defecto estos gestores de paquetes buscan en https://pypi.org/

El Python Package Index o PyPI es el repositorio de software oficial para aplicaciones de terceros en el lenguaje de programación Python. Los desarrolladores de Python pretenden que sea un catálogo exhaustivo de todos los paquetes de Python escritos en código abierto. https://es.wikipedia.org/wiki/%C3%8Dndice_de_paquetes_de_Python

Para ver la ruta de los paquetes:

  • import sys
  • print (‘\n’.join(sys.path))

Para ver los módulos instalados: pip freeze o pip list

Para actualizar ejecutar: pip install –upgrade pip

Instalar paquetes de Python: https://www.raspberrypi.org/documentation/linux/software/python.md

Sentencias condicionales

Imaginemos que queremos crear un sistema automático de riego en nuestra casa, de forma que cuando la lectura de un sensor de humedad sea menor que un cierto valor, encienda el sistema y que si la lectura es mayor que un cierto valor, lo apague. Con las herramientas que tenemos hasta ahora, esto no sería posible, para esto utilizamos la sentencia if/elif/else, que tiene la siguiente estructura:

if <expresion_booleana>:   # Solo si la condicion booleana es True, 
    bloque codigo          # el bloque de código se ejecuta
    ...
elif <expresion_booleana>: # No es necesario, añade condiciones extra al conjunto.
    bloque codigo          # Se puede poner tantas como se necesiten.
    ...
else:                      # No se necesario. Se ejecuta solo si
    bloque codigo          # todas las condiciones anteriores son falsas.         
    ...

Nota: Es importante saber la importancia de la indentación en Python. Cuando usemos sentencias que acaben en «:» (if, for…) las líneas que estén dentro de esta sentencia irán después de un tabulador o 4 espacios, como se muestra en los ejemplos.

Ejemplo:

num = float(input("Enter a number: "))
if num >= 0:
    if num == 0:
        print("Zero")
    else:
        print("Positive number")
else:
    print("Negative number")

Más información: El tipo Bool y sus operaciones.

Sentencias bucle

Anteriormente hemos visto el tipo de variable lista. Estas contenían una cierta cantidad de elementos. Imaginemos que tenemos una lista de enteros y queremos mostrar por pantalla los elementos que contiene que sean mayores que 5. Para esto, entre otras cosas, tenemos sentencias bucle.

En Python existen dos tipos estructuras de bucles:

  • Bucles for
  • Bucles while

La sintaxis de un bucle for es:

for <variable_sin_definir> in <Iterable>: # El bloque se ejecuta tantas veces 
    bloque codigo                         # como elementos tiene el iterable
    ...

El bucle ejecuta un bloque de código tantas veces como esté definido. El número de veces que se recorre el bucle es equivalente al número de elementos en el iterable que se usa. La variable que se usa toma como valores los elementos del iterable de forma secuencial, un valor por cada iteración.

Los bucles for son una gran herramienta para recorrer todos los elementos de una colección.

Ejemplo:

fruits = ["apple", "banana", "cherry"]
for x in fruits:
  print(x)

Ejemplo:

for x in range(6):
  print(x)
else:
  print("Finally finished!")

La sintaxis de los bucles while es:

while <condicion_boolena>:   # El bloque se ejecuta hasta que la condición es falsa.
    bloque codigo            # Antes de ejecutar asegurarse que se va a salir.
    ...

El bucle while se ejecuta de forma indefinida hasta que la condición después del while sea falsa. Por lo tanto es necesario realizar un cambio dentro del bucle que finalmente hará que se vuelva la condición False.

Adicionalmente existen un par de comandos dentro de Python que sirven para tener más control sobre los bucles:

  • continue. El intérprete cuando lo lee termina de ejecutar la presente iteración y pasa a la siguiente iteración.
  • break . El intérprete cuando lo lee termina la ejecución del bucle, continuando la ejecución de las siguientes líneas.

Ejemplo:

i = 1
while i < 6:
  print(i)
  if i == 3:
    break
  i += 1

Más información: Mas sobre Python for y While.

Iteradores

En Python existen diferentes estructuras que son conjuntos de elementos, son las llamadas colecciones. Este tipo de estructuras son iterables, es decir, se pueden recorrer elemento por elemento. Como veíamos antes, el bucle for itera sobre un iterable, por lo que utilizamos esta sentencia para recorrerlos. Algunos tipos de variable que son iterables son:

  • Cadena de caracteres (str)
  • Lista (list)
  • Tupla (tuple)
  • Diccionario (dict)

Además, muchas veces queremos repetir un bucle un número determinado de veces. Para esto puede ser útil la función range(n). Esta función genera un iterable que va desde 0 hasta n-1.

Más información:Iteraciones for en Python 3.

Funciones

Es muy posible que a lo largo de un programa necesitemos calcular el factorial de un número. Podemos escribir el código necesario para calcularlo en cada punto que lo necesitamos, o crear una función que podamos llamar desde cualquier punto y nos calcule el factorial de un número. 

La sintaxis para definir una función en Python es la siguiente:

def nombre_funcion(<parametro1>, <parametro2>, ...): # Los parametros son opcionales
    Bloque codigo
    ...
    return <valor_a_devolver> # El comando es opcional (puede devolver varios valores)

Los parámetros son las variables que se definen dentro del paréntesis, separados por comas. Son opcionales y sirven para pasarle valores a la función. Son opcionales una vez definimos la función, pero si la función está definida con n argumentos, tendremos que informarlos.

Adicionalmente puede introducirse una sentencia return que termina la ejecución de la función y devuelve el valor/objeto que está colocado justo después.

Los nombres de las funciones sigue el mismo convenio que el de las variables.

Para llamar a una función, como hemos visto antes, tenemos que escribir el nombre de la función y añadir entre paréntesis los argumentos que la funció necesita. Aunque la función no necesite argumentos, tenemos que escribir los paréntesis.

Ejemplo:

def escribe_media(x, y):
    media = (x + y) / 2
    print(f"La media de {x} y {y} es: {media}")
    return

a = 3
b = 5
escribe_media(a, b)
print("Programa terminado")

Código de python (ejemplos y snippets):

Ayuda de Paquetes y Módulos

Se usa la instrucción help() para obtener los documentos sobre todas las funciones a la vez:

  • import requests
  • help(requests)
  • help(requests.api)

Para simplemente enumerar los nombres de todas las funciones y variables definidas en el módulo: dir(module)

Ejemplos de Python aplicados a la Industria

Ejemplos:

Ejercicio: Recoger datos meteorológicos de aemet

Aemet Open data: http://www.aemet.es/es/datos_abiertos/AEMET_OpenData

Obtener Api Key, necesario un email: https://opendata.aemet.es/centrodedescargas/inicio

Documentación de la API: https://opendata.aemet.es/dist/index.html?

Ejemplo programa Python: https://opendata.aemet.es/centrodedescargas/ejemProgramas?

Crear un ejemplo usando la librería requests: https://pypi.org/project/requests/ y ejecutar para obtener datos de La Rioja.

Instalar librería requests: pip install requests

Crear un nuevo fichero llamado aemet.py en la carpeta /home/pi/ejercicios: nano aemet1.py

Copiar el código del ejercicio poniendo la API key de la AEMET: https://github.com/jecrespo/Aprendiendo-RaspberryPi/blob/master/Ejercicio03-Aemet/aemet.py

Ejecutar con python aemet1.py:

  • Listado de las estaciones de aemet
  • Listado de estaciones en La Rioja
  • Datos históricos diarios de la estación de La Rioja de los últimos 7 días

Librería python-aemet que nos facilita el trabajo: https://pypi.org/project/python-aemet/

No hay librería de AEMET en Node-RED, pero podemos hacer las peticiones a la web como se ha hecho en Python.

Instalar: pip install python-aemet

Crear el fichero aemet2.py: nano aemet2.py

Copiar el código:

from aemet import Aemet

aemet = Aemet('apy key')
observaciones = aemet.get_observacion_convencional('9170')  # Logroño
assert type(observaciones) is list

for observacion in observaciones:
    print(observacion.__dict__)

Ejecutar con: python aemet2.py

  • Obtener las últimas observaciones de la estación meteorológica de La Rioja

Todos los métodos disponibles: 

Paso a Paso: Instalación Servicios Raspberry Pi

Webmin

Webmin es una herramienta de configuración de sistemas accesible vía web para sistemas Unix, como GNU/Linux y OpenSolaris. Con él se pueden configurar aspectos internos de muchos sistemas operativos, como usuarios, cuotas de espacio, servicios, archivos de configuración, apagado del equipo, etcétera, así como modificar y controlar muchas aplicaciones libres, como el servidor web Apache, PHP, MySQL, DNS, Samba, DHCP, entre otros.

Instalar con apt desde el repositorio de webmin. Comandos: 

sudo sh -c 'echo "deb http://download.webmin.com/download/repository sarge contrib" > /etc/apt/sources.list.d/webmin.list'

cd /home/pi
wget https://download.webmin.com/jcameron-key.asc
sudo cat jcameron-key.asc | gpg --dearmor >jcameron-key.gpg
sudo cp jcameron-key.gpg /etc/apt/trusted.gpg.d
rm jcameron-key.*
sudo apt-get install apt-transport-https
sudo apt update
sudo apt install webmin
sudo /etc/webmin/start
sudo systemctl enable webmin 

Para comprobar que se ha instalado acceder desde un navegador a https://ip_address:10000

Navegar por las opciones de webmin y hacer:

  • Ver recursos usados
  • Ver procesos ejecutándose
  • Ver los cron jobs configurados
  • Ver los logs
  • Ver los usuarios y grupos
  • Ver los servidores instalados
  • Ver la configuración de red

Node-RED

Ejecutar el comando para instalar y actualizar: bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

Pulsar “y” a las preguntas en la instalación.

Para ejecutar Node-RED en el arranque: sudo systemctl enable nodered.service

Para iniciar el servicio: sudo systemctl start nodered.service

En caso de problemas ver el log con: node-red-log

Una vez instalado entrar en http://ip_address:1880

Navegar por Node-RED y poner el nodo inject y debug, unirlos y hacer deploy. Visualizar la pestaña de debug al pulsar sobre el nodo inject.

Añadir un nodo función y poner este código javascript:

// Create a Date object from the payload
var date = new Date(msg.payload);
// Change the payload to be a formatted Date string
msg.payload = date.toString();
// Return the message so it can be sent on
return msg;

Ahora se ve la fecha en un formato legible para humanos.

Instalar la librería moment https://flows.nodered.org/node/node-red-contrib-moment desde el gestor de paletas y sustituir el nodo función por un nodo moment.

First flow: https://nodered.org/docs/tutorials/first-flow 

SQLite

Instalar SQLite:

  • sudo apt update
  • sudo apt install sqlite3

Instalar SQLite Browser:

  • sudo apt update
  • sudo apt install sqlitebrowser

Usaremos SQLite como BBDD local y luego pasar datos a una BBD cloud. Así disponemos de un sistema de almacenamiento local en lugar de una BBDD más compleja o un fichero en local en un formato como json, que es más simple y menos funcional.

Crear una nueva base de datos desde sqlitebrowser llamada datosxx.db en /home/pi/BBDD, siendo xx el número de las Raspberry Pi asignada.

Mediante comandos ejecutar:

  • cd /home/pi
  • mkdir BBDD
  • cd BBDD
  • sqlite3 datosxx.db
$sqlite3 datos15.db
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

Crear una tabla llamada datos_aleatorios con tres campos, tal y como muestra la imagen:

  • id (Clave primaria, autoincremento, único)
  • fecha (tipo texto)
  • dato (tipo texto)

Desde la hoja de datos probar a insertar algunos datos

Mediante comandos ejecutar desde la consola de SQLite:

CREATE TABLE "datos_aleatorios" ( "id" INTEGER UNIQUE, "fecha" TEXT, "dato" TEXT, PRIMARY KEY("id" AUTOINCREMENT) );

Comandos SQLite

  • .help – ayuda
  • .database – listas nombres y ficheros de las bases de datos
  • .exit – salir
  • .tables – muestra las tablas
  • CLI sqlite: https://www.sqlite.org/cli.html

Si queremos usar un interfaz web sencillo para visualizar y hacer operaciones sencillas usar: https://github.com/coleifer/sqlite-web 

Para instalar ejecutar los comandos:

  • sudo pip install sqlite-web
  • sqlite_web –host 0.0.0.0 prueba.db 

Insertar Datos Aleatorios desde Node-RED

Conectarse a Node-RED: http://ip_address:1880

Copiar este texto y pegar en Node-RED en Menú – Import – Clipboard

[{"id":"35d3814e6567ee71","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"cf5e958c1024f743","type":"sqlite","z":"35d3814e6567ee71","mydb":"2542c44b886edf9f","sqlquery":"msg.topic","sql":"","name":"","x":600,"y":100,"wires":[["1be92c5ab1762656"]]},{"id":"e760762917e72c6d","type":"inject","z":"35d3814e6567ee71","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"15","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":190,"y":100,"wires":[["09e0bc6424dbe364"]]},{"id":"09e0bc6424dbe364","type":"change","z":"35d3814e6567ee71","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"\"INSERT INTO datos_aleatorios ('fecha','dato') VALUES ('\"&$now('[M01]/[D01]/[Y0001] [H01]:[m01]:[s01]','+0200')&\"','\"&$random()&\"')\"","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":100,"wires":[["cf5e958c1024f743"]]},{"id":"1be92c5ab1762656","type":"debug","z":"35d3814e6567ee71","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":590,"y":200,"wires":[]},{"id":"2542c44b886edf9f","type":"sqlitedb","db":"/home/pi/BBDD/datos15.db","mode":"RWC"}]

Y pulsar en Deploy para cargar el flujo.

Resolver los errores, revisar los nodos del flujo creado.

  • Instalar la librería node-red-node-sqlite desde el menú Manage palette
  • Poner la ruta al fichero que contiene la base de datos

Este flujo inserta cada 15 segundos un dato aleatorio en la tabla de la base de datos creada.

Comprobar que graba los datos aleatorios en la BBDD recién creada.

Ver este ejemplo de uso básico de SQL, importar el código y ejecutarlo: https://flows.nodered.org/flow/b44c896fb2d16c6920e3a70861fe06ac