Archivo de la categoría: Curso IoT Open Source

Proyecto Final IoT con Node-RED

Descripción del Proyecto

Proyecto final full stack IoT con Node-RED aplicando los conceptos vistos.

Repositorio: https://github.com/jecrespo/proyecto-fundamentos-iot 

Material del Proyecto

M5stack: https://m5stack.com/collections/m5-core/products/basic-core-iot-development-kit 

M5Stick-C con sensor ENV:

Raspberry Pi Zero: Instalada en local con cámara y programada con Node-RED, usada como dispositivo remoto.

Raspberry Pi 3B+: Instalada en local con Node-RED, Mosquitto y BBDD, usada como servidor.

Wibeee instalado y publicando datos.

Wibeee ONE 2W

Si el alumno tiene algún HW con que quiera interactuar, puede presentarlo y lo integramos en las prácticas.

Esquema del Proyecto

Topología del proyecto IoT:

Datos Disponibles

Topic Map Nodo00 (Enrique):

  • educantabria/nodo00/wemos1/dato10s – publica mensaje numerado cada 10s
  • educantabria/nodo00/wemos1/dato60s – publica mensaje numerado cada 60s
  • educantabria/nodo00/wemos1/reset – publica mensaje cada reset o inicio
  • educantabria/nodo00/wemos1/led – suscrito (1 led ON, otro valor  led OFF)
  • educantabria/nodo00/wemos1/text – suscrito (muestra el mensaje por pantalla)
  • educantabria/nodo00/wemos1/rele – suscrito (1 relé ON, otro valor  relé OFF). Con firmware relé
  • educantabria/nodo00/wemos2/dato10s – publica mensaje numerado cada 10s
  • educantabria/nodo00/wemos2/dato60s – publica mensaje numerado cada 60s
  • educantabria/nodo00/wemos2/reset – publica mensaje cada reset o inicio
  • educantabria/nodo00/wemos2/led – suscrito (1 led ON, otro valor  led OFF)
  • educantabria/nodo00/wemos2/text – suscrito (muestra el mensaje por pantalla)
  • educantabria/nodo00/wemos2/temperatura – publica dato temperatura cada 10 segundos. Con firmware DS18B20
  • educantabria/nodo00/wibeee/# – datos eléctricos de Wibeee. Varios parámetros.
  • educantabria/nodo00/m5atom/aviso – suscrito (“alarma” – leds rojos, “aviso” – leds amarillos, “ok” – leds verdes, otro mensaje apaga)
  • educantabria/nodo00/m5atom/boton – al pulsar publica “press” o “longpress”
  • educantabria/nodo00/m5stack/boton/A – al pulsar botón A publica “press”
  • educantabria/nodo00/m5stack/boton/B – al pulsar botón B publica “press” 
  • educantabria/nodo00/m5stack/boton/C – al pulsar botón C publica “press”
  • educantabria/nodo00/m5stack/led – suscrito (1 dibuja en pantalla círculo rojo, otro valor  dibuja en pantalla círculo verde)
  • educantabria/nodo00/m5stack/text – suscrito, muestra por pantalla el texto
  • educantabria/nodo00/m5stick/temperatura – publica dato temperatura cada 1 segundo
  • educantabria/nodo00/m5stick/humedad – publica dato humedad cada 1 segundo
  • educantabria/nodo00/m5stick/presion – publica dato presión cada 1 segundo
  • educantabria/nodo00/m5stickplus/distancia – publica dato distancia cuando se activa
  • educantabria/nodo00/m5stickplus/button – al pulsar botón publica “press”
  • educantabria/nodo00/m5stickplus/led – suscrito (1 led ON, otro valor  led OFF)
  • educantabria/nodo00/m5stickplus/label  – suscrito (“red” – circulo rojo, “yellow” – circulo amarillo, “green” – circulo verde, “black” – círculo verde)
  • educantabria/nodo00/raspberry3/CPU – publica Node-RED el datos de CPU 
  • educantabria/nodo00/raspberry3/Temperatura – publica Node-RED el datos de temperatura procesador
  • educantabria/nodo00/raspberry3/Memoria – publica Node-RED el datos de memoria libre
  • educantabria/nodo00/raspberry3/Dashboard/# – publica Node-RED cualquier dato del Dasboard
  • educantabria/nodo00/raspberry3/Datos/# – suscrito Node-RED para recibir cualquier dato externo
  • educantabria/nodo00/raspberry3TT/CPU – publica Node-RED el datos de CPU 
  • educantabria/nodo00/raspberry3TT/Temperatura – publica Node-RED el datos de temperatura procesador
  • educantabria/nodo00/raspberry3TT/Memoria – publica Node-RED el datos de memoria libre
  • educantabria/nodo00/raspberry3TT/Dashboard/# – publica Node-RED cualquier dato del Dasboard
  • educantabria/nodo00/raspberry3TT/Datos/# – suscrito Node-RED para recibir cualquier dato externo
  • educantabria/nodo00/raspberryzero/tomafotomqtt – suscrito Node-RED un valor cualquiera enviado, toma una foto y publica en el topic educantabria/nodo00/raspberryzero/foto en baja resolución.
  • educantabria/nodo00/raspberryzero/foto – publica Node-RED una foto al mandar cualquier dato en el topic educantabria/nodo00/raspberryzero/tomafotomqtt 
  • educantabria/nodo00/raspberryzero/tomafotoweb suscrito Node-RED un valor cualquiera enviado, toma una foto y la actualiza en https://www.aprendiendoarduino.com/servicios/imagen.jpg en alta resolución

Topic Map Alumnos Nodoxx:

  • educantabria/nodo{xx}/wemos{y}/dato10s – publica mensaje numerado cada 10s
  • educantabria/nodo{xx}/wemos{y}/dato60s – publica mensaje numerado cada 60s
  • educantabria/nodo{xx}/wemos{y}/reset – publica mensaje cada reset o inicio
  • educantabria/nodo{xx}/wemos{y}/led – suscrito (1 led ON, otro valor  led OFF)
  • educantabria/nodo{xx}/wemos{y}/text – suscrito (muestra el mensaje por pantalla)
  • educantabria/nodo{xx}/wemos{y}/rele – suscrito (1 relé ON, otro valor  relé OFF). Con firmware relé
  • educantabria/nodo{xx}/wemos{y}/oled – suscrito (muestra el mensaje por pantalla oled). Con firmware oled
  • educantabria/nodo{xx}/wemos{y}/temperatura – publica dato temperatura cada 10 segundos. Con firmware DS18B20
  • educantabria/nodo{xx}/wemos{y}/matrix – suscrito (0 efecto y apaga, de 1 a 8 ilumina de 1 a 8 líneas de matriz). Con firmware matrix.
  • educantabria/nodo{xx}/raspberry{y}/CPU – publica Node-RED el datos de CPU 
  • educantabria/nodo{xx}/raspberry{y}/Temperatura – publica Node-RED el datos de temperatura procesador
  • educantabria/nodo{xx}/raspberry{y}/Memoria – publica Node-RED el datos de memoria libre
  • educantabria/nodo{xx}/raspberry{y}/Dashboard/# – publica Node-RED cualquier dato del Dasboard
  • educantabria/nodo{xx}/raspberry{y}/Datos/# – suscrito Node-RED para recibir cualquier dato externo

{xx} número de alumno

{y} número de sensor

AlumnoNº Nodo
SERGIO A.nodo01
Alberto B.nodo02
Pablo C.nodo03
Soraya C.nodo03
isaías C.nodo04
Mª del Mar E.nodo05
Santiago F.nodo06
José Ángel G.nodo07
Oscar G.nodo08
MARCOS G.nodo09
Jose Luis G.nodo10
Evelio H.nodo11
Roberto I.nodo12
RAMON L.nodo13
Eduardo P.nodo14
FRANCISCO JAVIER R.nodo15
Sara T.nodo16

