Featured image of post Domotiser son PC

Domotiser son PC

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é. img/IMG_1.jpg

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”). Activation du WoL sur Windows

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”. Option de 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

Carte de contrôle du PC

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

Editeur de stratégie de groupe locale

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é. Propriétés de la statégie

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…).

Demande de passphrase Confirmation du refus

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 :

1
2
3
4
5
6
7
switch:
  - platform: wake_on_lan
    name: "PC Anup"
    mac: "17:04:ca:fe:19:92"
    host: 192.168.10.1
    turn_off:
      service: shell_command.eteindre_mon_ordi

Après une vérification de la configuration et un redémarrage de HA, je teste le switch et ça fonctionne ! Ouvre votre instance Home Assistant sur la page de contrôle du serveur

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 !

Généré avec Hugo
Thème Stack conçu par Jimmy