{"id":11861,"date":"2026-05-26T21:46:28","date_gmt":"2026-05-26T19:46:28","guid":{"rendered":"https:\/\/bitacora.eniac2000.com\/?p=11861"},"modified":"2026-05-26T21:54:55","modified_gmt":"2026-05-26T19:54:55","slug":"nuevo-servidor-de-virtualizacion-control-termico-avanzado-para-el-verano","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=11861","title":{"rendered":"Nuevo servidor de virtualizaci\u00f3n \u2013 Control t\u00e9rmico avanzado para el verano"},"content":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 7 de 7 de la serie <a href=\"https:\/\/bitacora.eniac2000.com\/?series=nuevo-servidor-de-virtualizacion\" class=\"series-1838\" title=\"Nuevo servidor de virtualizaci\u00f3n\">Nuevo servidor de virtualizaci\u00f3n<\/a><\/div>\n<p class=\"wp-block-paragraph\">Hace ya un par de a\u00f1itos empec\u00e9 una serie sobre el <a href=\"https:\/\/bitacora.eniac2000.com\/?series=nuevo-servidor-de-virtualizacion\" target=\"_blank\" rel=\"noreferrer noopener\">nuevo servidor de virtualizaci\u00f3n<\/a> que tengo instalado en casa. En su momento, uno de los art\u00edculos de la serie estuvo dedicado a la <a href=\"https:\/\/bitacora.eniac2000.com\/?p=5657\" target=\"_blank\" rel=\"noreferrer noopener\">reducci\u00f3n de los niveles de ruido<\/a>, aspecto clave para poder tener un servidor de tipo enracable en un entorno dom\u00e9stico. Ese art\u00edculo trataba de c\u00f3mo, gracias al proyecto iLO4 unlock, consegu\u00ed bajar el r\u00e9gimen de giro de los ventiladores del DL360p Gen8 del 50% al 19%, con lo que pasaba a ser viable tener un servidor de este tipo en un entorno dom\u00e9stico. Dos a\u00f1os despu\u00e9s, y cuando a\u00fan no hemos llegado al verano, he tenido que realizar algunas actuaciones para controlar esta velocidad de giro. Que es de lo que va este art\u00edculo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El problema: el verano y la escalada de ventiladores<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El comando m\u00e1gico que me hab\u00eda funcionado durante dos a\u00f1os era <code>fan pid lo 1200<\/code>, que permite al PID interno de la iLO bajar los ventiladores hasta aproximadamente un 18%. En invierno, con temperaturas ambiente de 20\u00b0C, el servidor se manten\u00eda silencioso sin problemas. Pero al llegar el verano, con el sensor <em>inlet<\/em> (que mide la temperatura de entrada de aire) superando los 28\u00b0C, los ventiladores empezaban a escalar de forma descontrolada, llegando a alcanzar valores de hasta el 75% en la zona derecha del servidor (la que aloja el almacenamiento y las tarjetas PCIe). Y eso suena como un Mig 21 despegando.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"534\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion01-1024x534.png\" alt=\"Escalada de temperaturas de Santiponce, la habitaci\u00f3n del servidor y el sensor inlet en la \u00faltima semana\" class=\"wp-image-11867\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion01-1024x534.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion01-300x156.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion01-768x400.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion01-1536x800.png 1536w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion01.png 1658w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Escalada de temperaturas de Santiponce, la habitaci\u00f3n del servidor y el sensor <em>inlet <\/em>en la \u00faltima semana, en la parte superior. En la inferior, el % de velocidad de giro de los ventiladores<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">El problema tiene una explicaci\u00f3n t\u00e9cnica interesante. El DL360p Gen8 tiene dos zonas f\u00edsicas de ventilaci\u00f3n independientes: los bloques 1-4 (izquierda, donde est\u00e1n las CPUs y la memoria) y los bloques 5-8 (derecha, donde est\u00e1n la controladora de discos y los slots PCIe). Cuando la temperatura sube, la iLO ventila ambas zonas de forma independiente, y resulta que la zona derecha es mucho m\u00e1s problem\u00e1tica: tiene componentes que generan calor de manera constante (como la controladora HD y la tarjeta de red) y que no responden al aire fr\u00edo de la misma forma que las CPUs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El servidor est\u00e1 ubicado en una habitaci\u00f3n que cuenta con aire acondicionado; durante el invierno y buena parte de la primavera y el oto\u00f1o el servidor puede estar perfectamente sin aire acondicionado y manteniendo niveles de giro de los ventiladores de entre el 18 y el 20%. Pero en verano (que cada vez es m\u00e1s largo, llega antes y se va m\u00e1s tarde) la cosa cambia. Me ve\u00eda obligado a hacer uso del aire acondicionado para mantener los ventiladores en niveles razonables, pero a costa de tener un coste energ\u00e9tico considerable. Y este a\u00f1o el \u00abverano\u00bb se ha adelantado, teniendo ya desde el 21 de mayo temperaturas que en Santiponce alcanzaban los 35\u00baC.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">An\u00e1lisis con inteligencia artificial: Claude como copiloto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para abordar el problema decid\u00ed utilizar un enfoque diferente al habitual: trabajar codo a codo con Claude Code para analizar el problema y aplicar soluciones. Como ya he comentado en otras ocasiones, el uso de Claude Code como <a href=\"https:\/\/bitacora.eniac2000.com\/?p=11810\" data-type=\"post\" data-id=\"11810\" target=\"_blank\" rel=\"noreferrer noopener\">asistente de ingenier\u00eda<\/a> me permite ejecutar comandos SSH, leer APIs, monitorizar valores en tiempo real y proponer soluciones bas\u00e1ndose en los datos que obtiene directamente del servidor, actuando como un ingeniero de sistemas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un detalle importante: durante gran parte del tiempo no tengo acceso f\u00edsico al servidor. Esto implica que cualquier error que cuelgue la iLO o fije los ventiladores en un valor incorrecto que requiera intervenci\u00f3n f\u00edsica me puede generar graves problemas. Esto es un condicionante clave para todo el proceso de an\u00e1lisis y prueba de soluciones. Implica que cada comando nuevo deb\u00eda ser validado antes de ejecutarse, teniendo la absoluta certeza de que no iba a causar efectos adversos o no previstos. Y obligaba a tomar un enfoque incremental y reversible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El proceso de an\u00e1lisis consisti\u00f3 en varias fases. En primer lugar, con mi agente de ingenier\u00eda, utilic\u00e9 Gemini y NotebookLM como fuentes de an\u00e1lisis documental, buscando referencias espec\u00edficas de uso de par\u00e1metros del parche de la iLO, modos de uso y funciones documentadas. Una vez obtenido el respaldo documental, con Claude establec\u00ed un plan de acci\u00f3n para implementar soluciones para la problem\u00e1tica, y por \u00faltimo us\u00e9 ChatGPT como adversario en funci\u00f3n de abogado del diablo, para buscar puntos d\u00e9biles y defectos en la aproximaci\u00f3n definida. El segundo paso fue usar Claude Code para acceder a los datos de los sensores a trav\u00e9s de la API Redfish de la iLO, procesarlos para identificar qu\u00e9 sensores estaban forzando la escalada de ventiladores. Llegados a este punto, el tercer paso fue hacer una propuesta de uso de par\u00e1metros adecuados para adecuar mi <em>script<\/em> inicial de reducci\u00f3n de par\u00e1metros de los sensores al escenario veraniego, aplicarlos uno a uno via SSH, y monitorizar el efecto durante periodos de 30 a 60 minutos, con lecturas cada 2-5 minutos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Entendiendo el PID de la iLO<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de describir la soluci\u00f3n, merece la pena explicar c\u00f3mo funciona el control de ventiladores de la iLO4 una vez desbloqueado. El sistema se basa en un controlador PID (Proporcional-Integral-Derivativo) con varios par\u00e1metros por sensor:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>fan pid XX lo YYYY<\/code> \u2014 El valor m\u00ednimo de PWM (<em>Pulse Width Modulation<\/em> o Modulaci\u00f3n por Ancho de Pulsos,que permite controlar cu\u00e1nta energ\u00eda reciben los ventiladores) que el PID puede solicitar. Con <code>lo 1200<\/code>, los ventiladores pueden bajar hasta ~18% de su r\u00e9gimen de giro m\u00e1ximo.  Existe un comando equivalente, <code>fan pid XX hi YYYY<\/code>, que permite establecer el valor m\u00e1ximo para el PID.<\/li>\n\n\n\n<li><code>fan pid XX sp YYYY<\/code> \u2014 El <em>setpoint<\/em>: la temperatura objetivo para cada sensor, en d\u00e9cimas de grado. El PID intenta mantener el sensor por debajo de este valor.<\/li>\n\n\n\n<li><code>fan p X max YY<\/code> \u2014 Un <em>ceiling<\/em> (techo) de PWM para cada bloque de ventiladores. Limita la velocidad m\u00e1xima, independientemente de lo que el PID solicite. De igual manera, existe el <code>fan p X min YY<\/code>, que establece un suelo para la velocidad del ventilador, no permitiendo que se baje de dicho nivel.<\/li>\n\n\n\n<li><code>fan t XX off<\/code> \u2014 Deshabilita un sensor del c\u00e1lculo PID. El hardware sigue monitoriz\u00e1ndolo para emergency shutdown, pero no influye en la velocidad de los ventiladores.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La f\u00f3rmula simplificada es: <code>output = max(clamp(PID_output, pid_lo, pid_hi), pwm_min)<\/code>, con el resultado final limitado por <code>fan p max<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un aspecto importante es que estos ajustes del PID son vol\u00e1tiles: se pierden cuando la iLO se reinicia o cuando el servidor arranca tras un corte de luz. Esto significa que es necesario establecer un mecanismo que los vuelva a aplicar autom\u00e1ticamente en cada arranque, algo que abordar\u00e9 m\u00e1s adelante.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Iteraci\u00f3n 1: Identificar los sensores problem\u00e1ticos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El primer paso fue entender por qu\u00e9 la zona derecha escalaba tanto. Con el <em>script <\/em>original s\u00f3lo realizaba un proceso iterativo para aplicar <code>fan pid lo 1200<\/code> a los 53 sensores que tiene definida la iLO y tres sensores deshabilitados. Todos los dem\u00e1s sensores ten\u00edan sus <em>setpoints <\/em>de f\u00e1brica de iLO, que en muchos casos eran bastante conservadores.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"541\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion02-1024x541.png\" alt=\"Listado de sensores, su funci\u00f3n, valor actual y estado, y l\u00edmites de funcionamiento, tanto de alerta como cr\u00edtico. El servidor siempre estaba en valores alejados de los l\u00edmites, pero aun as\u00ed demandaba velocidades de giro muy altas\" class=\"wp-image-11866\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion02-1024x541.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion02-300x159.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion02-768x406.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion02.png 1436w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Listado de sensores, su funci\u00f3n, valor actual y estado, y l\u00edmites de funcionamiento, tanto de alerta como cr\u00edtico. El servidor siempre estaba en valores alejados de los l\u00edmites, pero aun as\u00ed demandaba velocidades de giro muy altas<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mediante la API Redfish, extraje las temperaturas de los 42 sensores activos y las compar\u00e9 con sus umbrales de precauci\u00f3n (la temperatura a la que iLO genera una alerta). Pude descubrir que varios sensores estaban operando a un porcentaje muy alto de su <em>setpoint <\/em>de f\u00e1brica, lo que hac\u00eda que el PID pidiera velocidades de ventilador muy altas para intentar enfriarlos, en concreto:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>32-HD Cntlr Zone<\/strong>: 43\u00b0C con un SP de f\u00e1brica muy bajo \u2014 72% de SP, principal causante de la escalada en la zona derecha.<\/li>\n\n\n\n<li><strong>36-PCI 2 Zone<\/strong>: 40\u00b0C, otro sensor de la zona derecha que no baja por mucho que ventiles.<\/li>\n\n\n\n<li><strong>14-Chipset1 Zone<\/strong>: 42\u00b0C, sensor global que puntualmente lideraba la demanda.<\/li>\n\n\n\n<li><strong>33-34 PCI 1 Zone<\/strong>: sensores de un slot PCI-E vac\u00edo que estaban contribuyendo al c\u00e1lculo PID sin motivo.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Iteraci\u00f3n 2: <em>Setpoints <\/em>por zona<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Durante las pruebas con Claude pude determinar que los niveles a los que los sensores empezaban a demandar velocidades de giro m\u00e1s elevadas eran sensiblemente m\u00e1s bajos que los niveles de precauci\u00f3n declarados, por lo que los ventiladores empezaban a escalar a\u00fan estando muy lejos de los niveles de precauci\u00f3n formales. Es una aproximaci\u00f3n prudente desde el punto de vista del fabricante, que prefiere quedarse muy lejos de los niveles de riesgo, pero que implica que los ventiladores se disparan a\u00fan en circunstancias donde podr\u00edan funcionar a baja velocidad.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La soluci\u00f3n fue asignar <em>setpoints <\/em>personalizados a cada sensor, calibrados a partir de los umbrales de precauci\u00f3n reales de la iLO. La idea es sencilla: si el nivel de precacuci\u00f3n de un sensor est\u00e1 en 65\u00b0C y la temperatura real es de 43\u00b0C, podemos poner un SP de 64\u00b0C (98% del nivel de precauci\u00f3n) y el PID ver\u00e1 que el sensor est\u00e1 al 67% de su objetivo, en lugar de, por ejemplo, al 90% con el SP de f\u00e1brica. El PID pedir\u00e1 menos velocidad de ventilador.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esto requiri\u00f3 ir sensor por sensor, consultando los valores de precauci\u00f3n en la web de la iLO, y calibrando cada SP entre el 85% y el 97% de dicho valor. Los sensores de la zona de almacenamiento, que son los m\u00e1s problem\u00e1ticos porque generan calor constante que no responde al caudal de aire, recibieron SPs m\u00e1s agresivos (97-98% del nivel de precauci\u00f3n). Los de las CPUs y memoria, que s\u00ed responden bien al aire fr\u00edo, mantuvieron SPs m\u00e1s conservadores (86-93%).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adem\u00e1s, deshabilit\u00e9 del PID un total de 13 sensores que no aportaban informaci\u00f3n \u00fatil: el sensor de <em>inlet <\/em>(no tiene sentido que el PID reaccione a la temperatura del aire de entrada), sensores de slots PCI vac\u00edos, sensores redundantes de la zona de salida del aire, y sensores declarados pero sin uso en mi modelo de servidor, que reportaban 0\u00b0C.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Iteraci\u00f3n 3: El <em>ceiling <\/em>con fan p max<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Con los <em>setpoints <\/em>calibrados, los ventiladores ya no escalaban descontroladamente, pero segu\u00edan subiendo m\u00e1s de lo deseable en verano cuando el aire acondicionado dejaba de funcionar, y la temperatura ambiental empezaba a subir. Descubr\u00ed que el PID, aunque mejorado, segu\u00eda pidiendo velocidades del 50-55% en la zona derecha cuando la temperatura de la habitaci\u00f3n sub\u00eda por encima de los 27\u00baC.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La soluci\u00f3n fue a\u00f1adir un <em>ceiling<\/em> (techo) mediante <code>fan p max 89<\/code> en los 8 bloques, lo que equivale a un 35% de velocidad. Este comando limita la salida m\u00e1xima del PID: por mucho que el controlador quiera subir los ventiladores, no pueden pasar del 35%. Es importante entender que <code>fan p max<\/code> funciona como un techo, no como un bloqueo: si el PID quiere un 25%, los ventiladores van al 25%. Solo interviene cuando el PID pide m\u00e1s del 35%.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez establecido el valor, estuve haciendo un proceso de monitorizaci\u00f3n bastante intensivo con Claude Code. Ten\u00eda la intuici\u00f3n de que un punto estable de giro pod\u00eda estar en torno al 30-35% de los valores de giro incluso en verano, pero era necesario verificarlo. As\u00ed que fui bajando estos valores progresivamente desde el 41% hasta el 24%, con varias horas de monitorizaci\u00f3n, y reportes tanto por consola como por Telegram. Y el punto \u00f3ptimo de estabilidad estaba en el 34%.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"539\" height=\"1024\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/Screenshot_20260526-210805-539x1024.png\" alt=\"Captura de pantalla de uno de los mensajes de Telegram, con el nivel de temperatura de los sensores con respecto a su l\u00edmite de precauci\u00f3n. Recib\u00eda estos mensajes cada 5 minutos\" class=\"wp-image-11869\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/Screenshot_20260526-210805-539x1024.png 539w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/Screenshot_20260526-210805-158x300.png 158w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/Screenshot_20260526-210805-768x1458.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/Screenshot_20260526-210805-809x1536.png 809w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/Screenshot_20260526-210805.png 885w\" sizes=\"auto, (max-width: 539px) 100vw, 539px\" \/><figcaption class=\"wp-element-caption\">Captura de pantalla de uno de los mensajes de Telegram, con el nivel de temperatura de los sensores con respecto a su l\u00edmite de precauci\u00f3n. Recib\u00eda estos mensajes cada 5 minutos<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Un experimento interesante que tambi\u00e9n realic\u00e9 fue quitar el <em>ceiling <\/em>temporalmente para ver qu\u00e9 ped\u00eda el PID realmente tras unas cuantas horas con el valor limitado al 35%. Los resultados fueron reveladores:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Bloque<\/th><th>Zona<\/th><th>Con ceiling (35%)<\/th><th>Sin ceiling<\/th><\/tr><\/thead><tbody><tr><td>0 (Fan Block 1)<\/td><td>Izquierda &#8211; CPU<\/td><td>34%<\/td><td>56%<\/td><\/tr><tr><td>7 (Fan Block 8)<\/td><td>Derecha &#8211; Storage<\/td><td>34%<\/td><td>94%<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sin <em>ceiling<\/em>, la zona derecha se dispar\u00f3 al 94%. El <em>ceiling <\/em>es lo que mantiene este servidor silencioso en verano, pese a que los valores de los sensores nunca llegaron a escalar realmente a valores cercanos a los l\u00edmites de precauci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con estos resultados en mente, desarroll\u00e9 una nueva versi\u00f3n del <em>script<\/em>, con las siguientes acciones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aplicaci\u00f3n del l\u00edmite inferior <code>fan pid lo 1200<\/code> en los 52 sensores, para permitir bajar hasta el 18% del r\u00e9gimen de giro.<\/li>\n\n\n\n<li>Aplicaci\u00f3n de <em>setpoints<\/em> calibrados sensor y zona, para establecer el punto objetivo que el PID tiene que evitar alcanzar para cada uno de los sensores, m\u00e1s ajustados a los verdaderos valores de precauci\u00f3n establecidos para dichos sensores.<\/li>\n\n\n\n<li>Deshabilitaci\u00f3n de 13 sensores del c\u00e1lculo PID, entre sensores no utilizados, sensores redundantes o demasiado agresivos.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Iteraci\u00f3n 4: El <em>watchdog <\/em>t\u00e9rmico<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tener un <em>ceiling <\/em>fijo plantea un problema evidente: \u00bfqu\u00e9 pasa si hay un pico de calor real y el servidor necesita m\u00e1s ventilaci\u00f3n? Para dar respuesta a ese escenario cre\u00e9 un <em>watchdog<\/em>: un <em>script <\/em>en Python que corre como servicio systemd en el servidor Proxmox y monitoriza las temperaturas cada 30 segundos a trav\u00e9s de la API Redfish, y que est\u00e1 destinado a permitir variar el nivel real del <em>ceiling<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El <em>watchdog <\/em>gestiona tres estados:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Normal<\/strong>: <code>fan p max 89<\/code> (l\u00edmite m\u00e1ximo de giro del 35%). Operaci\u00f3n normal, silencioso.<\/li>\n\n\n\n<li><strong>Elevated<\/strong>: <code>fan p max 107<\/code> (l\u00edmite m\u00e1ximo de giro del 42%). Se activa cuando cualquier sensor alcanza el 90% de su <em>setpoint<\/em>. Se normaliza cuando todos bajan del 80%.<\/li>\n\n\n\n<li><strong>Fail-safe<\/strong>: <code>fan p max 255<\/code> (l\u00edmite m\u00e1ximo de giro del 100%). Se activa tras 5 errores consecutivos de comunicaci\u00f3n con la iLO \u2014 elimina el <em>ceiling <\/em>completamente para que el PID nativo opere sin restricciones.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">El <em>fail-safe<\/em> merece una explicaci\u00f3n. El <em>ceiling <\/em><code>fan p max 89<\/code> es una restricci\u00f3n activa sobre el PID: si el <em>watchdog <\/em>pierde la comunicaci\u00f3n con la iLO, ese <em>ceiling <\/em>queda fijado indefinidamente. Si durante esa desconexi\u00f3n hubiera un pico t\u00e9rmico real, el PID querr\u00eda subir los ventiladores al 60-90% pero no podr\u00eda porque el <em>ceiling <\/em>se lo impide. La soluci\u00f3n es intentar eliminar el <em>ceiling <\/em>como \u00faltimo recurso antes de perder la conexi\u00f3n: el servidor pasar\u00eda a poder ventilar a toda potencia (ruidoso pero seguro) hasta que la comunicaci\u00f3n se restablezca. Cuando el <em>watchdog <\/em>reconecta, restaura autom\u00e1ticamente el <em>ceiling <\/em>que corresponda seg\u00fan el estado t\u00e9rmico.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La secuencia de errores es progresiva: a los 3 errores consecutivos (1.5 minutos sin respuesta), el <em>watchdog <\/em>env\u00eda una alerta por Telegram avisando de que hay problemas de comunicaci\u00f3n. Si la situaci\u00f3n persiste hasta los 5 errores (2.5 minutos), se activa el <em>fail-safe<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Comunicaciones v\u00eda Telegram<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Otro de los aspectos que implement\u00e9 fue el env\u00edo de mensajes v\u00eda Telegram. Dado que estaba haciendo un ciclo bastante intenso de pruebas de comandos y monitorizaci\u00f3n de los resultados, me resultaba pr\u00e1ctico poder validar el estado del servidor, ventiladores y sensores no s\u00f3lo desde la consola, sino tambi\u00e9n desde el m\u00f3vil. Por ello, aprovechando que ya ten\u00eda un canal de Telegram configurado para otras alertas, defin\u00ed como parte del proceso el env\u00edo de mensajes con informaci\u00f3n del estado del servidor y de posibles situaciones an\u00f3malas.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"983\" height=\"972\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/Screenshot_20260526-203209.png\" alt=\"Muestra de mensajes de cambios de estado v\u00eda Telegram\" class=\"wp-image-11868\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/Screenshot_20260526-203209.png 983w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/Screenshot_20260526-203209-300x297.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/Screenshot_20260526-203209-768x759.png 768w\" sizes=\"auto, (max-width: 983px) 100vw, 983px\" \/><figcaption class=\"wp-element-caption\">Muestra de mensajes de cambios de estado v\u00eda Telegram<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Esto implica que el <em>watchdog <\/em>env\u00eda alertas via Telegram en cada cambio de estado y genera un resumen diario a las 8:00h que incluye el tiempo acumulado en estado <em>elevated <\/em>y el n\u00famero de ciclos normal\u2194<em>elevated <\/em>en las \u00faltimas 24 horas. Este \u00faltimo dato es especialmente \u00fatil para detectar el efecto rebote: si el <em>watchdog <\/em>est\u00e1 oscilando continuamente entre estados, es se\u00f1al de que los <em>setpoints <\/em>o los umbrales necesitan ajuste.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Persistencia ante cortes de luz<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como mencion\u00e9 antes, todos los ajustes del PID de la iLO son vol\u00e1tiles. Un corte de luz reinicia tanto el servidor como la iLO, y todos los <em>setpoints<\/em>, sensores deshabilitados y configuraciones de <em>ceiling <\/em>se pierden. El servidor, ante un reinicio del mismo o incluso un reinicio s\u00f3lo de la iLO, arrancar\u00eda con la configuraci\u00f3n de f\u00e1brica: ventiladores al 50% y el PID sin optimizar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para resolver esto, el <em>script <\/em>de configuraci\u00f3n (<code>fanspeed-dl360p-v4.sh<\/code>) est\u00e1 registrado como servicio systemd de tipo <code>oneshot<\/code>. Esto significa que se ejecuta autom\u00e1ticamente en cada arranque del sistema, antes de que el <em>watchdog <\/em>comience a operar. El <em>watchdog <\/em>tiene una dependencia expl\u00edcita (<code>Requires=fanspeed-dl360p-v4.service<\/code>), lo que garantiza que no arrancar\u00e1 hasta que la configuraci\u00f3n del PID est\u00e9 completa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El script incluye una comprobaci\u00f3n previa de conectividad: antes de enviar ning\u00fan comando, verifica que la iLO responde via SSH, reintentando cada 15 segundos hasta un m\u00e1ximo de 20 intentos (5 minutos). En un HPE ProLiant, la iLO normalmente est\u00e1 operativa mucho antes que el sistema operativo, pero no est\u00e1 de m\u00e1s verificarlo. Si tras 5 minutos la iLO no responde, el <em>script <\/em>aborta y el <em>watchdog <\/em>no arranca; ser\u00eda una situaci\u00f3n que requerir\u00eda intervenci\u00f3n manual.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La secuencia de arranque completa es: servidor arranca \u2192 red disponible \u2192 <code>fanspeed-dl360p-v4.service<\/code> verifica SSH \u2192 configura PID (52 sensores con <code>lo 1200<\/code>, setpoints por zona, sensores deshabilitados) \u2192 <code>ilo-watchdog.service<\/code> arranca \u2192 aplica ceiling y comienza la monitorizaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Integraci\u00f3n con Home Assistant: el A\/C autom\u00e1tico<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La pieza final del puzzle es la automatizaci\u00f3n del aire acondicionado. Tengo Home Assistant monitorizando las velocidades de los ventiladores del servidor a trav\u00e9s de la integraci\u00f3n HP iLO. Cuando los ventiladores suben del 39% (lo que ocurre cuando el watchdog escala a estado <em>elevated<\/em> y sube el <em>ceiling <\/em>al 42%), una automatizaci\u00f3n enciende el aire acondicionado de la habitaci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>trigger:\n  - platform: numeric_state\n    entity_id: sensor.hp_ilo_ventilador_cpu_1\n    above: 39\n  - platform: numeric_state\n    entity_id: sensor.hp_ilo_ventilador_cpu_5\n    above: 39\naction:\n  - service: climate.turn_on\n    target:\n      entity_id: climate.aire_acondicionado<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">El A\/C se apaga autom\u00e1ticamente a los 30 minutos. En la pr\u00e1ctica, lo que ocurre es una cadena autom\u00e1tica: la temperatura sube \u2192 el <em>watchdog <\/em>detecta un sensor al 90% de su SP \u2192 sube el <em>ceiling <\/em>al 42% \u2192 los ventiladores suben del 39% \u2192 Home Assistant detecta la subida \u2192 enciende el A\/C \u2192 la temperatura baja \u2192 el <em>watchdog <\/em>normaliza \u2192 los ventiladores vuelven al 34%. Y todo sin intervenci\u00f3n humana.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resultado final<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tras dos d\u00edas de pruebas, an\u00e1lisis y ajustes incrementales, el sistema qued\u00f3 estable con el siguiente comportamiento:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Condici\u00f3n<\/th><th>Sensor <em>Inlet<\/em><\/th><th>Ventiladores<\/th><th>Nota<\/th><\/tr><\/thead><tbody><tr><td>Invierno<\/td><td>~20\u00b0C<\/td><td>~19%<\/td><td>PID libre, silencio total<\/td><\/tr><tr><td>Verano normal<\/td><td>~27\u00b0C<\/td><td>~34%<\/td><td><em>Ceiling <\/em>activo, estable<\/td><\/tr><tr><td>Pico de calor<\/td><td>~30\u00b0C+<\/td><td>35\u219242%<\/td><td>Watchdog + A\/C autom\u00e1tico<\/td><\/tr><tr><td>P\u00e9rdida de comunicaci\u00f3n<\/td><td>\u2014<\/td><td>PID libre<\/td><td><em>Fail-safe, ceiling<\/em> eliminado<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez implementado, realic\u00e9 una una monitorizaci\u00f3n final de una hora, que confirm\u00f3 estabilidad absoluta: 12 lecturas consecutivas con los ventiladores al 34%, inlet entre 27-28\u00b0C, y el sensor m\u00e1s caliente al 68% de su <em>setpoint<\/em>. Ni una sola anomal\u00eda.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"515\" height=\"223\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion03.png\" alt=\"Ventiladores estabilizados al 34%, incluso en el pico de calor del d\u00eda en Santiponce\" class=\"wp-image-11865\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion03.png 515w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/05\/ventilacion03-300x130.png 300w\" sizes=\"auto, (max-width: 515px) 100vw, 515px\" \/><figcaption class=\"wp-element-caption\">Ventiladores estabilizados al 34%, incluso en el pico de calor del d\u00eda en Santiponce<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Arquitectura del sistema<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como resultado final, el sistema ha pasado a constar de una serie de piezas que trabajan en cadena:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><code>fanspeed-dl360p-v4.sh<\/code><\/strong> \u2014 Servicio systemd <code>oneshot<\/code> en Proxmox. Se ejecuta en cada arranque. Configura el PID de la iLO: <code>fan pid lo 1200<\/code> en los 52 sensores, setpoints calibrados por zona, y 13 sensores deshabilitados del c\u00e1lculo PID.<\/li>\n\n\n\n<li><strong><code>ilo-watchdog.py<\/code><\/strong> \u2014 Servicio systemd permanente en Proxmox. Arranca despu\u00e9s de que el script de configuraci\u00f3n termine. Monitoriza sensores via Redfish cada 30 segundos, gestiona el <em>ceiling <\/em>din\u00e1micamente (normal\/elevated\/fail-safe), y alerta v\u00eda Telegram.<\/li>\n\n\n\n<li><strong>Automatizaci\u00f3n Home Assistant<\/strong> \u2014 Monitoriza la velocidad de los ventiladores via la integraci\u00f3n HP iLO. Enciende el A\/C cuando los ventiladores superan el 39%.<\/li>\n\n\n\n<li><strong>Bot de Telegram<\/strong> \u2014 Recibe alertas en tiempo real del watchdog: cambios de estado, errores de comunicaci\u00f3n, activaci\u00f3n del <em>fail-safe<\/em>, y un resumen diario a las 8:00.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Este proceso, motivado por una necesidad pr\u00e1ctica, ha sido valioso tanto por el resultado t\u00e9cnico como por el proceso en s\u00ed: utilizar agentes IA como copilotos para un problema que requer\u00eda experimentaci\u00f3n iterativa en hardware real, con restricci\u00f3n de acceso f\u00edsico. Claude Code, junto con Gemini, NotebookLM y ChatGPT, ejecutaba los comandos SSH, monitorizaba los sensores, propon\u00eda cambios, los somet\u00eda a mi validaci\u00f3n y los aplicaba. Un enfoque que habr\u00eda sido mucho m\u00e1s tedioso, lento y arriesgado que una aproximaci\u00f3n convencional.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 7 de 7 de la serie <a href=\"https:\/\/bitacora.eniac2000.com\/?series=nuevo-servidor-de-virtualizacion\" class=\"series-1838\" title=\"Nuevo servidor de virtualizaci\u00f3n\">Nuevo servidor de virtualizaci\u00f3n<\/a><\/div><p>Hace ya un par de a\u00f1itos empec\u00e9 una serie sobre<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1845,13],"tags":[1864,1984,1959,798,811,824,836,1991,1310,1996,1997],"series":[1838],"class_list":["post-11861","post","type-post","status-publish","format-standard","hentry","category-generado-con-ia","category-informatica","tag-api","tag-chatgpt","tag-claude-code","tag-home-assistant","tag-hp-dl360p-gen8","tag-ia","tag-ilo","tag-notebooklm","tag-proxmox","tag-telegram","tag-watchdog","series-nuevo-servidor-de-virtualizacion"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11861","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11861"}],"version-history":[{"count":5,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11861\/revisions"}],"predecessor-version":[{"id":11872,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11861\/revisions\/11872"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11861"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11861"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11861"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=11861"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}