Validación y guardado
Al guardar, se comprueba cada función modificada:
- Entrada requerida sin asignar: un puerto obligatorio no tiene fuente.
- Incompatibilidad de tipos: una conexión o enlace cuyos tipos no coinciden (sin conversión seleccionada).
- Destino no permitido: una salida dirigida a un objeto en el que no debe escribir.
- Bucle sin bloque de temporización: un bucle de realimentación que se ejecutaría indefinidamente; inserte un bloque de temporización para validarlo.
Guardar siempre está permitido, pero una función que no supera la validación se guarda desactivada («desactivada por validación») y no se ejecuta hasta que se corrija. El resultado se notifica («Guardado. Una función presenta problemas y permanece desactivada.») y el panel de validación enumera cada problema señalando la tarjeta, el puerto o la conexión exacta.
📘 Nota: Esto es deliberado: permite guardar una hoja sin terminar al final de la jornada sin alterar lo que ya está en funcionamiento.

Monitorización y mantenimiento
Cambie el lienzo a Monitor para observar la ejecución de la lógica: los valores en tiempo real aparecen en puertos y conexiones, y cada tarjeta muestra un pie de estado:
| Estado | Significado |
|---|---|
| OK | En funcionamiento normal; muestra la hora de la última ejecución. |
| SUSPENDED | Una anulación manual desde la aplicación la ha pausado (un usuario ha movido la persiana manualmente). Muestra la cuenta atrás restante y un botón Reanudar ahora. |
| DISABLED | Desactivada: por el usuario o por la validación. |
| ERROR | Error en lenguaje claro, p. ej., entrada inactiva: «sensor sin señal durante 18 min — salida retenida». |
Historial de ejecución. Abra el historial de una función para ver sus últimas ejecuciones —cada una con los valores de entrada y las salidas generadas— y exporte el registro. Esta es la respuesta a «¿por qué se han movido las persianas a las 14:02?».
Prueba / simulación. Para realizar pruebas sin esperar a las condiciones reales, fuerce un valor de entrada:
- Abra el cuadro de diálogo de prueba de la función y seleccione el puerto de entrada.
- Introduzca el valor forzado y la duración en Revertir tras (por defecto 15 minutos, máximo 1 hora).
- Haga clic en Forzar valor. El puerto se marca como SIM; el enlace real permanece inalterado por debajo.
El servidor revierte el valor forzado mediante su propio temporizador (cerrar la pestaña del navegador no dejará la simulación activa) y tanto el inicio como el fin de la simulación quedan registrados en el historial de ejecución.
Eliminar una función. Al eliminar, se muestra primero un cuadro de diálogo de impacto: qué funciones consumen sus salidas y qué widgets materializados ha creado; para cada widget, elija conservarlo (continúa existiendo como un dispositivo virtual normal) o eliminarlo también.

Protecciones de seguridad
El motor protege la instalación frente a errores lógicos:
- Ruptura de bucles: un límite de profundidad de propagación detiene las cadenas que forman bucles a través de los dispositivos para evitar ejecuciones infinitas.
- Limitación de frecuencia: una función descontrolada (20 ejecuciones en 10 segundos) se suspende automáticamente durante 60 segundos y se marca en modo Monitor, en lugar de saturar el bus.
- Dimensionamiento: la recomendación general es de unas 200 funciones por instalación. Por encima de esa cifra, se aconseja consolidar (un único valor calculado con 8 entradas en lugar de un árbol de sumas) y evaluar si parte de la lógica debe residir en los propios dispositivos.
📘 Nota: Estas protecciones limitan los daños; no sustituyen al diseño del proyecto. Cualquier función crítica que no deba fallar bajo ningún concepto (viento, heladas) debe protegerse también en los propios parámetros del actuador.