Ir al contenido

← Todas las funcionalidades

Seguidores solares de dos ejesRaspberry PLC 21systemdInfraestructura

Hacer que un controlador de seguidor sobreviva a los reinicios con systemd

Los controladores en campo se reinician: caídas de tensión, watchdogs que saltan, técnicos que cortan magnetotérmicos. En un despliegue real de seguidor solar de dos ejes, dos servicios systemd mantienen el Raspberry PLC 21 autosuficiente — solar-tracker.service ejecuta el proceso de control en Python y tracker-ap.service vigila el botón del hotspot — mientras Node-RED sirve un dashboard con pestañas de control, calibración, inversor y configuración tras autenticación con Authelia. Este ejemplo es el fichero de unidad comentado más sus pasos de instalación.

Anatomía del fichero de unidad

La unidad espera a network-online.target, ejecuta el script de control como servicio simple desde su directorio de trabajo y usa root porque socketcan y GPIO lo requieren. Cada print acaba en journald, así que journalctl -u solar-tracker.service -f sustituye al depurado por SSH y tail. Habilita la unidad una vez y el controlador del seguidor arranca en cada reinicio, sin supervisión, exactamente el comportamiento que un emplazamiento remoto exige desde el primer día.

Política de reinicio sin tormentas de reinicios

Restart=always con RestartSec=10 revive el proceso tras una excepción de CAN o un crash, lo que en un emplazamiento remoto es la diferencia entre una línea de log y un desplazamiento de técnico. Los ajustes StartLimit acotan los reintentos: diez fallos en cinco minutos detienen el bucle, dejando una unidad claramente en fallo para su diagnóstico en lugar de un PLC quemando CPU indefinidamente con un error irresoluble.

Dos servicios, un mismo patrón

El vigilante del botón del punto de acceso es el mismo fichero de unidad con otra Description y un ExecStart apuntando a manage_ap.py — los comentarios de cabecera documentan los pasos de copiar y editar. Separar el controlador y el punto de acceso en servicios distintos hace que un crash en uno nunca perturbe al otro, y cada uno puede reiniciarse de forma independiente desde la línea de comandos durante la puesta en marcha o la resolución de problemas.

Un fragmento de la implementación

Tal cual del ejemplo desplegado en el Raspberry PLC 21 — cópialo libremente:

[Unit]
Description=Solar tracker control (PyEphem + CANopen + TCP Node-RED)
# Starts once the network is up and the CAN bus is already configured
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
# Main tracker control script
ExecStart=/usr/bin/python3 /home/pi/tracker/main.py
WorkingDirectory=/home/pi/tracker
# Needs root for socketcan and GPIO
User=root

# Automatic restart if the process dies (CAN bus failure, exception, etc.)
Restart=always
RestartSec=10

# Logs to journald (check with journalctl -u solar-tracker.service)
StandardOutput=journal
StandardError=journal

# Avoid aggressive restart loops if something is truly broken
StartLimitIntervalSec=300
StartLimitBurst=10

[Install]
WantedBy=multi-user.target

El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.

Preguntas frecuentes

¿Por qué ejecutar el servicio como root en lugar de con un usuario dedicado?

El proceso de control necesita acceso directo a la interfaz CAN y a los dispositivos de caracteres de GPIO. Puedes endurecerlo con permisos de grupo y reglas udev, pero en un PLC industrial de propósito único, root con una imagen endurecida es la línea base pragmática.

¿Cómo encaja Authelia delante de Node-RED?

Authelia actúa como portal de autenticación delante del dashboard, de modo que cada pestaña — control, calibración, inversor, configuración — requiere login. Node-RED permanece enlazado en local y nunca queda expuesto a la red sin autenticación.

¿Cómo compruebo por qué falló el servicio en campo?

systemctl status solar-tracker.service muestra el último estado y el código de salida, y journalctl -u solar-tracker.service --since today da el log completo. Como StandardOutput va a journald, no hay ficheros de log aparte que rotar.

Funcionalidades relacionadas