Tareas del Proyecto

Fase 1 – Monitorización Local

Instalar nodo con todo el SW:

Instalar los sensores en la ubicación.

Fase 2 – Conectar a la Nube

Conectar sensores:

Fase 3 – Automatizar

Configurar y securizar Node-RED: 

Programar Node-RED y MQTT:

Fase 4 – Integración con Terceros

Integración de datos con terceros:

¿Qué es IoT?

Internet de las cosas (en inglés Internet of things, abreviado IoT) es un concepto que se refiere a la interconexión digital de objetos cotidianos con Internet. En el caso que queramos interconectar los elementos de una empresa o una Industria es lo que se denomina IIOT (Industrial Internet of Things) o Industria 4.0

Definición de wikipedia:

¿Qués Internet de las Cosas?: http://www.ticbeat.com/tecnologias/que-es-el-internet-de-las-cosas/

Arduino y Raspberry Pi son dos elementos muy populares y abiertos que nos permiten de forma sencilla y económica conectar cualquier cosa a Internet. Con un Arduino y un sencillo módulo ethernet o wifi podemos conectar a Internet sensores para informar, controlar motores o bombillas desde cualquier parte del mundo o mandar un SMS o email cada vez que se abra la puerta de casa. Con una Raspberry Pi disponemos de un ordenador de bolsillo fácilmente conectable a Internet y que puede ejecutar tareas automatizadas, almacenar datos, mostrar información o hacer de pasarela para conectarnos a otras ubicaciones o dispositivos remotos.

Arduino y Raspberry Pi se han convertido en unas figuras destacadas e incluso unos de los impulsores del IoT y no por casualidad, sino que  por sus características son HW con gran capacidad para usar en proyectos de IoT.

Características de Arduino y Raspberry Pi para IoT

  • Barato y rápido prototipado.
  • HW libre y por lo tanto es modificable para que consuma menos y para hacer un HW final de características industriales.
  • Disponibilidad de HW de comunicaciones de todo tipo para conectar con Arduino. Nuevas tecnologías de comunicación llegan antes que para elementos comerciales
  • Librerías y SW públicos para su reutilización o adaptación.
  • Flexibilidad en la programación.
  • Apoyo de la comunidad.

Intersante web con publicaciones sobre IoT: https://iot-analytics.com/ 

Como afecta IoT a nuestro dia a dia: http://socialgeek.co/tecnologia/8-formas-que-the-internet-of-things-impactara-dia-dia

IoT en 5 minutos con Arduino: http://hackaday.com/2016/01/08/internet-of-things-in-five-minutes/ 

Aplicaciones de IoT: https://temboo.com/iot-applications 

7 Lecciones sobre IoT: https://www.greenbiz.com/article/7-essential-lessons-about-internet-things

IoT vs M2M

Una visión del IoT aplicado a la industria es lo denominado como Industria 4.0 o Industria conectada o IIoT que deriva del concepto de M2M (machine to machine) que se refiere al intercambio de información o comunicación en formato de datos entre dos máquinas remotas sin necesidad de conexión a Internet sino que puede ser en una red privada y crear una industria inteligente donde todos los elementos están interconectados y comparten los datos.

Definiciones de wikipedia:

Diferencias entre IoT y M2M: https://www.pubnub.com/blog/2015-01-02-iot-vs-m2m-understanding-difference/

El coche autónomo, en el que trabajan grupos como Google, BMW, Volvo o Tesla, es toda una proeza de la robótica.La conducción autónoma se basa en las comunicaciones máquina a máquina (M2M), por las que los vehículos pueden intercomunicarse con las señales, los semáforos y los otros automóviles. Todo esto también tiene mucho que ver con las smart cities. 

http://www.dr4ward.com/.a/6a00e54fd9f059883301a73dc37274970d-800wi

Interesantes artículos de Basic IoT:

Reflexiones de David Cuartielles sobre IoT en base a un paper de IBM: https://vimeo.com/299112221 

Ontología IoT https://www.w3.org/Submission/2015/SUBM-iot-lite-20151126/

Empresas en el Mercado IoT

El artículo de Matt Turck hace un buen desglose de IoT https://mattturck.com/iot2018/, que resume en esta imagen:

Imagen completa: link

Listado de compañías IoT: http://dfkoz.com/iot-landscape/

Divide los mercados o aplicaciones verticales en:

  • Personal
  • Home
  • Vehículos
  • Empresa
  • Industria

Divide las Plataformas Horizontales en:

  • Software
  • Seguridad
  • Conectividad
  • Analítica
  • Desarrollo
  • Pagos
  • Interfaces
  • 3D

Y los Building Blocks de IoT los divide en:

  • Hardware
  • Infraestructura
  • Conectividad
  • Partners

Más información: https://mattturck.com/iot2018/

Mercados Verticales IoT

La Internet de los objetos está unificada por un principio común (extracción y análisis de datos digitales del mundo físico), así como por características comunes (combinación de hardware y software), oportunidades (personalización e inteligencia, servicios en tiempo real) y retos (conectividad, seguridad, etc.).  Más allá de estas, sin embargo, áreas tan diversas como la domótica, los aviones no tripulados comerciales, la maquinaria industrial o los coches autónomos están sujetos a dinámicas industriales muy diferentes.

En este curso vamos a ver IoT desde un punto general para poder ser aplicable en cualquier sector, pero cuando se va a acometer un proyecto IoT suele ser adecuado hacer un enfoque vertical en función del sector en el que se vaya a aplicar puesto que cada sector tienen unas características concretas.

Conceptos como Industria 4.0, Smart Cities, Agricultura 2.0, Smart Home, Smart factory, etc… al final son etiquetas y en lugar de especializarse en áreas tecnológicas como sensores, comunicaciones, protocolos, sistemas, etc… pensamos como especialistas de sectores porque un mismo concepto como el de IoT se puede aplicar a muchos sectores de de una forma distinta.

El vino y el IoT http://www.elmundo.es/economia/2016/11/03/5819d37346163f9c528b45c9.html

Visión horizontal IoT

Algunos mercados verticales IoT:

  • Sanidad/Salud
  • Retail
  • Construcción
  • Gobierno/Servicios Públicos
  • Smart Cities
  • Defensa
  • Manufactura y Cadena de Suministro
  • Fabricación
  • Industria
  • Robótica Industrial
  • Automoción/Coche Conectado/Coche Autónomo
  • Movilidad Urbana (BIcis/Patinetes)
  • UAV (Vehículos Aéreos no Tripulados)
  • Logística/Transporte/Almacenes
  • Agricultura/Medio ambiente/Agricultura Vertical
  • Energía/Smart Metering y Eficiencia Energética
  • Hogar Inteligente/Domótica/Inmótica y Robótica Doméstica.
  • Hoteles/Turismo
  • eHealth/Deporte
  • Smart Grid
  • Alimentación
  • Seguridad (Alarmas)
  • Wearables
  • Fitness/Sports
  • Educación/Juguetes
  • Asistentes de voz/Plataformas de voz

Más verticales en el artículo de Matt Turck: https://mattturck.com/iot2018/

Encuesta: https://www.forbes.com/sites/louiscolumbus/2016/11/27/roundup-of-internet-of-things-forecasts-and-market-estimates-2016/#28e2ea4d292d 

Mercado Vertical Seguridad

El sector de la seguridad es uno de los más avanzados en IoT. Por ejemplo Securitas Direct:

Minut, startup sueca:

¿Qué Dispositivos podemos conectar a Internet?

La respuesta es: Cualquier cosa que podamos imaginar.

