Lógica a medida: automatizaciones avanzadas y el caso del crop steering
Cómo el constructor de automatizaciones de Growcast expresa cualquier lógica de control con ocho piezas, qué protecciones lo rodean y cómo se lee el crop steering como árbol.
La mayoría de los controladores ofrecen dos herramientas: un temporizador y un activador por umbral. Con eso se resuelven una luz y un extractor. No se resuelve «ventilar sólo cuando afuera hace más frío que adentro, nunca con humedad alta, y esperar diez minutos antes de arrancar», ni «regar hasta llegar a un nivel y después mantenerlo con pulsos cortos cada vez que baje un 10 %». Ese tipo de regla no es exótica: es el día a día de un proceso bien llevado.
El constructor de automatizaciones de Growcast parte de otra idea. Una automatización es un árbol de piezas que responden verdadero o falso, y el valor de la raíz es el estado de una salida. Si se puede describir cómo debería comportarse el proceso, el árbol lo puede expresar. El temporizador y el activador son dos árboles chicos, no el techo.
Un árbol, una salida
Las piezas vienen en dos familias, las mismas en las que el editor separa el menú de agregar nodo. Las condiciones preguntan algo y responden verdadero o falso:
- Condición ambiental: compara una variable contra un valor y es verdadera mientras la comparación se cumpla. El valor puede ser fijo o puede ser otra variable, con una diferencia opcional.
- Rango horario: verdadera dentro de la franja definida, con los días de la semana que se elijan.
- Promedio: promedia entre 2 y 5 variables analógicas del mismo dispositivo y compara ese promedio contra una referencia.
- Grupo: junta condiciones con Y (tienen que cumplirse todas) o con O (alcanza con una). De 2 a 8 por grupo.
Los modificadores no preguntan nada: toman el resultado que les llega y lo transforman antes de que alcance la salida:
- Oscilador: mientras su condición esté activa, pulsa: tantos segundos encendido y tantos apagado. Mínimo 5 segundos por fase.
- Retardo: demora el encendido, y sólo el encendido. Al dejar de cumplirse la condición, la salida se apaga al instante. Entre 5 segundos y 6 horas.
- Memoria: se queda activa aunque su condición deje de cumplirse, hasta que la señal de reset la apague. Si ambas llegan juntas, gana el reset.
- Inversor: devuelve lo contrario de su condición.
El árbol se arma en la nube, se compila a un formato compacto y se envía al dispositivo, que lo evalúa en su propio ciclo de control. Por eso cada pieza pide una versión mínima de firmware. Si el equipo está más atrás, la plataforma rechaza la regla al guardar y dice qué pieza no puede correr.
| Pieza | Firmware mínimo |
|---|---|
| Oscilador | 2.4.1 |
| Retardo | 2.4.2 |
| Inversor | 2.5.1 |
| Memoria | 2.5.2 |
| Promedio y referencia dinámica | 2.5.4 |
Ejemplo 1: un extractor con histéresis
Se quiere que el extractor arranque cuando la temperatura pase de 28 °C y que no se apague hasta que baje de 25 °C. Un activador por umbral no sabe hacer eso: con un solo valor, la salida vibra alrededor de 28.
No hay un nodo «histéresis». Hay una memoria, y la histéresis es lo que una memoria hace cuando su set y su reset son dos comparaciones distintas sobre la misma variable:
Entre 25 y 28 la memoria conserva lo último que decidió. Si venía encendida, sigue encendida; si venía apagada, sigue apagada. Y si por alguna razón las dos señales coinciden, gana el reset: ante la duda, el extractor se apaga. Esa prioridad no es un detalle de implementación, es lo que hace que la pieza sea honesta. Se sabe exactamente qué pasa en el caso raro, porque está escrito.
Ejemplo 2: deshumidificar de noche, y sólo si la bomba no está funcionando
Ahora una regla con tres condiciones que se cruzan. Deshumidificar sólo entre las 22:00 y las 06:00, sólo si la humedad relativa está por encima del 65 %, y nunca mientras la bomba esté encendida, porque el pico de humedad que deja un lavado o un riego es esperado y no vale la pena perseguirlo.
Tres cosas para leer ahí. Primero, la condición sobre la bomba es una comparación contra otra salida, no contra un sensor: una salida digital también es una variable, y su estado se puede usar como entrada de otra regla. Segundo, el inversor convierte «bomba encendida» en «bomba apagada» sin necesitar un nodo especial. Tercero, el retardo de 120 segundos hace que abrir una puerta un momento no dispare el equipo: la humedad tiene que sostenerse dos minutos por encima del umbral. Y como el retardo demora sólo el encendido, apenas la humedad baja el deshumidificador se apaga sin esperar.
Un detalle que la plataforma resuelve sola: un rango que cruza la medianoche no se arma igual que uno que no la cruza. De 06:00 a 14:00 hay que cumplir las dos puntas a la vez; de 22:00 a 06:00 alcanza con una. Se escribe el desde y el hasta, y el árbol correcto se genera solo.
Ejemplo 3: comparar contra otra variable
Una condición ambiental puede compararse contra un valor fijo o contra otra variable, con una diferencia opcional. «Que la temperatura exterior esté por lo menos dos grados por debajo de la interior» es una sola condición, y se mantiene sola aunque cambie el clima. Si el interior lo miden tres sondas, el promedio las junta y compara la media contra la referencia. Reglas relativas como esta son las que separan un controlador de un sistema que entiende que el ambiente está dentro de un clima que también cambia.
Protecciones
Un árbol que puede expresar cualquier cosa también puede expresar un error. Las protecciones rodean al árbol en cuatro capas, todas reales.
- Estado de seguridad. Cada condición ambiental define qué devuelve cuando la variable no está disponible, por ejemplo si el sensor dejó de reportar. Es la decisión más importante del árbol, porque es la que corre justo cuando algo salió mal. Una bomba que depende de un sensor de nivel debería fallar apagada. Un extractor de emergencia, probablemente encendido.
- Protección de salida. Al margen de la lógica, cada automatización puede llevar una protección de entre 5 y 3599 segundos que evita que la salida cambie de estado más seguido que eso. Es el seguro para un relé o un compresor que no debería conmutar cada diez segundos aunque el árbol lo pida.
- Los límites del equipo. La lógica corre en el dispositivo, así que tiene que entrar en su memoria. Un grupo admite entre 2 y 8 condiciones, el árbol llega hasta 16 niveles de anidamiento, y el peso total del árbol se calcula contra la capacidad real del firmware antes de enviarlo. Si se pasa, la plataforma lo dice al guardar y hay que simplificar. Un árbol que no entra nunca llega al equipo a medias.
- Análisis y simulación. Antes de desplegar, la plataforma analiza el árbol en busca de estructuras que técnicamente son válidas pero casi siempre son un error: dos ramas de un grupo O que se solapan y compiten por la misma salida, una rama que nunca puede ser verdadera, un modificador cuyo efecto queda tapado por un hermano. Y el Simulador corre el árbol contra curvas dibujadas a mano, con estados inventados para el resto de las variables, y muestra la salida segundo a segundo. El evaluador del Simulador es el mismo que razona sobre el árbol en la nube, así que responde la misma pregunta que va a responder el hardware.
Y tres hábitos que el manual recomienda al armar el árbol: poner las anulaciones críticas en el nivel superior, para que prevalezcan sobre los ciclos temporizados; hacer que las franjas de cada oscilador sean excluyentes, para evitar solapamientos que generen pulsos erráticos; y, cuando se combinan comportamientos diferentes, aislar cada rama con condiciones mutuamente excluyentes.
Crop steering, leído como árbol
La plantilla de riego con sensor —el crop steering, un caso común en el cultivo de precisión— es el mejor ejemplo de que las piezas componen, y de que la plataforma integra lo que cada industria ya usa: aquí, una sonda de sustrato de referencia comandando una bomba. Es una plantilla, así que se configura con un formulario. Pero lo que genera es un árbol común, y se puede abrir en el editor avanzado para verlo entero. El crop steering se describe en cuatro fases:
- F0Fase 0
Período con luces encendidas donde el sustrato se seca naturalmente; las plantas están despiertas y transpirando.
- F1Fase 1
Riego incremental con pequeños shots que elevan gradualmente la humedad hasta alcanzar el objetivo.
- F2Fase 2
Comienza cuando la humedad cruza el umbral deseado; el sistema riega con pequeños intervalos para mantener la humedad objetivo.
- F3Fase 3
Se deja secar el sustrato antes de la noche para promover el crecimiento de raíces.
El formulario pide: la variable de humedad de sustrato (por ejemplo el contenido volumétrico de agua de una TEROS 12), la humedad objetivo, cómo se activa (con la luz, con un retardo opcional para la fase 0, o por horario), la duración de encendido y apagado de los pulsos de fase 1, y para la fase 2 los pulsos más un porcentaje de dryback. Un ejemplo concreto: objetivo 50 %, fase 1 con pulsos de 2 minutos cada 10, fase 2 con pulsos de 30 segundos cada 30 minutos y un dryback del 10 %.
Esto es lo que la plantilla genera con esos valores, activada por la luz:
La memoria «ya llegó hoy» se enciende la primera vez que el sustrato cruza el objetivo y no se apaga hasta que se apagan las luces. Es el reloj del día: recuerda si la fase 1 ya cumplió su trabajo.
La rama de fase 1 pulsa mientras la luz esté encendida, el sustrato esté por debajo del objetivo y esa memoria esté apagada, es decir, mientras todavía no se llegó hoy. En cuanto el sustrato toca el 50 %, la memoria se enciende, el inversor la niega, y la fase 1 queda inhibida por el resto del día. Al apagarse las luces la memoria se resetea y la fase 1 se rearma para mañana. Una fase que corre una sola vez por día, sin un contador ni una fecha: sólo una memoria con el reset correcto.
La rama de fase 2 usa dos memorias. La primera es la misma «ya llegó hoy», esta vez sin invertir: la fase 2 no puede arrancar antes de que la fase 1 haya terminado. La segunda, «hubo dryback», es una banda de histéresis idéntica a la del extractor del primer ejemplo: se arma cuando el sustrato baja del piso (objetivo menos el 10 % de dryback, 45 %) y se desarma cuando vuelve a superar el objetivo. Entre 45 y 50 conserva lo último que decidió. Así la fase 2 sólo riega después de un secado real, y deja de regar apenas recupera el objetivo.
Y la fase 3 no es un nodo. Es lo que pasa cuando las luces se apagan: ninguna rama tiene activación, la bomba no vuelve a arrancar, y el sustrato se seca durante la noche.
Cierre
Nada en ese árbol es especial. Son dos osciladores, tres memorias, un inversor, unos grupos y unas comparaciones, las mismas piezas que se pueden arrastrar en el editor. La plantilla las ordena para el caso conocido de una industria; cuando el caso es otro —una ventilación, una dosificación, una climatización—, se ordenan a mano con las mismas piezas, o se le describen al Agente y se revisa lo que dibujó.
Lo que corre en el dispositivo es exactamente lo que se ve en el lienzo, lo que probó el Simulador y lo que el asistente lee la próxima vez que se le pide un cambio. Una sola lógica, en cuatro lugares. Ese es el punto.
A partir del manual de usuario de la plataforma Growcast. Los valores de las figuras son ilustrativos.