diff --git a/ZYX-html-framework/README.md b/ZYX-html-framework/README.md new file mode 100644 index 0000000..28cca33 --- /dev/null +++ b/ZYX-html-framework/README.md @@ -0,0 +1,73 @@ +# Zyx, le Pico framework Active Server Pages avec Lua inline +zf190127.1733 + +## Problématique +Le microcontrôleur NodeMCU à base de ESP8266 est une superbe petite bête. Il possède directement un interface WIFI avec une couche TCP complète et de plus se programme très facilement en Lua script. +Du coup il est le candidat idéal pour l'internet des objets (IoT), et de lui programmer un petit interface WEB est une chose très facile: + +``` +srv = net.createServer(net.TCP) +srv:listen(80, function(conn) + conn:on("receive", function(client, request) + print(request) + client:send("

ESP8266
Server is working!

"..tmr.now()) + end) + conn:on("sent", function(c) c:close() end) +end) +``` + +Par contre on doit *produire* le code HTML directement depuis le code LUA et on voit bien que cela devient vite très pénible pour la moindre page HTML un tant soit peu évoluée. +C'est aussi l'enfer de répondre à plusieurs pages HTML. +Oui, on sait bien que l'on ne va pas pouvoir concurrencer un serveur Apache avec ce petit contrôleur, mais quand même le minimum vital va très vite devenir impossible à gérer. + +De plus, on va se retrouver avec tout le code HTML dans la RAM du NodeMCU qui est très précieuse (< 40kB). + +## Moyens +Le truc étant de sauvegarder les pages HTML dans la FLASH du NodeMCU (on en a assez < 3.5MB) et de le lire à la volée ligne après lignes. Ceci va nous permettre d'économiser la RAM mais aussi de résoudre le problème du multi pages. + +L'autre truc, c'est *d'insérer* du code Lua dans le code HTML (Lua inline) et au moment de la *lecture* du fichier HTML par le NodeMCU, ligne par ligne, le code Lua *inséré* pourra être exécuté. Et par la même, rendre dynamique la page WEB très facilement. + +Par exemple on peut afficher la température du capteur *temp_capteur1* mesuré par le NodeMCU très simplement avec: + +``` +... +

Mesure de température

+La température est: +<% +zout(temp_capteur1.."°C") +%> +
+... +``` +Ecrire de jolies interfaces WEB utilisateur (interface de commande d'un robot, résultats de mesure d'une installation solaire) avec le NodeMCU devient très facile. + +## Framework références +Il suffit simplement d'entourer le bloc de code Lua à exécuter sur le NodeMCU par les balises **<%** et **%>** directement dans le code HTML à envoyer. + +La *sortie*, le fameux **print** de Lua est remplacé par **zout**. + +Et c'est tout ! + +## Limitations +Afin de limiter au maximum la charge, il y a quelques limitations tout à fait acceptables pour une utilisation sur un microcontrôleur. + +* Les balises **<%** et **%>** doivent être isolées sur une ligne.
+C'est à dire que tout se qui se trouve avant et après la balise est simplement ignoré ! + +* Pas d'imbrication de bloc Lua dans le code html.
+Typiquement on ne peut pas faire un bloc de bloc de Lua. +On peut par contre les chainer,avoir plusieurs blocs Lua dans le code html. + +* Maximum de 1'024 bytes la longueur d'une ligne dans le fichier html.
+C'est une limitation du SDK TCP du microcontrôleur. + +* Exactement comme sur le NodeMCU le fait d'utiliser une variable non définie (nil) fait crasher le microcontôleur.
+Comme par exemple afficher l'état un capteur qui n'existe pas, fera crasher le microcontrôleur, il n'y a pas de vérification.
+Il faudra donc bien vérifier le code Lua que l'on insère dans le code HTML ! + +* Mono-tâche à cause de l'utilisation de variables *globales*.
+Là, c'est plus embêtant, c'est à dire que l'on ne peut servir plusieurs page WEB en même temps à cause de l'obligation d'utiliser des variables *globales* pour pouvoir exécuter du code Lua venant d'un fichier *texte*.
+Mais vu que c'est utilisé pour des *interface WEB* sur un petit microcontrôleur et non un serveur WEB puissant ce n'est pas trop catastrophique. + + +## Exemples