IoT en su amplio concepto es conectar a Internet cualquier cosa, teniendo sentido o sin tenerlo. Por ejemplo, podríamos conectar a internet un sofá con un Arduino y unos pocos sensores, este sofá podría tuitear que nos acabamos de sentar a ver nuestra serie favorita, simplemente detectando el peso de la persona y conectándose a una API de un servidor de streaming como netflix y comprobando que acabo de poner un capítulo de westworld.

Puede parecer una idea sin sentido, pero esta idea para Netflix podría ser muy interesante, monitorizar a la gente que ve su canal, cuántas veces se levanta el espectador o si se queda dormido.

Un ejemplo más serio de IoT es aplicar las nuevas tecnologías a elementos cotidianos que no imaginarías que tuviera sentido conectar a Internet, pero que pensándolo puede ser muy útil. Por ejemplo, pensemos en conectar a Internet un cortacésped. Con un Arduino podríamos conectar diversos sensores de temperatura del motor, temperatura externa, revoluciones del motor, consumo eléctrico (cortacésped eléctricos), gps, logs, etc… que podrían ser mandados a una plataforma del fabricante y le permitiría analizar esos datos para mejorar sus futuros productos o detectar averías de forma precoz. Podría mandar una desconexión remota en caso que en una determinada partida de fabricación se haya detectado un fallo que podría provocar daños al usuario o actualizar on-line el firmware si se detecta un fallo sin necesidad de llevar al servicio técnico.

Ejemplos de cortacesped conectados:

También podemos conectar a Internet un bastón o una botas de seguridad:

Otra aplicación de IoT usando Arduino o Raspberry Pi como herramienta, es la de obtener información externa disponible mediante APIs del open data. Un ejemplo es el de un sistema de riego automático que podemos tener en una ciudad. En los inicios de la automatización se usaron programadores conectados a una electroválvula donde indicamos las horas entre las que deseamos regar. El siguiente paso fue poner detectores de lluvia para no regar si estaba lloviendo. Otro paso fue poner sensores de temperatura y humedad ambientales y sensores de humedad de suelo que nos indican cuándo debemos regar y en qué áreas de la ciudad.

El paso más avanzado que ofrece el IoT es poder conectar todo este sistema, ya de por sí muy eficiente, a los opendata meteorológicos disponibles en Internet como el de la aemet http://www.aemet.es/es/datos_abiertos/AEMET_OpenData y que nuestro sistema obtenga datos de prediciones meteorológicas y decida no regar si la predicción de lluvia es mayor del 80% en los próximos dos días o simplemente ajustar el algoritmo de riego en función los valores de los sensores + es de los datos meteorológicos. También puede recibir alertas de tormenta o pedrisco y tomar determinadas acciones o simplemente mandar un email o SMS al propietario del huerto. ¿Podríamos hacer esto con un sistema comercial?

Esto podría extenderse a explotaciones agrícolas usando un servicio como el sistema de información agroclimática de La Rioja:

Un ejemplo práctico de esto es el proyecto Aggrofox: 

Aggrofox: IoT sensing, notifications and analytics platform for urban and large-scale agriculture with automated irrigation, using Sigfox technology: https://www.hackster.io/107329/aggrofox-large-scale-and-urban-agriculture-iot-solution-8155fe 

IoT no es que un coche se pueda conectar a Internet para ver videos de youtube, sino que este coche esté conectado a Internet para que pueda actualizar su firmware automáticamente para dotar de nuevas funcionalidades sin necesidad de ir al concesionario, pueda ser inmovilizado en caso de robo o pueda mandar datos de los parámetros internos del coche para que sean analizados y poder detectar alertas precoces de fallo y actualizar automáticamente ese fallo sin que el usuario tenga que hacer nada o avisar al usuario para que lleve el coche a reparar y parar el coche si el usuario no ha llevado a revisión al cabo de unos kms para evitar males mayores.

Interesantes reflexiones sobre IoT: 

Ejemplo de Aplicaciones IoT

El conectar dispositivos a Internet puede tener muchos usos y aplicaciones que hasta ahora no hubiéramos imaginado.

Aplicaciones de IoT: https://temboo.com/iot-applications 

http://www.dragino.com/media/k2/galleries/119/LG01-40.jpg 

Algunos ejemplos

  • Monitorización en Tiempo real
  • Avisos precoces
  • Control remoto de instalaciones
  • Eficiencia energética
  • Automatización de procesos
  • Automatización de informes/Cuadros de mando
  • Mantenimientos Predictivos
  • PRL (Prevención de Riesgos Laborales)
  • análisis de datos (data mining, etc…)
  • Monitorización y notificación
  • Business intelligence (detectar problemas comunes, medir cuellos de botella, etc…) y ayudar en el mantenimiento predictivo.
  • Integrar con el software corporativo. ERP, CRM, GMAO (Gestión del Mantenimiento Asistido por Ordenador), CMMS
  • Recoger datos y tenerlos en tiempo real por ejemplo datos para sanidad en cámaras frigoríficas.
  • Automatizar todo el papeleo siendo recogidos los datos y guardados y generados los informes.

Ejemplos de uso:

  • Estación meteorológica: medidas de temperatura y humedad exterior (tiempo real)
    • Posible caso de uso 1:controlar la temperatura interior (encender/apagar el aire acondicionado, los radiadores, etc.)
    • Posible caso de uso 2: jardinería (urbanizaciones, comerciales o incluso smart cities que gestionan grandes jardines comunitarios) el riego fácil gracias a las previsiones.
  • Sistema de alarma: basado en la detección de personas, la seguridad del edificio puede ser más fácil.
    • Posible caso de uso 1: despliegue de varias aplicaciones de alarma, sensores de personas o de llama/calor en combinación con aplicaciones para smartphones, para estar siempre conectados a edificios públicos o locales comerciales.
  • Previsión del tráfico: a partir de medidas de tráfico regulares, se pueden construir ciudades inteligentes.
    • Posible caso de uso 1: escenarios para comunicarse con la gente que está en la calle -> tráfico potencial en la carretera con sugerencias directas de alternativas -> muy útil para los servicios de entrega de alimentos en las grandes ciudades.
  • Servicios de entrega (por ejemplo, servicio de pizza): seguimiento de los vehículos de entrega, búsqueda de las rutas más rápidas y posterior análisis de marketing (basado en datos históricos) para centrar las futuras actividades de marketing en las «zonas calientes».

Interesante web donde sacar más información de IoT: https://www.insight.tech/ 

Ejemplo real de uso empresa riojana: https://www.encore-lab.com/es/proyectos/humecfol 

Buen artículo de Luis del Valle sobre Proyectos IoT: https://programarfacil.com/podcast/proyectos-iot-con-arduino/

Ejemplo Práctico IoT

Riego automático de un jardín personal, explotación agrícola o ciudad. Fases:

  • Riego manual
  • Riego automatizado por horario y remoto → Temporizador
  • Riego bajo demanda con sensores de humedad, etc… → PLCs
  • Riego sostenible aprovechando las lluvia y las previsiones → IoT

Conectar a Internet los sistemas de riego para obtener las previsiones de lluvia y programar en función de los sensores de lluvia y las previsiones de lluvia ¿cómo?:

Para ello hay que leer la documentación de la API, buscar el “comando” que nos interesa, darse de alta en el servicio para obtener la API key (contraseña) y ejecutar en nuestro sistema.

Y un paso más, predecir enfermedades de los cultivos: http://apisiar.larioja.org/help 

AEMET

Llamada desde acceso: https://opendata.aemet.es/opendata/api/prediccion/especifica/municipio/diaria/39075/?api_key=111111111111

Obtengo:

{
  "descripcion" : "exito",
  "estado" : 200,
  "datos" : "https://opendata.aemet.es/opendata/sh/b904851e",
  "metadatos" : "https://opendata.aemet.es/opendata/sh/dfd88b22"
}

Visores JSON:

Predicción diaria por municipio: https://opendata.aemet.es/dist/index.html?#!/predicciones-especificas/Predicci%C3%B3n_por_municipios_diaria_Tiempo_actual 

