Saltar al contenido principal

Control MQTT programado

tip

El control MQTT programado está destinado a mensajes programados con antelación. Para control en vivo, consulte Control MQTT en vivo en su lugar.

Esta guía le ayudará a configurar MQTT en su SmartgridOne Controller para controlar y monitorear de forma remota instalaciones de baterías y paneles solares.

Qué necesita

  1. SmartgridOne Controller con conectividad a internet.
  2. Credenciales MQTT: Esto se puede solicitar enviando un correo electrónico a support@eniris.be.
  3. Entorno de desarrollo de Python (o cualquier otro cliente MQTT). Esta guía utiliza un ejemplo básico escrito en Python para ayudarlo a comenzar con MQTT y el envío de comandos. Recomendamos usar Python por su facilidad de uso, pero se admite cualquier otro cliente MQTT.

Información extra

MQTT es un protocolo de comunicación rápido a través de internet. Es un sistema de mensajes de publicación/suscripción, que permite una conexión directa entre su máquina y el SmartgridOne Controller. Sus activos se clasifican en grupos de solar, batería, EV y HVAC. En este momento, esta integración permite el control por grupo, no por dispositivo.

Configuración inicial (Punto de partida para nuevos usuarios)

Tengo un SmartgridOne Controller que me gustaría configurar para Control Remoto MQTT.

1. Verifique su red

Asegúrese de que su red permita tráfico de red mqtt a través del puerto 1883. Puede hacer esto usando el comando:

nc -zv mqtt.eniris.be 1883

Cuando este comando no está disponible, puede descargar y ejecutar este código python como alternativa.

Cuando tenga dudas, consulte a su ingeniero de red o use temporalmente el punto de acceso 4G/5G de su teléfono cuando ocurran errores de conexión.

nota

Cuando el puerto 1883 no es accesible desde su red, ofrecemos una copia de seguridad en el puerto 80. Esto se puede configurar en su cliente MQTT en un paso posterior de este manual.

2. Agregar sus dispositivos

Inicie sesión en la interfaz de puesta en marcha y asegúrese de que los dispositivos estén añadidos al SmartgridOne Controller.

3. Agregar la señal externa MQTT

Imagen 1
Imagen 1
Imagen 1

4. Habilitar señal remota MQTT

Seleccione todos los dispositivos que desea incluir en el Control Remoto MQTT.

Imagen 1

5. Señal remota añadida

La interfaz de Control Remoto MQTT ahora ha sido activada en el SmartgridOne Controller.

Ahora estamos listos para enviar algunos comandos básicos utilizando un ejemplo simple. La columna de Estado le indica si algún comando está activo.

Script de demostración en Python

Un buen punto de partida sería probar su integración recién configurada con un ejemplo simple.

Este código de prueba realiza una tarea simple de enviar continuamente el siguiente horario:

  • Batería: Cargar a 5 kW durante 15 minutos en 10 minutos.
  • Solar: Configurar potencia a 0 kW durante una hora en 30 minutos.

El SmartgridOne Controller responde con un mensaje de confirmación que contiene el identificador único del horario, o un mensaje de error.

Luego obtenemos el siguiente horario para ambos tipos de dispositivos, confirmando que el comando fue exitoso.

Por favor, descargue el archivo a continuación en su IDE de Python preferido. Complete su número de serie y credenciales MQTT y ejecute el script:

Cuando lo anterior sea exitoso, puede continuar enviando otros tipos de mensajes. Todos los mensajes están descritos a continuación.

Documentación MQTT para Envío de Comandos

Esta sección detalla el formato de mensajería MQTT y los requisitos de carga útil para configurar el control programado de dispositivos dentro de la red del SmartgridOne Controller.

Temas MQTT

  • Tema de Suscripción: standard1/rp_one_s/remoteScheduleMetrics/<controller SN>
  • Tema de Feedback: standard1/outbound/remoteScheduleMetrics/feedback/<controller SN>

Donde <controller SN> debe ser reemplazado con el número de serie real del SmartgridOne Controller que pretende controlar.

Tipos de Mensajes MQTT

1. Establecer Horario (set_schedule)

Crea un nuevo horario para un tipo de dispositivo.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "set_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint en watts>,
"remove_overlap": <True/False> (Opcional) (default=False),
"tag": <Tag String> (Opcional) (default=None),
}
}

Respuesta (Éxito):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedule_ack",
"state": {
"schedule_id": <Schedule ID>,
"deleted_ids": <Schedulde IDs deleted if remove_overlap=True>
"tag": <Tag String> (default=None),
},
"responseCode": 0
}
}

2. Establecer Horarios (set_schedules)

Crea múltiples nuevos horarios.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "set_schedules",
"fields":
"0": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint en watts>,
"remove_overlap": <True/False> (Opcional) (default=False),
},
"1": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint en watts>,
"remove_overlap": <True/False> (Opcional) (default=False),
},
...
}

