# 4 Guía MQTT

## ¿Qué es MQTT?

MQTT es un protocolo de mensajería simple y liviano, diseñado para dispositivos con poca memoria y con bajo ancho de banda. Esto significa que es la solución perfecta para las aplicaciones de Internet de las cosas y automatización del hogar y, por lo general, es más flexible, estable y confiable que otros protocolos como WebSockets. MQTT te permite enviar comandos para controlar salidas digitales, leer y escribir datos en sus dispositivos y más.

## Conceptos básicos de MQTT

En MQTT hay 3 conceptos básicos:

### **Temas (Topics):**&#x20;

Estos funcionan como la dirección de una casa, en este caso son las direcciones de un mensaje y determinan a donde se debe entregar, así es como se vería un tema con su respectivo mensaje:

**Topic:** `MiCasa/Sala/Lampara`&#x20;

**Mensaje:** `Encender`

aquí el tema es Micasa/Sala/Lámpara y el mensaje es Encender, en este caso la lámpara recibirá el mensaje y se encenderá. Esta es la estructura básica de todos los mensajes que se envían a través de MQTT

### **Sistema de Publicación y Subscripción**&#x20;

Cada dispositivo puede suscribirse a temas, y recibirá todos los mensajes enviados con los temas a los que están suscritos. pueden suscribirse a múltiples temas y también a subtemas.&#x20;

Además, al publicar un mensaje, los dispositivos deben proporcionar el tema para que el mensaje se pueda entregar correctamente.

{% hint style="info" %}
Un dispositivo que está suscrito a Casa/# recibirá mensajes enviados a Casa/Sala y también aquellos enviados a Casa/CuartoPrincipal con solo usar el signo **#**.&#x20;
{% endhint %}

### Broker:&#x20;

es el dispositivo central que permite y restringe las conexiones y también recibe, filtra, redirige y publica mensajes a todos los dispositivos conectados. En este caso, el Broker es el servidor de Smartnest.

## ¿MQTT es solo una herramienta para hablar con el servidor?

No, también puedes interconectar tus dispositivos usando este protocolo, por ejemplo, si tienes un sensor de movimiento y un sistema de iluminación, y están demasiado lejos el uno del otro, no necesitas instalar cables en la habitación para permitirles comunicarse, puedes hacer que la luz se suscriba al tema Casa/Dormitorio/Luz y puede hacer que el sensor publique los datos en ese tema, de tal forma estarán conectados entre sí y al mismo tiempo que se conectarán a Smartnet y todas las integraciones.

## Smartnest y MQTT

En Smartnest, cada dispositivo tiene una ID único, este ID debe usarse como la primera parte de un tema.&#x20;

Si se está enviando un mensaje al broker, la primera parte del tema debe ser el ID del dispositivo que está enviando el mensaje.&#x20;

Si se está enviando el mensaje a otro de sus dispositivos, la primera parte del tema debería ser el ID del dispositivo al que envía el mensaje, el usuario puede personalizar las siguientes partes del tema.&#x20;

Por ejemplo, este sería un tema válido desde dispositivo para Smartnest Broker:

{% hint style="success" %}
**`Tema:`**` ``jasds3421FDC1CDSCDSfdsas/Habitacion/Temperatura`&#x20;

**`mensaje:`**`25`
{% endhint %}

Mientras que este sería un mensaje inválido

{% hint style="danger" %}
**`Tema:`**` ``Bedroom/Temperature`&#x20;

**`mensaje:`**`25`
{% endhint %}

El sistema solo permitirá la publicación de un mensaje si el ID es válido y pertenece al usuario que lo envía

## Comandos MQTT de Smartnest&#x20;

Hay algunos subtemas reservados para fines especiales. Aquí está la lista de todos los temas reservados:

#### Directivas:&#x20;

Las directivas son enviadas desde el servidor al dispositivo cada vez que hay un nuevo comando de alguna de las integraciones.

