Présentation

Il n’y a pas si longtemps, j’ai lu un article de hackster.io à propos d’une nouvelle carte esp32 fabriquée par olimex, une open-source-hardware entreprise qui construit des cartes IOT.

Ce nouveau module (annoncé il y a environ 2 ans) a été inclus dans l’outil ESP-IDF fin 2022 et est officiellement pris en charge avec la dernière version du logiciel ESP-IDF v5.1.

Qu’est-ce qu’un esp32 ? Comme Arduino, la plate-forme Espressif conçoit du matériel, des SoC et des modules et des logiciels open source qui permettent des applications dans le domaine IoT.

Ces modules sont parfaits pour les automatisations à distance, les capteurs, le contrôle et la surveillance, avec un faible coût et une faible consommation d’énergie, la plupart des applications fonctionnant à basse tension (3,3 - 5v).

La plupart de la ligne esp, fonctionne avec la norme wi-fi 2.4Ghz(b/g/n), le nouveau module, cependant, est un peu plus spécial, il a inclus le nouveau protocole 802.11ax wi-fi 6 et IEEE 802.15.4 qui est vital pour établir la connectivité Thread et Zigbee.

Ce fait permet aux utilisateurs d’utiliser le nouvel écosystème Matter qui promet une connectivité transparente entre les appareils de différents producteurs en transformant le nouveau module en Matter Gateway, Thread Border Router ou Zigbee Matter Bridge.

Le projet

Pour commencer, je me suis en quelque sorte précipité pour acheter le module car il y a peu ou pas de développement pour cette carte, il y a quelques exemples ici et là, mais il n’y a pas d’implémentations dans le monde réel avec ce module exact.

J’utilise homeassistant comme plateforme domotique, il a plus de 2000 intégrations et les modules ESP32 en font partie. ESPHome est une distribution freertos spécialement conçue pour homeassistant, elle s’installe sur les modules ESP et permet la configuration simple avec des fichiers .yaml et rend possible la mise à jour du module avec OTA.

Malheureusement, ESPhome ne supporte pas, au moment de la rédaction de cet article, le module esp32c6.

Pour l’instant, comme je ne suis pas développeur, je vais construire un petit projet avec l’outil ESP-IDF la bibliothèque officielle de esp32, pendant que les développeurs d’EspHome parviennent à intégrer le nouveau module dans leur référentiel.

schema La carte ESP32 a 4 optocoupleurs comme entrées et 4 relais, ce qui me permet d’avoir une entrée locale et une télécommande via wi-fi vers les relais. schema-esp32

Exécution

Pour installer les outils d’aide à la construction du projet, j’ai suivi les recommandations officielles d’installation de la bibliothèque via l’extension VS Code. vs-code-ext

Ou vous pouvez télécharger le référentiel git et installer la bibliothèque et configurer l’environnement manuellement. Vous pouvez suivre les instructions ici : docs.espressif.com/get-started/ Une fois que j’ai installé l’extension et configuré mon environnement (sur un Macbook):

$HOME/esp/esp-idf/export.sh

J’ai commencé à jouer avec les exemples trouvés dans la bibliothèque, après avoir défini la cible.

idf.py set-target esp32c6

La première chose que j’ai cherchée était la configuration physique de ma carte, et j’ai trouvé cela sur le dépôt git d’olimex :

Ensuite, j’ai cherché un moyen de communiquer avec le module, de lui envoyer des commandes et de recevoir des données, et j’ai donc trouvé ce référentiel git :

  • github.com/nopnop2002/esp-idf-mqtt-dash/ A partir de ce référentiel, j’ai utilisé le projet gpio-control. C’est un projet qui permet le contrôle des broches gpio souhaitées via le protocole mqtt.

Grâce à un ami programmeur et au projet gpio-control comme base de mon projet, j’ai apporté les modifications suivantes :

  • les relais gpios, doivent être contrôlés en priorité par l’entrée des optocoupleurs
  • le service mqtt doit refléter les changements et contrôler à distance les gpios
  • utilisez le capteur de température intégré pour signaler la température

Le plus dur a été de définir la logique du projet, et son objectif. L’installation fonctionnera normalement, une fois l’interrupteur allumé, les lumières s’allument. Alors pourquoi la télécommande ? Grâce à homeassistant je peux imposer une limite de temps pour l’illumination. Donc, si j’oublie d’éteindre l’interrupteur, les lumières s’éteindront automatiquement dans 15 minutes. Cela laisse l’interrupteur allumé et les lumières éteintes. Pas de problème, nous avons programmé la carte pour en tenir compte, et si les lumières sont éteintes, le changement d’état de l’interrupteur les déclenchera pour s’allumer. Voici le code qui rend cela possible :

