Sommaire

Reset Domotique : Partie 2

Introduction

Suite à la partie 1 de mon reset domotique, je vais donc installer les composants qui gravite autour de mon système domotique.
Nous allons ici voir comment préparer, installer et configurer les services suivants :

Ces éléments seront installé avec Docker via Docker Compose.

ESPHome

Préparation

Voici donc mon fichier docker-compose.yml :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
version: '3.8'
services:
  esphome:
    image: esphome/esphome
    container_name: esphome
    restart: always
    healthcheck:
      test: curl -f http://localhost:6052 || exit 1
      interval: 1m
      timeout: 10s
      retries: 3
      start_period: 30s
    environment:
      - TZ=Europe/Paris
    #ports:
    #  - 6052:6052
    volumes:
      - /var/lib/esphome/config:/config:rw
    network_mode: host

J’ai mis un healthcheck afin d’avoir le status du service. Ainsi, la commande docker ps renverra un status healthy si le service (ici l’interface Web) est fonctionnel.

La section ports est commenté car j’utilise directement le réseau de l’hôte (mon serveur “physique”). J’ai fait de cette manière afin que le mDNS fonctionne.

Afin d’avoir des données persistantes, j’ai mappé un dossier sur /config.

Installation

Rien de compliqué ici, un simple docker-compose up -d et le tour est joué ! L’interface Web devrait-être accessible sur le port 6052.

Mosquitto

Préparation

J’ai préparé la configuration en amont afin d’utiliser le serveur de manière authentifiée.
Ci-dessous, mon fichier de configuration.

  • Fichier /etc/mosquitto/mosquitto.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
listener 1883

persistence true
persistence_location /mosquitto/data/

log_dest file /mosquitto/log/mosquitto.log
log_dest stdout

password_file /mosquitto/config/mosquitto-passwd
allow_anonymous false

Cette configuration nécessite donc un fichier de mot de passe.
Pour le créer, j’ai lancé un conteneur du service afin d’y initier le fichier.

1
2
3
$ docker run -it --entrypoint sh -v /etc/mosquitto:/data eclipse-mosquitto
mosquitto_passwd -b -c /data/mosquitto-passwd MonUserName MonPassword
exit
Ajouts d'utilisateurs supplémentaires

Pour ajouter d’autres comptes, il faudra enlever l’option -c.

Pour en créer de nouveau plus tard une fois le service lancé, il faudra exécuter la commande dans le conteneur.

1
2
$ docker exec -it mosquitto sh
mosquitto_passwd -b /mosquitto/config/mosquitto-passwd MonUserName MonPassword

Le Docker Compose :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
version: '3.8'
services:
  mosquitto:
    image: eclipse-mosquitto:2.0
    container_name: mosquitto
    restart: always
    volumes:
      - /etc/mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf:ro
      - /etc/mosquitto/mosquitto-passwd:/mosquitto/config/mosquitto-passwd
      - /var/log/mosquitto/:/mosquitto/log/
      - /var/lib/mosquitto/data/:/mosquitto/data/
    ports:
      - 1883:1883

Installation

Une fois le conteneur lancé on peut effectuer des tests de la même manière que sur mon article sur le pont RF.

Node-RED

Présentation

Node-RED c’est un outil de programmation dit “low code”, c’est-à-dire que la programmation se fait par le biais d’une interface graphique (au lieu d’écrire du code, on utilise des blocs de fonction).
Il est utilisé pour de la programmation liée à des évènements d’applications (je ne sais pas trop comment mieux traduire “for event-driven applications”)…

Avec ce logiciel, on va pouvoir recueillir des informations à partir d’évènements exposés comme une API par exemple.
Il existe un connecteur Home Assistant pour ce logiciel. De ce fait, on va pouvoir effectuer des actions en fonctions des évènements de notre système domotique. Je vais donc utiliser Node-RED pour configurer mes automatismes en lieu et place de ceux d’HA.

Préparation

Le Docker Compose :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
version: '3.8'
services:
  node-red:
    image: nodered/node-red:latest
    container_name: nodered
    restart: unless-stopped
    user: "0:0"
    environment:
      - TZ=Europe/Paris
    #ports:
    #  - 1880:1880
    volumes:
      - /var/lib/node-red/data:/data
    network_mode: host

J’initie un fichier de configuration en récupérant celui sur le GitHub de Node-RED que je place afin d’être dans le dossier /data du conteneur (soit /var/lib/node-red sur l’hôte (dans mon cas)).

Post-configuration

Une fois le conteneur lancé, je m’attarde à sécuriser l’accès via un mot de passe.
Pour cela, je vais éditer le fichier de paramètres.