Ejemplo con Node-RED: https://github.com/aprendiendonodered/AEMET_Prediccion_Dias 

OpenWeatherMap

Llamada: https://api.openweathermap.org/data/2.5/forecast?q=santander&units=metric&appid=1111

Ejemplo con Node-RED: 

[{"id":"ceb7af605b6e347f","type":"tab","label":"Flow 3","disabled":false,"info":""},{"id":"4f69f0089f144b46","type":"openweathermap","z":"ceb7af605b6e347f","name":"","wtype":"forecast","lon":"","lat":"","city":"santander","country":"ES","language":"en","x":260,"y":60,"wires":[["0ecd1ae54f3fc616"]]},{"id":"4a4ee3087a02a1bb","type":"inject","z":"ceb7af605b6e347f","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":110,"y":60,"wires":[["4f69f0089f144b46"]]},{"id":"0ecd1ae54f3fc616","type":"debug","z":"ceb7af605b6e347f","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":410,"y":60,"wires":[]}]

Grafana y Arduino

Grafana es un software libre basado en licencia de Apache 2.0, que permite la visualización y el formato de datos métricos. Permite crear cuadros de mando y gráficos a partir de múltiples fuentes, incluidas bases de datos de series de tiempo como Graphite, InfluxDB y OpenTSDB. Originalmente comenzó como un componente de Kibana y que luego le fue realizado una bifurcación.

Grafana es multiplataforma sin ninguna dependencia y también se puede implementar con Docker. Está escrito en lenguaje Go y tiene un HTTP API completo.

Además de administrar cuadros de mando clásicos (adiciones, eliminaciones, favoritos), Grafana ofrece compartir un cuadro de mando actual mediante la creación de un enlace o una instantánea estática del mismo.

Todos los paneles de control y las fuentes de datos están vinculados a una organización, y los usuarios de la aplicación están vinculados a organizaciones a través de roles.

Web: https://grafana.com/

Grafana API: https://grafana.com/docs/http_api/

Como obtener grafana: https://grafana.com/get

Wikipedia: https://es.wikipedia.org/wiki/Grafana

Introducing grafana 6: https://www.hostedgraphite.com/blog/introducing-grafana-6

Instalar Grafana

Download: https://grafana.com/grafana/download

Instalación en sistemas linux: https://grafana.com/docs/installation/rpm/

Para iniciar el servicio: sudo service grafana-server start

Esto iniciará el proceso grafana-server como el usuario grafana, que se crea durante la instalación del paquete. El puerto HTTP predeterminado es 3000, y el usuario y el grupo predeterminados son admin. Nombre de usuario y contraseña por defecto admin/admin

Guia de instalación en Debian/Ubuntu: https://grafana.com/docs/installation/debian/

Guia de instalación CentOS: https://grafana.com/docs/installation/rpm/

Instalar y configurar en CentOS: https://www.fosslinux.com/8328/how-to-install-and-configure-grafana-on-centos-7.htm

Actualizar grafana: https://grafana.com/docs/installation/upgrading/

Tutoriales para CentOS:

Instalar Grafana en Raspberry Pi

Download para Raspberry Pi: https://grafana.com/grafana/download?platform=arm

Comandos:

Para actualizar: sudo apt-get install grafana

Iniciar el servicio: sudo service grafana-server start

Para configurar grafana en el arranque: sudo systemctl enable grafana-server.service

Más información: https://grafana.com/docs/installation/rpm/

Ahora podemos acceder a Grafana desde el navegador en http://127.0.0.1:3000 con admin/admin y nos pedirá que cambiemos la contraseña.

Adicionalmente si queremos instalar influxDB: sudo apt-get install influxdb

Getting started InfluxDB: https://docs.influxdata.com/influxdb/v1.7/introduction/getting-started/

Configuring InfluxDB: https://docs.influxdata.com/influxdb/v1.7/administration/config/

Instalar Telegraf (opcional):

Herramientas:

  • Grafana: Una herramienta que te permite visualizar series de datos temporales de una forma visualmente muy atractiva. Además de la parte visual, dispone de un potente motor y editor de consultas, que te permite seleccionar y tratar los datos que necesitas mostrar en las gráficas y Dashboards que puedes crear en su interfaz web. Además, los datos que muestra se pueden incluir desde diversas fuentes de datos, entre las que se encuentran Graphite, InfluxDB, Prometheus, ElasticSearch, AWS CloudWatch, StackDriver, MySQL y muchos otros mediante los plugins que tiene disponibles.
  • InfluxDB: Es una base de datos diseñada para almacenar series de datos temporales, esto quiere decir, que se almacenan una serie de datos en registros asociados a un valor principal o índice, que es la marca de tiempo (fecha y hora). La monitorización es un caso típico de este almacenamiento de datos, donde se guarda la marca de tiempo, el nombre del host y los valores de métricas que se pretenden almacenar (CPU, memoria, IO, red, …). InfluxDB es software libre, y el rendimiento que definen para este tipo de entornos es muy competitivo.
  • Telegraf: Es un agente que se encarga de recopilar datos/métricas de un determinado sistema y almacenarlos donde le indiquemos. Por ejemplo, Telegraf recopilará datos de sistema tradicionales (uso de memoria, uso de MySQL/Apache, …) y los enviará a la URL con la API de InfluxDB, que se encargará de almacenarlo. Telegraf, al igual que InfluxDB, pertenecen a Influxdata, por lo que la integración entre ambos es perfecta.
  • Chronograf es la aplicación web de código abierto de InfluxData. Utilice Chronograf con los otros componentes de la pila TICK para visualizar sus datos de monitorización y crear fácilmente reglas de alerta y automatización.
  • Kapacitor es un motor de procesamiento de datos nativo. Puede procesar stream de datos de InfluxDB. Kapacitor le permite conectar su propia lógica personalizada o funciones definidas por el usuario para procesar alertas con umbrales dinámicos, hacer coincidir las métricas de los patrones, calcular anomalías estadísticas y realizar acciones específicas basadas en estas alertas, como el reequilibrio de carga dinámico.

TICK Stack: https://www.influxdata.com/time-series-platform/

Otros tutoriales:

Configurar Grafana

El archivo de configuración se encuentra en /etc/grafana/grafana.ini.

Para obtener detalles sobre todas esas opciones de configuración consultar: https://grafana.com/docs/installation/configuration/

Seguridad: https://grafana.com/docs/installation/security/

Autenticación: https://grafana.com/docs/auth/overview/

Añadir fuentes de datos a Grafana

Getting started: https://grafana.com/docs/guides/getting_started/

Conceptos básicos: https://grafana.com/docs/guides/basic_concepts/

Añadir la BBDD de MySQL donde hemos guardado nuestros datos de Arduino:

Adding data sources:

Primera Gráfica

Guia de novatos para hacer Dashboards: https://www.youtube.com/watch?v=sKNZMtoSHN4&index=7&list=PLDGkOdUX1Ujo3wHw9-z5Vo12YLqXRjzg2

Getting started: https://grafana.com/docs/guides/getting_started/

Pasos:

  • Crear un nuevo Dashboard
  • Añadir una Visualización
  • Elegir “Graph”
  • Poner en Column: IntensidadLuminosa
  • Crear otra visualización como tabla.

Resultado:

Métricas fáciles: https://www.ochobitshacenunbyte.com/2018/03/01/metricas-faciles-con-influxdb-telegraf-y-grafana/

Paneles https://grafana.com/docs/features/panels/graph/

  • Graph
  • Logs
  • Singlestat
  • Table
  • Heatmap
  • Alert List
  • Dasboard list
  • Text

Visualizar los datos de la raspberry Pi en un dashboard:

Plugins Grafana

Plugings grafana: https://grafana.com/plugins 

