Dans le tutoriel précédent, nous avons fabriqué un affichage déporté pour le serveur domotique Jeedom à l’aide d’un écran OLED SSD1306 configuré avec le firmware ESP Easy R120. Impossible de ne pas expliquer comment faire la même chose avec Domoticz !
Article actualisé le 21 avril 2020
On doit faire avec les contraintes du firmware ESP Easy, sauf à développer son propre plugin (tout est expliqué ici), on va devoir piloter l’affichage directement à l’aide de requêtes HTTP depuis Domoticz.
Scripts Lua
Je ne vais pas refaire un tutoriel sur les scripts Lua (sauf si vous insistez ;-)), il y a en déjà de très bons sur internet comme celui d’easydomoticz.com (en Français). Nous avons juste besoin de faire quelques rappels rapides :
- Les scripts Lua sont stockés dans le répertoire ~/domoticz/scripts/lua
- Il existe trois types de script. Domoticz fait la différence à partir du nom de fichier.
- script_device_NomDuDevice : le nom du device doit être identique, il est donc interdit d’utiliser des espaces et des caractères accentués ou spéciaux ( 😥 )
- script_time_NomScript.lua : le script est exécuté chaque minute. Le script a 10 secondes pour se terminer. Au delà, il est arrêté par Domoticz pour ne pas pénaliser les autres scripts et le système en général.
- script_variable_NomVariable.lua : se lance sur un changement de la variable indiquée.
- Ils doivent porter l’extension lua
Le Wiki complet sur les scripts Lua est ici.
Comment créer un script Lua à distance en SSH
Pour une raison qui m’échappe encore (bug ?), il ne semble pas possible d’éditer les scripts présents dans le répertoire scripts depuis le gestionnaire d’événements. Il va donc falloir le créer sur un éditeur de texte puis télécharger le fichier en FTP ou éditer directement le script sur le serveur Domoticz en SSH à l’aide de nano. J’ai opté pour cette solution afin de ne pas rencontrer de problème d’encodage (UTF-8) et de caractères de fin de ligne. Si vous débutez avec Linux, suivez ce guide pour tout savoir sur SSH.
Connectez vous à Domoticz en SSH (à l’aide de putty sur Windows, depuis le Terminal sur macOS et Linux). Placez vous dans le répertoire des scripts.
~/domoticz/scripts/lua
Ouvrez un nouveau script nommé script_device_Exterieur.lua . Ici, on va envoyez sur l’écran déporté la température d’une sonde extérieure qui fonctionne avec le firmware MySensors.
Quelques éléments de langage Lua avant de commencer
Avant de nous lancer dans le script, voici quelques éléments de langage qui pourront vous servir pour d’autres scripts
— | Permet de mettre en commentaire une ligne. Par exemple
— ceci est un commentaire |
print() | Permet d’afficher un message dans le journal (Log) accessible depuis le menu Réglages. Exemple
print(“Ajoute un message au journal”) |
chaine=”%20″ | Pour créer une variable contenant une chaine de caractères, il suffit de la déclarer et lui affecter une valeur. Par exemple
point=”%2E” |
..chaine
..variable |
Assemble des chaines de caractères (également une variable contenant une chaine). Par exemple
baseurlESP..’oled,1,3,Temp’..space |
fin de ligne | Contrairement à beaucoup de langages (C++, Javascript…), il n’y a pas de caractère de fin de ligne. Attention donc à l’encodage du fichier ! |
devicechanged[‘Device’] |
Permet de savoir si un device a changé d’état ou de valeur. Inutile dans un script _device puisqu’il est justement déclenché lorsque le Device change. |
if () then … end |
la boucle if en lua |
otherdevices_svalues[‘Device’] |
Récupère la valeur du Device indiqué. |
Encoder les caractères spéciaux par le code ASCII correspondant
On va donc devoir gérer nous même l’encodage des caractères spéciaux. Le mieux est de créer une variable pour chaque caractère qui sera utilisé dans la requête HTTP envoyée à l’ESP8266. En voici quelques uns, vous devriez tous les trouver ici.
-- Codes ASCII URL : http://www.w3schools.com/tags/ref_urlencode.asp point="%2E" space="%20" twopoints="%3A" pourcent="%25" openparenthese="%28" closeparenthse="%29"
On en profite également pour créer la base de l’URL qui est toujours identique. Il suffira de modifier l’adresse IP qui correspond à votre ESP8266.
-- Variables baseurlESPEasy = "http://192.168.1.80/control?cmd="
Tous les scripts Lua pour Domoticz doivent renvoyer un commandArray qui contient les commandes à exécuter. On en profite pour afficher dans le journal que le script vient de s’exécuter.
commandArray = {} print ("Update ESP Easy Oled Display")
On doit envoyer une série de requêtes HTTP à ESP Easy. Pour cela, on doit simplement ajouter une commande dans le tableau commandArray pour chaque requête HTTP. Pour commencer on efface l’écran
commandArray[1]={['OpenURL'] = baseurlESPEasy..'oledcmd,clear' }
Maintenant on actualise ligne par ligne l’écran. Par exemple on écrit sur la ligne 3 et la colonne 1, Temp: 19.5*C. On assemble la chaine en remplaçant les espaces et caractères spéciaux par le code ASCII.
commandArray[2]={['OpenURL'] = baseurlESPEasy..'oled,3,1,Temp'..space..twopoints..otherdevices_svalues['Exterieur']..space..'*C' }
Enfin, on peut forcer l’allumage de l’écran avec la commande oledcmd,on.
commandArray[5]={['OpenURL'] = baseurlESPEasy..'oledcmd,on' }
Le script doit obligatoirement retourner un tableau commandArray
return commandArray
Et voici le script dans son intégralité qu’il vous suffit de coller dans le fichier.
-- Codes ASCII URL : http://www.w3schools.com/tags/ref_urlencode.asp point="%2E" space="%20" twopoints="%3A" pourcent="%25" openparenthese="%28" closeparenthse="%29" -- Variables baseurlESPEasy = "http://192.168.1.80/control?cmd=" -- commandArray = {} print ("Update ESP Easy Oled Display") commandArray[1]={['OpenURL'] = baseurlESPEasy..'oledcmd,clear' } commandArray[2]={['OpenURL'] = baseurlESPEasy..'oled,1,1,**'..space..'Domoticz'..space..'**' } commandArray[3]={['OpenURL'] = baseurlESPEasy..'oled,3,1,Temp'..space..twopoints..otherdevices_svalues['Exterieur']..space..'*C' } commandArray[4]={['OpenURL'] = baseurlESPEasy..'oled,7,1,projetsdiy'..point..'fr' } commandArray[5]={['OpenURL'] = baseurlESPEasy..'oledcmd,on' } return commandArray
Enregistrez le script avec CTRL + X puis O (ou Y si Raspbian est en anglais). Dès que le Device sera actualisée, l’affichage déporté sera actualisée également. Si rien ne se passe, allez dans le journal (Log) pour vérifier s’il n’y a pas une erreur dans le script.
Pourquoi ne pas utiliser Blocky ?
Ce doit être possible mais Blocky est un peu blocké (pardon bloqué) pour faire ça. Contrairement à Jeedom qui sait encoder l’URL à la volée (remplacer les espaces et les caractères spéciaux par leur code ASCII), avec Domoticz il faut tout faire soi-même. Ce n’est pas un problème en soi, mais avec Blocky, ça risque de vite devenir galère.
Préparer l’affichage OLED SSD1306 déporté
Egalement une petite piqûre pour rappeler comment câbler et configurer un affichage OLED monochrome miniature (SSD1306).
Ici, je vous propose d’ajouter un bouton pour allumer l’écran durant un certain temps (ici 10 secondes). Ca peut être intéressant d’éteindre l’écran ou tout simplement par écologie. On va mettre un délai d’actualisation très long, ou au moins supérieur à la fréquence de rafraichissement des données envoyée par Domoticz. C’est nécessaire pour éviter que l’affichage ne soit ré-initialisé par ESP Easy. Comme ESP Easy ne dispose pas des données à afficher (elles sont envoyées par Domoticz directement), l’écran deviendra noir tout simplement.
L’écran OLED se connecte sur le bus I2C. Par défaut ce sont les broches GPIO4 (SDA, D2 de l’ESP8266) et GPIO5 (SCL, D1 de l’EP8266) qui sont utilisées.
LoLin WeMos D1 Mini (compact et économique) ou n’importe quel autre ESP8266 ESP-12 | |
Alimentation 5/3A micro-usb | |
Ecran OLED monochrome 168×64 pixels 0.96″ | |
Ecran OLED SSD1306 à empiler sur la D1 Mini. | |
Jumper Dupont (optionnel) | |
Breadboard (optionnel) |
Tous les shields compatibles avec la LoLin d1 Mini
Voici le résultat obtenu avec le script Lua proposé.
- ESP Easy Mega. Installation facile avec PlatformIO sur ESP8266 (R120 obsolète)
- Hack . Prise connectée SONOFF S20 pour en faire un super smart plug avec ESP Easy R120
- ESP Easy R120 ou Mega. Flasher le firmware avec esptool.py sur ESP8266
- ESP Easy R120. Ecran d’affichage OLED SSD1306 déporté avec un script Lua
- ESP Easy R120. Utiliser les Rules pour créer la consigne d’un thermostat connecté (Jeedom, Domoticz, Node-RED…)
- Test du shield LoLin d1 mini DHT11 ou DHT22 avec du code Arduino ou ESP Easy
Salut,
Tout d’abord, merci pour ce tuto!
J’ai suivi ton tuto pour afficher les températures de ma sonde extérieure (sans mettre de bouton). J’ai bien l’affichage de ma température mais l’écran rafraichit très souvent et j’ai les erreurs suivantes dans les logs de domoticz:
2017-11-25 20:04:58.263 Error: Error opening url: http://192.168.0.35/control?cmd=oledcmd,clear
2017-11-25 20:04:58.328 Error: Error opening url: http://192.168.0.35/control?cmd=oled,1,1,**%20Domoticz%20**
2017-11-25 20:04:58.403 Error: Error opening url: http://192.168.0.35/control?cmd=oled,3,1,Temp%20%3A20.6;60;1%20*C
2017-11-25 20:04:58.457 Error: Error opening url: http://192.168.0.35/control?cmd=oled,7,1,projetsdiy%2Efr
2017-11-25 20:04:58.492 Error: Error opening url: http://192.168.0.35/control?cmd=oledcmd,on
Est-ce normal? As-tu une solution à ceci?
Merci
Bonjour Gaël et merci beaucoup. D’après cette erreur il semble que l’ESP8266 ne soit pas accessible (par moment ?). Si l’affichage est actualisé, c’est peut être que la connexion WiFi est vraiment très faible. Concernant le rafraichissement, on a pas la main sur le paramètre, c’est domoticz qui lance les scripts.
Merci! effectivement, j’avais activé le deep sleep, ce qui semble perturber le fonctionnement. J’aurais par contre une autre question: j’aimerais faire un cadre style “magic miror” mais les écrans étant petits, j’envisage d’en mettre plusieurs. Le bus présent sur les esp étant un bus i2C, je me posais la question si on pouvait exploiter ta méthode pour afficher les informations de plusieurs sondes de températures sur plusieurs écrans branchés sur le bus i2c d’une même esp???
Bonjour Gaël. Je n’ai jamais essayé. Il y a deux conditions pour que cela fonctionne. En général, les écrans OLED ont une adresse attribuée par défaut par le fabricant. Pour nous simplifier la vie, le plus souvent, c’est la 0x3c. Avec deux écrans (ou plus), il faudra donc pouvoir sélectionner une adresse différente pour chaque écran. On peut le faire en soudant un pont mais ce n’est pas toujours possible. Ca dépend du fabricant. Ensuite, il faut que la librairie d’affichage puisse gérer plusieurs objets (écrans). A priori, ça doit fonctionner mais je n’ai jamais testé. Par contre, je pense qu’il serait peut être plus facile d’utiliser un écran Nextion de plus grande dimension. On créé une interface à l’aide d’un éditeur sous windows et ensuite la communication se fait via le bus série avec 2 fils. J’ai commandé un écran de 3,2” qui devrait arriver fin janvier https://www.banggood.com/3_2-Inch-Nextion-HMI-Intelligent-Smart-USART-UART-Serial-Touch-TFT-LCD-Screen-Module-p-1105286.html?p=RA18043558422201601Y
j’ai la même erreur Error: Error opening url: http://10.0.0.155/control?cmd=lcdcmd,clear
mais ça fonctionne quand même sur l’écran, trouve pas d’ou cela peut venir 🙁