ESP Easy R120. Ecran d’affichage OLED SSD1306 déporté avec un script Lua – Domoticz – Bienvenue sur le forum de domotique-et-objets-connectes.fr

kkcwbifqagjqlcxz6c0q-7671195
z3coaqvi4wrerbdb6k55-4096306

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

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.

Tous les shields compatibles avec la LoLin d1 Mini

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