Tesis Sistema Domotico MQTT
Tesis Sistema Domotico MQTT
Tesis Sistema Domotico MQTT
Realizado por
Rafael Ordóñez molina
Tutorizado por
Juan Carlos Tejero Calado
Departamento
Electrónica
Realizado por
Rafael Ordóñez Molina
Tutorizado por
Juan Carlos Tejero Calado
Departamento
Electrónica
UNIVERSIDAD DE MÁLAGA
MÁLAGA, JUNIO DE 2022
To solve this problem, this Final Degree project develops a fully functional
home automation system within a network. For this purpose, a web system, a
web client, and a software for devices based on the ESP8266 processor have been
developed, connecting the devices with the web server based on “Api rest” archi-
tecture, by means of a MQTT server.
The final architecture of the system is consolidated by two large systems, the
web system and the Iot devices system. The web system is packaged using doc-
ker, which will allow an easy deployment of the system, and the intelligent de-
vices will have a multi-device software, that is, the same software contains the
different types of configurations existing in the system.
Finally, we will obtain a complete system that will allow the society to have a
private home automation software, free and easy to install and use.
2
Resumen
En la actualidad numerosas empresas comercializan sistemas domóticos lis-
tos para usar, pero con el defecto de ser sistemas externos al hogar donde son
instalados, comprometiendo la seguridad de los habitantes del mismo.
La arquitectura final del sistema queda consolidada por dos grandes siste-
mas, el sistema web y el sistema de los dispositivos Iot. El sistema web se en-
cuentra empaquetado usando docker, lo que permitirá un fácil despliegue del
mismo, y los dispositivos inteligentes, dispondrán de un software multi-dispositivo,
esto es, un mismo software contiene los diferentes tipos de configuraciones exis-
tentes en el sistema.
3
4
Índice
1. Introducción 7
1.1. Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3. Estructura del documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Apéndice A. Manual de
Instalación 69
A.1. Instalación del servidor web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
A.2. Despliegue de fichero docker-compose . . . . . . . . . . . . . . . . . . . . . . . . 69
5
A.3. Instalación del firmware dispositivos Iot . . . . . . . . . . . . . . . . . . . . . . . 71
Apéndice B. Manual de
Usuario 73
B.1. Configuración Automática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
B.1.1. Dispositivo Inteligente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
B.1.2. Servidor Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
B.2. Configuración Manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
B.2.1. Dispositivo Inteligente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
B.2.2. Servidor web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
B.3. Modificar un dispositivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
B.4. Eliminar un Dispositivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6
1
Introducción
1.1. Motivación
En los últimos años se ha incrementado el uso de sistemas domóticos en los hogares Es-
pañoles, esto ha provocado que cada vez mas empresas fabriquen productos con caracterís-
ticas similares. Todos estos sistemas domóticos comerciales, permiten que la gran mayoría
de la población pueda domotizar sus hogares de una forma económica y sencilla.
Sin Embargo, la mayoría disponen de código privativo y los datos de todos los hogares
están alojados en servidores centrales, lo que implica un alto riesgo de seguridad.
En este caso, se justifica el objeto de este trabajo final de grado en base al desarrollo de
un software capaz de crear un sistema domótico de código libre y de fácil instalación para
toda la sociedad.
1.2. Objetivos
Todo el sistema domótico se encontrara en la red local del hogar, aunque podrá ser ex-
puesto al exterior del mismo. Para lograr estas metas, hay que cumplir una serie de objetivos
específicos:
7
Desarrollo de software en C++ y Arduino para una placa con procesador ESP8266, este
software sera capaz de conectarse a un servidor MQTT, enviando y recibiendo infor-
mación de los dispositivos conectados, a su vez, este software, podrá ser usado para
hardware con diferentes fines, en concreto:
Desarrollo de API REST en Java y Spring Boot para la conexión con servidor MQTT y
control de todos los dispositivos, de esta forma se puede integrar el sistema de control
con cualquier cliente, como POSTMAN o un sistema desarrollado en Javascript.
De esta forma, obtenemos una interacción directa entre el usuario y el dispositivo a contro-
lar, de una forma dinámica y fluida para el usuario final.
8
1.3. Estructura del documento
Capitulo 3: Análisis y diseño del sistema. Este capitulo se encuentra dividido en dos
grandes bloques:
9
10
2
Tecnologías y
herramientas de
desarrollo
Esta sección describe las tecnologías utilizadas durante el desarrollo del proyecto.
Todas ellas han sido elegidas por su flexibilidad y escalabilidad, permitiendo así, la creación
de nuevas lineas a futuro.
2.1. Hardware
NodeMCU ESP8266
11
En nuestro caso, es utilizada como base de los dispositivos Iot, dada la versatilidad de
la que dota a los mismos, aunque, podría se utilizado otro procesador compatible con
Arduino.
Se trata de una placa de desarrollo creada por el profesor Juan Carlos Tejero Calado
para impartir la docencia de la Asignatura “ Electrónica para la domótica”. Esta placa
incluye dispositivos, como relés, sensores o pulsadores, lo que permite un fácil desa-
rrollo de todo al sistema, usando una única placa donde se alojan todos los compo-
nentes necesarios.
12
Esta placa, sera utilizada durante el desarrollo del proyecto para realizar la programa-
ción y pruebas de los dispositivos inteligentes de una forma mas rápida y directa, sin
la necesidad de disponer de varios dispositivos independientes. Podemos destacar los
siguientes componentes utilizados de la misma:
• Sensor de luminosidad.
En concreto hablamos de una foto resistencia, un semiconductor que responde
según la cantidad de luz que incide sobre el mismo, cuando este no esta expuesto
a radiación lo suficiente luminosa, los electrones están firmemente unidos, emi-
tiendo un valor prácticamente nulo, sin embargo, cuando incide la cantidad de
luz suficiente sobre la superficie del mismo, esta energía libera electrones con lo
que hace al material mas conductor. En concreto, este sensor será utilizado en el
sistema para controlar una lampara o similar en función de la luz del ambiente.
• Pulsadores
En este caso disponemos de pulsadores “push button”, los cuales cuando son
pulsados permiten el paso de la corriente, por tanto, podremos leer el estado de
los mismos desde el firmware de los dispositivos.
Estos, serán utilizados como interruptores remotos para las persianas y los dis-
positivos de apago y encendido.
13
• Relés
Un relé es un interruptor, más frecuentemente electromagnético, que utiliza una
pequeña corriente para accionar un circuito mayor. Básicamente, se aplica una
señal en la entrada que enciende otro circuito conectado en la salida, sin necesi-
dad de supervisión humana.
Esto nos permite controlar dispositivos como lamparas, o persianas emitiendo
una señal sobre estos.
Figura 4: Relé
[4]
14
2.2. Software
Java
Es una plataforma de desarrollo orientada a objetos, el código generado para java, co-
rre sobre JVM (Java Virtual Machine), la cual esta disponible en la mayoría de sistemas
operativos. Java es ampliamente utilizada en sistemas empresariales, y a lo largo del
grado en Ingeniería Informática, es la tecnología de desarrollo mas usada, por lo que
se ha decidido utilizar esta tecnología, dado que nos ofrece un gran abanico de posi-
bilidades además de tener experiencia usando dicha tecnología. Hemos elegido dicho
lenguaje para el desarrollo de la “Api Rest”.
Spring Boot
Se trata de uno de los Frameworks mas usados en el mundo para JAVA, este framework
nos permite simplificar el código, dotando a java de características como la escalabili-
dad, seguridad y simplicidad entre otras.
En este caso ha sido utilizado para facilitar la creación de una API REST, la cual sera
detallada posteriormente. También, proporciona conexión a un servidor MQTT, por
conexión segura, inicio de sesión y otras características a tener en cuenta.
Gracias a Spring Boot, se obtiene una aplicación empaquetada en formato war o jar,
la cual puede ser desplegada sobre un servidor TOMCAT, permitiendo así el acceso a
clientes tales como POSTMAN o una interfaz web. Hemos elegido dicho framework
para el desarrollo de la “Api Rest”.
15
JPA
JPA[5] es la interfaz que ofrece Java para implementar un ORM (Framework Object Re-
lational Mapping), que permite interactuar con la base de datos por medio de objetos,
de esta forma, JPA es el encargado de convertir los objetos Java en instrucciones para
el sistema gestor de base de datos.
C++
Se trata de un lenguaje de programación cuya intención de su creación fue extender al
lenguaje de programación C mecanismos que permiten la manipulación de objetos.
En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, C++ es
un lenguaje híbrido.[6] En este caso se ha utilizado para la programación de las placas
de desarrollo, en concreto, sera utilizado junto al framework Arduino, explicado en el
siguiente punto.
C++ es uno de los lenguajes mas usados en sistemas empotrados, y aporta gran escala-
bilidad y robustez al sistema, además, el framework Arduino se integra perfectamente
con dicho lenguaje, lo que nos permite programar los dispositivos IoT de una forma
robusta.
Arduino
Arduino es un framework de desarrollo para dispositivos IoT en el lenguaje[7] C o C++,
el cual define define una API común de alto nivel para un facil acceso al hardware de
los dispositivos, por ejemplo, almacenar en la memoria EEPROM del chip datos no
volatites o la abstraccion de operaciones como el acceso a entradas/salidas digitales o
la gestión de interrupciones.
Arduino proporciona gran cantidad de librerías “open source”, que nos permite añadir
funciones a dichos dispositivos, en nuestro caso, permitirá la opción de usar la librería
"PubSubClient", de forma que el dispositivo actúa como cliente de un servidor MQTT
y se comunique posteriormente con la aplicación web.[8]
Javascript
Se trata de un lenguaje de programación interpretado, esta orientado a objetos, muy
poco tipado y dinamico. Javascript nos permite conectar la API REST del sistema do-
motico con la interfaz web para el cliente final.También puede realizar gran cantidad
16
de funcionalidades, como dar la capacidad a las paginas web de ser dinámicas, o en
nuestro caso, hacer peticiones al servidor Java Spring mediante.
Html
Se trata de un lenguaje de marcado de texto para la creación de paginas web, es el mas
usado en el mundo, y es el encargado de dar la estructura a nuestro cliente Web.
Css
Es un lenguaje de diseño gráfico para definir y crear la presentación de un documento
estructurado escrito en un lenguaje de marcado. Css nos permitirá definir estilos a
nuestro cliente web.
SqLite: Se trata de un pequeño sistema gestor de base de datos, de software libre, que
permite almacenar información en dispositivos empotrados de una forma sencilla,
eficaz, potente, rápida y en equipos con pocas capacidades de hardware, como puede
ser un dispositivo de un sistema domotico.
17
2.2.2. Herramientas
Comunicación pub/sub
• Servidor MQTT
MQTT [9] un protocolo de mensajería ligero de publicación/suscripción diseña-
do para telemetría M2M (máquina a máquina) en entornos de bajo ancho de
banda. Por tanto se convierte en un entorno ideal para conectar dispositivos con
potencia y ancho de banda limitados. Esto ha hecho que elijamos este soporte
para la comunicación entre el servidor web y los dispositivos IoT. La idea prin-
cipal, es utilizar este protocolo de publicación y suscripción, para que cada dis-
positivo tenga una ruta asociada, y el servidor web envíe datos a la misma, gene-
rando una reacción en el dispositivo Iot y viceversa.
• Mosquitto
Se trata de una implementación del protocolo MQTT open source, creado por
la fundación eclipse. Es una opción de servidor MQTT ligera, lo que hace que
sea una opción perfecta para desplegar dicho servidor sobre dispositivos de baja
potencia como Raspberry Pi
Servidor TOMCAT
Se trata de un servidor para ejecutar aplicaciones Java. Es ampliamente utilizado en
la industria, y destaca por su robustez y facilidad de uso, ya que al ser un contenedor
de servlets, brinda la opción de ejecutar una aplicación java completa con el simple
hecho de seleccionar un paquete war o jar. Este sera utilizado durante el desarrollo del
proyecto, aunque no sera la opción elegida para usarlo en un entorno real.
Eclipse
Eclipse es una plataforma de desarrollo, compuesto por un conjunto de herramientas
de programación de código abierto y multiplataforma, diseñada para ser extendida de
forma indefinida a través de plug-in. Este IDE ha sido elegido ya que no supone coste
alguno al ser open source, es ampliamente utilizado en el mundo empresarial, y es el
mas usado durante el desarrollo del grado de Ingeniería Informatica
18
Visual Studio Code
Se trata de un editor de codigo desarrollado por Microsoft, el cual ofrece gran can-
tidad de extensiones privativas o de la comunidad, lo que hace que sea un software
altamente escalable. Principalmente podemos destacar que incluye soporte para la
depuración, control integrado de Git, resaltado de sintaxis, finalización inteligente de
código, fragmentos y refactorización de código.
PlatformIO
PlatformIO es un ecosistema para el desarrollo de sistemas empotrados e IoT, el cuál
facilita y mucho la gestión de proyectos de software empotrados, gestión de depen-
dencias y librerías.
En el mercado existen gran cantidad de alternativas, pero este fue elegido gracias a la
cantidad de librerías incluidas en sus repositorios, asi como la búsqueda automática
en otros repositorios como gitHub. También incluye conexión directa con la placa que
esta siendo programada, asi como debug, lo que hace que sea un entorno de desarrollo
muy completo.
19
POSTMAN Es un cliente HTTP que nos da la posibilidad de testear ’HTTP requests’ a
través de una interfaz gráfica de usuario, por medio de la cual obtendremos diferentes
tipos de respuesta que posteriormente deberán ser validados.
Gracias a este software, la api rest se puede probar de una forma muy sencilla y rapida.
Diagrams.io: Se trata de una aplicación web gratuita que permite diseñar todo tipo de
diagramas, desde diagramas de base de datos, hasta complejas arquitecturas de soft-
ware en la nube. En este documento ha sido ampliamente utilizada para la creacion
de los diagramas
Umbrello:Es una herramienta gratuita para crear y editar diagramas UML desde ce-
ro, o importando las clases desde el propio código. Tiene soporte para la mayoría de
lenguajes existentes, y ha sido desarrollada por el equipo de KDE.
Finite State Machine Designer: Es una pagina web para la creacion de maquinas de
estado. Destaca por ser gratuita y muy intuitiva.
20
3
Análisis y diseño del
sistema
3.1. Análisis de Requisitos
En esta sección vamos a analizar los requisitos necesarios para la realización del sistema.
En concreto se analizaran los requisitos funcionales, los cuales tratan de expresar las funcio-
nalidades que deberá de realizar el sistema, y los requisitos no funcionales, especificando
las restricciones del mismo. También serán especificados los casos de uso del sistema.
RF01. Interfaz web centralizada El usuario dispondrá de una interfaz web, donde po-
drá observar el estado de todos los dispositivos conectados a la red, así como el control
de los mismos.
RF02.Iot Conectar dispositivo IoT a la red wifi del hogar. El usuario podrá conectar el
dispositivo haciendo uso de la pagina web del mismo, mediante un punto de acceso
creado por el mismo.
21
RF04.Iot Configuración Automática. El usuario conectara el dispositivo al servidor
web sin necesidad de especificar ninguna ruta, el dispositivo automáticamente puede
ser encontrado por el servidor Web.
RF05.Iot Software genérico para todos los dispositivos Iot. Los dispositivos IoT, usa-
ran un software genérico, permitiendo que el usuario elija el dispositivo que esta usan-
do desde la interfaz web del mismo.
RF06.Iot Eleccion del servidor MQTT.El usuario podrá elegir desde la interfaz web de
los dispositivos el servidor MQTT al que desea conectarse.
RF10. Web Eliminar Dispositivos. El usuario podrá eliminar dispositivos del sistema
web
22
RF14. Dispositivo físico para el control de Dispositivos On/Off. El usuario podrá co-
nectar un interruptor inteligente, el cual se conectara al servidor, para la configuración
con el dispositivo que controlará. De esta forma,los dispositivos de encendido / apa-
gado, como una lampara, pueden ser controladas desde un dispositivo externo a la
aplicación web.
23
3.1.2. Requisitos no funcionales
RNF 0. El sistema deberá ser intuitivo de usar para la mayoría de los usuarios
RNF 1. El sistema deberá consumir bajos recursos, para poder ser desplegado en un
sistema empotrado como Raspberry Pi
24
3.1.3. Casos de uso
En esta sección del documento, realizaremos una especificación de los casos de uso [13],
donde se explica el comportamiento del sistema o de una parte. Detallan como reacciona el
sistema a una determinada acción ejecutada por el usuario.Por tanto, describe el conjunto
de secuencias de acciones (incluyendo variantes) que ejecuta el sistema para producir un
resultado observable de interés para un actor.
Actor Usuario
25
Caso de Uso Configuración manual del dispositivo
Actor Usuario
Referencias RF-02,RF-03
26
Caso de Uso Configuración automática del dispositivo
Actor Usuario
27
Caso de Uso Eleccion del tipo de dispositivo
Actor Usuario
Referencias RF-05
28
Caso de Uso Búsqueda de nuevos dispositivos
Actor Usuario
Referencias RF-07
29
Caso de Uso Añadir dispositivos manualmente
Actor Usuario
Referencias RF-08
30
Caso de Uso Modificar dispositivos
Actor Usuario
Referencias RF-09
Actor Usuario
Referencias RF-10
Flujo Alternativo
31
Caso de Uso Control de persiana
Actor Usuario
Referencias RF-11
32
Caso de Uso Control de dispositivos On/Off
Actor Usuario
Referencias RF-12
33
Caso de Uso Control de persiana mediante dispositivo remoto
Actor Usuario
Referencias RF-13
34
Caso de Uso Control On/Off mediante dispositivo remoto
Actor Usuario
Referencias RF-14
35
Caso de Uso Control mediante cambio de luminosidad
Actor Sistema
Referencias RF-15
36
Para una mayor especificación de los casos de uso, y poder analizarlos visualmente, he-
mos desarrollado el modelo de casos de uso, donde podemos ver las relaciones entre los
mismos:
37
3.2. Arquitectura y Diseño del Sistema
Para poder enviar una señal a un dispositivo inteligente, y que este controle una per-
siana o una lampara, se ha diseñado e implementado una arquitectura basada en servidor
MQTT. El objetivo, es comunicar dispositivos de bajas capacidades computacionales, como
el procesador ESP8266, con un dispositivo utilizado por el usuario final, con el fin de mandar
señales y monitorizar a los mismos.
Para ello existen diversas soluciones, pero hemos optado por desplegar un servidor cen-
tral, el cual dispone de una API REST [14] que permite la conexión a diversos clientes, como
POSTMAN o al cliente propio que hemos diseñado para controlar a todos los dispositivos de
forma centralizada.
Este cliente esta implementado utilizando JavaScript como lenguaje que realiza las pe-
ticiones al servidor web, realizando así las acciones necesarias desde una interfaz intuitiva.
El servidor central usara SQLite, como sistema gestor de base de datos, el cual nos permite
almacenar los dispositivos que han sido añadidos y la configuración del sistema cuando este
es apagado.
El servidor Web, es el encargado de enviar los datos a los dispositivos Iot. Para enviar y
recibir información de dichos dispositivos, se utiliza un servidor MQTT, de forma que los
dispositivos Iot quedan a la espera de un mensaje para realizar una acción previamente pro-
gramada, así como enviar información de su estado en un determinado periodo de tiempo.
Todos estos procedimientos serán especificados en las siguientes secciones.
38
Figura 8: Visión general del sistema
39
3.2.2. Sistema Interno de los Dispositivos Inteligentes
El sistema interno esta desarrollado entorno a la entidad “Device”, lugar donde se espe-
cifican las características del dispositivo, así como el control del mismo. Uno de los puntos
mas importantes del sistema, es la conexión con el servidor MQTT, donde llegan las ordenes
enviadas desde el servidor para realizar una acción concreta.
En los siguientes puntos serán detallados en profundidad los componentes del sistema
junto con el diagrama UML.
1. Devices:
Se trata de la clase central, en ella se especifican las características de cada dispo-
sitivo, y encontramos los métodos para controlar el dispositivo a nivel mas bajo.
Desde esta clase podemos accionar pines del procesador, así como declararlos.
En caso de declarar el dispositivo como sensor, se podrán llamar a dichos méto-
dos para obtener el estado del mismo.
2. mqttConn:
El dispositivo esta programado para ser controlado remotamente, para ello se
utiliza la conexión con un servidor mqtt. En este caso, disponemos de métodos
para poder publicar información a una determinada ruta del servidor mqtt, así
como un método denominado callBack. Este método es el encargado de realizar
una acción determinada en función del tipo de dispositivo que tenemos confi-
gurado, de esta forma, cada vez que dicho método recibe un mensaje a la ruta a
la que se encuentra suscrita, se realiza una acción determinada.
40
3. utils:
Aquí encontraremos los métodos destinados al control y a la configuración del
dispositivo en si, es decir, disponemos de los diferentes métodos que accionan
un determinado tipo de dispositivo, esto nos permite mantener en un mismo
software la cantidad de dispositivos a controlar que deseemos. El funcionamien-
to de cada uno de estos métodos sera especificado en los siguientes subaparta-
dos, utilizando maquinas de estado.
4. serverConf:
Para la configuración inicial, donde se introducen datos como la ip del servidor
mqtt, o el ssid de la red, utilizamos un servidor Asíncrono, lo que permite que en
el primer inicio del dispositivo, o tras pulsar una combinación de botones, este
entre en modo configuración, creando un punto de acceso wifi, y generando una
pagina web interactiva con el usuario
5. eepromUtils:
Para el almacenamiento de todas las variables necesarias cuando el dispositivo
es apagado, utilizamos la librería “EEPROM FOR ESP8266”, la cual emula la exis-
tencia de una memoria eeprom sobre la memoria flash del procesador, de esta
forma podemos almacenar variables como el ultimo estado del sistema antes de
ser apagado.
41
Figura 9: Diagrama UML dispositivos Iot
42
Configuración inicial de los dispositivos:
Para facilitar la configuración inicial de los dispositivos, se ha desarrollado un sistema
de configuración automática y manual. De esta forma el usuario solo deberá conec-
tarse a la red wifi emitida por el dispositivo y a su pagina web, realizado una configura-
ción automática y sencilla. También se dispone de una configuración manual, donde
se podrán introducir las rutas especificas del servidor mqtt.
43
Para realizar el proceso de configuración automática, el dispositivo deberá estar en
modo access point, donde el usuario indicara desde la pagina web los atributos: ssid,
password,mqtt server Ip, deviceType y tipo de configuración. Una vez los campos han
sido rellenados el usuario envía el formulario y el sistema se reinicia con los paráme-
tros introducidos. El sistema inicia en modo auto configuración, y este se conecta a la
red previamente indicada.
Cuando el usuario final pulsa sobre añadir dispositivo, el servidor publica en la ruta
/deviceId el payload addDevice, por lo que el dispositivo “deviceId”, recibirá el pay-
load, reiniciando el dispositivo y entrando en modo “Ready”, por lo que el dispositivo
sera añadido al sistema y el usuario final podrá controlarlo.
44
Figura 11: Diagrama de funcionamiento de la configuración automática de los dispositivos
45
Descripción de los tipos de dispositivos y su funcionamiento
Disponemos de un software polivalente, dado que este se adapta a los siguientes tipos
de dispositivos que monten el procesador ESP8266:
46
2. Dispositivo Persiana:
Se trata de un dispositivo mas complejo, este, deberá montar dos relés, para el co-
rrecto funcionamiento de la persiana, dado que dispone de tres estados, parada,
subiendo o bajando. Además, en todo momento el dispositivo emite el porcenta-
je en el que se encuentra la persiana.Cuando la persiana obtiene el valor de 100 %
o 0 % esta adquiere el valor de parada. Este dispositivo responde a los comandos
0,1 y 00, los cuales serán especificados en el siguiente diagrama:
47
5. Fotoresistencia remota para dispositivo On/Off:
Este dispositivo implementa un funcionamiento similar al botón On/Off, sin em-
bargo, es necesario indicarle un rango de luminosidad en el cual emitirá una se-
ñal al dispositivo controlado. Esto es configurado desde la configuración inicial
en el servidor web.
48
3.2.3. Sistema Interno del servidor Web y Cliente Web
49
Especificación de las clases del servidor Web:
Device
Se trata de la clase encargada de contener los atributos de los dispositivo inteligentes,
tales como las rutas mqtt, el estado del dispositivo o el tipo.
En ella se incorporan los métodos necesarios para modificar dichos atributos, así co-
mo para enlazar dicho dispositivo con un segundo dispositivo a controlar.Por esta ra-
zón observamos como la clase Device esta relacionada con ella misma, dado que un
dispositivo, por ejemplo un pulsador, puede controlar una lampara.
Device Service
Es la clase donde se encuentra la lógica del sistema, en ella encontramos todas las
operaciones que hacen que la aplicación funcione correctamente.
Existen cantidad de métodos dentro de ella, pero podemos destacar:
4. setSensor: Este método nos permite agregar varios tipos de sensores que contro-
laran dispositivos en el sistema de una forma que se adapta a las necesidades del
dispositivo a agregar y a controlar.
50
mqtt en memoria, por lo que en cada inicio del sistema, hay que realizar una
carga de los mismos.
51
Figura 16: Diagrama de secuencia para añadir un dispositivo de forma automática
52
URI Tipo Descripción
domoApi/devices/
Punto de entrada para agregar nuevos sensores al sistema
addSensor POST
de forma automática, explicado en los diagramas de secuencia
/sensorName
domoApi/devices/id PUT Este método permite modificar los dispositivos del sistema
domoApi/devices/id DELETE Este método permite eliminar los dispositivos del sistema
Constants y Utils
1. Constants: Se trata de una clase con variables enteras y estáticas, cada una de
estas almacena el valor del tipo de dispositivo disponibles dentro del sistema, lo
que permite tener un código limpio.
54
• handler:Es uno de los puntos críticos del sistema, dado que es el encarga-
do de tratar los mensajes que llegan al servidor, previamente suscritos a un
topic.Cuando un mensaje coincide con los topics a los que el servidor se ha
suscrito, por ejemplo, el topic el configuración automática de los dispositi-
vos, o los topic de estado de los dispositivos, se realiza una serie de métodos.
En caso de ser detectado un nuevo dispositivo en el topic de auto configura-
ción, el sistema añade el nuevo dispositivo a la lista de dispositivos a agregar,
en caso contrario, actualiza el estado de los dispositivos existentes.
55
Por ultimo, en esta sección hablaremos del cliente web, este realiza peticiones al servidor
previamente especificado, y es donde el cliente final podrá realizar todas las acciones para
controlar el sistema. En el apéndice del Manual del Usuario, sera ilustrado con imágenes el
uso del sistema para el usuario Final.
Aspectos visuales
1. Html
En primer lugar, la estructura de la pagina es creada utilizando el lenguaje HTML,
la pagina se compone de un menu inicial donde se pueden ver todos los dispo-
sitivos disponibles en el sistema. Este menú es generado mediante un elemento
grid, de forma que va mostrando dispositivos en función de los existentes en el
sistema. También dispone de pantallas flotantes, tanto para la búsqueda de dis-
positivos como para la modificación de los mismos
2. Bootstrap
Para dotar a la estructura de un estilo elegante, minimalista y facil de usar para
los usuarios, se ha utilizado la librería bootstrap para maquetar la interfaz grafica.
Esta libreria permite generar una visual agradable a la vista con componentes
predefinidos.
var requestOptions = {
method: 'GET',
redirect: 'follow'
};
fetch(url+"domoApi/devices", requestOptions)
.then(function (response){
56
return response.json();
})
.then(function (data){
let html='';
data.forEach(function (device){
//Mostrar dispositivos formateados
1. Funcionamiento
Observemos el siguiente diagrama de secuencias.
Figura 17: Diagrama de secuencias para la visualización de los dispositivos del sistema
El usuario accede al panel web del cliente, como sabemos, en esta primera pan-
talla se muestran todos los dispositivos, por tanto, el cliente, mediante una peti-
ción al servidor web, obtiene todos los dispositivos disponibles en formato JSON,
tratando los datos y mostrándolos formateados al cliente final en la interfaz web.
57
3.2.4. Empaquetado y Despliegue
Esto nos permitirá empaquetar el sistema web en un fichero jar funcional. Tras ejecu-
tar el comando, el paquete sera enviado a la carpeta target.
En nuestro caso usaremos la imagen “openjdk:11”, la cual nos permite ejecutar apli-
caciones java. Ademas, deberemos copiar el paquete previamente creado y exponer el
puerto de la api, 8080. El fichero docker quedaría asi:
58
FROM openjdk:11
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EXPOSE 8080
docker build .
59
services:
mqtt:
container_name: mosquitto_mqtt
image: eclipse-mosquitto:1.6
restart: always
ports:
- "1883:1883"
- "9001:9001"
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/log:/mosquitto/log
- ./mosquitto/data:/mosquitto/data
Por ello, desplegaremos un servicio de nginx, que nos permitirá obtener los datos de la
pagina web desde un volumen, en concreto, de un directorio del host. Esto permitirá
que la url del servidor pueda ser modificada alterando un archivo, y elimina la com-
plejidad de crear un contenedor donde debemos acceder a el para modificar dicho
archivo.
60
Para ello seguimos el siguiente fichero:
client_website:
container_name: client_website
image: nginx
volumes:
- ./clienteJs:/usr/share/nginx/html
restart: always
ports:
- "80:80"
version: '3.8'
services:
mqtt:
container_name: mosquitto_mqtt
image: eclipse-mosquitto:1.6
restart: always
ports:
- "1883:1883"
- "9001:9001"
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/log:/mosquitto/log
- ./mosquitto/data:/mosquitto/data
springserver:
container_name: web_server
image: rafaelom/tfgmayo
restart: always
61
ports:
- "8080:8080"
environment:
mqttUrl: mqtt
client_website:
container_name: client_website
image: nginx
volumes:
- ./clienteJs:/usr/share/nginx/html
restart: always
ports:
- "80:80"
62
4
Conclusiones y Líneas
Futuras
En este capitulo, se especifican las conclusiones obtenidas tras la realización del pro-
yecto completo, y se plantean una serie de lineas futuras que podrían partir de este trabajo
como base.
4.1. Conclusiones
Tras la realización del proyecto, obtenemos las siguientes conclusiones respecto a los
objetivos inicialmente planteados:
Creación de una “Api Rest”, para el control de los dispositivos desde una interfaz web.
63
Se ha desplegado el servidor mqtt “mosquitto” con éxito, así como la conexión con los
demás sistemas.
Por tanto, tal y como se planteo al inicio, se ha desarrollado un sistema donde los dis-
positivos se controlan mediante el protocolo mqtt, todo el sistema se encuentra en una red
local, y se encuentra empaquetado , para una mayor facilidad de instalación y uso.
64
4.2. Líneas Futuras
65
5. Implementar seguridad en el sistema:
Se propone dotar el sistema de más seguridad, de forma que este pueda ser expuesto
al exterior sin poner en riesgo la integridad del mismo. Existen gran cantidad de herra-
mientas a aplicar, pero destacamos el uso de “SSL” entre el servidor MQTT y el servidor
web, así como la creación de usuario y contraseña para cada miembro del sistema.
66
Referencias
[1] B. Anderson, Responsive and fast : implementing high-performance responsive design.
2014, ISBN: 1-4919-1293-6.
[6] B. StroustrupA, El lenguaje de programación C++. Addison Wesley, 1998, ISBN: 84-7829-
019-2.
[8] P. Porcuna López, Robótica y domótica básica con Arduino. 2015, ISBN: 84-9964-610-7.
[10] J.-P. Gouigoux, Docker: Primeros pasos y puesta en práctica de una arquitectura basada
en micro-servicios. 2018, ISBN: 2409015905.
[12] T. Pulver, Hands-on internet of things with MQTT : build connected IoT devices with
Arduino and MQ telemetry transport (MQTT). 2019, ISBN: 1-78934-500-6.
67
[14] R. Hat, What is REST, https://www.redhat.com/es/topics/api/what-is-a-rest-
api, [Online; Se accedio el 6 de Abril de 2022].
[17] J. C. Braun, Desarrollo de Servicio REST API para el uso seguro de dispositivos IoT,
https : / / riuma . uma . es / xmlui / handle / 10630 / 18899, [Trabajo final de grado],
2019.
68
Apéndice A
Manual de
Instalación
En este apéndice se especifica la instalación del sistema web en un entorno donde sea
posible ejecutar docker, y la carga del firmware de los dispositivos Iot.
Para el despliegue del servidor web, es necesario disponer de docker y docker compose
instalado en el sistema.
docker-compose up -d
Este comando levantara los tres contenedores que contienen a la aplicación en su totali-
dad, diviendo al sistema en tres servicios, servidor web, servidor mqtt y web cliente.
69
Figura 18: Servicios del sistema funcionando en docker
Una vez los tres contenedores están corriendo, deberemos obtener la dirección ip de la
red local del equipo en el que se encuentra docker, dado que esta ip sera necesaria a la hora
de configurar un dispositivo inteligente.
En caso de estar en un sistema ubuntu deberemos ejecutar:
ifconfig
70
2. En la linea 2, observamos la direccion ip “localhost”, la cual debe de ser modificada
por la direccion ip obtenida en el paso previo
Es muy importante que no eliminemos el directorio donde están dichos archivos del servi-
dor web, dado que dicho directorio se encuentra montado como un volumen en el sistema
de docker.
Como hemos explicado previamente, el software para el control de los dispositivos, esta
diseñado para ser configurado en diferentes situaciones, por tanto, solo deberemos instalar
un software genérico en todos los dispositivos.
Para ello, el desarrollo del software se ha llevado a cabo en el ide “Visual Studio Code”, junto
con la extensión de “Platform.io”, por tanto la recomendación es instalalar dicha herramien-
ta e iniciar el flasheo desde ahi.
71
72
Apéndice B
Manual de
Usuario
En este apéndice se pretende explicar al usuario el uso del sistema completo, partiendo
desde la configuración inicial de los dispositivos Iot, hasta el servidor web.
73
Figura 20: Configurar un dispositivo automáticamente
Dispositivo On/Off
Se trata del dispositivo mas básico de todos, este permite el encendido y apagado de
un dispositivo tipo On/Off del Hogar.
Una vez hemos realizado el paso previo, deberemos dirigirnos hacia “New Device”>“Find
new devices”
74
Figura 21: Buscar nuevo dispositivo
75
Figura 23: Dispositivo en estado On
Persiana
Para agregar el dispositivo de tipo persiana, deberemos seleccionar la opción “Per-
siana”, en la configuración inicial del dispositivo, de esta forma, tras acceder al panel
principal y acceder “Find new Devices”, deberemos ver la siguiente pantalla, donde
deberemos pulsar sobre “Add device“:
76
Figura 25: Persiana agregada
2. Fecha hacia abajo: pulsándola, desencadenamos una acción que comienza a ba-
jar la persiana, en caso de estar completamente abierta no se realiza ninguna
acción
77
Figura 26: Buscar control remoto de persiana
78
Tras elegir el dispositivo y guardar los cambios podemos observar el nuevo dispositivo
en el panel de usuario, donde indica el dispositivo controlado.
Ahora desde el dispositivo físico podremos controlar la persiana.
79
Figura 29: Búsqueda de dispositivo sensor de luminosidad
80
Figura 30: Indicar limite inferior y superior
81
B.2. Configuración Manual
82
Figura 32: Configurar un dispositivo manualmente
83
B.2.2. Servidor web
Para ello deberemos acceder a la interfaz cliente, y pulsaremos sobre “New Device>Add
device Manually”
84
Finalmente, tras pulsar en “save changes”, veremos el nuevo dispositivo en nuestro panel
principal.
85
B.3. Modificar un dispositivo
Los atributos de los dispositivos añadidos pueden ser modificados, aunque solo es re-
comendable cambiar el nombre de los mismos, dado que modificar las rutas mqtt, pueden
afectar al funcionamiento del mismo.
Para editar un dispositivo seguiremos los siguientes pasos:
2. Después, cuando se abra el formulario, modificamos los campos que deseemos, y pul-
samos sobre “Modify”
86
Figura 37: Modificación del nombre de un dispositivo
87
3. Finalmente, observamos el nuevo nombre del dispositivo:
Para ello el proceso es muy simple. Deberemos acceder al panel principal y pulsar sobre
la rueda :
88
Después, en el formulario, presionaremos “Remove”, de forma que el dispositivo quedara
eliminado
89
E.T.S de Ingeniería Informática
Bulevar Louis Pasteur, 35
Campus de Teatinos
29071 Málaga
E.T.S. DE INGENIERÍA INFORMÁTICA