Instalar plugin grafana: https://grafana.com/grafana/plugins/grafana-piechart-panel/installation

Hosted Grafana

Web: https://grafana.com/products/cloud/

Si no queremos instalarlo tenemos disponible un grafana en la nube gratuito para un usuario y hasta 5 dashboards. Pricing: https://grafana.com/products/cloud/#pricing

Mi grafana cloud: https://aprendiendoarduino.grafana.net/

API REST

Las API REST se han convertido en una herramienta muy importante para los desarrollos con IoT al permitir conectar servicios entre sí. Vamos a explicar qué son exactamente.

La interfaz de programación de aplicaciones, conocida también por la sigla API, en inglés, application programming interface, es un conjunto de subrutinas, funciones y procedimientos (o métodos, en la programación orientada a objetos) que ofrece cierta biblioteca para ser utilizado por otro software como una capa de abstracción.

Hoy en día la mayoría de las empresas utilizan API REST para crear servicios. Esto se debe a que es un estándar lógico y eficiente para la creación de servicios web. Por poner algún ejemplo tenemos los sistemas de identificación de Facebook, la autenticación en los servicios de Google (hojas de cálculo, Google Analytics, …).

Las APIs forman el pegamento de conexión entre las aplicaciones modernas. Casi todas las aplicaciones utilizan APIs para conectarse con fuentes de datos corporativas, servicios de datos de terceros u otras aplicaciones. La creación de un formato de descripción abierto para los servicios de API que sea neutral para los proveedores, portátil y abierto es fundamental para acelerar la visión de un mundo verdaderamente conectado.

Una API es básicamente una forma de hacer una solicitud a otra aplicación. Por ejemplo, si estamos desarrollando una aplicación y queremos encontrar a las personas que nos siguen en Twitter, podría solicitar esta información a la API de Twitter: “Dame una lista de todas las personas que me siguen”. No hay diferencias si nuestra aplicación está en Ruby, Php, Javascript, etc., y Twitter otro lenguaje porque la API transmite y recibe datos en un formato común (normalmente JSON o XML). Esto permite que dos aplicaciones totalmente separadas envíen y reciban datos.

REST, REpresentational State Transfer, es un tipo de arquitectura de desarrollo web que se apoya totalmente en el estándar HTTP. REST nos permite crear servicios y aplicaciones que pueden ser usadas por cualquier dispositivo o cliente que entienda HTTP, por lo que es increíblemente más simple y convencional que otras alternativas como SOAP y XML-RPC. REST se definió en el 2000 por Roy Fielding, coautor principal también de la especificación HTTP. Podríamos considerar REST como un framework para construir aplicaciones web respetando HTTP.

Conocer bien HTTP no es opcional para alguien de desarrollo APIs ni para los consumidores de las mismas. El RFC es sencillo de leer.

Para desarrollar APIs REST los aspectos claves que hay que dominar y tener claros son:

Más información:

Según Fielding las restricciones que definen a un sistema RESTful serían:

  • Cliente-servidor: esta restricción mantiene al cliente y al servidor débilmente acoplados. Esto quiere decir que el cliente no necesita conocer los detalles de implementación del servidor  y el servidor se “despreocupa” de cómo son usados los datos que envía al cliente.
  • Sin estado: aquí decimos que cada petición que recibe el servidor debería ser independiente, es decir, no es necesario mantener sesiones.
  • Cacheable: debe admitir un sistema de almacenamiento en caché. La infraestructura de red debe soportar una caché de varios niveles. Este almacenamiento evitará repetir varias conexiones entre el servidor y el cliente para recuperar un mismo recurso.
  • Interfaz uniforme: define una interfaz genérica para administrar cada interacción que se produzca entre el cliente y el servidor de manera uniforme, lo cual simplifica y separa la arquitectura. Esta restricción indica que cada recurso del servicio REST debe tener una única dirección, “URI”.
  • Sistema de capas: el servidor puede disponer de varias capas para su implementación. Esto ayuda a mejorar la escalabilidad, el rendimiento y la seguridad.

Las operaciones más importantes que nos permitirán manipular los recursos son cuatro:

  • GET para consultar y leer
  • POST para crear
  • PUT para editar
  • DELETE para eliminar.

Ventajas e inconvenientes de las API REST: http://www.desarrolloweb.com/articulos/ventajas-inconvenientes-apirest-desarrollo.html

Arquitectura de una API REST: https://juanda.gitbooks.io/webapps/content/api/arquitectura-api-rest.html

Buenas prácticas de diseño de API REST: https://elbauldelprogramador.com/buenas-practicas-para-el-diseno-de-una-api-restful-pragmatica/

Qué es REST:

Enlaces:

Cliente REST de Arduino: https://github.com/csquared/arduino-restclient

Requests HTTP en python:

En informática, CRUD es el acrónimo de «Crear, Leer, Actualizar y Borrar» (del original en inglés: Create, Read, Update and Delete), que se usa para referirse a las funciones básicas en bases de datos o la capa de persistencia en un software.

Wikipedia: https://es.wikipedia.org/wiki/CRUD

Crear una API: https://desarrolloweb.com/manuales/manual-desarrollo-api.html 

Pulling and pushing data con Arduino usando HTTP:

Pull: Una aplicación en un ordenador o servidor pregunta a Arduino por los datos

Push: Arduino se comunica con el servidor para mandarle los datos

Postman

Postman surgió originariamente como una extensión para el navegador Google Chrome. A día de hoy dispone de aplicaciones nativas para MAC y Windows y Linux.

Está compuesto por diferentes herramientas y utilidades gratuitas (en la versión free) que permiten realizar tareas diferentes dentro del mundo API REST: creación de peticiones a APIs internas o de terceros, elaboración de tests para validar el comportamiento de APIs, posibilidad de crear entornos de trabajo diferentes (con variables globales y locales), y todo ello con la posibilidad de ser compartido con otros compañeros del equipo de manera gratuita (exportación de toda esta información mediante URL en formato JSON).

Además, dispone de un modo cloud colaborativo (de pago) para que equipos de trabajo puedan desarrollar entre todos colecciones para APIs sincronizadas en la nube para una integración más inmediata y sincronizada.

Más información: https://www.paradigmadigital.com/dev/postman-gestiona-construye-tus-apis-rapidamente/

El interés fundamental de Postman es que lo utilicemos como una herramienta para hacer peticiones a APIs y generar colecciones de peticiones que nos permitan probarlas de una manera rápida y sencilla.

Las colecciones son carpetas donde se almacenan las peticiones y que permiten ser estructuradas por recursos, módulos o como desees:

Todas las llamadas almacenadas en nuestra colección pueden ser exportadas a múltiples lenguajes haciendo clic en el apartado Generate Code que podéis ver en la captura anterior. Os dejo un ejemplo de cómo exporta una llamada GET para poder ser utilizada automáticamente desde código Python:

Herramienta para las API REST: Postman

Video explicativo: https://www.youtube.com/watch?list=PLM-7VG-sgbtCJYpjQfmLCcJZ6Yd74oytQ&v=ptvV_Fc3hd8   

Como probar una api rest con postman: https://www.luisllamas.es/realizar-peticiones-http-con-postman/ 

Instalar postman y probar a hacer estas dos peticiones:

Uso de API REST con Node-RED

Para integrar Node-Red con APIs que utilizan el protocolo HTTP debemos usar las HTTP requests/response de Node-RED.

HTTP recipes en Node-RED: https://cookbook.nodered.org/http/

Nodo HTTP request: https://flows.nodered.org/node/node-red-contrib-http-request

NOTA: antes de usar el nodo de HTTP request para acceder a una API pública buscar en https://flows.nodered.org/ si ya se ha publicado el nodo que lo haga. Por ejemplo https://flows.nodered.org/node/node-red-node-openweathermap

HTTP requests

