Riego agrícola automatizadoRaspberry Pi (Docker)Modbus TCPAdquisición
Leer un inversor Fronius por SunSpec Modbus TCP
¿Por qué pagar electricidad de red para regar cuando los paneles ya están produciendo? Este ejemplo lee un inversor Fronius por SunSpec Modbus TCP desde una Raspberry Pi: potencia AC generada (modelo 113, float32) más el consumo medido por el Smart Meter (modelo 211). Con ambos valores se calcula el excedente solar en tiempo real y se autoriza la bomba solo cuando la fotovoltaica puede con ella. Es la capa de adquisición exacta que funciona en un despliegue real de riego automatizado.
SunSpec hace el trabajo pesado
En lugar de buscar direcciones de registro a mano en el manual del inversor, el cliente pysunspec2 llama a scan() y autodescubre todos los modelos SunSpec que el Fronius expone en el puerto 502. La potencia generada queda entonces a un atributo de distancia: inverter_three_phase_float[0].W.value. El mismo objeto de dispositivo expone el Smart Meter como meter[0], así que una única conexión TCP te da los dos extremos del balance energético.
Excedente, no solo producción
La generación por sí sola engaña — puede que la finca ya esté consumiendo la mayor parte. El script resta la lectura del contador a la salida del inversor para obtener el excedente exportable real, y solo autoriza el riego por encima de un umbral configurable (4 kW en el ejemplo, dimensionado para la bomba). Esa decisión alimenta la orden Modbus hacia el Schneider Altivar 320 que mueve la bomba.
Preparado para sobrevivir a la noche
Los inversores Fronius apagan su interfaz Modbus al anochecer, así que un poller ingenuo se cae cada tarde. El bucle de lectura captura los fallos, los registra y reintenta en el siguiente ciclo en lugar de abortar. En producción el mismo código corre dentro de un contenedor Docker en la Raspberry Pi y publica los valores en Node-RED, donde los consumen la lógica de riego y el bot de Telegram.
Un fragmento de la implementación
Tal cual del ejemplo desplegado en el Raspberry Pi (Docker) — cópialo libremente:
def connect():
"""Opens the Modbus TCP connection and scans the device's SunSpec map."""
d = SunSpecModbusClientDeviceTCP(
slave_id=SLAVE_ID, ipaddr=INVERTER_IP, ipport=INVERTER_PORT
)
d.scan() # auto-discovers the available SunSpec models
return d
El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.
Preguntas frecuentes
¿Tengo que configurar algo en el inversor Fronius?
Sí, activa el esclavo Modbus TCP en los ajustes del inversor, selecciona float como tipo de datos SunSpec y mantén el puerto 502 por defecto. El Smart Meter debe estar registrado en el inversor para que el modelo 211 quede expuesto.
¿Qué diferencia hay entre los modelos SunSpec 113 y 211?
El modelo 113 es el bloque de inversor trifásico con registros float32, que informa de lo que genera el inversor. El modelo 211 es el bloque de contador trifásico, que informa de lo que la instalación importa o exporta en el punto de conexión a red.
¿Puedo usar esto con inversores de otras marcas?
Cualquier inversor que implemente el estándar SunSpec Modbus funciona con el mismo código, ya que pysunspec2 descubre los modelos dinámicamente. Solo pueden cambiar el slave id, la dirección IP y los nombres de modelo disponibles.