Faisabilité :
La première chose à faire est de voir si il est possible de piloter ces clims. L'infra rouge, c'est généralement pas simple. Chaque constructeur fait ses petites adaptations, et dans le cas des climatisations j'ai constaté que la télécommande envoyait de longs trains d'impulsions qui contenaient tous les ordres simultanément (chaud/froid/desumidificateur + température de consigne + volet oscillant o/n + mode normal/turbo, etc..). Bien sur il reste toujours possible de faire une capture de trame Infrarouge à l'aide d'un récepteur IR et d'une Arduino, puis de lla réenvoyer telle quelle, mais c'est beaucoup moins efficace que d'envoyer le train d'impulsions calculé avec le vrai protocole. Cela respecte meixu les timings et évite les erreurs de transmsission. Mais la complexité des trames faisait que le protocole est dur à casser... L'idéal serait donc de trouver une librairie qui soit développée pour ces climatisations. Cela évite de réinventer le fil à couper la poudre qui n'amasse pas mousse. (florilège de proverbes mixés).
Une recherche sur "Arduino" + "Carrier" m'a effectivement permis de loger rapidement une librairie. Toutefois, après l'avoir programmée, il ne s'est pas passé grand chose : les clims ne reconnaissaient pas le protocole. Damned.
Heureusement un ami travaillant dans la clim m'a donné la solution : Carrier, fabriquant américain, ne fabrique rien pour le marché européen. Il achète chinois (Midea) et revend du matériel rebrandé. Le matériel que je possède est donc du Midea........
Une autre recherche sur Midea / Arduino a permis de trouver une bibliothèque fonctionnelle : https://github.com/WiserUFBA/ArduMideaWrapper . Un petit essai avec une Led IR a confirmé que les clims reconnaissaient bien le protocole Midea.
L'étape suivante était de faire cette même recherche sur ESP8266. Pas mal de choix s'offrait :
- https://github.com/krzynio/esp8266-ir-ac-remote
- https://github.com/ToniA/arduino-heatpumpir
- https://github.com/sheinz/esp-midea-ir
Cette dernière option m'a beaucoup intéressée, car développée sur ESP-OPEN-RTOS, micro noyau temps réel pour ESP8266. L'auteur a même eu la gentillesse de nous développer un petit exemple : https://github.com/sheinz/esp-midea-ir-demo ... Let's go for a test...
Installation de l'environnement de développement ESP-OPEN-SDK
Passé le moment d'euphorie, il faut maintenant installer un environnement de développement pour esp-open-rtos. Ayant délaissé mon mac pour le PC de l'atelier, je ne souhaitais pas faire cela directement sous Windows. Tiens mais au fait, il n'y aurait pas un sous Système Linux pour Windows 10 (LSW)?? Mais si! Et ca tombe bien je l'avais déjà installé avec un Shell Ubuntu. ET comme Ubuntu, c'est une base Debian, facile d'installer des paquets avec apt-get... (je ne documente pas cette partie, déjà très détaillée sur Internet...).
Pour installer esp-open-rtos (le noyau temps réel), i faut déjà disposer de l’environnement de développement ESP-OPEN-SDK qui fournit à la fois le SDK pour le développement pour ESP826 et la chaine de cross compilation.
Esp-open-skd étant à compiler par les sources, il va déjà nous falloir une chaine de compilation complète GCC, et Git.
sudo apt-get install make unrar-free autoconf automake libtool gcc g++ gperf \ flex bison texinfo gawk ncurses-dev libexpat-dev python-dev python python-serial \ sed git unzip bash help2man wget bzip2 libtool-bin libz-dev
Un café pus tard, nous sommes prêts pour installer d'après les sources esp-open-sdk et le compiler :
cd ~ mkdir esp8266 cd esp8266 git clone --recursive https://github.com/pfalcon/esp-open-sdk.git cd esp-open-sdk make toolchain esptool libhal STANDALONE=n
Un apéro musclé plus tard (1 à 3h en fonction de votre configuration), la chaine de cross compilation est prête. Il va encore falloir l'intégrer à votre path en éditant votre fichier ~/.profile et en modifiant la dernière ligne:
# set PATH so it includes user's private bin directories PATH="$HOME/esp8266/esp-open-sdk/xtensa-lx106-elf/bin:$HOME/bin:$HOME/.local/bin:$PATH"
Après avoir quitté et rechargé le shell ubuntu, vou devriez pouvoir lancer gcc avec l'option -v pour vérifier qu'il s'exécute bien et sa version :
jpcivade@Atelier:~$ xtensa-lx106-elf-gcc -v Using built-in specs. COLLECT_GCC=xtensa-lx106-elf-gcc COLLECT_LTO_WRAPPER=/home/jpcivade/esp8266/esp-open-sdk/xtensa-lx106-elf/libexec/gcc/xtensa-lx106-elf/4.8.5/lto-wrapper Target: xtensa-lx106-elf Configured with: /home/jpcivade/esp8266/esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.5/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=xtensa-lx106-elf --prefix=/home/jpcivade/esp8266/esp-open-sdk/xtensa-lx106-elf --with-local-prefix=/home/jpcivade/esp8266/esp-open-sdk/xtensa-lx106-elf/xtensa-lx106-elf/sysroot --with-sysroot=/home/jpcivade/esp8266/esp-open-sdk/xtensa-lx106-elf/xtensa-lx106-elf/sysroot --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG crosstool-ng-1.22.0-60-g37b07f6' --disable-__cxa_atexit --enable-cxx-flags='-fno-exceptions -fno-rtti' --with-gmp=/home/jpcivade/esp8266/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/buildtools --with-mpfr=/home/jpcivade/esp8266/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/buildtools --with-mpc=/home/jpcivade/esp8266/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/buildtools --with-isl=/home/jpcivade/esp8266/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/buildtools --with-cloog=/home/jpcivade/esp8266/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/buildtools --with-libelf=/home/jpcivade/esp8266/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/buildtools --enable-lto --enable-target-optspace --without-long-double-128 --disable-libgomp --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-nls --disable-multilib --enable-languages=c,c++ Thread model: single gcc version 4.8.5 (crosstool-NG crosstool-ng-1.22.0-60-g37b07f6)
OK. Ca marche.
Installation d'ESP-OPEN-RTOS
L'étape suivante va être d'installer esp-open-rtos. C'est plus simple et plus rapide :
cd .. git clone --recursive https://github.com/Superhouse/esp-open-rtos.git
Pour que notre wifi fonctionne, il va falloir créer un fichier avec ses identifiants (mettre les vôtres, hein :) ) :
vi esp-open-rtos/include/private_ssid_config.h #define WIFI_SSID "mywifissid" #define WIFI_PASS "my secret password"
Enfin, nous allons installer la dernière version du logiciel de flashage d'ESP, en Python :
sudo apt-install python-pip pip install esptool esptool.py
Sur Ubuntu/Windows, lorsque l'on branche un périphérique série (ex : COMx), est est vu en /dev/ttySx. Munissez vous d'une ESP8266, branchez le et relevez le numéro de com sur lequel il est branché. Toutefois, pour des raisons que j'ignore, le /dev/ttySx nécessite des droits particuliers pour être utilisé par un utilisateur sans privilège.
Nous allons devoir les lui donner à la main (ici pour COM4) :
sudo chmod 777 /dev/ttyS4
Nous allons maintenant pouvoir compiler et flasher un exemple de code fourni avec esp-open-rtos (ici, flashé sur COM4):
cd ~/esp8266/esp-open-rtos make flash -j4 -C examples/http_get ESPPORT=/dev/ttyS4
Un café plus tard, votre ESP est flashé avec le code d'exemple. Ça fonctionne donc...
A noter que vous pouvez accélérer la programmation en ajoutant l'option ESPBAUD (défaut = 1152200). Les valeurs valides sont 115200, 230400,500000, 576000,921600,1000000. A 500000 ça commence à envoyer :).. si votre câble USB n'est pas trop long. Vous pouvez expérimenter pour voir quelle vitesse max vous pouvez utiliser en fonction de votre configuration.
Installation de l'exemple et de la bibliothèque Midea
sudo apt-get install picocom tftp git clone --recursive https://github.com/sheinz/esp-midea-ir-demo.git cd esp-midea-ir-demo ; Éditer le Makefile et changer le port série pour /dev/ttyS4 ; (ou celui de votre choix).
A ce stade, toute tentative de compilation se solde par un échec. En effet, le code a un petit bug facilement corrigeable : Dans midea-ir.c, changer
_xt_isr_attach(INUM_TIMER_FRC1, timer_interrupt_handler);
Pour
_xt_isr_attach(INUM_TIMER_FRC1, timer_interrupt_handler, NULL);
On peut maintenant compiler :
make flash -j4 ESPPORT=/dev/ttyS4 ESPBAUD=500000
Développer dans le sous Système Linux pour Windows (LFW)
Environnement graphique pour l'édition de fichiers
Bien sur on peut être tenté de localiser l'endroit ou sons placés les fichiers Linux à partir de environnement Windows (c'est dans %localappdata%\lxss\) et d'utiliser un IDE ou éditeur de texte Windows. Ce n'est clairement pas une bonne idée, car dès qu'on sauve un fichier on massacre ses permissions sous Linux et il devient invisible de linux (et donc incompilable...).
J'ai personnellement choisi de développer avec Visual Studio Code. On l'installe dans Windows puis on le lance dans Linux, ce qui lui permet d'écrire en tant qu'utilisateur Linux dans le système de fichiers sans modifier les permissions. Voici un petit exemple de script shell à lancer à l'ouverture du BASH Ubuntu, qui changera les permissions sur les com sélectionnés et lancera visual studio Code en tant qu'utilisateur Linux. Fini les problèmes de droits ! Il suffira de lancer la compilation de la même fenêtre Bash Ubuntu à chaque modificiation...
#!/bin/bash sudo chmod 777 /dev/ttyS4 sudo chmod 777 /dev/ttyS7 cd esp8266/climesp "/mnt/c/Program Files/Microsoft VS Code/Code.exe"&
Makefile et dépendances
Par ailleurs, il semblerait que les auteurs de esp-open-rtos aient fait le choix de ne pas gérer la dépendance des fichiers lors de la compilation. Ce qui veut dire que si vous changez un fichier, et relancez le "make", il ne détectera pas qu'un fichier a changé. Il faudra donc faire un "make clean" avant le "make". Exemple:
make clean; make flash -j4 ESPPORT=/dev/ttyS4 ESPBAUD=500000
Copier coller du terminal Bash vers windows
Il est possible d'activer le copier coller entre Windows et LSW. Pour ce faire faire bouton de droite sur la barre de titre, propriétés tet cocher "Mode d'édition rapide" et "activer les raccourcis avec la touche contrôle". Il faudra fermer et réouvrir a fenetre pour que cela soit actif et vous permettra de coller avec un simple clic droit.
Pilotage des climatisations
A ce stade, nous avons donc un environnement de développement pour ESP8266 dans un shell Ubuntu sous Windows 10 avec :
- le noyau temps réel,
- la chaine de compilation
- une splendide bibliothèque permettant de piloter l'infrarouge.
Il nous reste à ajouter le support du Wifi, le choix du SSID et mot de passe, et un serveur web qui serve des pages permettant de piloter la clim.
Branchement des leds IR
Mais avant cela, il va falloir ajouter de quoi piloter une ou plusieurs led infrarouge. Le couant consommé par ces petites bêtes étant assez important (de l'ordre de 100 mA), il va nous falloir disposer d'un étage de commutation, la sortie de l'ESP n'étant pas en capacité de délivrer d'aussi forts courants. Une led infra rouge se pilote avec une tension de 1.6V. Ici je vais en mettre 2 en série. J'ai choisi un mosfet 2N7000, qui a une résistance Ron de 5 ohms. La résistance a mettre en série avec les Leds sera donc de ( (5V - 1.6V - 1.6V) / 0.1A) - 5 ohms (ron du fet) = 13 ohms. Je choisi une valeur approchée (12 ou 15 ohms) pour cadrer avec les séries E. Voici le schema du branchement :
Squelette de programme
J'ai prélevé le squelette du programme d'un exemple fourni avec esp-open-rtos (examples/esphttpd). En effet, cette bibliothèque fournit tout la couche de setup du wifi, le serveur web et un système de templates HTML assez simple à utiliser. J'ai seulement élagué le code qui ne me servait pas et ajouté la partir télécommande Infrarouge. J'ai choisi de faire très simple. La petite interface web permet d'allumer le chauffage avec une température de consigne de 15 à 22 degrés. Il est également possible de l'appeler par une URL avec en GET le paramètre de température :
Arrêt : http://192.168.20.246/temperature.cgi?temp=0 20 degrés : http://192.168.20.246/temperature.cgi?temp=20
A noter que les paramètres sont testés pour n'accepter qu'une température comprise entre 15 et 22.
Version finale du programme
L'archive contenant le programme est ICI : climesp.zip. Elle est à décompresser dans ~/esp8266
Et Google Home alors?
Une fois que l'on dispose d'un microcontrôleur qui fournit une interface de pilotage en http, rien de plus simple pour le piloter.
Il faut d'abord que ce périphérique soit accessible de l'extérieur de votre réseau. C'est la partie la plus compliquée. Pour ce faire :
- Il faut que vous soyez en IP fixe, ou au moins en DNS dynamique (ex: Dyndns).
- Il faut ajouter l'attribution d'une IP fixe dans votre routeur pour l'adresse MAC correspondant à votre ESP. Ici disons 192.168.20.246.
- Il faut ajouter une règle NAT dans votre routeur qui redirige un port vers cette adresse IP (ici *:8888 > 192.168.20.246:80)
- Vous pouvez ensuite tester sur votre ip fixe ou sur le nom DynDNS (ex: http://monmachin-a-moi.dyndns.org:8888) et vérifier que la page web s'affiche. Sur certaines connexions ADSL, il n'est pas possible de faire ce test de l'intérieur de votre réseau. Faites le plutot avec un téléphone en 3/4G.
Ensuite, votre Google Home doit être associé avec IFTTT (ifttt.org). Vous devez pour cela ouvrir un compte sur https://www.ifttt.org, aller sur l'applet Google Assistant et cliquer sur l'icone settings pour l'associer avec votre propre Compte Google Home.
Dernière étape :
- Aller dans "My Applets", et cliquer sur "New Applet".
- Cliquer sur "If +This" et choisir dans la liste "Google Assistant"
- Sélectionner "Say a phrase with Number". Ce nombre sera la température souhaitée..
- Dans le champ "What do you want to say", mettre par exemeple "Chauffage à #"
- Dans le champ "What do you want the Assistant to say in response?", mettre par exemple "OK, le met le chauffage à # degreé"
- Sélectionnez le français puis "Create Trigger"
- Dans l'écran suivant, cliquez sur "+ that"
- Sélectionnez "Webhooks", qui va nous permettre d'appeler une adresse personnalisée
- Coller votre URL http://monmachin-a-moi.dyndns.org:8888//temperature.cgi?temp=
NumberField
- Sélectionner Method "Get", "Text/plain" sur le content type
- Cliquez sur "Create Action" puis "Run Applet"
Et voila. Vous avez désormais un nouveau mot clé pour allumer votre chauffage par Google Home ou Google Assistant. Il vous rester à créer une Autre applet pour l'éteindre (http://monmachin-a-moi.dyndns.org:8888//temperature.cgi?temp=0) pour compléter le tout...
En conclusion
Oui, c'est long et peut être compliqué. Et sur le résultat lu même, coté sécurité ce n'est pas le top. En effet, notre télécommande IR par internet est accessible à tout le monde. Il serait possible de sécuriser par mot de passe l'accès à l'interface web ou d'ajouter un jeton dans le requête qui ne serait pas devinable.
Quand à ajouter le support SSL, ce serait possible mais avec pas mal de limitations. Il y a un exemple fourni avec esp-open-rtos, mais qui a de sévères contraintes.
Mais ici, le risque est assez restreint puisque la seule chose que le device peut faire est d'envoyer des codes infrarouge.
Mais surtout, nous avons pu apprendre beaucoup sur l'utilisation de Windows comme outil de développement Linux, là ou avant il fallait une machine virtuelle ou un autre PC.
Également, nous avons compilé un outil de développent et intégré un noyau temps réel sur ESP, qui pourra ouvrir de tous nouveaux horizons par rapport à l'Arduino, beaucoup limitée.
Enfin, nous avons fait un truc fun: Ajouté des actions à notre Google Home...
Quick, dirty, mais FUN :)