Respuesta (Éxito):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedules_ack",
"state": {
"schedule_ids": <Schedule IDs>,
"deleted_ids": <Schedulde IDs deleted if remove_overlap=True>
},
"responseCode": 0
}
}

3. Obtener Horario (get_schedule)

Recupera un horario específico por ID.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedule",
"fields": {
"id": <Schedule ID>
}
}

Respuesta:

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

4. Obtener Horario Activo (get_active_schedule)

Recupera el horario actualmente activo para un tipo de dispositivo.

{
"extraTags": {
```json
{
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_active_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcional),
}
}

Response (Éxito):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_active_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

5. Obtener Próximo Horario (get_next_schedule)

Recupera el próximo horario programado para un tipo de dispositivo.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_next_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcional),
}
}

Response (Éxito):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_next_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

6. Obtener Horarios (get_schedules)

Recupera todos los horarios para una fecha específica.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedules",
"fields": {
"date": "<Date String of Format dd/mm/yyyy>"
}
}

Response (Éxito):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedules_ack",
"state": {
"schedules": [<Schedule>, ...]
},
"responseCode": 0
}
}

7. Obtener Horarios Futuros (get_future_schedules)

Recupera todos los horarios futuros.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_future_schedules",
"fields": {}
}

Response (Éxito):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_future_schedules_ack",
"state": {
"schedules": [<Schedule>, ...]
},
"responseCode": 0
}
}

8. Eliminar Horario (remove_schedule)

Elimina un horario específico por ID.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "remove_schedule",
"fields": {
"id": <Schedule ID>
}
}

Response (Éxito):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "remove_schedule_ack",
"state": "Horario <Schedule ID> eliminado exitosamente",
"responseCode": 0
}
}

9. Obtener Retroalimentación del Sitio (get_feedback)

Recupera retroalimentación detallada sobre el estado del sistema.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_feedback",
"fields": {
"device": <Device (node) level>
}
}

Response (Éxito):

Estructura de Carga de Retroalimentación

10. Topología del Sitio (get_toplogy)

Obtiene la topología del sitio.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_topology",
"fields": {}
}

Response (Éxito):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_topology_ack",
"state": {
"nodeId": <nodeId>,
"nodeType": <nodeType>,
"children": [{<ChildObject>}]
},
"responseCode": 0
}
}

Formato de Respuesta de Horario Estándar

{
"id": <Schedule ID>,
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Schedule Policy>",
"power_setpoint_w": <Setpoint in watts>,
"created_at": <Unix Timestamp>
}

Tipos de Componentes y Políticas

Para detalles sobre los componentes y políticas disponibles que se pueden programar, consulte la sección de Componentes y Políticas MQTT en la documentación de Control MQTT en Vivo.

Los horarios específicos del dispositivo se pueden enviar utilizando el campo opcional node_id, refiriéndose al ID del nodo del dispositivo controlable.

Manejo de Errores

Todos los mensajes pueden devolver una respuesta de error con responseCode: 1 cuando ocurre un error:

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "<Message Type>_ack",
"error": <Error Body>,
"responseCode": 1
}
}

Cuando ocurre un error no relacionado, el tipo de mensaje será (general_error).

Los errores comunes incluyen:

  • Superposición de horarios con horarios existentes
  • Rango de tiempo inválido
  • Tipo de dispositivo no encontrado
  • ID de horario no encontrado
  • Política inválida para el tipo de dispositivo

Reglas de Gestión de Horarios

  1. Reglas de Superposición
    • Los horarios no pueden superponerse para el mismo tipo de dispositivo
    • Los horarios no pueden superponerse para el mismo dispositivo
    • Los horarios para el mismo dispositivo y tipo de dispositivo no pueden superponerse
    • Los horarios existentes y superpuestos se eliminarán si la variable remove_overlap está configurada en True al crear un nuevo horario.
  2. Cada horario debe tener:
    • Un tipo de dispositivo válido
    • Un tiempo de inicio (marca de tiempo Unix)
    • Un tiempo de finalización (marca de tiempo Unix)
    • Una política (que coincida con las políticas disponibles para el tipo de dispositivo)
    • Un punto de ajuste de potencia (para políticas que lo requieran)
  3. El tiempo de inicio debe ser anterior al tiempo de finalización
  4. Si el tiempo de inicio está en el pasado, se cambia automáticamente para comenzar ahora
  5. Los horarios solo se pueden eliminar si no han comenzado aún. Los horarios activos no se pueden eliminar.
  6. Los horarios se pueden establecer para diferentes tipos de dispositivos de forma independiente
  7. El sistema aplica automáticamente la política apropiada cuando un horario se vuelve activo.