Paso mucho tiempo monitoreando, asegurando y entendiendo lo que está sucediendo en mi red doméstica. Entre la caja de Internet, el equipo expuesto involuntariamente y los escaneos permanentes de Internet, una vez me pregunté una cosa simple: ¿Mi IP pública se conoce como «ruidosa» o sospechosa en Internet?
Es decir, las herramientas maliciosas utilizan mi red (pc, NAS, router, HA, …) ??
Así es como me encontré GreyNoise, un servicio realmente interesante que permite saber si una dirección IP forma parte del «ruido» de Internet, es decir, si se observa en actividades de exploración, sondeo o tráfico malintencionado.
GreyNoise describe correctamente su enfoque como una forma de calificar el ruido de fondo de Internet y contextualizar una IP observada.
Y como a menudo conmigo, después de algunas pruebas, pensé: «Bueno, seguiría siendo conveniente tenerlo directamente en Home Assistant».
Inicialmente, pensé que haría algo muy simple con una petición HTTP clásica. Sobre el papel, parecía trivial. En la práctica, el método más obvio no funcionó para mí como esperaba. Así que cambié mi enfoque y finalmente cambié a un sensor de línea de comandos. En este artículo, les cuento todo esto paso a paso, ya que en realidad lo configuré en casa, con las tarjetas Lovelace para la pantalla final.

🎯 Mi objetivo
Mi objetivo era simple: Integrar en Home Assistant un sensor capaz de consultar GreyNoise para averiguar el estado de mi IP pública y, a continuación, mostrar el resultado en un panel de control claro y legible.
La idea no era convertir Home Assistant en un centro de ciberseguridad avanzado, sino agregar un pequeño indicador de contexto.
Una mirada rápida fue para hacerme saber si mi IP era vista como benigna, desconocida o posiblemente relacionada con una actividad más sospechosa.
GreyNoise establece precisamente este tipo de información a través de su punto final de verificación pública.
También quería algo comprensible para un principiante: Un sensor, algunos atributos útiles, y bonitas tarjetas para hacer todo esto legible sin tener que abrir un terminal y obviamente sin tomar una suscripción de nada y sin registrarme no.
¿Qué es 🧠 GreyNoise?
Cuando descubra GreyNoise por primera vez, es posible que se pregunte para qué sirve exactamente.
En una versión muy simple, GreyNoise observa constantemente el ruido de fondo de Internet: escaneos automatizados, encuestas de direcciones IP, intentos repetitivos de inicio de sesión, todos estos comportamientos que no son necesariamente visibles a simple vista pero que existen permanentemente en la red global.
GreyNoise presenta su servicio como un medio para distinguir entre la actividad sustantiva y el tráfico realmente significativo.
El interés de GreyNoise es que permita contextualizar una dirección IP. Básicamente, es posible saber si esta IP es conocida por participar en este ruido de Internet, si se considera legítima, o si simplemente no es conocida por sus sistemas. Su servicio público de verificación devuelve este contexto en forma de JSON.
Cuando entendí esto, encontré la idea excelente para la casa. A menudo tenemos una caja de internet, a veces redireccionamientos de puertos, una VPN, equipos accesibles a distancia, y no siempre sabemos cómo se «visualiza» nuestra IP desde el exterior.
Sin ser una herramienta de seguridad completa, GreyNoise da una pista interesante.
🆓 Herramientas gratuitas GreyNoise