int i = 0;
for (i=0; i<4; i++){
    // dernière valeur de l'optocoupleur
	int temp = Opto[i].value;    
    valeur réelle de l'optocoupleur
	Opto[i].value = gpio_get_level(Opto[i].gpio);
    // si les valeurs ne sont pas les mêmes,
    // c'est-à-dire que quelqu'un a changé la position de l'interrupteur
	if (temp != Opto[i].value)
	{
        // changer la valeur de la broche du relais à l'opposé
		gpios[i].value = !gpios[i].value;        
		gpio_set_level(gpios[i].gpio, gpios[i].value);
		sprintf(mqttBuf.topic, "%s%02d", base_topic, gpios[i].gpio);
		sprintf(mqttBuf.data, "%d", gpios[i].value);
        // publier la modification sur le serveur mqtt
		esp_mqtt_client_publish(mqtt_client, mqttBuf.topic, mqttBuf.data, 0, 1, 0);
		vTaskDelay(10);
	}

Le projet est à retrouver ici : https://git.cabivr.net/radu/esp-idf_mqtt-opto-control

Si vous voulez l’essayer n’oubliez pas de définir la bonne cible et de configurer votre serveur wifi et mqtt depuis le menu “Configuration de l’application”.

idf.py set-target esp32c6
idf.py menuconfig

app-conf Connectez ensuite votre carte à l’ordinateur et lancez :

idf.py flash monitor

Pour mettre à jour le firmware.

Intégration dans homeassistant

Après la configuration, la carte esp32c6 est disponible sur le topic “/esp32/gpio/#” et reçoit des commandes sur ce topic. La configuration des broches dans mon cas est “10/11/22/23/” comme sortie vers les relais.

Si vous n’avez pas encore le broker mqtt sur votre serveur homeassistant, il est recommandé de créer un utilisateur (je l’ai nommé “mqttuser”) dans le menu “Paramètres -> Personnes -> Utilisateurs-> Ajouter un utilisateur” de homeassistant et après cela installez le “Mosquitto Broker” à partir du menu “Add-ons”. Vérifiez votre installation en allant dans “Devices -> Integrations -> Mqtt -> Configure” Et entrez ce qui suit sous l’onglet “Écouter un sujet”: “/esp32/gpio/temp” Appuyez ensuite sur le bouton “Start listening”:

mqtt-verifie

Pour rendre les modifications permanentes, j’ai créé un fichier mqtt.yaml dans le dossier de configuration de homeassistant où j’ai écrit ces paramètres :

switch:
- name: esp170.10
  state_topic: "/esp170/gpio/10"
  command_topic: "/esp170/gpio/10"
  payload_on: "1"
  payload_off: "0"
- name: esp170.11
  state_topic: "/esp170/gpio/11"
  command_topic: "/esp170/gpio/11"
  payload_on: "1"
  payload_off: "0"
- name: esp170.22
  state_topic: "/esp170/gpio/22"
  command_topic: "/esp170/gpio/22"
  payload_on: "1"
  payload_off: "0"
- name: esp170.23
  state_topic: "/esp170/gpio/23"
  command_topic: "/esp170/gpio/23"
  payload_on: "1"
  payload_off: "0"
- name: esp170.all
  state_topic: "/esp170/gpio/set"
  command_topic: "/esp170/gpio/set"
  payload_on: "1"
  payload_off: "0"
- name: esp170.init
  state_topic: "/esp170/gpio/init"
  command_topic: "/esp170/gpio/init"
  payload_on: "10/11/22/23/"

sensor:
- name: "esp170.Temperature"
  state_topic: "/esp170/gpio/temp"
  suggested_display_precision: 2
  unit_of_measurement: "°C"
  

Et ajouté au fichier principal configuration.yaml :

mqtt: !include mqtt.yaml

Voici la carte homeassistant créée avec les boutons pour chaque relais :

buttons-esp Donc, ça y est, le projet est fonctionnel mais pas encore implémenté, en tant que preuve de concept, cela fonctionne mais, mon souci est que je n’ai pas implémenté une méthode de mise à jour simple comme celles disponibles avec le firmware ESPhome. Donc pour le moment, j’attendrai que le développement mûrisse.