| Topic                              | Mensaje      | Descripción                        | Soportado por |
| ---------------------------------- | ------------ | ---------------------------------- | ------------- |
| **DeviceID/directive/powerState**  | ON - OFF     | Encendido o apagado                | Todos         |
| **DeviceID/directive/percentage**  | 0-100        | Porcentaje                         | Luz           |
| **DeviceID/directive/setpoint**    | -100 - 200   | Punto deseado de temperatura       | Termostato    |
| **DeviceID/directive/lockedState** | true - false | true significa cerrar la cerradura | Cerradura     |

#### Reportes

Los reportes son enviados desde el dispositivo al servidor para informar de algún cambio de estado. Estos reportes son enviados siempre después de recibir una directiva y también si se produce algún cambio debido a una interacción física como presionar un botón.

| Topic                              | Message      | Description                                     | Supported types                                     |
| ---------------------------------- | ------------ | ----------------------------------------------- | --------------------------------------------------- |
| **DeviceID/report/powerState**     | ON - OFF     | Nuevo estado de poder                           | Todos                                               |
| **DeviceID/report/percentage**     | 0-100        | Nuevo porcentaje                                | Luz                                                 |
| **DeviceID/report/setpoint**       | -100 - 200   | Nuevo punto deseado                             | Termostato                                          |
| **DeviceID/report/temperature**    | -100 - 200   | Nueva temperatura                               | <p>Termostato, </p><p>Sensor de Temperatura</p>     |
| **DeviceID/report/humidity**       | 0 - 100      | Nueva humedad                                   | <p>Termostato, </p><p>Sensor de Temperatura</p>     |
| **DeviceID/report/pressure**       | >0           | Nueva presión                                   | Sensor de Temperatura                               |
| **DeviceID/report/scale**          | C - F        | Seleccionar la escala de T                      | <p>Termostato, </p><p>Sensor de Temperatura</p>     |
| **DeviceID/report/lockedState**    | true - false | Disp. abierto o cerrado                         | Cerradura                                           |
| **DeviceID/report/online**         | true - false | El disp. está conectado                         | Todos                                               |
| **DeviceID/report/info**           | (Any)        | <p>Para mostrar en la aplicación </p><p>Web</p> | Todos                                               |
| **DeviceID/report/detectionState** | true - false | Nuevo valor lógico                              | <p>Sensor de Presencia , </p><p>Sensor Contacto</p> |
| **DeviceID/report/notification**   | (Any)        | Envía una notificación push                     | Todos                                               |

#### Solicitudes y respuestas

Las solicitudes son enviadas desde los dispositivos al servidor para solicitar información especial como la hora, el servidor responderá con un topic response y la información requerida en el mensaje.

| Topic                      | Message              | Description                                                                                                                                                           |
| -------------------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **DeviceID/request/time**  | <p></p><p>GMT+XX</p> | Obtener el tiempo real, el mensaje puede tener opcionalmente la zona horaria "GMT+XX", si la zona horaria no está presente en el mensaje se enviará la hora de GMT+00 |
| **DeviceID/response/time** | HH:MM:SS             | Responde la solicitud de hora.                                                                                                                                        |

## Reglas en MQTT en Smartnest

En Smartnest somos una comunidad de automatización del hogar y todos estamos utilizando los mismos recursos web, de tal modo que deben existir reglas para garantizar un servicio continuo, seguro y confiable. Estas son las reglas que todos deben seguir al usar comandos MQTT:

* La conexión al broker solo se permitirá cuando se proporcione un nombre de usuario y contraseña válidos&#x20;
* La conexión se permitirá cuando la ID del dispositivo utilizado pertenezca al nombre de usuario utilizado&#x20;
* La primera parte del topic MQTT debe ser un ID válido de uno de los dispositivos del usuario utilizado
* Se debe evitar enviar mensajes a los temas reservados con demasiada frecuencia y se debe enviar sólo cuando el estado del dispositivo ha cambiado.

{% hint style="warning" %}
los dispositivos que no sigan estas reglas se desconectan y bloquean automáticamente por el sistema, el primer bloqueo es por 1 minuto, el segundo es por 2 minutos el tercero por 4 y así sucesivamente.
{% endhint %}