Lo que me gustó es que ya puedes probar cosas gratis, sin entrar en una integración complicada de inmediato.
La primera herramienta práctica es su página de verificación en línea. La página se abre e indica directamente cómo GreyNoise ve la IP pública utilizada para la navegación.
Es muy conveniente hacer una primera prueba rápida, sin instalar nada.
El otro punto muy interesante es que hay una API simple para consultar. Y es precisamente esta API la que quería usar en Home Assistant. En la línea de comandos, esto equivale a hacer una solicitud como:
curl -s -H "Aceptar: application/json" https://check.labs.greynoise.io/api/v1/check
En mi caso, la respuesta se veía así:
{ "ip": "82.65.xxx.xxx", "estatus": «no _found», «clasificación»: nulo, "ruido": false, "Common _business _services": false, "confía en _level": nulo, "error": «ip not found» } (en inglés).
Este formato se corresponde bien con el funcionamiento documentado del servicio público GreyNoise, que devuelve, en particular, el PI, el estado, la clasificación y el indicador. ruido, el indicador _business_servicios comunes, el nivel de confianza y un posible mensaje de error.
En pocas palabras: mi IP no era conocida por GreyNoise, lo que es bastante tranquilizador en este contexto.
🧪 Mi primer intento en Home Assistant
Como suele ser el caso, empecé con la solución que me parecía la más «limpia»: Utilice un sensor REST en Home Assistant.
En principio, esto era lógico. Tenía una URL HTTP que devolvía JSON, así que pensé que un sensor REST funcionaría bien. La documentación de Home Assistant REST permite definir con precisión un recurso HTTP, para leer el JSON con valor_template y recuperar campos como atributos con json_ Atributos.
Pensé que recuperaría directamente el estado y los atributos como IP, clasificación o nivel de confianza.
Excepto que en mi caso, este enfoque no funcionó correctamente. El sensor permaneció en un estado inutilizable. En lugar de perder el tiempo en un método que no dio un resultado estable en mi instalación, decidí cambiar a otra solución.
Y honestamente, esto es a menudo cómo sucede en la automatización del hogar: Nos vamos con una idea, luego nos ajustamos de acuerdo a la realidad.
⌨ _ Por qué me fui en la línea de comandos
Finalmente elegí confiar en un sensor de línea de comandos. No es necesariamente el método más «elegante» sobre el papel, pero en mi caso ha sido mucho más fiable.
El principio es simple: Home Assistant ejecuta un comando rizo, recuperar la respuesta JSON, a continuación, extraer el estado principal y varios atributos. Integración Comando _line Home Assistant soporta un comando shell, un valor_template y atributos JSON.
En otras palabras, comencé a partir de una prueba que ya estaba funcionando en mi terminal y luego simplemente la transpuse en Home Assistant.
Esta es a menudo una buena estrategia para principiantes: Cuando algo ya está funcionando a mano, es más fácil averiguar qué está pasando en Home Assistant.
⚙ Configuración en Home Assistant
En mi expediente configuration.yaml, Comencé incluyendo un archivo dedicado para mis sensores de línea de comandos:
_line de comandos: !include comando _line.yaml
Luego, en _line.yaml (en inglés), he añadido este sensor:
- sensor: nombre: «GreyNoise IP Check» _id único: Greynoise _ip _check icono: comando mdi:shield-search: «curl-s-H «Aceptar: application/json" https://check.labs.greynoise.io/api/v1/check' command_timeout: 20 scan_intervalo: 100800 value_template: Atributos de "{{value _json['status'] }}" json _: - ip - clasificación - ruido - common_business_services - trust_level - error
Voy a detallar esto muy simplemente:
- comando : Este es el comando realmente ejecutado por Home Assistant.
- _timeout Comando : Permito hasta 20 segundos antes de rendirme.
- scan_intervalo : Esta es la frecuencia de ejecución, en segundos. Aquí elegí 100800 segundos, así que cada 28 horas.
- valor_template : esto recupera el valor principal del sensor, aquí el campo
estadoJSON (en inglés). - json_ Atributos : Esto permite que otros campos útiles se almacenen como atributos del sensor.
¿Por qué 28 horas? Simplemente porque no necesitaba entrevistar a GreyNoise cada hora. Y quiero evitar las 24 horas porque muchos sensores están en 24, así que serán 28 horas hoy. No es algo que esté cambiando constantemente en mí, así que prefiero una ejecución espaciada.
🧾 Lo que el sensor me devuelve

Una vez que el sensor está operativo, recupero un estado principal y varios atributos.
El estado principal es el campo estado. En casa, por ejemplo, obtengo no _found. Es este valor el que se convierte en el estado del sensor en Home Assistant. El punto final público GreyNoise devuelve este campo de estado en su respuesta JSON.
Además de eso, tengo varios atributos útiles:
- ip : la dirección IP pública detectada.
- clasificación : la clasificación, en su caso.
- ruido : indica si el IP se considera parte del ruido de Internet.
- _business_servicios comunes : indica si el PI está vinculado a servicios corporativos conocidos.
- _level Trust : un indicador adicional cuando esté disponible.
- error : un mensaje informativo, por ejemplo, «ip not found».
📊 My Lovelace Cards
Una vez que se creó el sensor, especialmente quería una buena pantalla en el tablero. Así que hice una pequeña página dedicada con varias tarjetas para probar los renders.
Utilicé tanto Mushroom, Button Card y una tarjeta Markdown. Esto me permitió comparar un estilo más «sobrio», un estilo más «visual» y un estilo más «informativo».
🍄 Mapa Champiñón