HTTP request para novatos: http://www.steves-internet-guide.com/node-red-http-request-node-beginners/

Autorización/Autenticación API Rest

En el mundo de las API REST, se deben implementar flujos distintos de los habituales en cuanto a la autenticación de usuarios, ya que su arquitectura nos ofrece otro tipo de recursos que los tradicionales. Por lo general, en las aplicaciones web tradicionales, se utilizan las variables de sesión como soporte para memorizar el usuario. Esto viene a decir que en el momento de autenticar un usuario, el servidor genera las correspondientes variables de sesión y en las siguientes páginas consultadas por ese mismo cliente, es capaz de recordar al usuario.

Sin embargo, en las aplicaciones REST, esto no es posible, ya que una de las limitaciones de este sistema es que no se dispone de variables de sesión. Esto es debido a motivos de escalabilidad, ya que las API REST suelen estar alojadas en un cluster de servidores. La solución habitual para salvar este problema es la autenticación por token.

Una API RESTful debería ser stateless (sin estado). Esto significa que la petición de autenticación no debería depender de cookies o sesiones. En lugar de ello, cada petición debería venir con algún tipo de credencial de autorización.

En una API REST, enviar las credenciales una vez para iniciar sesión no es suficiente, las API REST son asíncronas. Al ser asíncrona, la API REST no puede recordar las credenciales ya que no existe ninguna sesión activa HTTP. ¡Así que tienes que indicar quién eres cada vez que hagas una petición!

Siempre que se use SSL, las credenciales de autenticación pueden ser simplificadas a un token de acceso generado de forma aleatoria, que es entregado en el campo de nombre de usuario de HTTP Basic Auth.

De todos modos, este método de autenticación token-over-basic-auth (token sobre autenticación básica) es sólo aceptable en los casos en que sea práctico tener la posibilidad de que el usuario copie un token de una interface de administración del entorno del consumidor de la API.

En los casos donde no sea posible, OAuth 2 debería ser usado para facilitar la transferencia del token seguro a terceros. OAuth 2 usa tokens Bearer y además depende de SSL para su encriptación de transporte subyacente.

Una API que necesita soporte JSONP necesitará un tercer método de autenticación, ya que las peticiones JSONP no pueden enviar credenciales HTTP Basic Auth ni Bearer tokens. En este caso, puede utilizarse un parámetro especial de consulta “access_token”.

Más información:

Basic Auth

Siempre que se use SSL, las credenciales de autenticación pueden ser simplificadas a un token de acceso generado de forma aleatoria, que es entregado en el campo de nombre de usuario de HTTP Basic Auth.

Esta es la forma más sencilla de asegurar tu API. Se basa principalmente en un nombre de usuario y una contraseña para identificarte.

Para comunicar estas credenciales desde el cliente hasta el servidor, se debe realizar mediante el encabezado HTTP Autorización (Authorization), según la especificación del protocolo HTTP.

Este método de autentificación está algo anticuado y puede ser un problema de seguridad en tu API REST.

API Key

Las API Keys son el primer método que apareció para realizar accesos a este tipo de servicios. Los desarrolladores no dudan en pensar en ella como la primera alternativa a la hora de autenticarse en su API. Esto se debe a que entre sus ventajas están su simpleza, la posibilidad de sacar estadísticas de accesos o peticiones y a su facilidad de uso para implementarlas en las aplicaciones que consumirán el servicio. Generalmente cuando accedemos a una web con este tipo de autenticación, vamos a nuestro perfil y en la sección de configuración nos encontramos con la API Key lista para ser cargada en alguna app móvil o servicio web para hacer tests de API.

Todo esto trae aparejados dos grandes problemas que son: su falta de seguridad y la pésima experiencia de usuario. En muchos casos, estas claves son enviadas dentro de la URL en donde se realiza la petición al servicio, lo que permite ser accedida por alguien que no debería. Para esto el estándar nos dice que las keys deberían viajar en el Header de la petición, para dificultar un poco su acceso por parte de terceros, aunque en la práctica se pueden ver en el Header Authorization, en un Header personalizado o en la URL.

Token

Un token es un valor que nos autentica en el servidor, Normalmente se consigue después de hacer login mediante usuario/contraseña.

Un token se genera normalmente como un hash calculado con algún dato (p.ej. login del usuario + clave secreta). Además el token puede llevar datos adicionales como el login.

Cada vez que el cliente deba realizar nuevas solicitudes al servidor, certificando que es un usuario correctamente autenticado, tendrá que enviar el token de nuevo al servidor. Por lo tanto, una vez recibido el token, deberá ser almacenado del lado del cliente para enviarlo con las posteriores solicitudes. En estos casos, el token suele viajar en las cabeceras del HTTP, de modo que llegue al servidor.

El servidor que recibe el token tiene la capacidad de desencriptarlo, de modo que pueda comprobar qué usuario es el que está realizando esta solicitud. Durante el proceso de decodificación del token, el servidor puede comprobar si este es válido y si resulta serlo, puede recuperar toda la información encriptada en el mismo, que suele ser al menos la referencia inequívoca del usuario involucrado. Por supuesto, si en cualquier momento se detecta que el token no es correcto, se obligará al usuario a autenticarse nuevamente.

Más información: https://desarrolloweb.com/articulos/autenticacion-token.html

JSON Web Token

Este tipo de token es mucho más largo que los demás ya que depende de la cantidad de datos que queramos almacenar en él. Sin embargo, una buena utilización del mismo nos permitiría mantener un token que se puede enviar por la red sin ocupar mucho espacio.

Este token está compuesto por varios campos codificados en base64 donde se guarda la información, identificación de usuario, alcance de los permisos del token, y finalmente una firma de todo los datos contenidos del token hecha por el servidor de la API para comprobar que el token es válido. Esta comprobación es mucho más eficiente y rápida que el acceso a la base de datos para determinar a quién pertenece, qué permisos tiene, etc.

OAuth 2

Con frecuencia, cuando se habla de seguridad y de OAuth, los conceptos de autenticación y autorización se solapan y son completamente diferentes:

  • La autenticación se define como el proceso mediante el cual se verifica quién eres, es decir, su ámbito se refiere a la identificación.
  • La autorización es el proceso mediante el cual se verifica a qué tienes acceso, es decir, su ámbito se limita al control de acceso.

Atendiendo a esos conceptos, OAuth es un framework que permite delegar la autorización de acceso a las APIs, NO es un protocolo de autenticación. Para que una app pueda acceder a servicios de terceros sin que el usuario tenga que darle a la app sus credenciales del servicio. Se basa en el uso de un token de sesión.

Este método es el mejor para las APIs que contengan información de usuarios. ¿Por qué? Principalmente por ser la más robusta de las tres alternativas y por cómo está definido el protocolo OAuth nos posibilita declarar permisos para cada aplicación que quiere acceder a la API y así tener varios tipos de autorización para apps diferentes. 

Las implementaciones de OAuth utilizan uno o los dos tokens siguientes:

  • Token de acceso: se envía como una API key, permite acceder a la información del usuario. Opcionalmente pueden tener una expiración.
  • Token de refresco: son un token opcional que sirve para actualizar el token de acceso en caso de que éste haya expirado.

Más información: 

WebHooks

Un Webhook es una manera de ser notificado cuando un evento ha ocurrido en tu aplicación o la de un tercero. Es básicamente una solicitud POST que se envía a una URL específica. Esa URL está configurada para recibir el cuerpo de la solicitud POST y procesarla de alguna manera.

Una API se utiliza para hacer preguntas directas y un Webhook se utiliza para notificar cuando se producen ciertos eventos. En lugar de preguntar constantemente si algo ha cambiado, un webhook puede activarse y notificarnos automáticamente apenas se produzca el evento.

API está haciendo cosas cuando se lo pides, mientras que Webhook hace cosas propias cuando ciertos criterios coinciden.

