[TUTO] Thermostat tactile "simple" connecté

Bonjour,

Voici un tutoriel pour réaliser un thermostat électronique avec une interface à écran tactile couleur.
Le fil d’origine : https://forum.jeedom.com/viewtopic.php?f=59&t=46242#p745637

Cahier des charges / Fonctionnalités :

  • Consigne réglable (la base du thermostat, quoi…).
  • Retour sur écran de tous les paramètres .
  • Mesure de température intégrée.
  • Chauffage en mode hystérésis.
  • Hystérésis paramétrable.
  • Possibilité de forcer la consigne.
  • Possibilité pour Jeedom de contourner le thermostat et d’envoyer la chauffe ou l’arrêt de la chauffe selon ses propres critères.
  • Sécurisation de la commande directe de Jeedom : au lieu de contrôler directement un GPIO via l’équipement Jeedom ESPEasy, la chauffe se fait via l’appel d’une fonction custom du Node qui active ou coupe le GPIO.
  • Réglage de valeurs mini/maxi en cas de panne Jeedom. Si le min ou max sont atteints, alors le contrôle Jeedom est désactivé et on rétablit une consigne égale au mini ou au maxi.
  • Retour à Jeedom de la consigne, de la température / humidité (selon capteur), si la chauffe est active, et si le mode « bypass » (contrôle jeedom) est actif.
  • Sécurisation de la coupure chauffe même si le thermostat a été mis sur off (et dans plusieurs autres cas).
  • Récupération des paramètres en cours en cas de coupure électrique.
  • Jeedom est prévenu si l’appareil reboote.
  • Réveil / extinction de l’écran par bouton capacitif.
  • Bouton ON/OFF du thermostat permettant de désactiver la gestion « autonome » et « bypass ».
  • Alimentation possible par micro usb ou 230V.
  • Sortie sur relais libre de potentiel NO/NF.
  • Boitier réalisable sur imprimante 3D.

L’idée générale est d’avoir un appareil qui soit autonome, et aussi pilotable par Jeedom ; en particulier par le plugin « Thermostat ». Mais avec des sécurités… si Jeedom plante (si, si, ça arrive !), des garde-fous empêcheront de se réveiller le matin avec 15° dans la maison.
Inconvénient principal de cet appareil : il n’est pas autonome énergétiquement… il faut prévoir une alim 230V ou USB.

Résumé technique :

Le thermostat est composé d’un NodeMCU (ESP8266), d’un écran Nextion 3.5", d’un capteur capacitif HTTM, d’un relais 230V et d’un capteur température / humidité (ou seulement température, au choix). Plus quelques composants classiques : résistances, diodes, transistor.
Le tout est monté sur un circuit imprimé fabriqué sur mesure chez JLCPCB.

Plan du tutoriel :

Le but du tutoriel est de détailler :

  • Comment intégrer physiquement les composants
  • La configuration du NodeMCU sous ESPEasy
  • Le design des images d’interface
  • La programmation de l’écran Nextion
  • La programmation du NodeMCU (rules)
  • Les règles détaillées de fonctionnement en mode « autonome » et « bypass »

Quelques images pour vous motiver à lire la suite (ou pas… je ne suis pas vraiment un graphiste pro :slight_smile: ) :
1-Ecran%20principal
2-Options
3-Recup

Le projet est actuellement fonctionnel en mode autonome (non contrôlé par le plugin thermostat de Jeedom).

Logiciels utilisés :

  • Powerpoint (design des écrans Nextion)
  • GIMP (design des écrans Nextion)
  • Nextion Editor (design et logique du Nextion)
  • EasyEDA (schéma électrique et circuit imprimé)
  • Solidworks (design boîtier)
5 « J'aime »

PARTIE HARDWARE

Schéma électrique :

Voici le schéma électrique du montage…
Les éléments complexes, comme l’écran, ou le nodeMCU sont prévus pour être enfichés sur des supports afin d’être changés facilement. C’est pour cela notamment que l’écran n’est pas relié directement au circuit.


