diff --git a/Firmware/nodemcu-master-19-modules-2019-12-31-16-40-12-float.bin b/Firmware/nodemcu-master-19-modules-2019-12-31-16-40-12-float.bin
new file mode 100644
index 0000000..e0d14f8
Binary files /dev/null and b/Firmware/nodemcu-master-19-modules-2019-12-31-16-40-12-float.bin differ
diff --git a/Firmware/nodemcu-master-19-modules-2019-12-31-16-40-12-float.pdf b/Firmware/nodemcu-master-19-modules-2019-12-31-16-40-12-float.pdf
new file mode 100644
index 0000000..c06be28
Binary files /dev/null and b/Firmware/nodemcu-master-19-modules-2019-12-31-16-40-12-float.pdf differ
diff --git a/SonOff/get_ip.lua b/SonOff/SonOff_1/get_ip.lua
similarity index 100%
rename from SonOff/get_ip.lua
rename to SonOff/SonOff_1/get_ip.lua
diff --git a/SonOff/init.lua b/SonOff/SonOff_1/init.lua
similarity index 100%
rename from SonOff/init.lua
rename to SonOff/SonOff_1/init.lua
diff --git a/SonOff/script1 - copie.lua b/SonOff/SonOff_1/script1 - copie.lua
similarity index 100%
rename from SonOff/script1 - copie.lua
rename to SonOff/SonOff_1/script1 - copie.lua
diff --git a/SonOff/start.lua b/SonOff/SonOff_1/start.lua
similarity index 100%
rename from SonOff/start.lua
rename to SonOff/SonOff_1/start.lua
diff --git a/SonOff/stop.lua b/SonOff/SonOff_1/stop.lua
similarity index 100%
rename from SonOff/stop.lua
rename to SonOff/SonOff_1/stop.lua
diff --git a/SonOff/telnet_srv.lua b/SonOff/SonOff_1/telnet_srv.lua
similarity index 100%
rename from SonOff/telnet_srv.lua
rename to SonOff/SonOff_1/telnet_srv.lua
diff --git a/SonOff/SonOff_2/0_cron.lua b/SonOff/SonOff_2/0_cron.lua
new file mode 100644
index 0000000..9eea706
--- /dev/null
+++ b/SonOff/SonOff_2/0_cron.lua
@@ -0,0 +1,8 @@
+-- Petit script pour faire office de crontab pour les
+--mesures
+print("\n 0_cron.lua zf191225.1803 \n")
+
+cron1=tmr.create()
+cron1:alarm(300*1000, tmr.ALARM_AUTO, function()
+ send_data()
+end)
diff --git a/SonOff/SonOff_2/0_send_data.lua b/SonOff/SonOff_2/0_send_data.lua
new file mode 100644
index 0000000..f2b31d2
--- /dev/null
+++ b/SonOff/SonOff_2/0_send_data.lua
@@ -0,0 +1,34 @@
+-- Petit script pour envoyer les valeurs sur un serveur WEB (InfluxDB)
+-- via un http GET
+print("\n 0_send_data.lua zf191228.2310 \n")
+
+function zpost(zarg)
+ 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)
+end
+
+function send_data()
+ if verbose then print("send_data: ") end
+ ztemp = readTemp() zhumd = readHumi()
+ if verbose then print("Temperature: "..ztemp.." °C") end
+ if verbose then print("Humidity: "..zhumd.." %") end
+
+ --zpost("bolo_ruru,capteur=th"..node_id.." humidity="..zhumd)
+ --zpost("bolo_ruru,capteur=th"..node_id.." temperature="..ztemp)
+
+-- print("titi")
+end
+
+--[[
+verbose=true
+send_data()
+]]
diff --git a/SonOff/SonOff_2/README.md b/SonOff/SonOff_2/README.md
new file mode 100644
index 0000000..33241f2
--- /dev/null
+++ b/SonOff/SonOff_2/README.md
@@ -0,0 +1,148 @@
+# Reflashage d'un SonOff Basic avec un firmware Lua et les outils pour pouvoir le programmer à distance
+
+
+Petit projet de reflashage d'un SonOff Basic avec un firmware Lua et les outils pour pouvoir le programmer à distance sans devoir le brancher sur le port série.
+
+
+
+
+
+ # ATTENTION, ce projet débute et la *base* de ce Readme est *emprunté* à un autre projet, il reste donc à le modifier !
+zf200101.1112
+
+
+
+
+Constellation de sondes de mesures
+
+
+
+Montage du capteur HTU21D directement sur le NodeMCU, chose à ne PAS faire, car la température du NodeMCU fausse complètement les mesures d'humidité !
+
+
+
+Exemple de sortie sur Grafana
+
+
+
+On peut voir ici, avec ce projet assez complet, toutes les possibilités offertes de la programmation d'un 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 sauvées dans le système de fichiers de la FLASH du NodeMCU
+* 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
+
+On utilise un tout petit capteur, le **HTU21D**, d'humidité et de température I2C.
+
+
+
+Il est vraiment très bon marché (1.5$), simple à utiliser et super précis.
+
+https://www.aliexpress.com/item/32480177429.html
+
+
+
+Incroyable la résolution de la mesure ! On peut observer ici l'arrivée le matin au salon, l'ouverture de la porte de la salle de bain après avoir pris la douche et l'ouverture de la fenêtre. Tout ceci dans la résolution de 1 à 3% de l'humidité relative
+
+Présentation:
+
+https://learn.sparkfun.com/tutorials/htu21d-humidity-sensor-hookup-guide/all
+
+Datasheet:
+
+https://cdn.sparkfun.com/assets/6/a/8/e/f/525778d4757b7f50398b4567.pdf
+
+
+## Installation
+
+Il faut *flasher* le NodeMCU avec ce firmware:
+
+https://github.com/zuzu59/NodeMCU_Lua/blob/master/Firmware/nodemcu-master-18-modules-2019-12-17-20-28-32-float.bin
+
+Avec ces modules:
+```
+file gpio http i2c net node rtctime sntp tmr uart wifi
+```
+
+## Utilisation
+
+### Visualisation des données dans Grafana
+
+Exemple de sortie dans Grafana
+
+https://snapshot.raintank.io/dashboard/snapshot/LUqdTJYLNuC6WatmJoN21yQSEQ0UJ0oy
+
+
+### 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'un seul 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
+```
+
+
+### Exportation des données en CSV depuis Grafana
+
+Quand on a trouvé la mesure qui nous convient sur Grafana, on peut l'exporter en CSV pour en faire un rapport dans un tableur par exemple.
+
+
+
+
+
+
+### Affichage des températures/humidité en local sur le NodeMCU
+
+On peut lire la température et l'humidité directement sur le NodeMCU au moyen de cette url (il faut modifier l'adresse IP du NodeMCU en question):
+
+```
+http://192.168.0.xxx/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:
+
+```
+http://192.168.0.xxx
+```
+
+
+### 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 ce petit WEB IDE:
+
+```
+http://192.168.0.xxx: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:
+
+```
+telnet -rN 192.168.0.xxx
+```
+
+
+
+zf191221.0825
+
+
+pense bête:
+
+```
+file.open("hello.lua","w+")
+file.writeline([[print("hello nodemcu")]])
+file.writeline([[print(node.heap())]])
+file.close()
+```
diff --git a/SonOff/SonOff_2/_secrets_project.lua_ b/SonOff/SonOff_2/_secrets_project.lua_
new file mode 100644
index 0000000..4e021de
--- /dev/null
+++ b/SonOff/SonOff_2/_secrets_project.lua_
@@ -0,0 +1,29 @@
+-- Petit script pour configurer les secrets dans ce projet
+-- et que l'on n'aimerait pas être exportés sur Internet (github)
+-- Il faut donc modifier le .gitignore avec secrets*.lua
+-- il faut le renommer en 'secrets_project.lua' et sera exécuté
+-- par 'boot2.lua' au moment du boot
+
+function secrets_project()
+ print("\n secrets_project.lua zf191222.1709 \n")
+
+ influxdb_url="http://www.xxx.ml:8086/write?db=xxx&u=admin&p=xxx"
+ print("influxdb_url: "..influxdb_url)
+
+ node_id = "generic"
+
+ if node.chipid() == 3049014 then node_id = "0" end
+ if node.chipid() == 3049553 then node_id = "1" end
+ if node.chipid() == 14975023 then node_id = "2" end
+ if node.chipid() == 14972372 then node_id = "3" end
+ if node.chipid() == 12557128 then node_id = "4" end
+ if node.chipid() == 3048165 then node_id = "5" end
+ if node.chipid() == 14973009 then node_id = "6" end
+
+
+
+ print("node_id: "..node_id)
+
+end
+secrets_project()
+secrets_project=nil
diff --git a/SonOff/SonOff_2/_secrets_wifi.lua_ b/SonOff/SonOff_2/_secrets_wifi.lua_
new file mode 100644
index 0000000..387f706
--- /dev/null
+++ b/SonOff/SonOff_2/_secrets_wifi.lua_
@@ -0,0 +1,23 @@
+-- Petit script pour configurer les secrets utilisés pour le wifi
+-- et que l'on n'aimerait pas être exportés sur Internet (github)
+-- Il faut donc modifier le .gitignore avec secrets*.lua
+-- il faut le renommer en 'secrets_wifi.lua' et sera exécuté
+-- par 'wifi_init.lua' une fois pour la configuration du WIFI
+
+function secrets_wifi()
+ print("\n secrets_wifi.lua zf191108.1744 \n")
+
+ -- cli_ssid="3g-s7"
+ -- cli_ssid="3G-zf2"
+ -- cli_ssid="apzuzu6_EXT"
+ cli_ssid="apzuzu6"
+ cli_pwd="xxx"
+
+ -- cli_ssid="voie4."
+ -- cli_pwd="xxx"
+
+ ap_ssid="NodeMCU"
+ ap_pwd="xxx"
+
+end
+secrets_wifi()
diff --git a/SonOff/SonOff_2/_zremote_cmd.txt b/SonOff/SonOff_2/_zremote_cmd.txt
new file mode 100644
index 0000000..e9b0099
--- /dev/null
+++ b/SonOff/SonOff_2/_zremote_cmd.txt
@@ -0,0 +1,274 @@
+# Quelques commandes remote (luatool) à envoyer avec le plugin Atom-IDE-terminal de l'éditeur Atom
+# zf191228.2312
+
+Todo à faire pour ce projet !
+
+-
+- ajouter fonction restart dans zindex.html (argument restart)
+- ajouter argument ok dans wifi_init.html
+- ajouter get_data() dans 0_send_data.lua
+- cron 10 seconde get_data avec moyenne et cron 300 sendata et zero moyenne
+- if verbose print partout dans 0_send_data.lua
+- garder variable node_id pour identification après poweron général, reattribution adrs ip sur modem 4G
+- indiquer nodeMCU name du dhcp modem 4G dans table liste adresses ip
+
+
+
+
+
+
+
+
+
+# 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.113"
+
+#th0 dev mobile
+192.168.0.118
+#th1
+192.168.0.143 192.168.8.102
+#th2
+192.168.0.132 192.168.8.105
+#th3
+192.168.0.145 192.168.8.104
+#th4
+192.168.0.117 192.168.8.103
+#th5 chambre à coucher
+192.168.0.178
+#th6 buanderie
+192.168.0.162
+#th7 cave
+192.168.0.199
+#th8 salon
+192.168.0.124
+
+
+
+export zIP="192.168.0.143"
+export zport="23"
+
+cd '/Users/zuzu/Google Drive/FamilleZ Share/FamilleZ/Papa/LUA/NodeMCU ESP8266/NodeMCU_Lua/Mesures/humidity/bolo
+'
+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
+export zIP="192.168.0.162"
+telnet -rN $zIP $zport
+verbose=false
+dofile("dir.lua")
+dir()
+#filec('dir2.lua')
+#dirc()
+~.
+./luatool.py --ip $zIP:$zport -f dir.lua
+
+
+
+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 wifi_init.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 Bolo à Ruchonnet:
+ssh -t -L 2323:localhost:2323 ubuntu@www.zuzutest.ml ssh -N -L 2323:192.168.8.102:23 ubuntu@localhost -p 20223
+
+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
+ssh -N -L 2323:192.168.0.118:23 admin@z.zufferey.com -p 1822
+
+ATTENTION: dans un deuxième terminal !
+export zIP="localhost"
+export zport="2323"
+telnet -rN $zIP $zport
+~.
+=node.heap()
+
+verbose=false
+verbose=true
+
+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
+
+
+
+Gestion de la passerelle SSH reverse
+Puis depuis une autre console on peut faire directement pour aller sur l'OpiZ (ici le 20223):
+ssh -t ubuntu@www.zuzutest.ml ssh ubuntu@localhost -p 20223
+
+ou
+
+1ère console
+On établit le tunnel local avec l'OpiZ
+ssh -N -L 20223:localhost:20223 ubuntu@www.zuzutest.ml
+
+
+2ème console, on utilise le tunnel OpiZ en local sur sa machine
+pour aller sur l'OpiZ
+ssh ubuntu@localhost -p 20223
+
+pour copier sa clef SSH depuis un MAC
+./ssh-copy-id -i ~/.ssh/id_rsa.pub 'ubuntu@localhost -p 20223'
+après on devrait pouvoir se connecter sans devoir entrer son password à chaque fois
+ssh ubuntu@localhost -p 20223
+
+ou, on établit un tunnel pour telnet sur un NodeMCU
+ssh -L 2323:192.168.0.137:23 ubuntu@localhost -p 20223
+puis
+telnet -rN localhost 2323
+
+ou, on établit un tunnel pour le rpimonotor sur l'OpiZ
+ssh -N -L 8888:192.168.0.113:8888 ubuntu@localhost -p 20223
+puis
+http://localhost:8888
+
+ou, on établit un tunnel proxy Socket 5 pour le modem 4G HUAWEI sur l'OpiZ
+ssh -N -D 8080 ubuntu@localhost -p 20223
+puis depuis le browser FireFox avec le plugin FoxyProxy Socket 5 sur localhost port 8080
+http://192.168.8.1
+
+
+
+.
diff --git a/SonOff/SonOff_2/a.lua b/SonOff/SonOff_2/a.lua
new file mode 100644
index 0000000..909c6ca
--- /dev/null
+++ b/SonOff/SonOff_2/a.lua
@@ -0,0 +1,9 @@
+print('\\n-----')
+local l = file.list()
+table.sort(l)
+for k,v in pairs(l) do print(k..', size:'..v)end
+print('-----\\n')
+
+
+zdir={};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);print('\n-----');for i=1, #zdir do print(zdir[i]) end;print('-----\n');zdir=nil;pfile=nil;k=nil;v=nil;i=nil
+
diff --git a/SonOff/SonOff_2/boot.lua b/SonOff/SonOff_2/boot.lua
new file mode 100644
index 0000000..dba8694
--- /dev/null
+++ b/SonOff/SonOff_2/boot.lua
@@ -0,0 +1,11 @@
+-- Scripts à charger après le boot pour démarrer le core system
+
+print("\n boot.lua zf191221.1509 \n")
+
+function boot()
+ gpio.trig(zswitch, "none") hvbouton=nil zswitch=nil reset_reason=nil
+
+ f= "telnet_srv2.lua" if file.exists(f) then dofile(f) end
+ f= "wifi_init.lua" if file.exists(f) then dofile(f) end
+end
+boot()
diff --git a/SonOff/SonOff_2/boot2.lua b/SonOff/SonOff_2/boot2.lua
new file mode 100644
index 0000000..f07225c
--- /dev/null
+++ b/SonOff/SonOff_2/boot2.lua
@@ -0,0 +1,71 @@
+-- Scripts à charger après le boot pour démarrer son projet
+
+print("\n boot2.lua zf191228.2303 \n")
+
+function boot2()
+ second_chance=nil initz=nil boot=nil zLED=nil
+ boot2_tmr=nil secrets_wifi=nil wifi_init=nil
+ cli_ssid=nil cli_pwd=nil
+ boot2_tmr1=nil wifi_init1=nil wifi_info=nil boot2_go=nil
+
+ 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()
+
+ wifi.setmode(wifi.STATIONAP,true)
+ wifi.ap.config({ ssid = ap_ssid.."_"..node_id, pwd = ap_pwd, save=true })
+ ap_ssid=nil ap_pwd=nil
+ f= "web_srv2.lua" if file.exists(f) then dofile(f) end
+ boot2_tmr3=tmr.create()
+ boot2_tmr3:alarm(60*1000, tmr.ALARM_SINGLE, function()
+ print("BOOOOUM, y'a plus de AP WIFI !")
+ wifi.setmode(wifi.STATION,true) boot2_tmr3=nil
+ print(node.heap()) collectgarbage() print(node.heap())
+ end)
+
+ --f= "0_htu21d.lua" if file.exists(f) then dofile(f) end
+ --f= "0_send_data.lua" if file.exists(f) then dofile(f) end
+ --f= "0_cron.lua" if file.exists(f) then dofile(f) end
+ --f= "web_ide2.lua" if file.exists(f) then dofile(f) end
+ f=nil
+
+ verbose = true
+
+ boot2_tmr2=tmr.create()
+ boot2_tmr2:alarm(3*1000, tmr.ALARM_SINGLE, function()
+ print("BOOOOUM, y'a plus de boot2 !")
+ boot2=nil boot2_tmr2=nil
+ print(node.heap()) collectgarbage() print(node.heap())
+
+ --tmr.create():alarm(7*1000, tmr.ALARM_SINGLE, function()
+ -- print("MUOOOOB !")
+ -- collectgarbage()
+ -- print(node.heap())
+ --f= "web_ide2.lua" if file.exists(f) then dofile(f) end
+ -- f=nil
+ --end)
+ end)
+end
+
+boot2_tmr1=tmr.create()
+boot2_tmr1:alarm(1*1000, tmr.ALARM_AUTO , function()
+ if boot2_go then
+ boot2_tmr1:unregister() boot2()
+ end
+end)
+
+
+
+
+
+
+
+--[[
+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/SonOff/SonOff_2/cat.lua b/SonOff/SonOff_2/cat.lua
new file mode 100644
index 0000000..8a2e29c
--- /dev/null
+++ b/SonOff/SonOff_2/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/SonOff/SonOff_2/check_all.sh b/SonOff/SonOff_2/check_all.sh
new file mode 100755
index 0000000..5bfda14
--- /dev/null
+++ b/SonOff/SonOff_2/check_all.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+# Petit script pour contrôler en remote les versions d'une grappe de NodeMCU installés
+#zf191226.1241
+
+# crée les tunnels SSH
+source ./make_tunnels.sh go
+
+# On liste les fichiers de chaque nodemcu
+echo -e "th1"
+./luatool.py --ip localhost:$TH1_PORT --list
+
+echo -e "th2"
+./luatool.py --ip localhost:$TH2_PORT --list
+
+echo -e "th3"
+./luatool.py --ip localhost:$TH3_PORT --list
+
+echo -e "th4"
+./luatool.py --ip localhost:$TH4_PORT --list
diff --git a/SonOff/SonOff_2/dir.lua b/SonOff/SonOff_2/dir.lua
new file mode 100644
index 0000000..3bef94c
--- /dev/null
+++ b/SonOff/SonOff_2/dir.lua
@@ -0,0 +1,31 @@
+-- fonction dir() pour juste afficher les fichiers avec leur taille
+
+print("\n dir2.lua zf191223.1455 \n")
+
+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
+
+dir()
+print("\nusage:")
+print(" dir()")
+
+--[[
+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/SonOff/SonOff_2/dir2.lua b/SonOff/SonOff_2/dir2.lua
new file mode 100644
index 0000000..bd2fb1a
--- /dev/null
+++ b/SonOff/SonOff_2/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/SonOff/SonOff_2/disp_temp.html b/SonOff/SonOff_2/disp_temp.html
new file mode 100644
index 0000000..ffd491c
--- /dev/null
+++ b/SonOff/SonOff_2/disp_temp.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+ Affichage des températures
+
+
+
+ Affichage des températures 190727.1349
+
+ Les températures mesurées sont:
+
+
+ <%
+ if (ztemp1 ~= nil) then
+ zout("
Température intérieure chambre à coucher "..ztemp1.."°C")
+ end
+ if (ztemp2 ~= nil) then
+ zout("
Température extérieure sud (nodemcu 29) "..ztemp2.."°C")
+ end
+ if (ztemp3 ~= nil) then
+ zout("
Température extérieure nord (nodemcu 30) "..ztemp3.."°C")
+ end
+
+ zout("
RAM: "..node.heap().."
")
+ %>
+
+
+
diff --git a/SonOff/SonOff_2/goodies/a.lua b/SonOff/SonOff_2/goodies/a.lua
new file mode 100644
index 0000000..7c59e2f
--- /dev/null
+++ b/SonOff/SonOff_2/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/SonOff/SonOff_2/goodies/c.lua b/SonOff/SonOff_2/goodies/c.lua
new file mode 100644
index 0000000..eb2f832
--- /dev/null
+++ b/SonOff/SonOff_2/goodies/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/SonOff/SonOff_2/goodies/flash_led_xfois.lua b/SonOff/SonOff_2/goodies/flash_led_xfois.lua
new file mode 100644
index 0000000..aae55a9
--- /dev/null
+++ b/SonOff/SonOff_2/goodies/flash_led_xfois.lua
@@ -0,0 +1,35 @@
+-- programme pour faire clignoter x fois une LED avec un rapport on/off en mS
+
+function flash_led_xfois()
+ print("\n flash_led_xfois.lua zf191221.1454 \n")
+
+ zTm_On_LED = 50 zTm_Off_LED = 100 nbfois = 0
+ zLED=4 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/SonOff/SonOff_2/goodies/i2c_scanner.lua b/SonOff/SonOff_2/goodies/i2c_scanner.lua
new file mode 100644
index 0000000..6fcfbf4
--- /dev/null
+++ b/SonOff/SonOff_2/goodies/i2c_scanner.lua
@@ -0,0 +1,17 @@
+-- Scanner for I2C devices
+-- http://www.esp8266.com/viewtopic.php?f=19&t=771
+
+print("\n i2c_scanner.lua zf191216.2117 \n")
+
+id=0 sda=5 scl=6
+
+print("start...")
+i2c.setup(id,sda,scl,i2c.SLOW)
+
+for i=0,127 do
+ i2c.start(id)
+ resCode = i2c.address(id, i, i2c.TRANSMITTER)
+ i2c.stop(id)
+ if resCode == true then print("We have a device on address 0x" .. string.format("%02x", i) .. " (" .. i ..")") end
+end
+print("stop...")
diff --git a/SonOff/SonOff_2/head.lua b/SonOff/SonOff_2/head.lua
new file mode 100644
index 0000000..0478b8c
--- /dev/null
+++ b/SonOff/SonOff_2/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/SonOff/SonOff_2/initz.lua b/SonOff/SonOff_2/initz.lua
new file mode 100644
index 0000000..c566d5e
--- /dev/null
+++ b/SonOff/SonOff_2/initz.lua
@@ -0,0 +1,55 @@
+--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 zf191221.1509 \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...")
+ zLED=4 gpio.write(zLED, gpio.LOW) gpio.mode(zLED, gpio.OUTPUT)
+ initalarme=tmr.create()
+ initalarme:alarm(5*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()
+ 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")
+ 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/SonOff/SonOff_2/luatool.py b/SonOff/SonOff_2/luatool.py
new file mode 100755
index 0000000..29e183f
--- /dev/null
+++ b/SonOff/SonOff_2/luatool.py
@@ -0,0 +1,408 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+version = "0.6.8 zf191225.1428"
+
+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.025, 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)
+ # zzz191225 Amélioré encore la sortie du listing des fichiers (sort file)
+ transport.writeln("zdir={};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);print('\\n-----');for i=1, #zdir do print(zdir[i]) end;print('-----\\n');zdir=nil;pfile=nil;k=nil;v=nil;i=nil\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/SonOff/SonOff_2/make_tunnels.sh b/SonOff/SonOff_2/make_tunnels.sh
new file mode 100755
index 0000000..32521b8
--- /dev/null
+++ b/SonOff/SonOff_2/make_tunnels.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+# Petit script pour créer tous les tunnels SSH sur les NodeMCU en remote
+# zf191226.1239
+
+#test si l'argument est vide
+if [ -z "$1" ]
+ then
+ echo -e "
+Usage:
+
+source ./make_tunnels.sh go
+
+"
+ read -p "continue ?"
+fi
+
+
+
+
+
+
+# Définition des variables
+export TREMPLIN_SSH=www.zuzutest.ml
+export OPIZ_PORT=20223
+
+export TH1_IP=192.168.8.100
+export TH1_PORT=23001
+export TH2_IP=192.168.8.101
+export TH2_PORT=23002
+export TH3_IP=192.168.8.102
+export TH3_PORT=23003
+export TH4_IP=192.168.8.103
+export TH4_PORT=23004
+
+
+# On tue tous les tunnels ssh
+echo "kill"
+killall -9 ssh
+sleep 3
+
+# On crée le tunnel sur la passerelle ssh 20223
+echo "first"
+ssh -y -y -N -T -L $OPIZ_PORT:localhost:$OPIZ_PORT ubuntu@$TREMPLIN_SSH &
+sleep 3
+
+# On crée tous les tunnels sur les nodemcu
+echo "second"
+ssh -y -y -N -T -L $TH1_PORT:$TH1_IP:23 ubuntu@localhost -p $OPIZ_PORT &
+ssh -y -y -N -T -L $TH2_PORT:$TH2_IP:23 ubuntu@localhost -p $OPIZ_PORT &
+ssh -y -y -N -T -L $TH3_PORT:$TH3_IP:23 ubuntu@localhost -p $OPIZ_PORT &
+ssh -y -y -N -T -L $TH4_PORT:$TH4_IP:23 ubuntu@localhost -p $OPIZ_PORT &
+sleep 3
+
+echo "end"
+ps ax |grep ssh
diff --git a/SonOff/SonOff_2/schema/nodemcu_energy_adc_ ADS1015.fzz b/SonOff/SonOff_2/schema/nodemcu_energy_adc_ ADS1015.fzz
new file mode 100644
index 0000000..5bdeb21
Binary files /dev/null and b/SonOff/SonOff_2/schema/nodemcu_energy_adc_ ADS1015.fzz differ
diff --git a/SonOff/SonOff_2/set_time.lua b/SonOff/SonOff_2/set_time.lua
new file mode 100644
index 0000000..8b12174
--- /dev/null
+++ b/SonOff/SonOff_2/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/SonOff/SonOff_2/telnet_srv2.lua b/SonOff/SonOff_2/telnet_srv2.lua
new file mode 100644
index 0000000..19920f2
--- /dev/null
+++ b/SonOff/SonOff_2/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/SonOff/SonOff_2/up_load_all.sh b/SonOff/SonOff_2/up_load_all.sh
new file mode 100755
index 0000000..335df7e
--- /dev/null
+++ b/SonOff/SonOff_2/up_load_all.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+# Petit script pour télécharger du code en remote sur une grappe de NodeMCU
+#zf191225.1802
+
+# crée les tunnels SSH
+source ./make_tunnels.sh
+
+export ZFILE="0_cron.lua"
+export ZRESTART=""
+#export ZRESTART="--restart"
+
+# On télécharge le fichier sur chaque nodemcu
+echo -e "th1"
+#./luatool.py --ip localhost:$TH1_PORT $ZRESTART -f $ZFILE
+./luatool.py --ip localhost:$TH1_PORT --zrestart
+
+echo -e "th2"
+#./luatool.py --ip localhost:$TH2_PORT $ZRESTART -f $ZFILE
+./luatool.py --ip localhost:$TH2_PORT --zrestart
+
+echo -e "th3"
+#./luatool.py --ip localhost:$TH3_PORT $ZRESTART -f $ZFILE
+./luatool.py --ip localhost:$TH3_PORT --zrestart
+
+echo -e "th4"
+#./luatool.py --ip localhost:$TH4_PORT $ZRESTART -f $ZFILE
+./luatool.py --ip localhost:$TH4_PORT --zrestart
+
+
+#
diff --git a/SonOff/SonOff_2/upload_s.sh b/SonOff/SonOff_2/upload_s.sh
new file mode 100755
index 0000000..1097e1f
--- /dev/null
+++ b/SonOff/SonOff_2/upload_s.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+# Petit script pour télécharger facilement tout le binz via le port série
+#zf191228.2313
+
+# 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_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 wifi_clear.html
+./luatool.py --port $luatool_tty --bar -f web_srv2.lua
+./luatool.py --port $luatool_tty --bar -f web_ide2.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 eus_params.lua
+./luatool.py --port $luatool_tty --bar -f disp_temp.html
+./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 boot2.lua
+./luatool.py --port $luatool_tty --bar -f boot.lua
+./luatool.py --port $luatool_tty --bar -f 0_send_data.lua
+#./luatool.py --port $luatool_tty --bar -f 0_htu21d.lua
+./luatool.py --port $luatool_tty --bar -f 0_cron.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/SonOff/SonOff_2/upload_t.sh b/SonOff/SonOff_2/upload_t.sh
new file mode 100755
index 0000000..f379ded
--- /dev/null
+++ b/SonOff/SonOff_2/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/SonOff/SonOff_2/web_ide2.lua b/SonOff/SonOff_2/web_ide2.lua
new file mode 100644
index 0000000..fdfbafc
--- /dev/null
+++ b/SonOff/SonOff_2/web_ide2.lua
@@ -0,0 +1,159 @@
+-- Petit WEB IDE tout simple autonome
+-- ATTENTION: tourne sur le port 88 !
+
+print("\n _web_ide2.lua zf181221.1137 \n")
+
+--[[
+XChip's NodeMCU IDE
+
+Create, Edit and run NodeMCU files using your webbrowser.
+Examples:
+http:/// will list all the files in the MCU
+http:///newfile.lua displays the file on your browser
+http:///newfile.lua?edit allows to creates or edits the specified script in your browser
+http:///newfile.lua?run it will run the specified script and will show the returned value
+]]--
+
+srv=net.createServer(net.TCP)
+srv:listen(88,function(conn)
+
+ local rnrn=0
+ local Status = 0
+ local DataToGet = 0
+ local method=""
+ local url=""
+ local vars=""
+
+ conn:on("receive",function(conn,payload)
+
+ if Status==0 then
+ _, _, method, url, vars = string.find(payload, "([A-Z]+) /([^?]*)%??(.*) HTTP")
+ print(method, url, vars)
+ end
+
+ if method=="POST" then
+
+ if Status==0 then
+ --print("status", Status)
+ _,_,DataToGet, payload = string.find(payload, "Content%-Length: (%d+)(.+)")
+ if DataToGet~=nil then
+ DataToGet = tonumber(DataToGet)
+ --print(DataToGet)
+ rnrn=1
+ Status = 1
+ else
+ print("bad length")
+ end
+ end
+
+ -- find /r/n/r/n
+ if Status==1 then
+ --print("status", Status)
+ local payloadlen = string.len(payload)
+ local mark = "\r\n\r\n"
+ local i
+ for i=1, payloadlen do
+ if string.byte(mark, rnrn) == string.byte(payload, i) then
+ rnrn=rnrn+1
+ if rnrn==5 then
+ payload = string.sub(payload, i+1,payloadlen)
+ file.open(url, "w")
+ file.close()
+ Status=2
+ break
+ end
+ else
+ rnrn=1
+ end
+ end
+ if Status==1 then
+ return
+ end
+ end
+
+ if Status==2 then
+ --print("status", Status)
+ if payload~=nil then
+ DataToGet=DataToGet-string.len(payload)
+ --print("DataToGet:", DataToGet, "payload len:", string.len(payload))
+ file.open(url, "a+")
+ file.write(payload)
+ file.close()
+ else
+ conn:send("HTTP/1.1 200 OK\r\n\r\nERROR")
+ Status=0
+ end
+
+ if DataToGet==0 then
+ conn:send("HTTP/1.1 200 OK\r\n\r\nOK")
+ Status=0
+ end
+ end
+
+ return
+ end
+
+ DataToGet = -1
+
+ if url == "favicon.ico" then
+ conn:send("HTTP/1.1 404 file not found")
+ return
+ end
+
+ conn:send("HTTP/1.1 200 OK\r\n\r\n")
+
+ -- it wants a file in particular
+ if url~="" and vars=="" then
+ DataToGet = 0
+ return
+ end
+
+ conn:send("NodeMCU IDE
")
+
+ if vars=="edit" then
+ conn:send("")
+ conn:send("
")
+ end
+
+ if vars=="run" then
+ conn:send("")
+ local st, result=pcall(dofile, url)
+ conn:send(tostring(result))
+ conn:send("")
+ end
+
+ if url=="" then
+ local l = file.list();
+ for k,v in pairs(l) do
+ conn:send(""..k..", size:"..v.."
")
+ end
+ end
+
+ conn:send("")
+
+ end)
+ conn:on("sent",function(conn)
+ if DataToGet>=0 and method=="GET" then
+ if file.open(url, "r") then
+ file.seek("set", DataToGet)
+ local line=file.read(512)
+ file.close()
+ if line then
+ conn:send(line)
+ DataToGet = DataToGet + 512
+
+ if (string.len(line)==512) then
+ return
+ end
+ end
+ end
+ end
+
+ conn:close()
+ end)
+end)
+print("listening, free:", node.heap())
diff --git a/SonOff/SonOff_2/web_srv2.lua b/SonOff/SonOff_2/web_srv2.lua
new file mode 100644
index 0000000..15a8048
--- /dev/null
+++ b/SonOff/SonOff_2/web_srv2.lua
@@ -0,0 +1,88 @@
+-- petit script de serveur WEB avec Active Server Page ZYX
+
+print("\n web_srv2.lua zf191222.2335 \n")
+
+-- 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 = file_web:readline()
+-- local line = file_web:read('\n')
+-- local line = zread_line()
+-- print("hello toto",string.len(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(""..zfilename.." not found - 404 error
Home
")
+ end
+end
+
+
+srv = net.createServer()
+srv:listen(80, function(conn)
+ conn:on("receive", function(client, request)
+ _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP")
+
+-- print("zrequest: \n---\n"..request.."---")
+
+-- print("method: ", method) print("path: ", path) print("vars: ", vars)
+
+ if not string.find(request, "/favicon.ico") then
+ print("coucou")
+ if (method == nil) then
+ _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP")
+ end
+ print("method: ", method) print("path: ", path) print("vars: ", vars)
+ _GET = {}
+ if (vars ~= nil) then
+ for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
+ _GET[k] = v
+ print(k..": "..v)
+ end
+ end
+ file_html=string.gsub(path, "/", "")
+ -- print("file_html: ",file_html)
+ send_file(client, file_html)
+ end
+ end)
+ conn:on("sent", function(c) c:close() end)
+end)
diff --git a/SonOff/SonOff_2/wifi_clear.html b/SonOff/SonOff_2/wifi_clear.html
new file mode 100644
index 0000000..57fb2dd
--- /dev/null
+++ b/SonOff/SonOff_2/wifi_clear.html
@@ -0,0 +1,63 @@
+
+
+
+
+
+ Wifi clear
+
+
+
+ Wifi clear 191222.2348
+
+ Effacement de la configuration WIFI actuelle !
+ Retour à la home page...
+
+ Test d'un web service qui fonctionne avec l'Active Server Page ZYX.
+
+ Le code Lua pour afficher ce résultat se trouve dans le code HTML de cette page et est exécuté sur
+ le NodeMCU.
+ Les données viennent du NodeMCU !
+
+ <%
+ zout("Il reste: "..node.heap().." de RAM !
\n")
+ %>
+
+ <%
+ zout("Booooooooum dans 5 secondes!
")
+ tmr.create():alarm(5*1000, tmr.ALARM_SINGLE, function()
+ file.remove("eus_params.lua")
+ node.restart()
+ end)
+
+ %>
+
+ Les arguments du web service (GET) sont:
+ <%
+ if (vars ~= nil) then
+ zout("
vars: "..vars.."
")
+ for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
+ _GET[k] = v
+ zout(k..": "..v.."
")
+ if k == "field1" then
+ ztemp1_conc = v
+ elseif k == "field2" then
+ ztemp2_conc = v
+ elseif k == "field3" then
+ ztemp3_conc = v
+ end
+ end
+ end
+ zout("
Les températures récupérées sont: "..ztemp1_conc..", "..ztemp2_conc..", "..ztemp3_conc)
+ %>
+
+
+
+
+
Yeah... cela fonctionne vachement bien !
+
+ <%
+ zout("Il reste: "..node.heap().." de RAM !
\n")
+ %>
+
+
+
diff --git a/SonOff/SonOff_2/wifi_info.lua b/SonOff/SonOff_2/wifi_info.lua
new file mode 100644
index 0000000..2a0066b
--- /dev/null
+++ b/SonOff/SonOff_2/wifi_info.lua
@@ -0,0 +1,44 @@
+-- Petit script pour afficher les infos actuel du WIFI
+print("\n wifi_info.lua zf191030.2017 \n")
+
+function wifi_info()
+ local zmodewifi=wifi.getmode()
+
+ --wifi.NULLMODE, wifi.STATION, wifi.SOFTAP, wifi.STATIONAP
+
+ if zmodewifi == wifi.NULLMODE then
+ print("WIFI OFF")
+ elseif zmodewifi == wifi.STATION then
+ print("WIFI mode CLI")
+ print("Connected IP:\n",wifi.sta.getip())
+ local sta_config=wifi.sta.getconfig(true)
+ print("Current client config:")
+ print("\tssid:", sta_config.ssid)
+ print("\tpassword:", sta_config.pwd)
+ print("\tbssid:", sta_config.bssid)
+ elseif zmodewifi == wifi.SOFTAP then
+ print("WIFI mode AP\n")
+ print("AP IP: ", wifi.ap.getip())
+ print("Current AP config:")
+ local ap_config=wifi.ap.getconfig(true)
+ print("\tssid:", ap_config.ssid)
+ print("\tpassword:", ap_config.pwd)
+ print("\tbssid:", wifi.ap.getmac())
+ elseif zmodewifi == wifi.STATIONAP then
+ print("WIFI mode CLI+AP\n")
+ print("CLIENT IP:\n",wifi.sta.getip())
+ local sta_config=wifi.sta.getconfig(true)
+ print("Current CLIENT config:")
+ print("\tssid:", sta_config.ssid)
+ print("\tpassword:", sta_config.pwd)
+ print("\tbssid:", sta_config.bssid.."\n")
+ print("AP IP: ", wifi.ap.getip())
+ print("Current AP config:")
+ local ap_config=wifi.ap.getconfig(true)
+ print("\tssid:", ap_config.ssid)
+ print("\tpassword:", ap_config.pwd)
+ print("\tbssid:", wifi.ap.getmac())
+ end
+end
+wifi_info()
+
diff --git a/SonOff/SonOff_2/wifi_init.lua b/SonOff/SonOff_2/wifi_init.lua
new file mode 100644
index 0000000..380300f
--- /dev/null
+++ b/SonOff/SonOff_2/wifi_init.lua
@@ -0,0 +1,36 @@
+-- Petit script pour initaliser la couche WIFI
+
+function wifi_init()
+ print("\n wifi_init.lua zf191222.2356 \n")
+ -- charge les secrets pour le wifi
+ f= "secrets_wifi.lua" if file.exists(f) then dofile(f) end
+
+ wifi.setmode(wifi.STATION,true)
+ wifi.sta.config{ssid=cli_ssid, pwd=cli_pwd, auto=true, save=true}
+ wifi.sta.autoconnect(1)
+ wifi.sta.connect()
+
+ zLED=4 gpio.write(zLED, gpio.HIGH) gpio.mode(zLED, gpio.OUTPUT)
+ i=1
+ wifi_init1=tmr.create()
+ wifi_init1:alarm(1*1000, tmr.ALARM_AUTO , function()
+ gpio.write(zLED, gpio.LOW) tmr.delay(10000) gpio.write(zLED, gpio.HIGH)
+ if wifi.sta.getip() == nil then
+ print("Connecting to AP...")
+ i=i+1
+ if i > 10 then
+ i=nil wifi_init1:unregister()
+ print("booum!")
+ enduser_setup.start(function()
+ node.restart()
+ end)
+ end
+ else
+ wifi_init1:unregister() zLED=nil i=nil
+ f= "wifi_info.lua" if file.exists(f) then dofile(f) end
+ boot2_go = true
+ end
+ end)
+end
+
+wifi_init()
diff --git a/SonOff/SonOff_2/wifi_set_conf.html b/SonOff/SonOff_2/wifi_set_conf.html
new file mode 100644
index 0000000..2aaee74
--- /dev/null
+++ b/SonOff/SonOff_2/wifi_set_conf.html
@@ -0,0 +1,48 @@
+
+
+
+
+
+ WIFI set config
+
+
+
+ WIFI set config 191124.2334
+
+ Coucou c'est WIFI set config !
+ Retour à la home page...
+
+
+
+<%
+
+ if (vars ~= nil) then
+ zout("
vars: "..vars.."
")
+ for k, v in string.gmatch(vars, "(%w+)=(%w+%p+%w+)&*") do
+ _GET[k] = v
+ zout(k..": "..v.."
")
+ end
+ end
+
+ zout("
toto
")
+
+--[[
+zout("t1: ",_GET.zssid,"
")
+zout("t2: ",_GET.zpasswd,"
")
+
+if zverif == "YES" then
+ zout("c'est tout bon")
+ zout("Le SSID est: ",zssid)
+ zout("Le PASSWD est: ",zpasswd)
+end
+]]
+
+ztemp=ztemp+1
+zout(ztemp.."°C")
+%>
+
+
Mais il fait encore trop froid !
+
+
+
+
diff --git a/SonOff/SonOff_2/z_index.html b/SonOff/SonOff_2/z_index.html
new file mode 100644
index 0000000..60207cb
--- /dev/null
+++ b/SonOff/SonOff_2/z_index.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+ ESP8266 home page
+
+
+
+ ESP8266 home page 191222.2346
+ Menu:
+
+
+
+ <%
+ a,b,c = wifi.sta.getip()
+ zout("IP: "..a.." MASK: "..b.." GATEWAY: "..c.."
")
+
+ %>
+
+
+
+
+
+
+
diff --git a/SonOff/SonOff_2/zz_host_dir.lua b/SonOff/SonOff_2/zz_host_dir.lua
new file mode 100755
index 0000000..23e75ce
--- /dev/null
+++ b/SonOff/SonOff_2/zz_host_dir.lua
@@ -0,0 +1,67 @@
+#!/usr/local/bin/lua5.1
+-- script lua à faire tourner sur le host pour la taille de tous les fichiers
+-- du dossier en cours, donc PAS sur le NodeMCU !
+-- source: https://stackoverflow.com/questions/5303174/how-to-get-list-of-directories-in-lua (30%)
+
+-- usage dans la console:
+-- ./zz_host_dir.lua
+--[[
+./zz_host_dir.lua > thost
+]]
+-- usage dans Atom editor
+-- il faut installer ceci: https://atom.io/packages/compare-files
+-- puis sélectionner les deux fichiers dans l'explorateur à gauche puis CTRL+CMD+C
+
+
+print("\n zz_host_dir.lua zf191124.1646 \n")
+
+function calc_chksum_file(name_file)
+ size_file = 0 chksum_file = 0
+ local f = io.open(name_file, "r")
+-- 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(name_file)
+end
+
+function dirfile(k)
+ calc_chksum_file(k)
+ print(k..string.rep(" ",24-string.len(k)).." : "..size_file..", "..chksum_file)
+ size_file=nil chksum_file=nil k=nil
+end
+
+function dir()
+ local zdir={}
+ local pfile = io.popen("ls -1r *.lua *.html")
+ for k in pfile:lines() do
+-- local pfile = file.list()
+-- for k,v in pairs(pfile) do
+ calc_chksum_file(k)
+ if (size_file ~= 1) and (chksum_file ~= 1) then
+ zdir[#zdir+1]=k..string.rep(" ",24-string.len(k)).." : "..size_file
+ end
+ end
+ pfile:close()
+ table.sort(zdir)
+ for i=1, #zdir do
+ print(zdir[i])
+ end
+ size_file=nil chksum_file=nil k=nil
+end
+
+dir()
+print("\n\nRappel, sur Atom, sélectionner les deux fichiers à gauche puis CTRL+CMD+C\n")
+
+--[[
+dir()
+dirfile("dir2.lua")
+
+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/SonOff/SonOff_2/zz_host_dir2.lua b/SonOff/SonOff_2/zz_host_dir2.lua
new file mode 100755
index 0000000..13cf1bc
--- /dev/null
+++ b/SonOff/SonOff_2/zz_host_dir2.lua
@@ -0,0 +1,67 @@
+#!/usr/local/bin/lua5.1
+-- script lua à faire tourner sur le host pour calculer le checksum de tous les fichiers
+-- du dossier en cours, donc PAS sur le NodeMCU !
+-- source: https://stackoverflow.com/questions/5303174/how-to-get-list-of-directories-in-lua (30%)
+
+-- usage dans la console:
+-- ./zz_host_dir2.lua
+--[[
+./zz_host_dir2.lua > thost
+]]
+-- usage dans Atom editor
+-- il faut installer ceci: https://atom.io/packages/compare-files
+-- puis sélectionner les deux fichiers dans l'explorateur à gauche puis CTRL+CMD+C
+
+
+print("\n zz_host_dir2.lua zf191124.1634 \n")
+
+function calc_chksum_file(name_file)
+ size_file = 1 chksum_file = 0
+ local f = io.open(name_file, "r")
+-- 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(name_file)
+end
+
+function dirfile(k)
+ calc_chksum_file(k)
+ print(k..string.rep(" ",24-string.len(k)).." : "..size_file..", "..chksum_file)
+ size_file=nil chksum_file=nil k=nil
+end
+
+function dir()
+ local zdir={}
+ local pfile = io.popen("ls -1r ")
+ for k in pfile:lines() do
+-- local pfile = file.list()
+-- for k,v in pairs(pfile) do
+ calc_chksum_file(k)
+ if (size_file ~= 1) and (chksum_file ~= 1) then
+ zdir[#zdir+1]=k..string.rep(" ",24-string.len(k)).." : "..size_file..", "..chksum_file
+ end
+ end
+ pfile:close()
+ table.sort(zdir)
+ for i=1, #zdir do
+ print(zdir[i])
+ end
+ size_file=nil chksum_file=nil k=nil
+end
+
+dir()
+print("\n\nRappel, sur Atom, sélectionner les deux fichiers à gauche puis CTRL+CMD+C\n")
+
+--[[
+dir()
+dirfile("dir2.lua")
+
+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/zflash-eps01.sh b/zflash-eps01.sh
index a86eff5..ecaba3b 100755
--- a/zflash-eps01.sh
+++ b/zflash-eps01.sh
@@ -3,18 +3,30 @@
#ATTENTION: c'est pour ma structure, il faudra donc l'adapter
-#zf1812.1429
+#zf191231.1912
#test si l'argument est vide
if [ -z "$1" ]
then
- echo -e "\nSyntax: ./zflash.sh ../../Firmware/nodemcu-master-13-modules-2018-10-11-16-35-53-float.bin \n\n"
+ echo -e "\nSyntax:
+
+Pour le dernier firmware à la mode:
+./zflash-eps01.sh ../../Firmware/nodemcu-master-16-modules-2019-12-01-22-17-07-float.bin
+./zflash-eps01.sh ../../Firmware/nodemcu-master-11-modules-2019-12-15-16-45-47-float.bin
+./zflash-eps01.sh ../../Firmware/nodemcu-master-18-modules-2019-12-17-20-28-32-float.bin
+./zflash-eps01.sh ../../Firmware/nodemcu-master-12-modules-2019-12-21-11-05-58-float.bin
+./zflash-eps01.sh ../../Firmware/nodemcu-master-19-modules-2019-12-31-16-40-12-float.bin
+
+Pour l'ancien qui supporte encore le DS18B20:
+./zflash-eps01.sh ../../Firmware/nodemcu-master-20-modules-2019-06-01-12-50-39-float.bin
+
+
+
+"
exit
fi
-echo ---------- start zflash.sh
-
cd ./Tools/esptool-master
python esptool.py erase_flash
diff --git a/zflash.sh b/zflash.sh
index 49b8d11..1f982ee 100755
--- a/zflash.sh
+++ b/zflash.sh
@@ -3,7 +3,7 @@
#ATTENTION: c'est pour ma structure, il faudra donc l'adapter
-#zf191221.1223
+#zf191231.1746
#test si l'argument est vide
@@ -16,6 +16,7 @@ Pour le dernier firmware à la mode:
./zflash.sh ../../Firmware/nodemcu-master-11-modules-2019-12-15-16-45-47-float.bin
./zflash.sh ../../Firmware/nodemcu-master-18-modules-2019-12-17-20-28-32-float.bin
./zflash.sh ../../Firmware/nodemcu-master-12-modules-2019-12-21-11-05-58-float.bin
+./zflash.sh ../../Firmware/nodemcu-master-19-modules-2019-12-31-16-40-12-float.bin
Pour l'ancien qui supporte encore le DS18B20:
./zflash.sh ../../Firmware/nodemcu-master-20-modules-2019-06-01-12-50-39-float.bin