Avant cela, je dois générer un hash du mot de passe. La méthode la plus accessible est de le faire dans le conteneur.
Je SSH donc dans le conteneur et lance la commande fournis dans la documentation officielle.

1
2
docker exec -it nodered bash
node -e "console.log(require('bcryptjs').hashSync(process.argv[1], 8));" MonSuperMotsDePasse

En retour, j’obtiens donc le hash.

$2a$08$J/ycU0EmKox6lcKl271DVOeYTiI85mN/oTAAVfYAp5Rf.KLupfpuq

Je copie cela pour la suite.

j’édite donc le fichier settings.js en remplaçant la section adminAuth :

126
127
128
129
130
131
132
133
134
135
136
137
    // Securing Node-RED
    // -----------------
    // To password protect the Node-RED editor and admin API, the following
    // property can be used. See http://nodered.org/docs/security.html for details.
    adminAuth: {
        type: "credentials",
        users: [{
            username: "admin",
            password: "$2a$08$J/ycU0EmKox6lcKl271DVOeYTiI85mN/oTAAVfYAp5Rf.KLupfpuq",
            permissions: "*"
        }]
    },

En relançant le conteneur (docker-compose restart), l’authentification devrait-être demandé.
En consultant les logs (docker-compose logs), j’ai remarqué l’avertissement suivant :

Your flow credentials file is encrypted using a system-generated key.

If the system-generated key is lost for any reason, your credentials file will not be recoverable, you will have to delete it and re-enter your credentials.

You should set your own key using the ‘credentialSecret’ option in your settings file. Node-RED will then re-encrypt your credentials file using your chosen key the next time you deploy a change.

J’ai donc amélioré cela en éditant le paramètre credentialSecret avec un secret créer avec un pwgen -B 32 1 :

77
78
79
80
81
82
83
    // By default, credentials are encrypted in storage using a generated key. To
    // specify your own secret, set the following property.
    // If you want to disable encryption of credentials, set this property to false.
    // Note: once you set this property, do not change it - doing so will prevent
    // node-red from being able to decrypt your existing credentials and they will be
    // lost.
    credentialSecret: "pu9aichooC7mai3ovahy9ugiesu7ceif",

Intégration d’HA

Il faut ajouté la palette de contrôle node-red-contrib-home-assistant-websocket.
Pour cela, un clique sur le burger en haut à droite pour ensuite séléctionner “Manage palette”.

/reset-domotique-partie-2/img/Screenshot_1.webp
Menu

Dans l’onglet Install, il faut installer la palette node-red-contrib-home-assistant-websocket qui se retrouve grâce à barre de recherche.

/reset-domotique-partie-2/img/Screenshot_2.webp
Installation de la palette pour HA

Pour configurer la connexion avec Home Assistant, il faut éditer un des “nodes” de Node-RED. Dans la liste de ces nodes à gauche de l’interface, je scroll jusqu’à trouvé la section home assistant.
Je drag and drop un node (“entity” dans mon cas) et double-clic dessus.

/reset-domotique-partie-2/img/Screenshot_3.webp
Ajout du node entity au flow
/reset-domotique-partie-2/img/Screenshot_4.webp
Edition de l’entité

Dans le menu d’édition, on voit bien qu’aucun serveur n’est renseigné. Je clique alors sur le ✏️ afin d’y ajouté mon serveur.

/reset-domotique-partie-2/img/Screenshot_5.webp
Edition de l’entité

Le token se génère sur la page de votre profile utilisateur HA (tout en bas) :
https://my.home-assistant.io/badges/profile.svg

/reset-domotique-partie-2/img/Screenshot_6.webp
Token HA

Une fois le tout validé on relance le conteneur Node-RED, ces logs nous valide la bonne configuration de notre serveur HA.

/reset-domotique-partie-2/img/Screenshot_7.webp
Logs du conteneur Node-RED

Pour la configuration de flow, je n’ai pas encore bien maitrisé ce logiciel. Une fois cet apprentissage effectué ,je ferais un petit article avec un exemple concret et un peu complexe (exemple que je suis en train de mettre en place).

SSL

En cours de réalisation.

Conclusion

De par mon expérience avec mon ancien serveur, j’ai constitué une nouvelle base pour mon système domotique. Bien que je n’ai pas eu de problème particulier avec mon ancienne installation, je pense avoir une installation plus saine.
Ma façon de faire est peut-être un peu différente que les autres tutoriels que l’on peut voir sur le net. Je fais de cette manière pour pouvoir redéployer mes services le plus rapidement possible car mes services sont en intégralités mis en place via des rôles Ansible.

Donne-moi un peu de temps pour la partie SSL avec Traefik !