Quelques explications :

  • SW1 est un interrupteur tactile rétroéclairé. Il est capable de basculer à travers une paroi. Il sert à éteindre ou réveiller l’écran.
  • U3 est un capteur température / humidité DHT22 (il sera probablement remplacé par une sonde DS18B20, soit soudée directement sur le PCB (mais j’ai des doutes quant à la précision de la température), soit déportée dans le boîtier.
  • La partie droite du circuit est un montage qui permet de déclencher un relais 5V à partir d’une sortie 3.3V du Node et d’un transistor.
  • La partie isolée en bas à gauche est le circuit d’alim… soit en 230V via le bloc HiLink, soir directement via une alim micro-USB.
  • Le circuit a été concu pour un DHT22, mais d’un point de vue intégration, une sonde étanche « dallas » DS18b20 fera mieux l’affaire pour la mise en boitier. Sans ce cas, la résistance R2, notée 10kOhm doit être remplacée par une 4.7 kOhm.

Rien de très compliqué :wink:

Liste de courses :

En principe avec ça vous devriez avoir de quoi faire ! Même pour d’autres projets.

Si j’ai bien compté au fur et à mesure, il y en a pour environ 55€, sans les frais de port. Je n 'ai pas non plus été chercher le moins cher ni essayé de grouper le maximum d’articles chez le même vendeur.
Si vous avez la chance d’avoir un détaillant en électronique près de chez vous, ça peut être intéressant d’y aller, car tous les kits de diodes, résistances et autres peuvent êtres ramenés à quelques dizaines de centimes pour des composants à l’unité.

Un truc à savoir : chez AliExpress, les frais de livraison sont appliqués sur chaque article même pour un vendeur unique. Mais il est en général possible de les contacter pour qu’ils ne les appliquent qu’une seule fois. Dans ce cas, il faut passer la commande, et au moment de payer (par Paypal, par exemple), annuler la validation finale du paiement. Ensuite la commande passe en ‹ A payer ›, vous pouvez alors recontacter le vendeur pour qu’il fasse sauter les frais de port supplémentaires (bien sûr, il faut s’être mis d’accord avant).

On va maintenant pouvoir passer à l’assemblage !

PCB :

Le circuit imprimé est conçu grâce à EasyEDA. C’est un logiciel gratuit et édité par un fabricant de PCB (JLCPCB - Hong Kong) … comme quoi, rien ne se perd ! Le soft est assez rapide de prise en main et surtout, il fait les routages tout seul. On commence par le circuit électrique (voir au-dessus) puis il projette le tout vers un PCB. Plus qu’à décider comment placer les composants, donner quelques contraintes pour le routage, et hop.
Ensuite en quelques clicks on commande chez JLCPCB. Ca ne coûte pas grand chose en termes de circuit, MAIS il faut en commander 5 minimum et les frais de port sont plus élevés que le prix des PCB. Dans mon cas, pour un PCB de 10cm x 7cm, il y en a pour 2$ les 5 (!) mais 5.5$ de frais de port minimum…

Voilà le résultat en vue 3D dans EasyEDA :


On notera que l’écran et le bouton sont sur une face et tout le reste sur l’autre.
Ce PCB est la seconde version physique…

Le PCB étant définitif, voici le lien pour le commander… par 5 minimum !



Ayant épuisé mon stock, voici le mini tuto pour commander des PCB.
D’abord il faut créer un compte chez JLCPCB, puis se loguer sur le site… là pas besoin d’aide.

Ensuite, lorsque vous cliquez sur le lien ci-dessus, vous devez choisir l’option « Open in Editor » au-dessus de l’image du PCB :

Aller dans « Fabrication / PCB Fabrication File (Gerber) » :

Répondre non à la question qui demande si on veut vérifier les règles de design :
Etape3

Configurer comme suit la fenêtre suivante, puis cliiquer sur « Order at JLCPCB » :

Confirmez les choix précédents (si vous ne savez pas, laissez par défaut), puis cliquez à droite sur « Save to cart » :

Enfin, cliquez sur la fenêtre qui apparaît en haut « Checkout » :
Etape6

En principe, il y en a pour 2$ de PCB. Il faut choisir un mode d’expédition en 10-15j (autour de 6.5$) si vous ne voulez pas payer vraiment cher de frais de port.

1 « J'aime »

Un peu de soudure :

Il faut juste avoir une petite panne pointue et être minutieux. On commence par les petits composants en face « arrière » (côté composants), puis les gros, et pour finir la face avant où il n’y a qu’un seul support à souder.

En images…

Ici, on peut voir le début de la soudure des petits composants : diode, résistances, transistors, les supports du NodeMCU, puis les connecteurs (USB, puissance), enfin les gros composants (relais et Hi-Link).


Sur ce montage, on voit le détail des 3 fils du capteur de température DS18b20. La longueur idéale de câble pour l’intégration dans le boîtier est de 18-20cm.
De l’autre côté, le support pour le switch tactile et les entretoises pour l’écran. Il faut des entretoises de type M3-10mm.


Ici c’est le montage terminé : les câbles USB et de la sonde de température sont routés à leur place finale, un petit fil pour les tenir (il y a deux trous prévus pour…). Le Nextion est connecté (notez l’ordre des fils de gauche à droite : jaune, bleu, noir, rouge).
Et en face avant, le switch est en place et l’écran monté sur ses entretoises.
J’ai routé les câbles du Nextion sous le NodeMCU et le câble d’alimentation.


On va pouvoir passer à la suite… toute la config !

1 « J'aime »

Installation d’ESPEasy sur le NodeMCU

Pour commencer, il faut connecter le Node sur votre PC via sa prise USB (notez que dans ce cas, si vous l’avez laissé sur le PCB, le Nextion n’est pas alimenté). Puis laisser Windows chercher un driver adapté s’il n’existe pas déjà.
Le Node devrait apparaître dans le gestionnaire de périphériques (Click droit sur Poste de travail / Gérer / Gestionnaire de périphériques (à gauche) / Ports COM et LPT). Profitez-en pour récupérer le numéro du port COM.

Ensuite, il faut aller récupérer la dernière mouture d’ESPEasy ici :

Cliquez sur le titre « Release Mega YYYYmmdd » et téléchargez le fichier .zip sur l’écran suivant : ESPEasy_mega-YYYYmmdd.zip

Nota : mon thermostat fonctionne avec la version suivante :
https://github.com/letscontrolit/ESPEasy/releases/download/mega-20191208/ESPEasy_mega-20191208.zip

Dézippez l’archive et donnez les droits d’exécution « Admin » à esptool.exe et FlashESP8266.exe .
Allez dans le dossier /bin et copiez le fichier « ESP_Easy_mega-YYYYmmdd_test_core_XXX_ESP8266_4M.bin » (il faut impérativement une version « test » pour la prise en charge de l’écran Nextion).
Revenez au dossier où se trouve FlashESP8266.exe et collez le .bin.

Ensuite on lance l’exécutable FlashESP8266.exe.
Il va proposer un port COM (choisir celui du NodeMCU) et un Firmware : normalement il n’y a qu’un seul choix possible : celui que vous venez de coller.
En cliquant sur « Flash », une interface doit apparaître et au bout d’un moment elle indique que le flash s’est bien déroulé.

On débranche et rebranche le NodeMCU. Il va redémarrer et se configurer pour créer un point d’accès Wifi nommé « ESP_Easy_0 ».
Avec une tablette ou un téléphone, connectez vous sur ce point d’accès avec le mot de passe suivant : configesp.
Une interface permettant de saisir un SSID et un mot de passe va apparaître. Mettez-y vos paramètres de wifi et validez.
L’interface se configure et vous indique l’adresse IP que votre NodeMCU a récupéré sur votre réseau.
Revenez sur le PC et tapez l’adresse IP dans le navigateur. Vous arrivez sur l’interface d’ESPEasy.

Dans la partie « Config / IP settings » vous pouvez mettre une IP fixe pour votre ESP. Validez et rebootez pour prise en compte.

Maintenant nous sommes prêts pour la configuration…

Configuration d’ESPEasy sur le NodeMCU

Là ça va être plus simple… il suffit de la charger dedans.
Allez dans « Tools / Settings / Bouton Load » et fournissez le fichier suivant (pour lequel vous aurez auparavant enlevé l’extension .pdf, puis dézippé le contenu) :

config_ESP7-Thermostat_DS18b20_Build20104_202009.dat.pdf (64 Ko)

Après chargement du fichier, des trucs ont dû apparaître dans à peu près tous les onglets. Il est important de retourner dans « Config » pour y remettre le SSID / Mot de passe de votre Wifi (vous avez dû récupérer mes identifiants Wifi ‹ spéciaux tutos ›), l’adresse IP fixe. Revalidez le tout et reboot.
Si l’ESP ne trouve pas de réseau Wifi où se connecter, il recommence sa procédure « Point d’accès ESP_Easy_0 »…etc…

La config de la partie « Devices » doit ressembler à ça :


Il faut aussi aller dans « Tools / Bouton Advanced » pour vérifier que le port série est désactivé. Il est réservé pour l’écran Nextion dans notre cas.

Là tout est prêt pour faire fonctionner ESPEasy avec le Nextion. La page suivante explique la configuration du retour vers Jeedom et l’utilité des différents « Devices »…

2 « J'aime »

Configuration du retour Jeedom

Il faut aller dans l’onglet « Controllers » d’ESPEasy. Et y ajouter un nouveau contrôleur.
Éditer le premier et le configurer comme cela :


Pour l’adresse IP, mettez celle de votre Jeedom…
Et pour « Controller Publish », mettre :

device=%sysname%&taskid=%id%&cmd=%valname%&value=%value%

Côté Jeedom, il faut installer le plugin ESPEasy et cliquer sur inclusion. Cela devrait faire apparaître un nouvel ESP. Une fois créées, les commandes d’info vont apparaître au fur et à mesure que des valeurs y remonteront.

Explication sur les différents « Devices » :

  • BUTTON : c’est le switch tactile qui sert à réveiller l’écran.
  • NEX : c’est l’écran Nextion. Il renvoie via son port série deux informations : idx (identifiant du bouton pressé) et value (une valeur).
  • CNT : c’est la task avec les paramètres de contrôle : consigne (la consigne de température), bypass (contrôle externe de la chauffe), on_off , chauffe (relais déclenché ou pas). Ces paramètres sont remontés à Jeedom toutes les 10s.
  • TEMP : c’est la température qui sera remontée à Jeedom. Elle est corrigée logiciellement selon si l’écran est allumé ou pas.
  • PAR : paramètres de fonctionnement : hyst (hystérésis : décalage en °C entre chauffage et coupure chauffe), mini (valeur minimale de température de déclenchement de la sécurité), maxi (valeur max de température de déclenchement de la sécurité), ext_temp (non utilisé pour le moment… pondération externe de la température lue par la sonde du thermostat).
  • SENS : le capteur de température
  • SYSINFO : renvoie à Jeedom le taux de charge et la réception wifi
  • VRB : ce sont des variables internes au fonctionnement. Notamment pour calculer des angles d’affichage pour les aiguilles et sauvegarder des paramètres.
1 « J'aime »

Configuration de l’écran Nextion

En principe, si tout s’est bien passé, vous devriez avoir un écran qui s’allume lorsque vous branchez du 230V ou un câble USB.
Pour charger un projet dans l’écran, il faut le compiler, le mettre sur une carte SD, puis brancher la carte sur l’écran et le rebooter.
Il charge ensuite le projet, puis il faut retirer la carte SD et rebooter à nouveau.

L’interface de programmation se trouve ici : https://nextion.itead.cc/resources/download/

Cet écran dans sa version ‹ anglaise › a des limitations : il ne gère pas la transparence des .png, et il ne gère pas non plus les valeurs décimales… du coup pour faire des consignes de température à 0.1°C de précision il faut tricher et utiliser des valeurs x 10…

Le principe de base de l’utilisation de cet écran est d’avoir deux images pour une page. Une image où tous les boutons ou afficheurs sont éteints, et une où ils sont tous allumés. Ensuite, la logique de l’interface utilise des sortes de « masques » qui permettent d’afficher sous une zone tactile active soit l’image générale des boutons éteints, soit celle avec les boutons allumés. Vu que c’est à l’échelle d’une petite zone de l’écran, ça donne l’illusion que le bouton s’allume.

L’autre fonction majeure est sa capacité à envoyer des identifiants (idx) et des valeurs (value) , qu’ESPEasy capte et peut utiliser.

Donc en gros, quand on appuie sur un bouton, son image de fond change, et un identifiant est envoyé au NodeMCU.
A l’inverse, il est possible via ESPEasy de changer l’attribut d’un des éléments de l’écran : mettre du texte dans une zone, changer l’image de fond d’un bouton, etc…
Tout la logique d’utilisation de l’interface est basée sur ces propriétés.

Des écrans « allumés / éteints » :


L’archive ci-dessous contient plusieurs fichiers :

  • Un fichier .tft qui est la compilation du projet directement utilisable dans l’écran.
  • Un fichier .hmi, qui est le projet chargeable dans l’éditeur Nextion si vous souhaitez le modifier.
  • Un document powerpoint qui contient les images assemblées pour faire des écrans ‹ tout allumé › et ‹ tout éteint › : il vous est donc possible de changer les fonds, les icônes, etc… juste en changeant l’image complète et en l’exportant dans l’éditeur Nextion.
  • Un fichier .zi qui est une police de caractères qui s’utilise avec le .hmi

Vu qu’elle est trop grosse pour être attachée au post, je l’ai mise sur un serveur.
http://lecoin.info/File_hosting/thermostat/nextion.7z

Il vous suffit donc de mettre le fichier « thermostat.tft » sur la carte SD et de le charger dans l’écran. Au reboot, l’image de l’écran1 du thermostat devrait apparaitre sur l’écran.

1 « J'aime »

Mise en place des « rules »

Les « rules » (règles) d’ESPEasy permettent de définir des règles de fonctionnement de l’ESP à travers un langage de programmation spécifique et relativement simple.
Il y a quatre « banques » de règles, chacune étant limitée à 2048 caractères.

Créer un thermostat avec des sécurités de fonctionnement, des paramètres modifiables et la capacité à accepter des commandes externes peut amener rapidement à saturer les 8000 caractères de l’espace de programmation disponible.
Par ailleurs, le processeur de l’ESP n’est pas très puissant et se retrouve vite saturé. Et lorsqu’il sature, il reboote !
J’ai donc dû rationaliser le code pour utiliser un minimum de caractères et trouver des techniques pour alléger le processeur.

Pour activer les rules (le cas échéant), on va dans ‹ Tools / Bouton Advanced › puis on coche « Rules » et « Old Engine » tout en haut.
Un nouvel onglet « Rules » apparaît.


La liste déroulante permet de choisir une des 4 banques de règles. Il suffit ensuite de cliquer sur « Submit » en bas pour valider le texte entré.

Voici les règles à ajouter dans les 4 différentes banques :

Banque1 :

on System#Boot do
 //TaskValueSet 6,1,1
 //TaskValueSet 6,2,20
 //TaskValueSet 6,3,25
 TaskValueSet 3,3,0 //conditions initiales pour restore
 TaskValueSet 3,2,1 //conditions initiales pour restore
 timerSet,2,7
endon

on BUTTON#state do
 if [BUTTON#state]=0
  NEX,dim=100
  NEX,tsw 255,1
 else
  NEX,dim=0
  NEX,tsw 255,0
 endif
endon

on Rules#Timer=1 do
 if [BUTTON#state]=1
    NEX,dim=0
    NEX,tsw 255,0
 endif
endon


on Rules#Timer=2 do
 NEX,page 2
 NEX,tsw 255,1
 NEX,click b1,1
endon

on Rules#Timer=3 do
 NEX,page 0
 event,refresh0
 if [BUTTON#state]=1
  NEX,dim=0
  NEX,tsw 255,0
 endif
 SendToHTTP 192.168.1.13,80,/core/api/jeeApi.php?apikey=xxxxxxxxx&type=scenario&id=65&action=start
endon

on Rules#Timer=4 do
 if %iswifi%=0
  reboot
 endif
endon

Après mise en place des rules, il faudra décommenter les dernières lignes de la banque1 et rebooter. Cela aura pour effet de fixer quelques paramètres par défaut avant leur sauvegarde dans la mémoire de l’écran. Par la suite vous pourrez supprimer ces lignes. De même il faudra bouger le slider de consigne pour en fixer une première dans l’appareil.

La partie à la fin :
SendToHTTP 192.168.1.13,80,/core/api/jeeApi.php?apikey=xxxxxx&type=scenario&id=65&action=start
…permet de prévenir Jeedom en cas de reboot. Il faut remplacer l’adresse IP, la clef API, et le numéro du scénario à appeler.

Banque2 :

on SENS#temp do
 if [BUTTON#state]=0
  TaskValueSet 7,1,[SENS#temp]-0.3
  TaskValueSet 4,1,[SENS#temp]-0.3
 else
  TaskValueSet 4,1,[SENS#temp]
 endif
 TaskValueSet 9,3,(([SENS#temp]-15)*13)+80
 NEX,page0.z1.val=[VRB#t_ang]
 let,2,[SENS#temp]
 let,3,[CNT#consigne]
 let,4,[CNT#consigne]+[PAR#hyst]
 let,5,[PAR#mini]
 let,6,[PAR#maxi]
 if [CNT#bypass]=0 and [CNT#on_off]=1
  if %v2% < %v3%
   GPIO,4,1
   TaskValueSet 3,4,1
   NEX,wepo "1",22
   NEX,page0.q2.picc=1
  endif
 endif
 if [CNT#bypass]=0
  if %v2% > %v4%
   GPIO,4,0
   TaskValueSet 3,4,0
   NEX,wepo "0",22
   NEX,page0.q2.picc=0
  endif
 endif
 if [CNT#on_off]=1
  if %v2%>%v6%
    TaskValueSet 3,1,%v3%
    TaskValueSet 9,4,%v3%*10
    NEX,wepo "[VRB#sav]",1
   event,bypass=0
  endif
  if %v2%<%v5%
   TaskValueSet 3,1,%v3%
   TaskValueSet 9,4,%v3%*10
   NEX,wepo "[VRB#sav]",1
   TaskValueSet 3,2,0
   NEX,page0.q0.picc=0
   NEX,page1.remote.picc=3
   TaskValueSet 9,1,((([CNT#consigne]-18)*40)+320)%360
   TaskValueSet 9,2,([CNT#consigne]*10)
   NEX,page0.z0.val=[VRB#c_ang]
   NEX,page0.h0.val=[VRB#c_sld]
   NEX,wepo "0",24
  endif
 endif
 if %iswifi%=0
  timerset,4,25
 endif
endon

on refresh1 do
NEX,page1.hyst.txt="[PAR#hyst]"
NEX,page1.mini.txt="[PAR#mini]"
NEX,page1.maxi.txt="[PAR#maxi]"
if [CNT#bypass]=1
 NEX,page1.remote.picc=4
else
 NEX,page1.remote.picc=3
endif
endon

on refresh0 do
NEX,tsw 255,1
if [CNT#bypass]=1
 NEX,page0.q0.picc=1
 NEX,page0.z0.val=260
 NEX,page0.h0.val=180      
else
 NEX,page0.q0.picc=0
 TaskValueSet 9,1,((([CNT#consigne]-18)*40)+320)%360
 TaskValueSet 9,2,([CNT#consigne]*10)
 NEX,page0.z0.val=[VRB#c_ang]
 NEX,page0.h0.val=[VRB#c_sld]
endif
TaskValueSet 9,3,(([SENS#temp]-15)*13)+80
NEX,page0.z1.val=[VRB#t_ang]
if [CNT#chauffe]=1
 NEX,page0.q2.picc=1
else
 NEX,page0.q2.picc=0
endif
if [CNT#on_off]=1
 NEX,page0.bt0.val=1
else
 NEX,page0.bt0.val=0
endif
endon

A la fin du premier bloc, il y a un test sur le fait que le wifi est connecté ou non. S’il n’est plus connecté, l’ESP reboote au bout de 25s (timer4, en banque 1). A garder en tête si le wifi tombe définitivement. Cela peut aussi être une façon de le forcer à rebooter.
Dans le premier bloc, il y a aussi une correction de température de 0.3°C selon si l’écran est allumé ou pas… voir plus loin l’explication (influence thermique sur la mesure).
On sauvegarde aussi la température corrigée dans la « Task 4 » qui est le dummy device qui reporte à Jeedom (sans quoi c’est la température non corrigée qui est remontée).

Banque3 :

on forceConsigne do
 if %eventvalue% >= 18 and %eventvalue% <= 24.5 and [CNT#bypass]=0
  NEX,dim=100
  NEX,tsw 255,1
  TaskValueSet 9,1,(((%eventvalue%-18)*40)+320)%360
  TaskValueSet 9,2,(%eventvalue%*10)
  NEX,page0.z0.val=[VRB#c_ang]
  NEX,page0.h0.val=[VRB#c_sld]
  TaskValueSet 3,1,%eventvalue%
  NEX,wepo "[VRB#c_sld]",1
  timerSet,1,10
 endif
endon

on bypass do
 TaskValueSet 3,2,%eventvalue%
 GPIO,4,0
 TaskValueSet 3,4,0
 NEX,page0.q2.picc=0
 NEX,wepo "0",22
 if %eventvalue%=1
  NEX,page0.q0.picc=1
  NEX,page0.z0.val=260
  NEX,page0.h0.val=180
  NEX,wepo "1",24
  NEX,page1.remote.picc=4
 else
  NEX,page0.q0.picc=0
  NEX,page1.remote.picc=3
  TaskValueSet 9,1,((([CNT#consigne]-18)*40)+320)%360
  TaskValueSet 9,2,([CNT#consigne]*10)
  NEX,page0.z0.val=[VRB#c_ang]
  NEX,page0.h0.val=[VRB#c_sld]
  NEX,wepo "0",24
 endif
endon

on bypass2 do
 TaskValueSet 3,2,%eventvalue%
 if %eventvalue%=1
  NEX,page0.q0.picc=1
  NEX,page0.z0.val=260
  NEX,page0.h0.val=180
  NEX,page0.q2.picc=0
  NEX,page1.remote.picc=4
 else
  NEX,page0.q0.picc=0
  NEX,page1.remote.picc=3
  TaskValueSet 9,1,((([CNT#consigne]-18)*40)+320)%360
  TaskValueSet 9,2,([CNT#consigne]*10)
  NEX,page0.z0.val=[VRB#c_ang]
  NEX,page0.h0.val=[VRB#c_sld]
 endif
endon

on chauffe do
 if %eventvalue%=1 and [CNT#bypass]=1 and [CNT#on_off]=1
  GPIO,4,1
  TaskValueSet 3,4,1
  NEX,wepo "1",22
  NEX,page0.q2.picc=1
 endif
 if %eventvalue%=0 and [CNT#bypass]=1 and [CNT#on_off]=1
  GPIO,4,0
  TaskValueSet 3,4,0
  NEX,wepo "0",22
  NEX,page0.q2.picc=0
 endif
endon

on onoff do
 NEX,page0.q0.picc=0
 TaskValueSet,3,2,0
 NEX,wepo "0",24
 NEX,page1.remote.picc=3
 TaskValueSet 9,1,((([CNT#consigne]-18)*40)+320)%360
 TaskValueSet 9,2,([CNT#consigne]*10)
 NEX,page0.z0.val=[VRB#c_ang]
 NEX,page0.h0.val=[VRB#c_sld]
 GPIO,4,0
 TaskValueSet 3,4,0
 NEX,wepo "0",22
 NEX,page0.q2.picc=0
 if [CNT#on_off]=1
  NEX,wepo "1",20
 else
  NEX,wepo "0",20
 endif
endon

Banque4 :

on NEX#idx do
if [NEX#idx]=20
if [CNT#bypass]=0
TaskValueSet 9,1,((([NEX#value]-180)*4)+320)%360
NEX,page0.z0.val=[VRB#c_ang]
TaskValueSet 3,1,[NEX#value]/10
NEX,wepo "[NEX#value]",1
timerSet,1,10
else
NEX,page0.z0.val=260
NEX,page0.h0.val=180
endif
endif
if [NEX#idx]=21
TaskValueSet 6,1,[PAR#hyst]-0.1
NEX,page1.hyst.txt="[PAR#hyst]"
TaskValueSet 9,4,[PAR#hyst]*10
NEX,wepo "[VRB#sav]",6
endif
if [NEX#idx]=22
TaskValueSet 6,1,[PAR#hyst]+0.1
NEX,page1.hyst.txt="[PAR#hyst]"
TaskValueSet 9,4,[PAR#hyst]*10
NEX,wepo "[VRB#sav]",6
endif
if [NEX#idx]=28
event,refresh0
endif
if [NEX#idx]=29
event,refresh1
endif
if [NEX#idx]=23
TaskValueSet 6,2,[PAR#mini]-0.1
NEX,page1.mini.txt="[PAR#mini]"
endif
if [NEX#idx]=24
TaskValueSet 6,2,[PAR#mini]+0.1
NEX,page1.mini.txt="[PAR#mini]"
endif
if [NEX#idx]=23 or [NEX#idx]=24
TaskValueSet 9,4,[PAR#mini]*10
NEX,wepo "[VRB#sav]",10
endif
if [NEX#idx]=25
TaskValueSet 6,3,[PAR#maxi]-0.1
NEX,page1.maxi.txt="[PAR#maxi]"
endif
if [NEX#idx]=26
TaskValueSet 6,3,[PAR#maxi]+0.1
NEX,page1.maxi.txt="[PAR#maxi]"
endif
if [NEX#idx]=25 or [NEX#idx]=26
TaskValueSet 9,4,[PAR#maxi]*10
NEX,wepo "[VRB#sav]",15
endif
if [NEX#idx]=30
TaskValueSet 3,3,[NEX#value]
event,onoff
endif
if [NEX#idx]=31
TaskValueSet 6,1,[NEX#value]/10
NEX,click b2,1
endif
if [NEX#idx]=32
TaskValueSet 6,2,[NEX#value]/10
NEX,click b3,1
endif
if [NEX#idx]=33
TaskValueSet 6,3,[NEX#value]/10
NEX,click b6,1
endif
if [NEX#idx]=34
TaskValueSet 3,3,[NEX#value]
NEX,click b0,1
endif
if [NEX#idx]=35
TaskValueSet 3,4,[NEX#value]
if [CNT#chauffe]=1 
gpio,4,1
endif
NEX,click b4,1
endif
if [NEX#idx]=36
TaskValueSet 3,2,[NEX#value]
if [CNT#bypass]=1
event,bypass2=1
endif
NEX,click b5,1
endif
if [NEX#idx]=37
TaskValueSet 3,1,[NEX#value]/10
timerSet,3,1
endif
if [NEX#idx]=767
event,bypass=0
endif
endon

Après ça, vous devriez avoir un Thermostat fonctionnel.
La section suivante expliquera plus en détails les principes de fonctionnement et la logique du thermostat.

1 « J'aime »

Principes de fonctionnement :

  • Lorsqu’on appuie sur le bouton tactile, cela a pour effet d’éteindre ou de réveiller l’écran. Lorsque l’écran est « éteint », il est en fait à un niveau de luminosité de 10%, et ses fonctions tactiles désactivées. Si vous voulez passer à un écran tout noir, il suffit de remplacer tous les Nex,dim=10 par des NEX,Dim=0 … il y en a 3 dans la banque1 de règles.

  • Sur l’écran principal (page1), le gros cadran indique la consigne, le petit la température actuelle lue par le thermostat. Un slider latéral permet de régler la consigne entre 18°C et 24.5°C. Deux flèches en haut et en bas du slider permettent de régler par pas de 0.1°C.

  • Le principe de base de fonctionnement type « hystérésis » est le suivant : lorsque la température devient inférieure à la consigne, la chauffe se met en route. Lorsque la température devient supérieure à la consigne + hystérésis, la chauffe se coupe. Il y a donc une « zone morte » entre la consigne et la consigne+hystérésis où on laisse la température descendre sans toucher à la chauffe.
    La valeur par défaut au premier boot (souvenez-vous, il faut décommenter trois ligne au premier boot pour régler les valeurs la première fois…) est de 1°C. Suivant votre installation, vous aurez peut-être besoin de faire varier cette valeur. Cela se passe en page2 de l’écran, à laquelle on accède via le bouton avec l’engrenage en bas à gauche.

  • Vous avez la possibilité de passer en mode que j’ai appelé plus haut « bypass » ou « remote »… en français, « télécommandé ». Là c’est Jeedom qui contrôle la chauffe via une commande d’action que l’on peut définir dans l’équipement ESPEasy de Jeedom de la façon suivante :


    Idem avec le bypass :

    Le mode bypass envoie l’aiguille de consigne vers le bas pour indiquer qu’il n’y a plus de consigne valide.
    Lorsque le mode bypass est actif, une icône ronde sur la page2 permet de déverrouiller ce mode depuis le thermostat. Cela a pour effet de couper la chauffe en plus de supprimer le mode. La consigne précédent est restaurée.

  • Autre possibilité : envoyer une consigne depuis Jeedom en mode de fonctionnement normal. Il faut définir une commande de type slider comme ci-après :


    Attention : cette commande est plutôt faite pour être utilisée dans un scénario. En effet, le paramétrage possible du slider du plugin ESPEasy est inexistant… pas de mini/maxi, un pas incrémental de 1. Donc n’utilisez pas directement le slider de l’équipement pour régler.
    Lorsqu’on force la consigne, l’écran se réveille pendant 10s s’il était éteint.
    La majuscule à ‹ Consigne › dans ‹ forceConsigne › est optionnelle.

  • Il y a deux sécurité réglables pour le fonctionnement sous contrôle Jeedom (bypass). Un mini et un maxi. Elles se règlent via la page 2. L’idée est que si on atteint la limite mini ou maxi, le mode bypass se désactive et on établit comme consigne la valeur mini ou maxi entrée (18°C ou 24.5°C si les valeurs sont au-delà de ces limites). Cela permet d’éviter de trop dériver en cas de problème sur Jeedom. Cela peut être modifié dans les rules pour éventuellement régler la dernière consigne à la place du mini ou maxi.

  • Les valeurs de consigne, bypass, chauffe, on/off sont remontées à Jeedom toutes les 10s. La température lue toutes les 20s. Il peut donc y avoir un délai de 20s pour que la chauffe s’active suite à la modification de la consigne.

  • Un bouton on/off en haut à gauche permet de supprimer toutes les actions du thermostat. Lorsqu’il est coupé, il ne prend plus le bypass, la chauffe, la consigne forcée. En revanche, on peut toujours la modifier sur l’écran du thermostat. Elle n’aura juste pas d’effet.
    Arrêter le thermostat via ce bouton arrêtera immédiatement la chauffe si elle était active.

  • Une fonction de sauvegarde des paramètres dans la mémoire du Nextion permet de les récupérer en cas de reboot. Si la chauffe ou le bypass était actifs, ils seront restaurés aussi.

Les fonctions accessibles depuis Jeedom le sont aussi via des url, la syntaxe est la suivante :

  • http://IP_Thermostat/control?cmd=event,forceConsigne=18.5 (majuscule à Consigne optionnelle)
  • http://IP_Thermostat/control?cmd=event,bypass=0 ou 1
  • http://IP_Thermostat/control?cmd=event,chauffe=0 ou 1

Limitations et performances :

Pour éviter les problèmes de désynchronisation entre Nextion et ESP, toutes les actions sur l’écran changent des valeurs uniquement dans l’ESP. Puis les valeurs sont renvoyées à l’écran si nécessaire. Du coup cela demande des allers-retours de communication qui ralentissent l’interface.
De plus, l’ESP fonctionnant via des interruptions, il en supporte que très peu empilées les unes sur les autres. Donc si vous appuyez trop rapidement sur un bouton de réglage (p. ex. l’hystérésis) sans laisser le temps au système de modifier la valeur, vous pourrez atteindre la limite de la pile d’évènements et provoquer un reboot… prenez votre temps !

Le taux de charge de l’ESP avec les réglages de ce tuto est d’environ 45%. Il monte rapidement lorsqu’on effectue des actions successives. Si vous programmez par exemple par scénario un forçage de consigne toutes les secondes, il va planter à coup sûr. Un plantage amène un reboot. Et la restauration des paramètres stockés dans le Nextion prend plus de 15 secondes.

Hello,

Voici la suite du projet avec la partie boîtier…

La base :

Le couvercle :

Il faudra que je poste les fichiers source pour l’impression 3D sur Thingiverse… to be done !

Suite à des problèmes de transmission thermique du NodeMCU vers le capteur de température, j’ai refait le boîtier avec une barrière thermique entre le PCB et le capteur.
Au final, il s’est avéré que câble du capteur touchait le NodeMCU qui est la partie la plus chaude :

L’écran aussi influe sur la température lue. La différence de température écran allumé / écran éteint est de 0.4°… j’ai donc corrigé logiciellement la température lue (banque 2 des rules, premier bloc) lorsque l’écran est allumé.

En conclusion, pour le moment le fonctionnement est très satisfaisant, sauf pour un point : les déconnexions de l’ESP au niveau retour d’état vers Jeedom.
Régulièrement (on va dire tous les 4-5 jours, mais c’est aléatoire) le thermostat s’arrête de communiquer avec Jeedom. Mon « watchdog » logiciel qui reboote en cas de perte wifi ne voit rien, l’ESP est donc -de son point de vue- toujours connecté au wifi… mais plus rien ne remonte. Il est aussi impossible de se connecter dessus via la navigateur.
A priori mon point d’accès n’est pas en cause, car j’ai configuré dans ESPEasy un second SSID d’un autre point d’accès. Je suppose que c’est un bug restant des versions actuelles d’ESPEasy (je suis resté en version mega-20190626 test) et il faut que je teste les dernières versions.

Après avoir acheté le plugin thermostat, il s’intègre parfaitement avec l’appareil. La sécurité du plugin, couplée à la sécurité logicielle interne au thermostat font un ensemble très robuste. Le mode « bypass » permet un contrôle total de la chauffe depuis Jeedom.

… à suivre …

[EDIT 2020-10-02] J’édite ce post pour indiquer que les problèmes de déconnexion venaient de la version d’ESPEasy. Avec la version « ESP_Easy_mega-20191208_test_beta_ESP8266_4M1M.bin », plus aucun problème de stabilité.

1 « J'aime »

Tuto super détaillé et qui fait envie.
Je viens de commander les condensateurs, les diodes et les boutons FTTM.
J’ai déjà le nodemcu v3 et l’écran est en cours de livraison depuis 2 semaines maintenant. Il ne devrait pas tarder.
Je pense faire une solution à mis chemin de la tienne avec un peu moins d’intelligence.
J’ai déjà des sondes dans chaque pièce, des capteurs d’ouverture des portes et des fenêtres pour tout le monde.
Mon Jeedom ne plante quasi jamais donc je persiste à lui faire confiance et tous mes fils pilotes arrivent au tableau électrique et sont déjà pilotés un par un avec un RPI1 et des relais plus diodes.
Ca me permet d’avoir un thermostat par pièce géré par le plugin mode.
Bref, mon idée est d’avoir un boitier posé dans la pièce qui permet de piloter le thermostat de la pièce et d’avoir les infos.
J’aimerai que tu m’expliques le but des diodes et des condensateurs pour ton schéma. Je fais mes montages sans et j’imagine que c’est pas top. Par ex, je pilote un relai directement depuis le GPIO plus la résistance de pullup ou pulldown.

1 « J'aime »

Hello,

Pas de condensateur sur mon schéma. Seulement résistances, diode et transistors.

La diode, je t’avouerais que je ne suis pas très sûr de son utilité… j’ai pris le montage tout fait. Je soupçonne qu’elle serve lors de la coupure de la bobine (il y a un pic d’intensité au moment de la coupure).

Le transistor du relais sert à convertir la sortie 3.3V du NodeMcu en 5V utilisés pour commander la bobine du relais ; de plus la sortie du NodeMcu n’est pas suffisamment puissante en intensité pour commander une bobine. Un transistor permet de « télécommander » un courant avec une commande bien plus faible.

Le second transistor sert à éviter un problème au boot du NodeMcu, car le D8 est utilisé pour la communication série « hardware » avec le Nextion. D8 est aussi utilisé pendant le boot du Noode et on peut générer un freeze si on ne fait pas ce montage avec le Nextion (d’ailleurs, ça freeze effectivement ; je me suis fait avoir !).

La résistance R2 sert à la lecture de température, c’est le montage standard du capteur.

Le montage R1/R3 est un pont diviseur pour avoir la tension / courant corrects dans le transistor.

Le HI Link permet d’alimenter éventuellement le thermostat avec du 230V.

Je te remercie pour ta réponse. J’ai regardé sur le net pour l’utilisation du transistor.
C’est très clair pour les 2.
Par contre, à quoi bon le pont diviseur sur la base du 2N3904 ?
L’esp sort du 3.3V et il semblerait que cette tension soit suffisante pour déclencher la commutation du transistor non ?
Pour les diodes, je n’en vois qu’une sur le schéma. Et je reconnais que je ne comprends pas le but dans ce montage.
Si qqun peut nous expliquer …

La diode est absoluent nécessaire pour protéger le transistor de commutation Q1. C’est en électronique un grand classique qui s’apelle Diode de roue libre.
Le transistor Q1 se comporte comme un interrupteur. Lors de l’ouverture du circuit (blocage du courant entre C et E du transistor Q1) le courant qui circulait dans la bobine du relai se trouve brutalement bloqué et donc la tension (inverse) aux bornes de la bobine augmente brutalement (u = L* di/dt aux bornes de la bobine, i passant de sa valeur nominal lorsque Q1 est passant à 0 brutalement, u peut avoir une valeur très élevée pendant un très bref instant, suffisante pour détruire l’électronique. Avec la diode le courant i qui circule dans la bobine ne passera pas brutalement à zéro car il s’écoulera par la diode jusqu’à épuisement de l’énergie stockée par la bobine) . La diode sert donc à écouler l’énergie stockée dans la bobine sans créer cette surtension dévastatrice pour toute l’électronique connectée à la bobine (Q1 en l’occurence mais potentiellement aussi U1) .
En espérant avoir éclairé vos lanternes sur le sujet.
Cordialement.

2 « J'aime »

Merci @Yves19 ! C’est très clair même si je vais devoir le relire une nouvelle fois :wink:
Je prends note de cette nécessité et vais l’intégrer dans mes prochains montages.
Jusqu’à présent je reliais directement le GPIO au relai sans passer par un transistor et sans mettre de diode. Il faut croire que j’ai eu de la chance. Je vais mettre les 2 à l’avenir.

Une idée du pourquoi le pont diviseur entre le gpio et le transistor ?

Le pont diviseur est la pour s’assurer :

  1. Que le courant Ib qui entre sur la base de Q1 est suffisant pour saturer Q1 pour que celui ci commute bien un courant Ic suffisant pour piloter la bobine du relais
  2. Adapter l’impédance du circuit de commutation à l’impédance de sortie spécifiée pour le GPIO
1 « J'aime »

C’est mieux expliqué que moi ! Merci @Yves19

Bonjour à tous,

Depuis la mise à jour de l’ESP en « ESP_Easy_mega-20191208_test_beta_ESP8266_4M1M.bin » (core 2.7), et le changement du point d’accès, plus aucun problème de déconnexion !
Le taux de charge est passé de 42% à 28% ! Et l’ESP est beaucoup plus résistant aux clicks très rapprochés sur l’écran…

Que du bonheur ! Je pense qu’à la mi-hiver je le brancherai sur ma chaudière…

C’est en effet une bonne nouvelle !
A suivre de près. :wink:

Je viens de faire une petite modif sur la structure : j’ai ajouté un « Dummy device » en task4, dans lequel je recopie la température modifiée logiciellement lorsque l’écran est allumé.

En procédant comme auparavant, soit en modifiant directement la valeur de la Task du capteur de température dès que l’on entre dans la rule qui le gère, la valeur non modifiée à le temps d’être remontée à Jeedom avant que la rule soit exécutée… donc le thermostat fonctionne bien en se basant sur une température modifiée, mais il remonte la température lue ‹ brute ›.

Du coup, c’est le Dummy Device dans lequel on recopie la température modifié qui remonte maintenant.

J’ai mis à jour le fichier de config fourni plus haut et ajouté une explication dans la partie qui traite la liste des tasks.