Article présentant la manière dont je démarre et arrête mon PC (Windows) à distance sur Home Assistant.
Introduction
La domotique permet de commander à distance pas mal de chose (lampe, ventilateur, aspirateur, TV, …) mais quand est-il de notre PC ?
Une solution de démarrage à distance existe depuis la nuit des temps (j’exagère un peu), elle porte
le nom de Wake on LAN (WoL).
Cette fonctionnalité est possible que si la carte mère le supporte ainsi que la carte Ethernet.
Sur les modèles d’ordinateur actuel, on peut penser que cela doit-être majoritairement le cas.
Pour l’arrêt de la machine, c’est un peu plus compliqué. Pour cela, on utilisera l’outil net
qui
est une commande Linux pour l’administration de serveurs CIFS et Samba.
Démarrage à distance
Pré-requis
BIOS
Pour activé le WoL, il faut d’abord le faire dans le BIOS. Pour voir comment faire cela avec votre modèle de carte mère je vous invite à chercher sur le net ou de parcourir votre BIOS.
Dans mon cas (carte mère MSI Z370 Gaming Plus), le paramètre à activer était
Réveil avec LAN intégré
.
Windows
Une fois que le BIOS permet le WoL, il faut vérifier que c’est bien le cas dans les paramètres de la carte réseau sur Windows.
Pour cela, exécutez ncpa.cpl
dans une fenêtre d’exécution (Windows + R), faites un clic droit
sur votre carte et sélectionnez Propriétés
. Dans la fenêtre qui vient de s’ouvrir,
cliquer sur Configurer
. Aller donc dans l’onglet Avancé
et chercher la propriété “Wake on Magic Packet”.
Activez-la si ce n’est pas le cas (case “Valeur”).
Relever aussi l’adresse MAC de la carte, nous en aurons besoin pour la suite. Pour cela,
faite un clic droit sur votre carte, sélectionner Status
puis Détails...
. L’adresse MAC correspond alors à la valeur
du champs “Adresse physique”, elle est de la forme 17-04-CA-FE-19-92 (j’utiliserais cette valeur en exemple dans la
suite de cet article).
Pour finir, il faut aussi désactiver le démarrage rapide de Windows 10.
Aller donc dans le “Panneau de configuration”, (“Matériel et audio”), “Options d’alimentation” et cliquer sur
Choisir l’action des boutons d'alimentation
, puis décocher l’option “Activer le démarrage rapide”.
Test
Pour tester le fonctionnement, j’ai utilisé l’application Android Wake On Lan.
Renseignez-y l’adresse MAC en séparant les octets par un double point plutôt que par un tiret (ex. : 17:04:CA:FE:19:92). N’oubliez pas d’éteindre votre PC avant !
Intégration à HA
Pour avoir la possibilité d’envoyé des magic packets via HA, il faut ajouté le contenu suivant dans le fichier
configuration.yaml
:
wake_on_lan:
Ensuite, on définit un switch de la manière suivante :
switch:
- platform: wake_on_lan
name: "PC Anup"
mac: "17:04:ca:fe:19:92"
host: 192.168.10.1
Dans la documentation relative et WoL,
les exemples d’adresses MAC ne comportent pas de majuscules. N’en mettez donc pas.
Le champ d’hôte (host
) n’est pas nécessaire mais permet a HA de connaitre le status de l’ordinateur.
Cela sera nécessaire pour la partie suivante, je vous conseille donc d’en spécifier une.
De ce fait, cette IP ne doit pas changer. J’ai donc mis une adresse IP statique sur mon PC
(hors de mon pool DHCP).
Sur Lovelace, j’ai créé une simple carte d’entités :
entities:
- entity: switch.pc_anup
show_header_toggle: false
type: entities
Afin de ne pas permettre à n’importe qui d’utiliser cette carte, je l’ai créé dans une page accessible seulement aux administrateurs. Il est aussi possible de verrouiller l’utilisation de cette carte avec la Love Lock Card disponible sur HACS.
Arrêt à distance
Pré-requis
Vous avez besoin de votre nom de compte ainsi que de la passphrase de connexion.
Bien que cela paraisse évident, il n’est pas sûr que votre nom de compte le soit.
Pour l’obtenir, entrer la commande whoami
dans un invite de commande.
Le résultat devrait être de la forme <nom_du_pc>\<nom_de_compte>
.
Pour les exemples, j’utiliserais les éléments de compte Windows suivants :
- Nom de compte :
batman
- Passphrase :
robin
Nous devons autoriser notre utilisateur à effectuer un arrêt à distance. Pour cela,
il faut exécuter gpedit.msc
dans une fenêtre d’exécution (Windows + R).
Suivez donc l’arborescence suivante :
- Configuration ordinateur
- Paramètres Windows
- Paramètres de sécurité
- Stratégies locales
- Attributions des droits utilisateur
- Stratégies locales
- Paramètres de sécurité
- Paramètres Windows
Dans la liste des stratégies (à droite), ouvrez Forcer l'arrêt à partir d'un système distant
.
Par défaut, seul les Administrateurs ont cette possibilité.
On ajoute donc notre utilisateur en cliquant sur le bouton d’ajout. Dans la fenêtre qui s’ouvre,
on tape notre nom de compte et on clique sur Vérifier les noms
. Normalement, votre saisie est
modifiée pour être la même chose que le retour de la commande whoami
.
Configuration Linux
Principe
La commande d’arrêt à distance est la suivante :
net rpc shutdown -I 192.168.10.1 -U batman%robin
En exécutant cela, le PC Windows reçoit un message pour l’avertir. Le PC s’éteint après une trentaine de secondes.
Du coup le principe est de faire de cette commande un script et de le lancer via HA. Le problème est que la passphrase est un peu (beaucoup) trop en clair à mon gout ! Surtout quand c’est celui de mon PC !
On va donc voir comment avoir utilisé les secrets dans un script Bash.
Création des clés avec GnuPG
On va donc créer une paire de clés pour le cryptage/décryptage d’un fichier texte contenant
la passphrase du compte Windows. On installe donc GPG (version 2) avec sudo apt install gnupg2
.
Pour que cela fonctionne sur HA, je me connecte avec mon compte de service qui
dans mon cas, s’appelle simplement homeassistant
.
Faisant cela en SSH avec un su
pour aller sur cet utilisateur, j’ai eu le message suivant :
gpg: agent_genkey failed: Permission denied
De ce fait, il faut d’abord donner les droits sur la sortie standard à l’utilisateur avant
de switcher dessus. On récupère le nom de la sortie avec la commande ls -l $(tty)
.
Dans mon cas le résultat est /dev/pts/0
sudo chown homeassistant /dev/pts/0
sudo -u homeassistant -H -s
cd # Pour être sur d'être dans son repertoire utilisateur
On génère donc la clé avec la commande gpg2 --full-generate-key
dont voici le résultat du prompt :
$ gpg2 --full-generate-key
gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: Home Assistant
Email address:
Comment:
You selected this USER-ID:
"Home Assistant"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
J’ai donc choisi une clé de 4096 bits qui n’expire jamais.
Après avoir validé la saisie, on nous demande une passphrase, je n’en ai mis aucune car
il ne sera pas possible d’utiliser le script sinon (le script va demander à l’utilisateur
d’entrée la passphrase…).
Après cela, la génération va prendre plus ou moins de temps en fonction de votre machine (moi ~7 min).
Cryptage de la passphrase
Pour obtenir de manière cryptée la passphrase “robin” :
echo -n "robin" | gpg --armor --recipient "Home Assistant" --encrypt
Vous aurez alors un résultat de ce type :
-----BEGIN PGP MESSAGE-----
hQIMA3tijEyqYB7MAQ/9HG5rpX0zlOVRd/jy+6mK+9yP2SJZaPJHOexVIYY4I1c6
i4v0We6w3Jl6m74kih8udFzMomg/fnkiv3DybLEHcpriC5maKERoV76pkfV2Op+F
TOfmURmn3KBGSqg7yxfJfSgbxwso1katZvAtUt8zgtqLEc5DCORVm9JdvBHrjbDv
RxTzxRmupW+WHIghprqCZw6Tc8oNBpqJhdkybPqkTbsSNzCX0M5jCCTCTbzb6J8O
6NIW4pxFzrUO29EQ94EKYq1VT/mz+KFQspRax8Yk9rL/k/twAO9yIhorwXZGAHwG
hHGge0EAMPds/iB+WAoLXRFqXBQHfufo/bUExcFYLfpETW/Z511/+wpy3YeCJQYu
ofWAfaMnlrFHRB+VvDj5k4zyvlWBznt+JDtkcRpiiLQXz1/OyozLlMx1ZQKStGQZ
XLVsPdHiMYM67dHG5bliWils8IevBm+tTZoBDzC+FIQPoEKHrvoATiBiYL69dq/2
uCqqfSt5jX1+gzgoQHnJAGQjop+tEg1tGEXAYF8JXdv8uXC9NHxPekjKN3uJqYcP
emQn7qaRPFOYoyriAf/LWFkTWGWtbMkG/48llwPNM6EL7CmM1BknKqA3owUCdesH
0VMk4gIbsHXwvaCNwXGH2HVlfSBvjNPn/xDDoxEvL5ZAOYynZpCLjIxKw3HxisrS
QwEcg22xtNpv4MjW1C0mYMJF4Lv3gJpod4Ns7dDo1HXch76cG/2EmWaQ2GEOB2eD
DKg9cKVNB9XXUVnAPdXe27rzgYQ=
=lKuF
-----END PGP MESSAGE-----
Copier cela quelque part, nous en aurons besoin dans le script.
Pour le tester, lancer la commande gpg --batch --quiet --recipient "Home Assistant" --decrypt <<EOF
, entrer le message PGP et taper EOF
. Votre passphrase devrait apparaitre sur le prompt.
Création du script
J’ai donc créé un script à la base de mes fichiers de configuration de HA avec le contenu suivant :
#!/bin/bash
ipAdress="192.168.10.1"
user="batman"
password=$(gpg --batch --quiet --recipient "Home Assistant" --decrypt <<EOF
-----BEGIN PGP MESSAGE-----
hQIMA3tijEyqYB7MAQ/9HG5rpX0zlOVRd/jy+6mK+9yP2SJZaPJHOexVIYY4I1c6
i4v0We6w3Jl6m74kih8udFzMomg/fnkiv3DybLEHcpriC5maKERoV76pkfV2Op+F
TOfmURmn3KBGSqg7yxfJfSgbxwso1katZvAtUt8zgtqLEc5DCORVm9JdvBHrjbDv
RxTzxRmupW+WHIghprqCZw6Tc8oNBpqJhdkybPqkTbsSNzCX0M5jCCTCTbzb6J8O
6NIW4pxFzrUO29EQ94EKYq1VT/mz+KFQspRax8Yk9rL/k/twAO9yIhorwXZGAHwG
hHGge0EAMPds/iB+WAoLXRFqXBQHfufo/bUExcFYLfpETW/Z511/+wpy3YeCJQYu
ofWAfaMnlrFHRB+VvDj5k4zyvlWBznt+JDtkcRpiiLQXz1/OyozLlMx1ZQKStGQZ
XLVsPdHiMYM67dHG5bliWils8IevBm+tTZoBDzC+FIQPoEKHrvoATiBiYL69dq/2
uCqqfSt5jX1+gzgoQHnJAGQjop+tEg1tGEXAYF8JXdv8uXC9NHxPekjKN3uJqYcP
emQn7qaRPFOYoyriAf/LWFkTWGWtbMkG/48llwPNM6EL7CmM1BknKqA3owUCdesH
0VMk4gIbsHXwvaCNwXGH2HVlfSBvjNPn/xDDoxEvL5ZAOYynZpCLjIxKw3HxisrS
QwEcg22xtNpv4MjW1C0mYMJF4Lv3gJpod4Ns7dDo1HXch76cG/2EmWaQ2GEOB2eD
DKg9cKVNB9XXUVnAPdXe27rzgYQ=
=lKuF
-----END PGP MESSAGE-----
EOF
)
net rpc shutdown -I $ipAdress -U ${user}%${password}
Le script fonctionne !
Intégration dans HA
Pour pouvoir lancé le script via HA, il faut créer une commande Shell.
On édite donc le fichier configuration.yaml
shell_command:
eteindre_mon_ordi: /home/homeassistant/.homeassistant/shutdown_computer.sh
Ainsi, on édite notre switch pour appeler notre script :
|
|
Après une vérification de la configuration et un redémarrage de HA, je teste le switch et ça fonctionne !
Conclusion
Une bonne chose de fait !
Cette procédure est plutôt simple, j’ai simplement ajouté de la difficulté avec le cryptage
de la passphrase.
Il est aussi possible de coupler un bouton logique sur les mêmes pins que le bouton
d’alimentation avec un relais (comme un Sonoff SV) en mode latching ou un optocoupleur ou autre…
De mon point de vue, une solution logiciel est plus simple à mettre en place.
De plus, ça ne coute rien !