La principal diferencia entre el funcionamiento de los Webhooks y las APIs es que, mientras que las APIs realizan llamadas sin saber si reciben alguna actualización de datos como respuesta o no, los Webhooks reciben llamadas a través de HTTP POSTs desde sistemas externos sólo cuando éstos tienen algunas actualizaciones de datos.

Por otro lado, los Webhooks son llamadas automáticas de example.com a un servidor. Estas llamadas se activan cuando ocurre un evento específico en example.com. Por ejemplo, si un nuevo usuario se registra en example.com, la llamada automática puede configurarse para pedir al servidor que envíe un correo electrónico de bienvenida.

Si empezamos a pensar más en Webhooks, podemos empezar a ver a todos los Web Services como un gran repositorio de librerías asíncronas. Con el uso de Webhooks podemos por ejemplo pensar en implementar notificaciones en tiempo real sin necesidad de estar haciendo polling.

Un webhook no es una API, no es una tecnología, es solo un patrón de diseño donde definimos hooks que pueden ser invocados por terceros vía HTTP. Simple y Elegante. Esto es muy fácil implementarlo en Arduino.

Más información:

WebHooks IFTTT

Son webhooks para luego lanzar otros servicios: https://ifttt.com/maker_webhooks

Para disparar un evento, hacer un POST o GET a: https://maker.ifttt.com/trigger/{event}/with/key/aaabbbcccdddeee con un cuerpo JSON opcional con el formato: { «value1» : «», «value2» : «», «value3» : «» }

Ejemplo de APIS

API Telegram: https://core.telegram.org/bots/api

API Twitter: https://developer.twitter.com/en/docs

API thingspeak: https://www.mathworks.com/help/thingspeak/

API Rest con Arduino

Práctica: API AEMET

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

Predicción municipio horaria: https://opendata.aemet.es/dist/index.html?#!/predicciones-especificas/Predicci%C3%B3n_por_municipios_horaria_Tiempo_actual

Código Logroño: 26089

Práctica: Conexión a Thingspeak

Escribir datos en un canal: https://es.mathworks.com/help/thingspeak/write-data.html

Detalles: https://es.mathworks.com/help/thingspeak/writedata.html

Práctica: Conexión a EmonCMS

Documentación API: https://emoncms.org/site/api 

Instalación Software Raspberry Pi

Instalar servidor LAMP

El acrónimo LAMP está compuesto por las iniciales de sus cuatro componentes: Linux, Apache, MySQL y PHP. Estos forman la infraestructura en el servidor, que hace posible la creación y el alojamiento de páginas web dinámicas. Los componentes individuales se acumulan unos sobre otros, por lo que esta plataforma también recibe el nombre de LAMP stack (del inglés “apilar”).

Su funcionamiento es muy simple. Linux sirve como sistema operativo base para ejecutar el servidor web Apache. Este último no puede interpretar contenidos dinámicos, pero es aquí donde PHP entra a ejercer sus funciones de programación del lado del servidor. El proceso funciona entonces de la siguiente manera: Apache le envía un código fuente al intérprete PHP, incluyendo la información correspondiente sobre las acciones del visitante de la web, y permite el acceso a la base de datos MySQL. El resultado es devuelto a Apache y este se muestra finalmente en el navegador web del visitante.

El lenguaje de programación PHP es uno de los más extendidos para el desarrollo de páginas web. La ventaja de utilizar PHP para el desarrollo de páginas web es que nos permite crear páginas web dinámicas, es decir, que se generan cuando un usuario visita la página.

MySQL es un sistema de gestión de bases de datos relacional desarrollado bajo licencia dual: Licencia pública general/Licencia comercial por Oracle Corporation y está considerada como la base datos de código abierto más popular del mundo, y una de las más populares en general junto a Oracle y Microsoft SQL Server, sobre todo para entornos de desarrollo web.

La alternativa libre es mariaDB: https://mariadb.org/ 

Este proyecto monta un pequeño servidor web Apache con lo que podrías por ejemplo alojar tu propia página web entre otras cosas. Además, si despliegas alrededor de tu casa, por ejemplo, varios sensores y actuadores (temperatura, humedad, luces, etc…) comandados por Arduino, podrías utilizar la Raspberry Pi 3como centro de envío y recepción de datos a través de su red. Y por supuesto utilizar la página Web para mostrar y controlar los datos a través de Internet.

Instrucciones para su instalación:

#Update system

  • sudo apt-get update
  • sudo apt-get upgrade

#Install Apache2

  • sudo apt-get install apache2

Comprobar que accedemos entrando a la IP de la Raspberry Pi desde un navegador

La página web por defecto está en /var/www/html

Crear un fichero prueba.html en el directorio /var/www/html que contenga el texto: “HOLA MUNDO”

Para comprobar que funciona entrar desde un navegador a la dirección: http://ip_raspberry/prueba.html y ver que aparece el texto “HOLA MUNDO”

También podemos comprobar que funciona conectando un Arduino a la red de la Raspberry Pi y cargar este sketch: https://github.com/jecrespo/Curso-IoT-Open-Source/blob/master/Conecta_Raspberry/Conecta_Raspberry.ino 

#Install PHP

  • sudo apt-get install php libapache2-mod-php

La versión que se instala es la 7.

Para comprobar el funcionamiento crear un fichero llamado info.php y en su interior el código: <?php phpinfo(); ?>

Luego en un navegador ir a http://IP-raspberry/info.php

#Install MariaDB

  • sudo apt-get install mariadb-server mariadb-client php-mysql
  • sudo mysql_secure_installation
  • sudo service apache2 restart

Durante el proceso de instalación se pedirá el password de root de MySQL, poner el mismo que tiene el usuario pi de la Raspberry Pi y poner a Yes todas las opciones de mysql_secure_installation 

Estos comando instalan una BBDD MariaDB

Para comprobar que todo funciona ejecutar sudo mysql -u root -p y poner la contraseña, saldrá:

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 61
Server version: 10.1.23-MariaDB-9+deb9u1 Raspbian 9.0
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

#Install MySQL

En caso de quere instalar MySQL en lugar de MariaDB usar estos comandos:

Más información:

#Install PhpMyAdmin

  • sudo apt-get install phpmyadmin

Durante el proceso pide la contraseña del usuario phpmyadmin de MySQL y el servidor a instalar el apache y poner yes en dbconfig-common

En caso que no hayamos configurado el servidor web correctamente o queramos hacer una configuración de phpmyadmin después de la instalación, usar el comando: sudo dpkg-reconfigure -plow phpmyadmin

phpMyAdmin es una herramienta escrita en PHP con la intención de manejar la administración de MySQL a través de páginas web, utilizando Internet. Actualmente puede crear y eliminar Bases de Datos, crear, eliminar y alterar tablas, borrar, editar y añadir campos, ejecutar cualquier sentencia SQL, administrar claves en campos, administrar privilegios, exportar datos en varios formatos y está disponible en 72 idiomas. Se encuentra disponible bajo la licencia GPL Versión 2.

Para probar que funciona ver en un navegador: http://IP-raspberry/phpmyadmin con el usuario phpmyadmin y la contraseña usada.

El usuario phpmyadmin no tiene privilegios. Para crear un usuario “pi” con privilegios ejecutar:

  • sudo mysql -u root -p
  • CREATE USER ‘pi’@’localhost’ IDENTIFIED BY ‘tu_contrasena‘;
  • CREATE USER ‘pi’@’%’ IDENTIFIED BY ‘tu_contrasena‘;
  • GRANT ALL PRIVILEGES ON * . * TO ‘pi’@’localhost’; (Para acceso local)
  • GRANT ALL PRIVILEGES ON *.* TO ‘pi’@’%’;  (Para acceso remoto)
  • GRANT GRANT OPTION ON *.* TO ‘pi’@’localhost’; (Privilegios para dar permisos a otros usuarios)
  • FLUSH PRIVILEGES;

