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.
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'