Domoticz : script Lua pour créer un affichage déporté OLED avec ESP Easy

Dans le tutoriel précédent, nous avons vu comment créer un affichage déporté pour le serveur domotique Jeedom à l’aide d’un écran OLED configuré avec le firmware ESP Easy. Impossible de ne pas expliquer comment faire la même chose avec Domoticz ! 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.

Les 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 le script Lua (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.

Astuce. Pour les utilisateurs Mac, le tilde (~) s’obtient avec la combinaison de touche ALT + N. Merci Steve !

~/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.

Le degré (°) ne fonctionne pas (ou je n’ai pas encore trouvé comment faire !).

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.

esp8266 Wemos D1 mini Wemos D1 Mini (compact et économique) ou n’importe quel autre ESP8266 ESP-12
oled ssd1306 ecran i2c Ecran OLED monochrome 168×64 pixels 0.96″

SSD1306

wemos d1 mini oled shield Ecran OLED officiel Wemos. Compact, à empiler sur la D1 Mini.

environ 4,40€

mini switch Boutons poussoir (x3 mini switchs)
jumper dupont Jumper Dupont (optionnel)
breadboard Breadboard (optionnel)

Voici le résultat obtenu avec le script Lua proposé.

espeay esp easy domoticz script lua ssd1306 oled display deported dht22

Inscrivez-vous à la newsletter hebdomadaire

Aucun spam et aucun autre usage ne sera fait de votre email. Vous pouvez vous désinscrire à tout moment.

Promos à ne pas louper

Tags :

5 Commentaires
  1. 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 🙁

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Domotique et objets connectés à faire soi-même