Para conectarnos desde otro servidor: mysql -h ip_raspberry -u root -p

#Install servidor ftp (VSFTPD)

  • sudo apt-get install vsftpd

Una vez instalado, configurar con: sudo nano /etc/vsftpd.conf 

Comentar estas dos opciones:

#local_enable=YES
#ssl_enable=NO

Y añadir al final del fichero:

# CUSTOM
ssl_enable=YES
local_enable=YES
chroot_local_user=YES
local_root=/var/www
user_sub_token=pi
write_enable=YES
local_umask=002
allow_writeable_chroot=YES
ftpd_banner=Welcome to my Raspberry Pi FTP service.

También necesitamos añadir el usuario pi al grupo www-data, dar la propiedad de la carpeta /var/www al usuario y al grupo www-data, cambiar la carpeta de inicio del usuario pi a la misma, y aflojar algunos permisos en la carpeta /var/www:

  • sudo usermod -a -G www-data pi
  • sudo usermod -m -d /var/www pi
  • sudo chown -R www-data:www-data /var/www
  • sudo chmod -R 775 /var/www

Y reiniciar el servicio: sudo service vsftpd restart 

Para comprobar que funciona usar un cliente ftp con https://filezilla-project.org/ y hacer una conexión con la siguiente configuración:

  • Host – 192.xxx.x.xxx (IP address)
  • Port – 21
  • Protocol – FTP (File Transfer Protocol)
  • Encryption – Use explicit FTP over TLS if available
  • Logon Type – Normal (username & password)
  • Username – pi
  • Password – [enter password]

Más información: 

Y si quisieramos instalar un wordpress: https://www.raspberrypi.org/learning/lamp-web-server-with-wordpress/

Con esto ya tenemos listo un servidor para recibir conexiones de arduino y guardar datos y mostrarlos

Recordar cada vez que se haga una modificación grande en Raspberry Pi hacer una copia de seguridad de la tarjeta SD con Win32DiskImager.

Descarga https://sourceforge.net/projects/win32diskimager/

Escribir el nombre de la imagen en la ruta donde los guardemos.

Y luego pulsar read. Una vez hecho esto, esperar a que el proceso finalice.

Probar LAMP con Arduino

Para probar el servidor LAMP que acabamos de instalar en nuestra Raspberry Pi vamos a usar Arduino y mandar datos de luminosidad de la sala usando un LDR.

Una fotorresistencia o LDR (por sus siglas en inglés “light-dependent resistor”) es un componente electrónico cuya resistencia varía en función de la luz.

Se trata de un sensor que actúa como una resistencia variable en función de la luz que capta. A mayor intensidad de luz, menor resistencia: el sensor ofrece una resistencia de 1M ohm en la oscuridad, alrededor de 10k ohm en exposición de luz ambiente, hasta menos de 1k ohm expuesto a la luz del sol. Aunque estos valores pueden depender del modelo de LDR.

El LDR actúa como una resistencia variable. Para conocer la cantidad de luz que el sensor capta en cierto ambiente, necesitamos medir la tensión de salida del mismo. Para ello utilizaremos un divisor de tensión, colocando el punto de lectura para Vout entre ambas resistencias. De esta forma:

Dónde Vout es el voltaje leído por el PIN analógico del Arduino y será convertido a un valor digital, Vin es el voltaje de entrada (5v), R2 será el valor de la resistencia fija colocada (10k ohm generalmente) y R1 es el valor resistivo del sensor LDR. A medida que el valor del sensor LDR varía, obtendremos una fracción mayor o menor del voltaje de entrada Vin.

Instalación:

Más información https://www.luisllamas.es/medir-nivel-luz-con-arduino-y-fotoresistencia-ldr/ 

Crear una base de datos llamada “DatosArduino” con una tabla llamada “luminosidad” que tenga 4 campos: “id” auto incremental y sea el campo clave, “fecha” de  tipo timestamp y que se actualice al actualizar, un campo “arduino” de tipo entero y un campo “IntensidadLuminosa” que sea de tipo entero.

O con la query:

CREATE TABLE `luminosidad` (
  `id` int(11) NOT NULL,
  `fecha` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `arduino` int(11) NOT NULL,
  `IntensidadLuminosa` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `luminosidad`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `luminosidad`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;

Para insertar un dato:

INSERT INTO `luminosidad` (`arduino`, `IntensidadLuminosa`) VALUES (’22’, ’22’);

Subir por FTP seguro los ficheros Graba_GET.php y Graba_POST.php a Raspberry Pi al directorio /var/www/html o crearlos con el comando nano:

Se puede probar que funciona ejecutando desde el navegador: http://127.0.0.1/Graba_GET.php?arduino=2&IntensidadLuminosa=89 

Ejecutar en Arduino estos sketches para GET o POST para mandar cada 5 segundos el dato de luminosidad:

Ver en la web de phpmyadmin los datos que se están subiendo y descargar en formato csv los datos guardados en unos minutos.

NOTA: Para ver los errores de PHP activar en /etc/php/7.0/apache2/php.ini la línea:

  • Development Value: E_ALL

Instalar Node-RED

No instalar la versión que aparece en software recomendado de Raspberry Pi OS.

Seguir esta instalacióm: https://nodered.org/docs/getting-started/raspberrypi 

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

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

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

Instalar 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.

Web: http://www.webmin.com/

Instalación:

Para comprobar que se ha instalado acceder desde un navegador a https://ip_address:10000 con usuario pi y la contraseña

Más información:

Manejar GPIO Raspberry Pi

Blink Led

Antes de empezar recordar comprobar la posición de los pines porque en caso de error podemos dañar la Raspberry Pi ya que los GPIO no tienen ninguna protección.

  • Cuando conectes cables a los GPIO procura no equivocarte y fíjate bien.
  • Usa cables con recubrimiento del tipo Dupont Macho-hembra por ejemplo, y no acerques cables sin proteger a tus GPIO (Y mucho menos un destornillador) porque puedes hacer un corto con facilidad.
  • Una vez que conectes un cable hembra protegido, vuelve a mirar y asegúrate de que lo has conectado al pin que querías y no al de al lado.
  • Especial cuidado con los pines que uses para sacar 3V o 5V de tu Raspi. No dejes el otro extremo al aire: Asegúrate de conectarlo a algún sitio.
  • NO CONECTES NADA DE 5V si no estás seguro. Tu Raspberry funciona a 3.3V y meterle 5V en un pin puede suponer quemar el procesador central. 

Instalar las librerías para el uso de los pines GPIO desde Python, asegurandonos de tener actualizado Raspbian:

  • sudo apt-get update
  • sudo apt-get upgrade
  • sudo apt-get install python-dev
  • sudo apt-get install pyton-rpi.gpio

Tened en cuenta que en esta ocasión vamos a alimentar el LED con 3.3V (Que es lo que proporciona un pin de la Raspi) y que la intensidad que obtendremos será: 3.3 / 1K Ω = 3 mA, que no es mucho para iluminar un LED pero suficiente.

Esquema de GPIO:

Conectamos GND al pin 6 de la Raspberry y vamos a usar el pin 12 (GPIO 18) como control del encendido mediante una resistencia intermedia. El esquema de conexión es:

Abrir el IDLE de Python 3 para empezar nuestro programa:

Y copiar código:

import RPi.GPIO as gpio

import time

gpio.setmode(gpio.BOARD)
gpio.setup(12, gpio.OUT)

for  x in range ( 0, 10):
    gpio.output(12, True)
    time.sleep(0.5)
    gpio.output(12, False)
    time.sleep(0.5)

print «Ejecución finalizada»

Guardar el fichero con el nombre blink.py en /home/pi y ejecutarlo pulsando F5

Más información: