Apagado remoto de un equipo desde Home Assistant

Apagado remoto de un equipo desde Home Assistant

Tengo un pequeño servidor local con Ubuntu server que quiero poder encender y apagar de forma remota. Así es como lo he conseguido un interruptor en mi panel de control de Home Assistant.

Encendido remoto

Gracias al WoL el encendido remoto de un equipo es realmente sencillo. Lo primero es acceder a la BIOS del equipo y habilitar el “Wake On LAN”. Cada fabricante lo tiene escondido en un menú diferente así que las capturas de pantalla de mi caso particular que pueda poner seguramente no sirvan de ayuda.

Además de WoL, si vas a usar el equipo como servidor, resulta imprescindible habilitar también desde la BIOS en encendido automático para que el equipo vuelva a arrancar tras un corte de corriente.

Con esto, todavía no es posible arrancar el equipo mediante WoL ya que las distribuciones basadas en Debian, como es mi caso, requieren una configuración posterior de la interface de red.

Empezaremos listando las interfaces de red para conocer el nombre y ver cual corresponde a la que tenemos activa.

ip link show

El comando produce la siguiente salida:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp1s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 54:47:11:24:9d:fb brd ff:ff:ff:ff:ff:ff
3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 54:43:0e:2a:9e:fc brd ff:ff:ff:ff:ff:ff
4: wlp0s20f3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether b0:dc:ef:ca:9d:65 brd ff:ff:ff:ff:ff:ff

De lo anterior (La red activa aparece como “state UP”) podemos deducir que la interface de red activa es “enp2s0” y pasaremos a analizarla con la utilidad ethtool. Si no tenemos instalada la aplicación la instalaremos con sudo apt install ethtool y lanzaremos el análisis.

sudo ethtool enp2s0

La salida que, en mi caso ha dado es la siguiente y en ella podemos ver como la opción “Wake-on” esta deshabilitada (disabled):

PHYAD: 0
Transceiver: external
MDI-X: Unknown
Supports Wake-on: pumbg
Wake-on: d
Link detected: yes

Podemos habilitar WoL en el modo “magic packet” mediante el comando ethtool -s enp2s0 wol g y obtendremos la confirmación de que este modo se ha habilitado.

PHYAD: 0
Transceiver: external
MDI-X: Unknown
Supports Wake-on: pumbg
Wake-on: g
Link detected: yes

Resulta que este método funciona pero no es persistente y después de un reinicio se desactiva el WOL por lo que hay que crear un script que lo active en cada reinicio del servidor.

  • Crear archivo “wol” sudo nano /etc/network/if-up.d/wol
  #!/bin/bash
  ethtool -s enp2s0 wol g
  • Dar permiso de ejecución al archivo con sudo chmod +x /etc/network/if-up.d/wol
  • Para ejecutar en cada reinicio editamos el crontab de root sudo crontab -e y añadimos la siguiente línea:
@reboot /etc/network/if-up.d/wol	 

Ahora y tenemos el equipo listo para encenderlo de forma remota desde Home Assistant. Utilizaremos la integración Wake on LAN capaz de enviar un “magic packet” a un equipo remoto para encenderlo sin más necesidades que la MAC y la IP local de dicho equipo.

Mediante el comando ip link show no sólo hemos visto el nombre de la interface de red, también podemos conocer la MAC de la misma.

Ahora necesitamos añadir un “switch” en el archivo “configuration.yaml” de Home Assistant mediante las siguientes líneas:

switch:
  - platform: wake_on_lan
    name: uber
    mac: 54:43:0e:2a:9e:fc
    host: 192.168.10.211

Añadimos el “switch” a nuestro panel de Home Assistant y listo para encender el servidor remoto. image-01

Apagado remoto

Llegados a este punto tenemos un equipo remoto que queremos apagar y un equipo donde tenemos instalado Home Assistant

En primer lugar necesitamos que para ejecutar el comando poweroff en el equipo remoto no se solicite contraseña. Seguimos los siguientes pasos

  • Accedemos al equipo remoto mediante ssh ssh usuario@ip_remoto
  • Ejecutamos en el equipo remoto sudo visudo
  • Añadimos la siguiente línea
mi_usuario ALL=NOPASSWD:/sbin/poweroff

A continuación accedemos a la terminal de Home Assistant que deberemos tener instalada mediante el complemento Advanced SSH & Web Terminal

  • Generamos una llave ssh ssh-keygen en el directorio “/config/ssh/id_rsa” y sin ningún tipo de contraseña
  • Nos logeamos como superusuario sudo -i
  • Copiamos la “ssh-key” al equipo remoto ssh-copy-id -i /config/ssh/id_rsa.pub usuario@ip_remoto

Ya sólo falta crear un “shell_command” y vincularlo al apagado del “switch” en el archivo “configuration.yaml” de Home Assistant.

switch:
  - platform: wake_on_lan
    name: dever
    mac: 84:47:09:24:9e:fc
    host: 192.168.10.211
    turn_off:
      service: shell_command.turn_off_dever

shell_command:
  turn_off_dever: ssh -i /config/ssh/id_rsa -o StrictHostKeyChecking=no sherlockes@192.168.10.211 'sudo poweroff'

Enlaces de interés