La primera tarjeta que hice fue una tarjeta de champiñones basada en el sensor real:
Tipo: custom:mushroom-template-card entidad: sensor.greynoise_ip_comprobar primaria: > {% set c = estado_attr(entidad, 'clasificación') %} {% if c == 'malicioso' %GreyNoise: actividad maliciosa {% elif c == 'sospechoso' %GreyNoise: actividad sospechosa {% elif c == 'benigno' %GreyNoise: servicio legítimo {% elif states(entity) in ['not _found', 'unknown', 'unavailable'] %GreyNoise: ninguna actividad conocida {% de lo contrario %GreyNoise: {{ estados (entidad) }} {% endif %} secundaria: > {% set ip = estado_attr(entidad, 'ip') o 'IP desconocido' %} {% set classif = estado_attr(entidad, 'clasificación') o 'ninguno' %} {% set noise = estado_attr(entidad, 'ruido') %} {% set cbs = estado_attr(entidad, 'common_business_services') %} IP: {{ ip }} • Clasificación: {{classif }} • Ruido: {{ noise }} • Servicios conocidos: Icono de {{ cbs }}: > {% set c = estado_attr(entidad, 'clasificación') %} {% if c == 'malicioso' %mdi:escudo-alerta {% elif c == 'sospechoso' %mdi:escudo-búsqueda {% elif c == 'benigno' %mdi:chequeo {% de lo contrario %mdi:escudo-check-outline {% endif %} icon_color: > {% set c = estado_attr(entidad, 'clasificación') %} {% if c == 'malicioso' %} rojo {% elif c == 'sospechoso' %} naranja {% elif c == 'benigno' %} teal {% de lo contrario %} verde {% endif %_secundaria multilínea: true fill_container (envase de relleno verdadero): Auténtico tap_action: Acción: more-info
Me gusta mucho esta tarjeta porque es fácil de leer. De un vistazo, veo un mensaje claro, un icono adecuado y un color consistente.
🧪 Fictitious Cards

Para comparar visualmente los estados, también creé algunos mapas puramente ficticios. Esto hace posible ver cómo se verían los diferentes casos sin esperar a que sucedan realmente.
Tipo: tarjetas de pila vertical: - tipo: custom:mushroom-template-card primario: Fictif - principalmente secundario: «PI: 45.67.89.10 • ruido • ruido: icono "verdadero": mdi:shield-alert icon_color: _secundaria multilínea roja: verdadero - tipo: custom:mushroom-template-card primario: Fictif - secundario benigno: «PI: 1.1.1.1 • benigno • ruido: Icono de false": mdi:shield-check icon_color: _secundaria multilínea: verdadero - tipo: custom:mushroom-template-card primario: Fictif - no encontrado secundario: «PI: 82.65.100.200 • not_found • ruido: Icono de false": mdi:shield-check-outline icon_color: _secundaria multilínea verde: cierto
Es estúpido, pero muy útil cuando construyes una interfaz: Puedes elegir el estilo incluso antes de tener un caso real.
🎨 tarjeta botón

Entonces quería algo más visual, casi como una tarjeta de alerta. Así que usé Button Card.
Tipo: custom:entidad de tarjeta de botón: sensor.greynoise_ip_Comprobar nombre: | [[const c = entidad?.atributos?.clasificación; si (c === 'malicioso') devuelve 'GreyNoise - actividad maliciosa'; si (c === 'sospechoso') devuelve 'GreyNoise - actividad sospechosa'; si (c === 'benigno') devuelve 'GreyNoise - servicio legítimo'; devolver «GreyNoise - ninguna actividad conocida»; ]]] icono: | [[const c = entidad?.atributos?.clasificación; si (c === 'malicioso') devuelve 'mdi:shield-alert'; si (c === 'sospechoso') devuelve 'mdi:shield-search'; si (c === 'benign') devuelve 'mdi:shield-check'; devolver «mdi:shield-check-outline»; ]]] mostrar _state: Auténtico estado_display: | [[¿entidad de retorno?.state || 'desconocido'; ]]] Etiqueta: | [[ const ip = entity?.attributes?.ip || 'IP unknown'; const c = entidad?.atributos?. Clasificación || «ninguno»; ruido de const = entidad?.atributos?.ruido; const cbs = entity?.attributes?.common _business _services; retorno «PI ${ip} • ${c} • ruido: ${ruido} • asuntos comunes: ${cbs}“; ]]] mostrar _label: Auténtico tap_action: Acción: estilos more-info: tarjeta: - relleno: 18px - radio fronterizo: 20px - color: blanco - fondo: | [[const c = entidad?.atributos?.clasificación; si (c === 'malicioso') devuelve 'gradiente lineal(135deg, #b71c1c 0%, #e53935 100%)»; si (c === 'sospechoso') devuelve 'gradiente lineal(135deg, #ef6c00 0%, #ffa726 100%)»; si (c === 'benigno') devuelve 'gradiente lineal(135deg, #00695c 0%, #26a69a 100%)»; gradiente lineal de retorno(135deg, #2e7d32 0%, #66bb6a 100%)»; ]]] cuadrícula: - cuadrículas-plantillas-áreas: "\"i n\" \"i s\" \"l l\" - grid-template-columns: 60px 1fr - cuadrícula-plantillas-filas: icono min-content min-content min-content: - anchura: 42px - color: nombre blanco: - justificarse a sí mismo: start - tamaño de fuente: 18px - font-weight: 700 estados: - justificarse a sí mismo: start - tamaño de fuente: 15px - font-weight: Etiqueta 500: - justificarse a sí mismo: centro - texto-alineación: centro - anchura: 100% - tamaño de fuente: 13px - opacidad: 0.92
Esta tarjeta es muy agradable, especialmente cuando quieres algo que sea un poco más llamativo. También he ajustado la línea de fondo para que esté centrada, lo que realmente mejora la representación.
📝 Markdown Mapa Resumen

Finalmente, agregué una tarjeta Markdown para mostrar toda la información de manera legible:
Tipo: contenido de la reducción: >- {% set e = 'sensor.greynoise _ip _check' %} ## Informe completo de GreyNoise - **Estado**: {{ estados(e) }} - **IP**: {{ state_attr(e, 'ip') o 'desconocido' }} - **Clasificación**: {{ state_attr(e, 'classification') or 'none' }} - **Ruido de Internet**: {{state_attr(e, 'ruido') }} - **Servicios conocidos**: {{ state_attr(e, 'common_business_services') }} - **Nivel de confianza**: {{ state_attr(e, 'trust _level') o '--' }} - **Mensaje informativo**: {{ state_attr(e, 'error') or 'none' }} --- - **Última ejecución de la solicitud**: {{ relativa _time(states[e].last _updated) }} - **Horodatage de última ejecución**: {{ as_local(states[e].last _updated).strftime('%d/%m/%Y %H:%M:%S')}}
Me gusta esta tarjeta porque es muy clara, especialmente para el diagnóstico.
Además, añadí el concepto de tiempo transcurrido desde la última actualización, que es útil para saber cuándo se ejecutó realmente la solicitud.
Propiedades ultimo _actualizado y ultimo_cambiado están bien disponibles en el motor de plantilla Home Assistant para este tipo de uso.
🧩 Lo que he aprendido de esta integración
Este pequeño proyecto me recordó algo importante: En la automatización del hogar, lo más importante no siempre es el método teóricamente más elegante, sino el que realmente funciona de manera confiable en el hogar.
Inicialmente, quería ir a REST. Finalmente, fue el sensor de línea de comandos el que me permitió lograr un resultado estable, legible y fácil de mantener. Y francamente, para uso doméstico, eso es exactamente lo que estaba buscando.
También me di cuenta de que este tipo de integración tiene un valor pedagógico real. Aprende a recuperar JSON, crear un sensor Home Assistant, explotar atributos, formatear un tablero y convertir la información en bruto en algo visual y comprensible.
Al final, utilicé la Mushroom Card en una pequeña esquina de mi tablero, de un vistazo, veré si el icono se vuelve rojo.
Si el corazón me lo dice, puedo añadir el cambio de estado de sensor.greynoise_ip_check en los disparadores de cualquier SMS o notificaciones visuales …
✅ Conclusión
Con GreyNoise, agregué en Home Assistant un pequeño bloque de contexto de red que me parece realmente interesante. No es una herramienta milagrosa, ni un SDI completo, pero es un buen indicador de cómo se percibe mi IP pública desde el exterior.
Comencé probando la página de verificación en línea, luego la consulta de API en el terminal, luego probé la integración en Home Assistant. Como el sensor REST no fue concluyente en mi caso, me fui Comando _line, y fue en última instancia este método el que hizo el trabajo. El enfoque descrito es coherente con las capacidades documentadas de las integraciones REST y _line de Home Assistant.
Al final, obtengo un sensor simple, algunos atributos útiles y, sobre todo, tarjetas Lovelace que son agradables de leer. Para mí, este es exactamente el tipo de integración que me gusta: un tema algo técnico al principio, pero transformado en algo concreto, visual y accesible a diario.

