Este artículo proporciona información sobre cómo conectar un inversor solar Deye con el complemento MODBUS de Shelly Pro mediante la interfaz de comunicación RS485.
Introducción
Los hogares modernos dependen cada vez más de solutions de energía renovable para reducir gastos, aumentar la autonomía energética y participar en la optimización de las redes inteligentes. Este proyecto presenta un sistema de energía solar totalmente integrado, compuesto por un inversor Deye, una batería externa, paneles solares, una caja de distribución eléctrica con un ATS (interruptor de transferencia automática) y una red de monitorización Shelly Pro con Shelly Pro EM-50 y complemento RS485.
El sistema proporciona una supervisión continua de la producción, el consumo y el almacenamiento de energía, lo que permite tomar decisiones informadas relacionadas con la optimización de los costes energéticos, el autoconsumo y el control de las cargas. Además, al aprovechar el almacenamiento en baterías y algoritmos inteligentes, el sistema puede vender energía a la red cuando los precios de la electricidad son altos y almacenarla cuando son bajos.
Arquitectura del sistema
El sistema consta de:
-
Inversor monofásico Deye con entrada fotovoltaica y compatibilidad con almacenamiento en baterías
-
Banco de baterías externas de ion-litio con JK-BMS 200
-
Conjunto de paneles solares
-
Armario de distribución eléctrica con ATS
-
Medidor de energía Shelly Pro EM-50
-
Complemento RS485 Shelly Pro
-
Cableado de comunicación (alimentación y datos)
Esta arquitectura permite un flujo de energía fluido entre el conjunto fotovoltaico, el inversor, las cargas del hogar, el almacenamiento en baterías y la red. El ATS garantiza la transferencia automática de energía en caso de fallo de la red, manteniendo la continuidad del suministro.
Integración del hardware
1. Instalación y configuración del inversor Deye
El inversor Deye actúa como dispositivo de control central. Gestiona la energía fotovoltaica mediante el control MPPT, el acoplamiento de CA, la gestión de la batería de CC y la sincronización con la red. La puesta en servicio adecuada incluye configurar los modos del inversor (autoconsumo, venta a la red, uso según horario), establecer los límites de carga y descarga y definir los parámetros de compatibilidad de la batería.
2. Configuración del sistema de baterías
La batería externa se integra mediante comunicación CAN/RS485 para establecer un comportamiento de carga sincronizado con el inversor. Los pasos de configuración incluyen:
-
Límites de tensión y corriente
-
Configuración de la química de la batería
-
Programación de la carga y descarga
-
Permisos de exportación a la red
La configuración correcta garantiza que la batería almacene energía cuando el coste de la electricidad sea bajo y se descargue cuando resulte rentable.
3. Integración de paneles solares
Los paneles solares se cablean utilizando cableado de CC adecuado, protección contra sobretensiones y se conectan a las entradas fotovoltaicas del inversor. Las consideraciones de dimensionamiento incluyen la demanda energética, el rendimiento estacional y las normativas locales.
4. Armario de distribución eléctrica con ATS
El ATS integra el suministro de la red, la salida de CA del inversor y la distribución de carga del hogar. Cambia automáticamente a la energía del inversor durante un corte de la red, protegiendo los equipos electrónicos y manteniendo la continuidad operativa.
Hay otras formas de integrar un inversor en la distribución eléctrica de una vivienda. Se eligió este diseño para permitir la máxima flexibilidad en el mantenimiento del sistema y estaba destinado a un escenario aislado de la red, con conexión ocasional a la red y sin vender energía a la red.
Adquisición de datos y comunicación en la nube
El Shelly Pro EM-50 proporciona mediciones detalladas del flujo de energía en una o varias fases. Con el complemento RS485, se puede establecer comunicación Modbus-RTU para la adquisición de datos.
La integración en la nube permite:
-
Supervisión remota en tiempo real
-
Paneles de visualización
-
Flujos de trabajo de notificaciones
-
Registro histórico de datos
Panel de componentes virtuales
Para mostrar los datos recuperados del inversor, se utiliza un sistema integrado para ampliar los dispositivos Shelly: componentes virtuales.
El sistema produce nueve parámetros clave útiles tanto para la supervisión como para la toma de decisiones:
-
Potencia de generación solar
-
Consumo del hogar
-
Importación de la red
-
Exportación a la red
-
Nivel de carga de la batería
-
Tasa de carga/descarga de la batería
-
Eficiencia del inversor
-
Tensión/corriente fotovoltaica
-
Coste por kWh (dinámico)
Estos valores se visualizan en un panel unificado para las operaciones diarias.
Script de adquisición de datos mediante Modbus-RTU
El complemento RS485 de Shelly Pro transmite datos del inversor o la batería mediante el protocolo Modbus-RTU. Un script personalizado consulta el dispositivo a intervalos definidos y publica los resultados en la nube.
Las responsabilidades del script incluyen:
-
Mapeo de registros
-
Análisis y escalado de valores
-
Gestión de errores
-
Almacenamiento en caché de datos y envío al almacenamiento en la nube
Este script permite ciclos de retroalimentación en tiempo real para la automatización del control de cargas.
Script integrado de adquisición de datos
El sistema depende de una aplicación JavaScript integrada que se ejecuta en la plataforma Shelly Pro para comunicarse con el inversor y recopilar datos de rendimiento en tiempo real. El script recupera valores de los registros Modbus, los escala adecuadamente y los publica como componentes virtuales, lo que permite que los paneles y las automatizaciones consuman información estructurada.
Descargo de responsabilidad: el script se ha probado y funciona correctamente en 1.8.99-dev148102 revisión del firmware.
/* Shelly Europe Ltd. - Equipo de Integraciones Este ejemplo está dedicado a la comunicación mediante MODBUS-RTU con un inversor solar Deye. Versión basada en ENTITIES + componentes virtuales. */ const INVERTER_MODBUS_SERVER_ID = 1; // Obtener un punto final MODBUS-RTU: ID 1, velocidad en baudios 9600, 8 bits de datos, sin paridad, 1 bit de parada. const MODBUS_ENDPOINT = ModbusController.get(INVERTER_MODBUS_SERVER_ID, { baud: 9600, mode: "8N1", pause_ms: 2000 }); // Tabla ENTITIES que describe todos los parámetros y su asignación a componentes virtuales const ENTITIES = [{ name: "Potencia total", units: "W", reg: { addr: 175, rtype: ModbusController.REGTYPE_HOLDING, itype: "i16", bo: ModbusController.BE, wo: ModbusController.BE }, scale: 1, rights: "R", vcId: "number:200", handle: null, vcHandle: null }, { name: "Potencia de la batería", units: "W", reg: { addr: 190, rtype: ModbusController.REGTYPE_HOLDING, itype: "i16", bo: ModbusController.BE, wo: ModbusController.BE }, scale: 1, rights: "R", vcId: "number:201", handle: null, vcHandle: null }, { name: "Potencia FV1", units: "W", reg: { addr: 186, rtype: ModbusController.REGTYPE_HOLDING, itype: "u16", bo: ModbusController.BE, wo: ModbusController.BE }, scale: 1, rights: "R", vcId: "number:202", handle: null, vcHandle: null }, { name: "Potencia total de la red", units: "W", reg: { addr: 169, rtype: ModbusController.REGTYPE_HOLDING, itype: "i16", bo: ModbusController.BE, wo: ModbusController.BE }, scale: 10, rights: "R", vcId: "number:203", handle: null, vcHandle: null }, { name: "Estado de carga de la batería", units: "%", reg: { addr: 184, rtype: ModbusController.REGTYPE_HOLDING, itype: "u16", bo: ModbusController.BE, wo: ModbusController.BE, poll_int: 10000 }, scale: 1, rights: "R", vcId: "number:204", handle: null, vcHandle: null }, { name: "Tensión FV1", units: "V", reg: { addr: 109, rtype: ModbusController.REGTYPE_HOLDING, itype: "u16", bo: ModbusController.BE, wo: ModbusController.BE }, scale: 0.1, rights: "R", vcId: "number:205", handle: null, vcHandle: null }, { name: "Tensión de red L1", units: "V", reg: { addr: 150, rtype: ModbusController.REGTYPE_HOLDING, itype: "u16", bo: ModbusController.BE, wo: ModbusController.BE, poll_int: 10000 }, scale: 0.1, rights: "R", vcId: "number:206", handle: null, vcHandle: null }, { name: "Corriente L1", units: "A", reg: { addr: 164, rtype: ModbusController.REGTYPE_HOLDING, itype: "i16", bo: ModbusController.BE, wo: ModbusController.BE }, scale: 0.01, rights: "R", vcId: "number:207", handle: null, vcHandle: null }, { name: "Frecuencia de CA", units: "Hz", reg: { addr: 192, rtype: ModbusController.REGTYPE_HOLDING, itype: "u16", bo: ModbusController.BE, wo: ModbusController.BE, poll_int: 10000 }, scale: 0.01, rights: "R", vcId: "number:208", handle: null, vcHandle: null }, ]; function getScaledValue(ent) { return ent.handle.getValue() * ent.scale; } function updateVc(ent) { if (!ent.vcHandle) return; const new_val = getScaledValue(ent); const old_val = ent.vcHandle.getValue(); console.log(ent.name + ": " + old_val + " -> " + new_val + " [" + ent.units + "]"); ent.vcHandle.setValue(new_val); return old_val; } function init() { for (let i = 0; i < ENTITIES.length; i++) { let ent = ENTITIES[i]; ent.handle = MODBUS_ENDPOINT.addEntity(ent.reg); if (ent.vcId) { ent.vcHandle = Virtual.getHandle(ent.vcId); ent.handle.on("change", function (handle) { updateVc(ent); }); } } Timer.set(10000, false, function () { for (let i = 0; i < ENTITIES.length; i++) { updateVc(ENTITIES[i]); } }); } // Ejecutar la aplicación. init(); El resultado de la adquisición puede verse en la siguiente captura de pantalla.
Estrategias de gestión energética
1. Almacenamiento de energía cuando el precio es bajo
Las tarifas según el horario permiten cargar estratégicamente la batería durante los periodos de menor costo energético. El sistema se sincroniza con los datos de precios y programa las operaciones de carga de la batería en consecuencia.
2. Venta de energía a la red al precio máximo
Cuando los precios de la energía se disparan y el almacenamiento en batería es suficiente, el sistema exporta energía de vuelta a la red. Esto se controla mediante la configuración del inversor y reglas automatizadas de toma de decisiones.
3. Determinación del mejor momento para cargar el vehículo eléctrico
La carga del vehículo eléctrico puede optimizarse usando el excedente solar o electricidad barata de la red durante la noche. Entre los factores de decisión se incluyen:
-
Producción/consumo en tiempo real
-
Estado de carga de la batería
-
Precios de la red
-
Uso previsto del vehículo eléctrico
El motor de automatización puede cambiar las fuentes de carga o posponerla basándose en la lógica de costo-beneficio.
Caso de uso: equilibrio energético del hogar
Un flujo de trabajo diario típico:
-
Mañana: la energía solar alimenta las cargas del hogar; el excedente comienza a cargar la batería
-
Por la tarde: el excedente de energía carga completamente la batería y se exporta a la red
-
Tarde: la batería se descarga para reducir las importaciones de la red cuando el costo es más alto
-
Noche: la batería se carga desde la red si la electricidad nocturna es más barata
-
En cualquier momento: la carga del vehículo eléctrico se programa solo cuando es cost-efficient
Beneficios
-
Menor costo de electricidad
-
Ingresos por la exportación a la red
-
Mayor resiliencia y autonomía
-
Consumo de energía sostenible y transparente
-
Escalable para futuros devices e integración con smart home
Conclusión
Este proyecto demuestra cómo combinar hardware disponible comercialmente y herramientas de código abierto para crear un potente sistema de optimización energética. Con monitoreo en tiempo real, toma de decisiones automatizada y gestión inteligente del almacenamiento, los hogares pueden participar activamente en los ecosistemas energéticos modernos, minimizando los costos y maximizando la sostenibilidad.

