diff --git a/Mesures/humidity/bolo/0_cron.lua b/Mesures/humidity/bolo/0_cron.lua
new file mode 100644
index 0000000..073c089
--- /dev/null
+++ b/Mesures/humidity/bolo/0_cron.lua
@@ -0,0 +1,13 @@
+-- Petit script pour faire office de crontab pour les
+--mesures
+print("\n 0_cron.lua zf190917.0033 \n")
+
+f= "flash_led_xfois.lua" if file.exists(f) then dofile(f) end
+flash_led_xfois()
+xfois =2
+
+cron1=tmr.create()
+cron1:alarm(10*1000, tmr.ALARM_AUTO, function()
+ blink_LED ()
+ send_data()
+end)
diff --git a/Mesures/humidity/bolo/0_get_data.lua b/Mesures/humidity/bolo/0_get_data.lua
new file mode 100644
index 0000000..9c81dd7
--- /dev/null
+++ b/Mesures/humidity/bolo/0_get_data.lua
@@ -0,0 +1,62 @@
+-- Lit le convertisseur ADC connecté sur le transformateur de courant
+-- pour mesurer le courant électrique de l'installation PV
+print("\n 0_get_data.lua zf191024.1037 \n")
+
+-- Astuce de mesure:
+-- On converti le courant en tension avec la résistance de charge du
+-- transformateur de courant 1/800 et le mesure avec l'ADC
+-- Au lieu de découper la sinusoïde en 100 parties, c'est à dire toutes
+-- les 0.2ms (5'000x /s), pour en faire l'intégrale. On lit l'adc toutes
+-- les 11ms (91x /s) donc beaucoup plus lentement.
+-- Comme la sinusoïde fait 20ms et est répétitive, on balaye (par décalage)
+-- statistiquement la sinusoïde.
+-- On redresse l'alternance par rapport à la masse fictive (env 0.5),
+-- ce qui nous permet d'estimer une valeur RMS du courant
+-- quelque soit sa forme et on le somme sur 2.1 secondes
+-- Les mesures min et max ne sont là juste pour vérifier que nous sommes
+-- bien dans la plage de mesure avec le choix de la résistance de conversion
+-- la conversion courant/tension/puissance est faite avec une simple régle de 3
+
+
+zpow_cal=401 --puissance mesurée de la charge étalon
+zadc_cal=189 --valeur de l'adc pour zpow_cal
+zadc_offset=548
+
+zadc_sum=0 zadc_offset_sum=0 znb_mes=0
+zadc_min=zadc_offset zadc_max=zadc_offset
+
+if adc.force_init_mode(adc.INIT_ADC)
+then
+ node.restart()
+ return
+end
+
+tmr_read_adc=tmr.create()
+tmr_read_adc:alarm(11, tmr.ALARM_AUTO, function()
+ read_adc()
+end)
+
+tmr_calc_rms=tmr.create()
+tmr_calc_rms:alarm(2.1*1000, tmr.ALARM_AUTO, function()
+ calc_rms()
+end)
+
+function read_adc()
+ zadc=adc.read(0)
+ if zadc<=zadc_min then zadc_min=zadc end
+ if zadc>=zadc_max then zadc_max=zadc end
+ zadc_offset_sum=zadc_offset_sum+zadc
+ zadc=zadc-zadc_offset if zadc<=0 then zadc=zadc*-1 end
+ zadc_sum=zadc_sum+zadc znb_mes=znb_mes+1
+end
+
+function calc_rms()
+ zadc_rms=math.floor(zadc_sum/znb_mes)
+ if zadc_rms<=8 then zadc_rms=0 end
+ zadc_offset=math.floor(zadc_offset_sum/znb_mes)
+ zpower=math.floor(zadc_rms*zpow_cal/zadc_cal)
+ if verbose then print(zadc_min,zadc_max,zadc_max-zadc_min,zadc_offset,zadc_rms,zpower.."W") end
+ zadc_min=zadc_offset zadc_max=zadc_offset
+ zadc_sum=0 zadc_offset_sum=0 znb_mes=0
+ zadc_min=zadc_offset zadc_max=zadc_offset
+end
diff --git a/Mesures/humidity/bolo/0_send_data.lua b/Mesures/humidity/bolo/0_send_data.lua
new file mode 100644
index 0000000..38f119b
--- /dev/null
+++ b/Mesures/humidity/bolo/0_send_data.lua
@@ -0,0 +1,27 @@
+-- Petit script pour envoyer les valeurs sur un serveur WEB (InfluxDB)
+-- via un http GET
+print("\n 0_send_data.lua zf190924.1043 \n")
+
+function send_data()
+ if verbose then print("send_data: ") end
+
+ zarg="energy,compteur=2 puissance="..zpower/1000
+ if verbose then print("zarg: "..zarg) end
+
+ http.post(influxdb_url, 'Content-Type: application/x-www-form-urlencoded\r\n', zarg, function(code, data)
+-- print("toto")
+ if (code < 0) then
+ print("HTTP request failed")
+ print("zuzu", code, data)
+ else
+ if verbose then print(code, data) end
+ end
+-- print("tutu")
+ end)
+-- print("titi")
+end
+
+--[[
+zpower=450
+send_data()
+]]
diff --git a/Mesures/humidity/bolo/README.md b/Mesures/humidity/bolo/README.md
new file mode 100644
index 0000000..58c0c08
--- /dev/null
+++ b/Mesures/humidity/bolo/README.md
@@ -0,0 +1,135 @@
+# Mesure d'humidité et de température
+
+Petit projet pour mesurer l'humidité et la température pour l'afficher sur Grafana avec une DB InfluxDB. Comme par exemple pour monitorer l'humidité d'un local au cours du temps.
+
+
+
+toto
+
+
+tutu
+
+
+titi
+
+
+tata
+
+
+
+On peut voir ici, avec ce projet assez complet, toutes les possibilités offertes de la programmation des NodeMCU en LUA, en mode événementiel.
+Choses qui ne seraient pas possible si on l'avait fait en C++ (mode Arduino), comme par exemple:
+
+* serveur WEB Active Server Pages ZYX, permet de faire des pages HTML dynamiques avec du code LUA in line. Les pages HTML sont sauve dans la FLASH du NodeMCU
+* serveur WEB service pour le HUB concentrateur de mesures de différents NodeMCU (API GET)
+* serveur WEB pour l'affichage de l'humidité et de la température
+* serveur WEB pour l'IDE, modification du code source en remote directement depuis une page WEB, pas besoin d'IDE
+* crontab, horloge pour les mesures
+* serveur TELNET, utilisation de la console en remote pour le dépannage
+
+Toutes les fonctions sont bien séparées dans des scripts, cela *complexifie* le projet mais cela facilite la portabilité entre les projets et aussi sa mise au point.
+
+
+
+## Astuces de mesures
+
+
+## Installation
+
+Il faut *flasher* le NodeMCU avec ce firmware:
+
+
+
+Avec ces modules:
+
+```
+adc ds18b20 file gpio http i2c mdns mqtt net
+node ow pcm rtctime sntp spi tmr uart wifi ws2812
+```
+
+
+## Utilisation
+
+
+### Distribution des rôles de NodeMCU
+
+Comme on peut avoir plusieurs points de mesures à différents endroit dans le local, il n'y a qu'une Seulement fichier de *secrets*. C'est dans ce fichier de *secrets* qu'il y a l'information de l'adresse IP de la base de donnée InfluxDB et c'est l'id des NodeMCU qui sont enregistrés dans la DB InfluxDB !
+
+```
+secrets_projet.lua
+```
+
+
+
+**ATTENTION, readme pas encore terminé, il faut encore modifier le readme depuis ici ! zf190922.1740**
+
+
+
+
+
+
+
+
+### Affichage des températures en local sur le NodeMCU
+
+On peut lire la température directement sur le NodeMCU au moyen de cet url (il faut modifier l'adresse IP du NodeMCU en question):
+
+nodemcu 28 int, http://192.168.0.171/disp_temp.html
+
+nodemcu 29 sud, http://192.168.0.180/disp_temp.html
+
+nodemcu 30 nord, http://192.168.0.105/disp_temp.html
+
+
+### Affichage du petit serveur web du NodeMCU_Lua
+
+Chaque NodeMCU a son propre serveur WEB, on peut l'accéder simplement depuis son adresse IP:
+
+nodemcu 28 int, http://192.168.0.171
+
+nodemcu 29 sud, http://192.168.0.180
+
+nodemcu 30 nord, http://192.168.0.105
+
+
+### Modification du code source du NodeMCU en remote
+
+Très pratique pour le debug, on peut directement modifier le code source Lua du NodeMCU en remote avec cet url:
+
+nodemcu 28 int, http://192.168.0.171:88
+
+nodemcu 29 sud, http://192.168.0.180:88
+
+nodemcu 30 sord, http://192.168.0.105:88
+
+
+### Utilisation de la console du NodeMCU en remote
+
+Très pratique pour le debug, on peut accéder à la console du NodeMCU en remote avec telnet:
+
+nodemcu 28 int, **telnet -rN 192.168.0.171**
+
+nodemcu 29 sud, **telnet -rN 192.168.0.180**
+
+nodemcu 30 nord, **telnet -rN 192.168.0.105**
+
+
+## Visualisation sur ThingSpeak
+La totale en détail
+https://thingspeak.com/channels/817940
+
+Seulement la corrélation entre les trois température
+https://thingspeak.com/apps/plugins/300559
+
+
+zf191201.2305
+
+
+pense bête:
+
+```
+file.open("hello.lua","w+")
+file.writeline([[print("hello nodemcu")]])
+file.writeline([[print(node.heap())]])
+file.close()
+```
diff --git a/Mesures/humidity/bolo/_zremote_cmd.txt b/Mesures/humidity/bolo/_zremote_cmd.txt
new file mode 100644
index 0000000..ae15a9b
--- /dev/null
+++ b/Mesures/humidity/bolo/_zremote_cmd.txt
@@ -0,0 +1,180 @@
+# Quelques commandes remote (luatool) à envoyer avec le plugin Atom-IDE-terminal de l'éditeur Atom
+# zf191124.2340
+
+# si luatool ne marche pas sur le MAC, il faut lire ceci:
+# https://docs.google.com/document/d/1q64uK3IMOgEDdKaIAttbYuFt4GuLQ06k3FLeyfCsWLg/edit#heading=h.bmefcu67uwj0
+
+# raccourcis clavier
+# CTRL+ALT+ENTER envoie au terminal la ligne de l'éditeur
+# SHIT+CTRL+` ouvre le terminal (attention, ne pas oublier de copier le *path* dans le *tree* et le changer)
+# ALT+CMD+F bascule entre le terminal et l'éditeur
+
+# définitions à faire AVANT !
+cd /Users/zuzu/Desktop/NodeMCU/NodeMCU_Lua/WIFI_sniffer/cret_project
+export luatool_tty="/dev/cu.wchusbserial1410"
+export zIP="192.168.0.122"
+export zIP="192.168.0.137"
+export zport="23"
+
+cd '/Users/zuzu/Google Drive/FamilleZ Share/FamilleZ/Papa/LUA/NodeMCU ESP8266/NodeMCU_Lua/WIFI_sniffer/cret_project'
+export zIP="localhost"
+export zport="2323"
+ATTENTION: voir les tunnels tout à la fin !
+
+
+# ouvrir et fermer (ALT+N+.) une session telnet sur le NodeMCU avec l'adresse zIP)
+telnet -rN $zIP $zport
+~.
+--node.restart()
+collectgarbage()
+=node.heap()
+for k,v in pairs(_G) do print(k,v) end
+
+
+# commandes lua pour ce projet
+telnet -rN $zIP $zport
+wifi.eventmon.unregister(wifi.eventmon.AP_PROBEREQRECVED)
+dofile("dir2.lua")
+filec('dir2.lua')
+dirc()
+~.
+
+
+
+verbose=true
+verbose=false
+zsort_rssi() zshow()
+
+
+#commandes luatool pour ce projet le .137 est à jour avec la nouvelle version du wifi !
+~.
+./luatool.py --ip $zIP:$zport -l
+./luatool.py --ip $zIP:$zport -f dir2.lua
+
+
+./luatool.py --ip $zIP:$zport -f secrets_wifi.lua
+./luatool.py --ip $zIP:$zport -f initz.lua -t init.lua
+./luatool.py --ip $zIP:$zport -f boot.lua
+./luatool.py --ip $zIP:$zport -f boot2.lua
+./luatool.py --ip $zIP:$zport -f wifi_init.lua
+./luatool.py --ip $zIP:$zport -f set_time.lua
+./luatool.py --ip $zIP:$zport -f wifi_info.lua
+./luatool.py --ip $zIP:$zport -f c.lua
+./luatool.py --ip $zIP:$zport -f cat.lua
+./luatool.py --ip $zIP:$zport -f flash_led_xfois.lua
+./luatool.py --ip $zIP:$zport -f head.lua
+
+./luatool.py --ip $zIP:$zport -f b.lua
+./luatool.py --ip $zIP:$zport -f web_srv2.lua
+./luatool.py --ip $zIP:$zport -f z_index.html
+
+
+./luatool.py --ip $zIP:$zport -f wifi_get_conf.html
+./luatool.py --ip $zIP:$zport -f wifi_set_conf.html
+
+
+./luatool.py --ip $zIP:$zport -f z_page1.html
+./luatool.py --ip $zIP:$zport -f z_page2.html
+./luatool.py --ip $zIP:$zport -f z_page3.html
+./luatool.py --ip $zIP:$zport -f z_page4.html
+
+./luatool.py --ip $zIP:$zport --delete wifi_ap_start.lua
+./luatool.py --ip $zIP:$zport --delete wifi_cli_conf.lua
+./luatool.py --ip $zIP:$zport --delete wifi_cli_start.lua
+./luatool.py --ip $zIP:$zport --delete dir.lua
+./luatool.py --ip $zIP:$zport --delete initz.lua
+./luatool.py --ip $zIP:$zport --delete wifi_conf.lua
+
+
+
+dofile("wifi_info.lua")
+--node.restart()
+for k,v in pairs(_G) do print(k,v) end
+t=12
+t=nil
+print(pcall(function () print("2"..t) end))
+
+
+
+# ici c'est maintenant ;-)
+~.
+./luatool.py --ip $zIP:$zport -f b.lua
+--./luatool.py --ip $zIP:$zport --zrestart
+telnet -rN $zIP $zport
+zsort_rssi() zshow()
+print(ztrig_rssi)
+ztrig_rssi=-1000
+ztrig_rssi=-90
+
+
+
+# test de la gestion des erreurs
+~.
+./luatool.py --ip $zIP:$zport -f c.lua
+#./luatool.py --ip $zIP:$zport --zrestart
+telnet -rN $zIP $zport
+status, err = pcall(function () dofile("c.lua") end) if status==false then print("Error: ",err) end
+zerr=nil
+zerr=1
+ztmr_tst_err:unregister()
+
+
+
+~.
+./luatool.py --ip $zIP:$zport -f head.lua
+telnet -rN $zIP $zport
+dofile("head.lua")
+zhead("c.lua")
+
+ztmr_tst_err:unregister()
+for k,v in pairs(_G) do print(k,v) end
+
+./luatool.py --ip $zIP --zrestart
+
+
+# faire un cat d'un fichier sur le NodeMCU
+dofile("cat.lua")
+cat("boot2.lua")
+
+
+# commandes luatool
+./luatool.py -h
+./luatool.py --ip $zIP:$zport -i
+./luatool.py --ip $zIP:$zport -l
+./luatool.py --ip $zIP:$zport -f toto.lua -d
+./luatool.py --ip $zIP:$zport --delete toto.lua
+
+
+# création des tunnels ssh
+ATTENTION: dans un premier terminal !
+Pour le MsL
+ssh -t -L 2323:localhost:2323 ubuntu@www.zuzutest.ml ssh -N -L 2323:192.168.1.111:23 ubuntu@localhost -p 20221
+
+Pour le Crêt
+ssh -N -L 2323:192.168.0.137:23 admin@z.zufferey.com -p 1822
+ssh -N -L 2323:192.168.0.122:23 admin@z.zufferey.com -p 1822
+
+ATTENTION: dans un deuxième terminal !
+export zIP="localhost"
+export zport="2323"
+telnet -rN $zIP $zport
+
+dofile("dir2.lua")
+dir()
+filec("head.lua")
+
+dofile("head.lua")
+zhead("dir2.lua")
+
+dofile("cat.lua")
+cat("head.lua")
+
+~.
+--node.restart()
+=node.heap()
+
+
+status, err = pcall(function () fonction_a_tester() end) if status==false then print("Error: ",err) end
+status, err = pcall(function () toto() end) if status==false then print("Error: ",err) end
+
+.
diff --git a/Mesures/humidity/bolo/boot.lua b/Mesures/humidity/bolo/boot.lua
new file mode 100644
index 0000000..109c0a4
--- /dev/null
+++ b/Mesures/humidity/bolo/boot.lua
@@ -0,0 +1,13 @@
+-- Scripts à charger après le boot pour démarrer le core system
+
+print("\n boot.lua zf191124.1920 \n")
+
+function boot()
+ --f= "led_rgb.lua" if file.exists(f) then dofile(f) end
+ f= "telnet_srv2.lua" if file.exists(f) then dofile(f) end
+ f= "wifi_init.lua" if file.exists(f) then dofile(f) end
+ --f= "web_ide2.lua" if file.exists(f) then dofile(f) end
+ --f= "web_srv2.lua" if file.exists(f) then dofile(f) end
+end
+boot()
+
diff --git a/Mesures/humidity/bolo/boot2.lua b/Mesures/humidity/bolo/boot2.lua
new file mode 100644
index 0000000..4a581b3
--- /dev/null
+++ b/Mesures/humidity/bolo/boot2.lua
@@ -0,0 +1,55 @@
+-- Scripts à charger après le boot pour démarrer son projet
+
+print("\n boot2.lua zf191124.1922 \n")
+
+function boot2()
+ second_chance=nil initz=nil boot=nil
+ f= "flash_led_xfois.lua" if file.exists(f) then dofile(f) end
+ if false then
+ tmr.create():alarm(1*1000, tmr.ALARM_AUTO, function()
+ xfois =2
+ blink_LED ()
+ end)
+ end
+
+ boot2_tmr=tmr.create()
+ boot2_tmr:alarm(1*1000, tmr.ALARM_AUTO , function()
+ if wifi.sta.getip() == nil then
+ print("Connecting to AP...")
+ xfois =2 blink_LED ()
+ else
+ boot2_tmr:unregister()
+ flash_led_xfois=nil blink_LED=nil ztmr_Flash_LED=nil
+ zTm_Off_LED=nil zTm_On_LED=nil nbfois=nil xfois=nil zLED=nil
+ boot2_tmr=nil secrets_wifi=nil wifi_init=nil
+ cli_ssid=nil cli_pwd=nil ap_ssid=nil ap_pwd=nil
+ f= "wifi_info.lua" if file.exists(f) then dofile(f) end
+ f= "secrets_project.lua" if file.exists(f) then dofile(f) end
+ f= "set_time.lua" if file.exists(f) then dofile(f) end
+ collectgarbage()
+ --- f= "b.lua" if file.exists(f) then dofile(f) end
+ f= "web_srv2.lua" if file.exists(f) then dofile(f) end
+
+ f=nil
+
+ tmr.create():alarm(3*1000, tmr.ALARM_SINGLE, function()
+ print("BOOOOUM, y'a plus de boot2 !")
+ wifi_info=nil boot2=nil
+ end)
+
+ end
+ end)
+end
+
+boot2()
+
+
+--[[
+tmr.create():alarm(1*1000, tmr.ALARM_AUTO, function()
+ print(node.heap())
+end)
+]]
+
+--[[
+for k,v in pairs(_G) do print(k,v) end
+]]
diff --git a/Mesures/humidity/bolo/c.lua b/Mesures/humidity/bolo/c.lua
new file mode 100644
index 0000000..eb2f832
--- /dev/null
+++ b/Mesures/humidity/bolo/c.lua
@@ -0,0 +1,37 @@
+-- Scripts pour tester l'affichage des erreurs quand on se trouve ne remote telnet
+-- source: https://www.lua.org/pil/8.4.html
+-- source: https://riptutorial.com/lua/example/16000/using-pcall
+
+--[[
+Usage:
+après l'avoir lancé on peut faire varier le contenu de la variable zerr pour cérer des erreurs répétitives
+
+Commandes à envoyer via un terminal:
+~.
+./luatool.py --ip $zIP:$zport -f c.lua
+#./luatool.py --ip $zIP:$zport --zrestart
+telnet -rN $zIP $zport
+status, err = pcall(function () dofile("c.lua") end) if status==false then print("Error: ",err) end
+zerr=nil
+zerr=1
+ztmr_tst_err:unregister()
+]]
+
+print("\n c.lua zf191030.1231 \n")
+
+zerr=1
+ztmr_tst_err = tmr.create()
+
+-- le code à tester DOIT être encapsulé dans une fonction
+function zfoo()
+ print("toto: "..zerr)
+end
+
+-- timer pour générer des erreurs répétitives
+ztmr_tst_err:alarm(3*1000, tmr.ALARM_AUTO, function()
+ -- test du code
+ local status, err = pcall(function () zfoo() end) if status==false then print("Error: ",err) end
+end)
+
+
+--
diff --git a/Mesures/humidity/bolo/cat.lua b/Mesures/humidity/bolo/cat.lua
new file mode 100644
index 0000000..8a2e29c
--- /dev/null
+++ b/Mesures/humidity/bolo/cat.lua
@@ -0,0 +1,22 @@
+-- fonction cat() pour afficher le contenu d'un fichier dans la flash
+print("\n cat.lua zf191124.2204 \n")
+
+function zread_line()
+ local zline = ""
+ while true do
+ local t = zf:read(1) if t == nil then return end
+ zline = zline..t
+ if t == "\n" then return string.sub(zline,1,string.len(zline)-1) end
+ end
+end
+
+function cat(zfile)
+ print("\n"..zfile.."\n-------------------------------")
+ zf = file.open(zfile, "r")
+ while true do
+ zline = zread_line() if zline == nil then break end
+ print(zline)
+ end
+ zf:close()
+ print("-------------------------------")
+end
diff --git a/Mesures/humidity/bolo/dir2.lua b/Mesures/humidity/bolo/dir2.lua
new file mode 100644
index 0000000..bd2fb1a
--- /dev/null
+++ b/Mesures/humidity/bolo/dir2.lua
@@ -0,0 +1,90 @@
+-- fonction dirc() pour calculer le checksum de tous les fichiers sur le NodeMCU !
+-- fonction filec(fichier) pour calculer le checksum d'un seul fichiers sur le NodeMCU !
+
+print("\n dir2.lua zf191124.1602 \n")
+
+function calc_chksum_file()
+ local name_file = list_files[zcmpt1]
+ print(name_file)
+ local size_file = 1 local chksum_file = 0
+ local f = file.open(name_file, "r")
+ while true do
+ local t = f:read(1) if t == nil then break end
+ chksum_file = chksum_file + size_file * string.byte(t)
+ size_file = size_file + 1
+ if size_file%100 == 0 then uart.write(0,".") end
+ end
+ f:close() print("")
+ zdir[#zdir+1]=name_file..string.rep(" ",24-string.len(name_file)).." : "..size_file..", "..chksum_file
+ zcmpt1 = zcmpt1 + 1
+ zrepeat()
+end
+
+function zrepeat()
+ if zcmpt1 <= #list_files then
+-- if zcmpt1 <= 3 then
+ node.task.post(calc_chksum_file)
+ else
+ table.sort(zdir) for i=1, #zdir do print(zdir[i]) end
+ zdir=nil list_files=nil zcmpt1=nil
+ end
+end
+
+function dirc()
+ zdir={} list_files={}
+ local pfile = file.list()
+ for k,v in pairs(pfile) do
+ list_files[#list_files+1]=k
+ end
+ zcmpt1 = 1 zrepeat()
+end
+
+function filec(name_file)
+ print(name_file)
+ local size_file = 1 local chksum_file = 0
+ local f = file.open(name_file, "r")
+ while true do
+ local t = f:read(1) if t == nil then break end
+ chksum_file = chksum_file + size_file * string.byte(t)
+ size_file = size_file + 1
+ if size_file%100 == 0 then uart.write(0,".") end
+ end
+ f:close() print("")
+ print(name_file..string.rep(" ",24-string.len(name_file)).." : "..size_file..", "..chksum_file)
+end
+
+function dir()
+ local zdir={}
+ local pfile = file.list()
+ for k,v in pairs(pfile) do
+ zdir[#zdir+1] = k..string.rep(" ",24-string.len(k)).." : "..v
+ end
+ table.sort(zdir) for i=1, #zdir do print(zdir[i]) end
+ size_file=nil chksum_file=nil k=nil
+end
+
+function clear_dir()
+ dir=nil dir2=nil dirc=nil filec=nil
+ zrepeat=nil calc_chksum_file=nil
+end
+
+dir()
+print("\nusage:")
+print(" dir()")
+print(" dirc()")
+print(" filec('dir2.lua')")
+
+
+--[[
+dir()
+dirc()
+filec("dir2.lua")
+
+=node.heap()
+clear_dir()
+=node.heap()
+
+for k,v in pairs(_G) do print(k,v) end
+
+status, err = pcall(function () print(zhash("il était une fois trois petits cochons roses...")) end) if status==false then print("Error: ",err) end
+]]
diff --git a/Mesures/humidity/bolo/flash_led_xfois.lua b/Mesures/humidity/bolo/flash_led_xfois.lua
new file mode 100644
index 0000000..0b3deaf
--- /dev/null
+++ b/Mesures/humidity/bolo/flash_led_xfois.lua
@@ -0,0 +1,40 @@
+-- programme pour faire clignoter x fois une LED avec un rapport on/off
+
+function flash_led_xfois()
+ print("\n flash_led_xfois.lua zf1911124.1053 \n")
+
+ --zLED=0 --NodeMCU
+ zLED=4 --EPS-M3
+ zTm_On_LED = 50 --> en ms
+ zTm_Off_LED = 100 --> en ms
+ nbfois = 0
+ gpio.write(zLED, gpio.HIGH)
+ gpio.mode(zLED, gpio.OUTPUT)
+ ztmr_Flash_LED = tmr.create()
+
+ function blink_LED ()
+ if nbfois >= xfois then
+ -- print(nbfois)
+ nbfois = 0
+ else
+ if gpio.read(zLED)==gpio.HIGH then
+ gpio.write(zLED, gpio.LOW)
+-- tmr.alarm(ztmr_Flash_LED, zTm_Off_LED, tmr.ALARM_SINGLE, blink_LED)
+ ztmr_Flash_LED:alarm(zTm_Off_LED, tmr.ALARM_SINGLE, blink_LED)
+ else
+ gpio.write(zLED, gpio.HIGH)
+ nbfois = nbfois+1
+-- tmr.alarm(ztmr_Flash_LED, zTm_On_LED, tmr.ALARM_SINGLE, blink_LED)
+ ztmr_Flash_LED:alarm(zTm_On_LED, tmr.ALARM_SINGLE, blink_LED)
+ end
+ end
+ end
+
+end
+
+flash_led_xfois()
+
+--[[
+xfois =2
+blink_LED ()
+]]
diff --git a/Mesures/humidity/bolo/goodies/a.lua b/Mesures/humidity/bolo/goodies/a.lua
new file mode 100644
index 0000000..7c59e2f
--- /dev/null
+++ b/Mesures/humidity/bolo/goodies/a.lua
@@ -0,0 +1,48 @@
+-- Scripts pour tester le multi-tâche
+
+
+function lenteur()
+ print("in...")
+ tmr.delay(1*1000*1000)
+ print("out...")
+ i=i+1
+ zrepeat()
+end
+
+function zrepeat()
+ if i<5 then
+ node.task.post(lenteur)
+ end
+ print("out2...")
+end
+
+
+t1=tmr.now()
+
+i=0
+zrepeat()
+
+t2=tmr.now()
+print("durée: "..t2-t1)
+
+
+--[[
+
+t1={}
+for k,v in pairs(pfile) do
+ t1[#t1+1]=k
+end
+
+print(t1[3])
+
+
+t1 = file.list()
+print(file.list()["a.lua"])
+
+
+print(file.list[1])
+print(#file.list)
+
+
+
+]]
\ No newline at end of file
diff --git a/Mesures/humidity/bolo/head.lua b/Mesures/humidity/bolo/head.lua
new file mode 100644
index 0000000..0478b8c
--- /dev/null
+++ b/Mesures/humidity/bolo/head.lua
@@ -0,0 +1,19 @@
+-- fonction cat() pour afficher les 10 premières lignes d'un fichier dans la flash
+print("\n head.lua zf192028.1516 \n")
+
+function zhead(zfile)
+ print("\n"..zfile.."\n-------------------------------")
+
+ zfilei = file.open(zfile, "r")
+ i=1
+ zline=file.readline()
+ repeat
+-- print(i..": "..string.sub(zline,1,string.len(zline)-1))
+ print(string.sub(zline,1,string.len(zline)-1))
+ i=i+1 zline=file.readline()
+ if i>10 then break end
+ until zline==nil
+ file.close(zfilei)
+
+ print("-------------------------------")
+end
diff --git a/Mesures/humidity/bolo/initz.lua b/Mesures/humidity/bolo/initz.lua
new file mode 100644
index 0000000..87c0905
--- /dev/null
+++ b/Mesures/humidity/bolo/initz.lua
@@ -0,0 +1,65 @@
+--Script de bootstrap, test au moment du boot qui a été la cause de boot.
+-- Si la cause est un power on ou une connexion depuis l'IDE, alors
+-- le script repair.lua pendant xx secondes avant de continuer
+--Source: https://nodemcu.readthedocs.io/en/master/en/modules/node/#nodebootreason
+
+print("\n init.lua zf191030.2015 \n")
+
+function initz()
+ zswitch=3 --switch flash
+ gpio.mode(zswitch, gpio.INT, gpio.PULLUP)
+
+ function hvbouton()
+ gpio.trig(zswitch, "none")
+ initalarme:unregister() initalarme2:unregister()
+ f= "boot.lua" if file.exists(f) then dofile(f) end
+ f= "boot2.lua" if file.exists(f) then dofile(f) end
+ end
+
+ gpio.trig(zswitch, "both", hvbouton)
+
+ function second_chance()
+ print("seconde chance...")
+ f= "repair.lua" if file.exists(f) then dofile(f) end
+ initalarme=tmr.create()
+ initalarme:alarm(4*1000, tmr.ALARM_SINGLE, function()
+ f= "boot.lua" if file.exists(f) then dofile(f) end
+ end)
+ initalarme2=tmr.create()
+ initalarme2:alarm(30*1000, tmr.ALARM_SINGLE, function()
+ gpio.trig(zswitch)
+ hvbouton=nil
+ zswitch=nil
+ reset_reason=nil
+ f= "boot2.lua" if file.exists(f) then dofile(f) end
+ end)
+ end
+
+ _, reset_reason = node.bootreason()
+ print("reset_reason:",reset_reason)
+ if reset_reason == 0 then
+ print("power on")
+ second_chance()
+ elseif reset_reason == 4 then
+ print("node.restart")
+ gpio.trig(zswitch)
+ hvbouton=nil
+ second_chance=nil
+ zswitch=nil
+ reset_reason=nil
+ f= "boot.lua" if file.exists(f) then dofile(f) end
+ f= "boot2.lua" if file.exists(f) then dofile(f) end
+ elseif reset_reason == 5 then
+ print("dsleep wake up")
+ f= "boot.lua" if file.exists(f) then dofile(f) end
+ f= "boot2.lua" if file.exists(f) then dofile(f) end
+ elseif reset_reason == 6 then
+ print("external reset")
+ second_chance()
+ else
+ print("autre raison")
+ second_chance()
+ end
+end
+initz()
+
diff --git a/Mesures/humidity/bolo/luatool.py b/Mesures/humidity/bolo/luatool.py
new file mode 100755
index 0000000..68815e9
--- /dev/null
+++ b/Mesures/humidity/bolo/luatool.py
@@ -0,0 +1,405 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+version = "0.6.6 zf191124.1036"
+
+print("luatool.py ver " + version)
+
+#Améliorations
+# Pour voir les améliorations il faut 'chercher' les zzz
+
+
+#
+# ESP8266 luatool
+# Author e-mail: 4ref0nt@gmail.com
+# Site: http://esp8266.ru
+# Contributions from: https://github.com/sej7278
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
+# Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import sys
+import serial
+from time import sleep
+import socket
+import argparse
+from os.path import basename
+
+
+tqdm_installed = True
+try:
+ from tqdm import tqdm
+except ImportError, e:
+ if e.message == 'No module named tqdm':
+ tqdm_installed = False
+ else:
+ raise
+
+
+
+class TransportError(Exception):
+ """Custom exception to represent errors with a transport
+ """
+ def __init__(self, message):
+ self.message = message
+
+ def __str__(self):
+ return self.message
+
+class AbstractTransport:
+ def __init__(self):
+ raise NotImplementedError('abstract transports cannot be instantiated.')
+
+ def close(self):
+ raise NotImplementedError('Function not implemented')
+
+ def read(self, length):
+ raise NotImplementedError('Function not implemented')
+
+ def writeln(self, data, check=1):
+ raise NotImplementedError('Function not implemented')
+
+ def writer(self, data):
+ ##zzz191124 enlève la fin de ligne afin de ne pas perturber la vérification finale
+ data = data.rstrip('\r\n')
+ self.writeln("file.writeline([==[" + data + "]==])\r")
+
+ def performcheck(self, expected):
+ line = ''
+ char = ''
+ i = -1
+ while char != chr(62): # '>'
+ char = self.read(1)
+ if char == '':
+ raise Exception('No proper answer from MCU')
+ if char == chr(13) or char == chr(10): # LF or CR
+ if line != '':
+ #zzz191124 line = line.strip()
+ # zzz191021 Affiche ce que l'on a reçu du NodeMCU
+ if args.verbose:
+ print("\n\nzread0957: {" + line + "\n}\n")
+
+ if line+'\r' == expected and not args.bar:
+ sys.stdout.write(" -> ok")
+ elif line+'\r' != expected:
+ if line[:4] == "lua:":
+ sys.stdout.write("\r\n\r\nLua ERROR: %s" % line)
+ raise Exception('ERROR from Lua interpreter\r\n\r\n')
+ else:
+ expected = expected.split("\r")[0]
+ sys.stdout.write("\r\n\r\nERROR")
+ sys.stdout.write("\r\n send string : '%s'" % expected)
+ sys.stdout.write("\r\n expected echo : '%s'" % expected)
+ sys.stdout.write("\r\n but got answer : '%s'" % line)
+ sys.stdout.write("\r\n\r\n")
+ raise Exception('Error sending data to MCU\r\n\r\n')
+ line = ''
+ else:
+ line += char
+ if char == chr(62) and expected[i] == char:
+ char = ''
+ i += 1
+
+
+class SerialTransport(AbstractTransport):
+ def __init__(self, port, baud, delay):
+ self.port = port
+ self.baud = baud
+ self.serial = None
+ self.delay = delay
+
+ try:
+ self.serial = serial.Serial(port, baud)
+ except serial.SerialException as e:
+ raise TransportError(e.strerror)
+
+ self.serial.timeout = 3
+ self.serial.interCharTimeout = 3
+
+ # zzz191021 juste après l'ouverture du port série, on attend le caractère '>'
+ line = ''
+ char = ''
+ i = -1
+ while char != chr(62): # '>'
+ char = self.read(1)
+ if char == '':
+ raise Exception('No proper answer from MCU')
+ line += char
+ i += 1
+ if args.verbose:
+ print("line: ." + line + ".")
+
+
+ def writeln(self, data, check=1):
+ # zzz191020 on fait une petite pause avant l'envoi de chaque ligne
+ sleep(self.delay)
+ if self.serial.inWaiting() > 0:
+ self.serial.flushInput()
+ if len(data) > 0 and not args.bar:
+ sys.stdout.write("\r\n->")
+ sys.stdout.write(data.split("\r")[0])
+ ##zzz191124 attend encore un petit peu avant d'envoyer
+ sleep(self.delay)
+ self.serial.write(data)
+ sleep(self.delay)
+ # zzz191021 Affiche ce que l'on a envoyé au NodeMCU
+ if args.verbose:
+ print("\n\nzwrite0952: {" + data + "\n}\n")
+ if check > 0:
+ self.performcheck(data)
+ elif not args.bar:
+ sys.stdout.write(" -> send without check")
+
+ def read(self, length):
+ return self.serial.read(length)
+
+ def close(self):
+ self.serial.flush()
+ self.serial.close()
+
+
+class TcpSocketTransport(AbstractTransport):
+ def __init__(self, host, port):
+ self.host = host
+ self.port = port
+ self.socket = None
+
+ try:
+ self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ except socket.error as e:
+ raise TransportError(e.strerror)
+
+ try:
+ self.socket.connect((host, port))
+ except socket.error as e:
+ raise TransportError(e.strerror)
+ # read intro from telnet server (see telnet_srv.lua)
+ self.socket.recv(50)
+
+ def writeln(self, data, check=1):
+ if len(data) > 0 and not args.bar:
+ sys.stdout.write("\r\n->")
+ sys.stdout.write(data.split("\r")[0])
+ self.socket.sendall(data)
+ if check > 0:
+ self.performcheck(data)
+ elif not args.bar:
+ sys.stdout.write(" -> send without check")
+
+ def read(self, length):
+ return self.socket.recv(length)
+
+ def close(self):
+ self.socket.close()
+
+
+def decidetransport(cliargs):
+ if cliargs.ip:
+ data = cliargs.ip.split(':')
+ host = data[0]
+ if len(data) == 2:
+ port = int(data[1])
+ else:
+ port = 23
+ return TcpSocketTransport(host, port)
+ else:
+ return SerialTransport(cliargs.port, cliargs.baud, cliargs.delay)
+
+
+if __name__ == '__main__':
+ # parse arguments or use defaults
+ parser = argparse.ArgumentParser(description='ESP8266 Lua script uploader.')
+ parser.add_argument('--bar', action='store_true', help='Show a progress bar for uploads instead of printing each line')
+ parser.add_argument('--delay', default=0.02, help='Delay in seconds between each write, default 0.03 sec.', type=float)
+ parser.add_argument('--delete', default=None, help='Delete a lua/lc file from device.')
+ parser.add_argument('--ip', default=None, help='Connect via telnet server (--ip IP[:port])')
+ parser.add_argument('--zrestart', action='store_true', help='Restart the NodeMCU.')
+ parser.add_argument('-a', '--append', action='store_true', help='Append source file to destination file.')
+ parser.add_argument('-b', '--baud', default=115200, help='Baudrate, default 115200')
+ parser.add_argument('-c', '--compile', action='store_true', help='Compile lua to lc after upload')
+ parser.add_argument('-d', '--dofile', action='store_true', help='Run the Lua script after upload')
+ parser.add_argument('-e', '--echo', action='store_true', help='Echo output of MCU until script is terminated.')
+ parser.add_argument('-f', '--src', default='main.lua', help='Source file on computer, default main.lua')
+ parser.add_argument('-i', '--id', action='store_true', help='Query the modules chip id.')
+ parser.add_argument('-l', '--list', action='store_true', help='List files on device')
+ parser.add_argument('-p', '--port', default='/dev/ttyUSB0', help='Device name, default /dev/ttyUSB0')
+ parser.add_argument('-r', '--restart', action='store_true', help='Restart MCU after upload')
+ parser.add_argument('-t', '--dest', default=None, help='Destination file on MCU, default to source file name')
+ parser.add_argument('-v', '--verbose', action='store_true', help="Show progress messages.")
+ parser.add_argument('-w', '--wipe', action='store_true', help='Delete all lua/lc files on device.')
+ args = parser.parse_args()
+
+ transport = decidetransport(args)
+
+ if args.bar and not tqdm_installed:
+ sys.stdout.write("You must install the tqdm library to use the bar feature\n")
+ sys.stdout.write("To install, at the prompt type: \"pip install tqdm\"\n")
+ sys.exit(0)
+
+
+ if args.list:
+ # zzz191020 Amélioré la sortie du listing des fichiers
+ transport.writeln("print('\\n-----');local l = file.list();for k,v in pairs(l) do print(k..', size:'..v)end;print('-----\\n')\r", 0)
+ while True:
+ char = transport.read(1)
+ if char == '' or char == chr(62): # '' or '>'
+ break
+ sys.stdout.write(char)
+ sys.exit(0)
+
+ if args.id:
+ transport.writeln("=node.chipid()\r", 0)
+ id=""
+ while True:
+ char = transport.read(1)
+ if char == '' or char == chr(62):
+ break
+ if char.isdigit():
+ id += char
+ print("\n"+id)
+ sys.exit(0)
+
+ # zzz191020 Ajouté la fonction restart seule
+ if args.zrestart:
+ transport.writeln("node.restart()\r")
+ sys.exit(0)
+
+ if args.wipe:
+ transport.writeln("local l = file.list();for k,v in pairs(l) do print(k)end\r", 0)
+ file_list = []
+ fn = ""
+ while True:
+ char = transport.read(1)
+ if char == '' or char == chr(62):
+ break
+ if char not in ['\r', '\n']:
+ fn += char
+ else:
+ if fn:
+ file_list.append(fn.strip())
+ fn = ''
+ for fn in file_list[1:]: # first line is the list command sent to device
+ if args.verbose:
+ sys.stderr.write("Delete file {} from device.\r\n".format(fn))
+ transport.writeln("file.remove(\"" + fn + "\")\r")
+ sys.exit(0)
+
+ if args.delete:
+ transport.writeln("file.remove(\"" + args.delete + "\")\r")
+ sys.exit(0)
+
+ if args.dest is None:
+ args.dest = basename(args.src)
+ # zzz191020 Affiche le fichier à envoyer
+ print("File: " + args.src)
+
+ # open source file for reading
+ try:
+ try:
+ f = open(args.src, "rt")
+ except:
+ import os
+ base_dir = os.path.dirname(os.path.realpath(__file__))
+ f = open(os.path.join(base_dir, args.src), "rt")
+ os.chdir(base_dir)
+ except:
+ sys.stderr.write("Could not open input file \"%s\"\n" % args.src)
+ sys.exit(1)
+
+ # Verify the selected file will not exceed the size of the serial buffer.
+ # The size of the buffer is 256. This script does not accept files with
+ # lines longer than 230 characters to have some room for command overhead.
+ num_lines = 0
+ for ln in f:
+ if len(ln) > 230:
+ sys.stderr.write("File \"%s\" contains a line with more than 240 "
+ "characters. This exceeds the size of the serial buffer.\n"
+ % args.src)
+ f.close()
+ sys.exit(1)
+ num_lines += 1
+
+ # Go back to the beginning of the file after verifying it has the correct
+ # line length
+ f.seek(0)
+
+ # set serial timeout
+ if args.verbose:
+ sys.stderr.write("Upload starting\r\n")
+
+ # remove existing file on device
+ if args.append==False:
+ if args.verbose:
+ sys.stderr.write("Stage 1. Deleting old file from flash memory")
+ transport.writeln("file.open(\"" + args.dest + "\", \"w\")\r")
+ transport.writeln("file.close()\r")
+ transport.writeln("file.remove(\"" + args.dest + "\")\r")
+ else:
+ if args.verbose:
+ sys.stderr.write("[SKIPPED] Stage 1. Deleting old file from flash memory [SKIPPED]")
+
+
+ # read source file line by line and write to device
+ if args.verbose:
+ sys.stderr.write("\r\nStage 2. Creating file in flash memory and write first line")
+ if args.append:
+ transport.writeln("file.open(\"" + args.dest + "\", \"a+\")\r")
+ else:
+ transport.writeln("file.open(\"" + args.dest + "\", \"w+\")\r")
+ line = f.readline()
+ if args.verbose:
+ sys.stderr.write("\r\nStage 3. Start writing data to flash memory...")
+ if args.bar:
+ for i in tqdm(range(0, num_lines)):
+ #zzz191124 transport.writer(line.strip())
+ transport.writer(line)
+ line = f.readline()
+ else:
+ while line != '':
+ #zzz191124 transport.writer(line.strip())
+ transport.writer(line)
+ line = f.readline()
+
+ # close both files
+ f.close()
+ if args.verbose:
+ sys.stderr.write("\r\nStage 4. Flush data and closing file")
+ transport.writeln("file.flush()\r")
+ transport.writeln("file.close()\r")
+
+ # compile?
+ if args.compile:
+ if args.verbose:
+ sys.stderr.write("\r\nStage 5. Compiling")
+ transport.writeln("node.compile(\"" + args.dest + "\")\r")
+ transport.writeln("file.remove(\"" + args.dest + "\")\r")
+
+ # restart or dofile
+ if args.restart:
+ transport.writeln("node.restart()\r")
+
+ if args.dofile: # never exec if restart=1
+ transport.writeln("dofile(\"" + args.dest + "\")\r", 0)
+
+ if args.echo:
+ if args.verbose:
+ sys.stderr.write("\r\nEchoing MCU output, press Ctrl-C to exit")
+ while True:
+ sys.stdout.write(transport.read(1))
+
+ # close serial port
+ transport.close()
+
+ # flush screen
+ sys.stdout.flush()
+ sys.stderr.flush()
+ if not args.bar:
+ sys.stderr.write("\r\n--->>> All done <<<---\r\n")
diff --git a/Mesures/humidity/bolo/set_time.lua b/Mesures/humidity/bolo/set_time.lua
new file mode 100644
index 0000000..8b12174
--- /dev/null
+++ b/Mesures/humidity/bolo/set_time.lua
@@ -0,0 +1,36 @@
+-- Scripts pour régler l'horloge quand on est connecté en WIFI
+-- Permet aussi de 'compresser' le unix time afin de prendre moins de place dans les strings
+
+print("\n set_time.lua zf191030.2026 \n")
+
+--source: https://www.freeformatter.com/epoch-timestamp-to-date-converter.html
+
+ztime2019 = 1546300800 -- Unix time pour le 1.1.2019
+
+function set_time()
+ sntp.sync(nil, nil, nil, 1)
+end
+
+function ztime_compress(ztime_long)
+ return ztime_long - ztime2019
+end
+
+function ztime_uncompress(ztime_short)
+ return ztime_short + ztime2019
+end
+
+function ztime_format(ztime)
+ local tm = rtctime.epoch2cal(ztime + 3600)
+ return(string.format("%04d/%02d/%02d %02d:%02d:%02d", tm["year"], tm["mon"], tm["day"], tm["hour"], tm["min"], tm["sec"]))
+end
+
+set_time()
+
+tmr.create():alarm(2*1000, tmr.ALARM_SINGLE, function()
+ print(ztime_format(rtctime.get()))
+end)
+
+
+
+
+
diff --git a/Mesures/humidity/bolo/telnet_srv2.lua b/Mesures/humidity/bolo/telnet_srv2.lua
new file mode 100644
index 0000000..19920f2
--- /dev/null
+++ b/Mesures/humidity/bolo/telnet_srv2.lua
@@ -0,0 +1,93 @@
+-- Serveur telnet pour connexion en remote WIFI, NOUVELLE VERSION !
+-- source: https://github.com/nodemcu/nodemcu-firmware/blob/master/lua_examples/telnet/telnet.lua
+
+print("\n telnet_srv2.lua zf191020.1932 \n")
+
+local node, table, tmr, wifi, uwrite, tostring =
+ node, table, tmr, wifi, uart.write, tostring
+
+local function telnet_listener(socket)
+ local insert, remove, concat, heap, gc =
+ table.insert, table.remove, table.concat, node.heap, collectgarbage
+ local fifo1, fifo1l, fifo2, fifo2l = {}, 0, {}, 0
+ local s -- s is a copy of the TCP socket if and only if sending is in progress
+ local wdclr, cnt = tmr.wdclr, 0
+ local function debug(fmt, ...)
+ if (...) then fmt = fmt:format(...) end
+ uwrite(0, "\r\nDBG: ",fmt,"\r\n" )
+ cnt = cnt + 1
+ if cnt % 10 then wdclr() end
+ end
+
+ local function flushGarbage()
+ if heap() < 13440 then gc() end
+ end
+
+ local function sendLine()
+ if not s then return end
+
+ if fifo2l + fifo1l == 0 then -- both FIFOs empty, so clear down s
+ s = nil
+ return
+ end
+ flushGarbage()
+ if #fifo2 < 4 then -- Flush FIFO1 into FIFO2
+ insert(fifo2,concat(fifo1))
+ fifo2l, fifo1, fifo1l = fifo2l + fifo1l, {}, 0
+ end
+ local rec = remove(fifo2,1) .. (remove(fifo2,1) or '') ..
+ (remove(fifo2,1) or '') .. (remove(fifo2,1) or '')
+ fifo2l = fifo2l - #rec
+ flushGarbage()
+ s:send(rec)
+ end
+
+ local F1_SIZE = 256
+
+ local function queueLine(str)
+ while #str > 0 do -- this is because str might be longer than the packet size!
+ local k, l = F1_SIZE - fifo1l, #str
+ local chunk
+ if #fifo1 >= 32 or (k < l and k < 16) then
+ insert(fifo2, concat(fifo1))
+ fifo2l, fifo1, fifo1l, k = fifo2l + fifo1l, {}, 0, F1_SIZE
+ end
+ if l > k+16 then -- also tolerate a size overrun of 16 bytes to avoid a split
+ chunk, str = str:sub(1,k), str:sub(k+1)
+ else
+ chunk, str = str, ''
+ end
+ insert(fifo1, chunk)
+ fifo1l = fifo1l + #chunk
+ end
+ if not s and socket then
+ s = socket
+ sendLine()
+ else
+ flushGarbage()
+ end
+ end
+
+ local function receiveLine(s, line)
+ node.input(line)
+ end
+
+ local function disconnect(s)
+ fifo1, fifo1l, fifo2, fifo2l, s = {}, 0, {}, 0, nil
+ node.output(nil)
+ end
+
+ --zzz
+ local function zconnection(s)
+ print("Welcome to NodeMCU world.")
+ end
+
+ socket:on("connection", zconnection)
+ socket:on("receive", receiveLine)
+ socket:on("disconnection", disconnect)
+ socket:on("sent", sendLine)
+ node.output(queueLine, 0)
+end
+
+net.createServer(net.TCP, 180):listen(23, telnet_listener)
+print("Telnet server running...\nUsage: telnet -rN ip\n")
diff --git a/Mesures/humidity/bolo/thost b/Mesures/humidity/bolo/thost
new file mode 100644
index 0000000..e417b33
--- /dev/null
+++ b/Mesures/humidity/bolo/thost
@@ -0,0 +1,38 @@
+
+ zz_host_dir2.lua zf191124.1634
+
+README.md : 2841, 347247457
+_secrets_energy.lua_ : 574, 14047690
+_zremote_cmd.txt : 4416, 811416628
+b.lua : 4289, 696634446
+boot.lua : 451, 8092291
+boot2.lua : 1581, 89772835
+c.lua : 1023, 45354296
+cat.lua : 522, 9721978
+dir2.lua : 2504, 246241567
+flash_led_xfois.lua : 1131, 43977377
+head.lua : 567, 11507510
+initz.lua : 2159, 175035891
+luatool.py : 14772, 8192529118
+secrets_project.lua : 539, 12833508
+secrets_wifi.lua : 635, 15410620
+set_time.lua : 879, 31173858
+telnet_srv2.lua : 2760, 289194718
+thost : 40, 43773
+tnode : 881, 22330813
+upload_s.sh : 1913, 159132384
+upload_t.sh : 1618, 109879609
+web_srv2.lua : 2960, 297644504
+wifi_info.lua : 1604, 98582260
+wifi_init.lua : 501, 10271357
+z_index.html : 1015, 44275501
+z_page1.html : 443, 7731060
+z_page2.html : 1867, 123937742
+z_page3.html : 1415, 67091731
+z_page4.html : 1660, 90364904
+zz_host_dir.lua : 2001, 159551326
+zz_host_dir2.lua : 2020, 162623430
+
+
+Rappel, sur Atom, sélectionner les deux fichiers à gauche puis CTRL+CMD+C
+
diff --git a/Mesures/humidity/bolo/tnode b/Mesures/humidity/bolo/tnode
new file mode 100644
index 0000000..33dbfcb
--- /dev/null
+++ b/Mesures/humidity/bolo/tnode
@@ -0,0 +1,22 @@
+b.lua : 4289, 696634446
+boot.lua : 451, 8092291
+boot2.lua : 1581, 89772835
+c.lua : 1023, 45354296
+cat.lua : 522, 9721978
+dir2.lua : 2504, 246241567
+flash_led_xfois.lua : 1131, 43977377
+head.lua : 567, 11507510
+init.lua : 2159, 175035891
+secrets_project.lua : 539, 12833508
+secrets_wifi.lua : 635, 15410620
+set_time.lua : 879, 31173858
+telnet_srv2.lua : 2760, 289194718
+web_srv2.lua : 2960, 297644504
+wifi_info.lua : 1604, 98582260
+wifi_init.lua : 501, 10271357
+z_index.html : 1015, 44275501
+z_page1.html : 443, 7731060
+z_page2.html : 1867, 123937742
+z_page3.html : 1415, 67091731
+z_page4.html : 1660, 90364904
+~.
diff --git a/Mesures/humidity/bolo/upload_s.sh b/Mesures/humidity/bolo/upload_s.sh
new file mode 100755
index 0000000..456b088
--- /dev/null
+++ b/Mesures/humidity/bolo/upload_s.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+# Petit script pour télécharger facilement tout le binz via le port série
+#zf191124.1019
+
+# S'il y a des erreurs lors d'un téléchargement, il faut simplement augmenter un peu le délai !
+# Il est préférable de télécharger en premier les *gros* fichiers .lua !
+
+# ATTENTION: cela efface tout le NodeMCU !
+
+luatool_tty="/dev/cu.wchusbserial1410"
+
+echo ""
+read -p "ATTENTION, cela va effacer tout le NodeMCU !"
+read -p "Etes-vous vraiment certain ?"
+
+chmod +x luatool.py
+
+./luatool.py --port $luatool_tty -w
+./luatool.py --port $luatool_tty -l
+read -p "Est-ce bien vide ?"
+
+./luatool.py --port $luatool_tty --bar -f z_page4.html
+./luatool.py --port $luatool_tty --bar -f z_page3.html
+./luatool.py --port $luatool_tty --bar -f z_page2.html
+./luatool.py --port $luatool_tty --bar -f z_page1.html
+./luatool.py --port $luatool_tty --bar -f z_index.html
+./luatool.py --port $luatool_tty --bar -f wifi_init.lua
+./luatool.py --port $luatool_tty --bar -f wifi_info.lua
+./luatool.py --port $luatool_tty --bar -f web_srv2.lua
+./luatool.py --port $luatool_tty --bar -f telnet_srv2.lua
+./luatool.py --port $luatool_tty --bar -f set_time.lua
+./luatool.py --port $luatool_tty --bar -f secrets_wifi.lua
+./luatool.py --port $luatool_tty --bar -f secrets_project.lua
+./luatool.py --port $luatool_tty --bar -f head.lua
+./luatool.py --port $luatool_tty --bar -f flash_led_xfois.lua
+./luatool.py --port $luatool_tty --bar -f dir2.lua
+./luatool.py --port $luatool_tty --bar -f cat.lua
+./luatool.py --port $luatool_tty --bar -f c.lua
+./luatool.py --port $luatool_tty --bar -f boot2.lua
+./luatool.py --port $luatool_tty --bar -f boot.lua
+./luatool.py --port $luatool_tty --bar -f b.lua
+
+./luatool.py --port $luatool_tty -l
+read -p "Pas eu d'erreur, on part à fond avec le init.lua ?"
+
+./luatool.py --port $luatool_tty --bar -f initz.lua -t init.lua
+./luatool.py --port $luatool_tty -l
+echo -e "\nC'est tout bon ;-)"
diff --git a/Mesures/humidity/bolo/upload_t.sh b/Mesures/humidity/bolo/upload_t.sh
new file mode 100755
index 0000000..f379ded
--- /dev/null
+++ b/Mesures/humidity/bolo/upload_t.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+# Petit script pour télécharger facilement tout le binz
+#zf191028.1459
+
+# S'il y a des erreurs lors d'un téléchargement, il faut simplement augmenter un peu le délai !
+# Il est préférable de télécharger en premier les *gros* fichiers .lua !
+
+# ATTENTION: cela efface tout le NodeMCU !
+
+luatool_tty="/dev/cu.wchusbserial1410"
+
+echo ""
+read -p "ATTENTION, cela va effacer tout le NodeMCU !"
+read -p "Etes-vous vraiment certain ?"
+
+chmod +x luatool.py
+
+./luatool.py --port $luatool_tty -w
+./luatool.py --port $luatool_tty -l
+read -p "Est-ce bien vide ?"
+
+./luatool.py --port $luatool_tty --bar --delay 0.06 -f telnet_srv2.lua
+./luatool.py --port $luatool_tty --bar --delay 0.03 -f head.lua
+./luatool.py --port $luatool_tty --bar --delay 0.03 -f flash_led_xfois.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f wifi_info.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f wifi_cli_start.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f wifi_cli_conf.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f wifi_ap_stop.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f secrets_energy.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f dir.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f cat.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f boot2.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f boot.lua
+
+./luatool.py --port $luatool_tty -l
+read -p "Pas eu d'erreur, on part à fond avec le init.lua ?"
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f initz.lua -t init.lua
+echo -e "\nC'est tout bon ;-)"
diff --git a/Mesures/humidity/bolo/web_srv2.lua b/Mesures/humidity/bolo/web_srv2.lua
new file mode 100644
index 0000000..274ba82
--- /dev/null
+++ b/Mesures/humidity/bolo/web_srv2.lua
@@ -0,0 +1,87 @@
+-- petit script de serveur WEB avec Active Server Page ZYX
+
+print("\n web_srv2.lua zf191124.2225 \n")
+
+ztemp=12
+
+-- dû refaire la commande file.readline car elle bug quand ligne longue
+function zread_line()
+ local zline = ""
+ while true do
+ local t = file_web:read(1) if t == nil then return end
+ zline = zline..t
+ if t == "\n" then return zline end
+ end
+end
+
+-- envoie sur le port ouvert mais depuis l'environnement global !
+function zout(zstring)
+ zzclient:send(zstring) -- envoie le résultat du code lua inline
+end
+
+-- envoie un fichier HTML sur le port. ATTENTION: longueur de la ligne maximale de 1'024 bytes !
+function send_file(zclient, zfilename)
+ print("start send html...")
+ zclient:send("HTTP/1.1 200 OK\n")
+ zclient:send("Content-Type: text/html\n\n")
+ zzclient = zclient -- export le port sur l'environnement global !
+ if zfilename == "" then zfilename = "z_index.html" end
+ file_web = file.open(zfilename, "r")
+ if file_web then
+ repeat
+ local line = zread_line()
+ if line then
+ if string.find(line, "<%%") then
+-- print("start lua...")
+ flag_lua_code = true -- bascule sur le code lua inline
+ lua_code = ""
+ elseif string.find(line, "%%>") then
+-- print("stop lua...")
+ flag_lua_code = false -- revient sur le code HTML
+-- print("Et voici le code lua inline:\n"..lua_code)
+ loadstring(lua_code)() --on exécute ici le code lua inline !
+ elseif flag_lua_code then
+-- print(line)
+ lua_code = lua_code..line -- récupère le code lua inline
+ else
+-- print(line)
+ zclient:send(line) -- envoie le code HTML
+ end
+ end
+ until not line
+ file_web:close() file_web = nil
+ else
+ zclient:send("
| MAC | Name | RSSI | Time | +
|---|---|---|---|
| " .. k .. " | \n") + zout("\t" .. tostring(zmac_adrs[k]["zname"]) .. " | \n") + zout("\t" .. tostring(zmac_adrs[k]["zrssi"]) .. " | \n") + zout("\t" .. tostring(zmac_adrs[k]["ztime"]) .. " | \n") + zout("