Commencé le projet mesure d'humidité pour les locaux du Musée Bolo

This commit is contained in:
Christian Zufferey
2019-12-01 23:08:02 +01:00
parent 0e56311434
commit 02e90e839a
33 changed files with 2066 additions and 0 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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()
]]

View File

@@ -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.
![Image of Yaktocat](https://zraw.githubusercontent.com/zuzu59/NodeMCU_Lua/master/Mesures/energy/transfo_courant_clip/img/20190908_134444.jpg)
toto
![Image of Yaktocat](https://zraw.githubusercontent.com/zuzu59/NodeMCU_Lua/master/Mesures/energy/transfo_courant_clip/img/20190908_134444.jpg)
tutu
![Image of Yaktocat](https://zraw.githubusercontent.com/zuzu59/NodeMCU_Lua/master/Mesures/energy/transfo_courant_clip/img/20190908_134444.jpg)
titi
![Image of Yaktocat](https://zraw.githubusercontent.com/zuzu59/NodeMCU_Lua/master/Mesures/energy/transfo_courant_clip/img/20190908_134444.jpg)
tata
<br><bR>
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. <br>
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 !<br>
```
secrets_projet.lua
```
**ATTENTION, readme pas encore terminé, il faut encore modifier le readme depuis ici ! zf190922.1740**
<br>
<br>
<br>
<br>
<br>
<br>
### 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()
```

View File

@@ -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
.

View File

@@ -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()

View File

@@ -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
]]

View File

@@ -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)
--

View File

@@ -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

View File

@@ -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
]]

View File

@@ -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 ()
]]

View File

@@ -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)
]]

View File

@@ -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

View File

@@ -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()

405
Mesures/humidity/bolo/luatool.py Executable file
View File

@@ -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")

View File

@@ -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)

View File

@@ -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")

View File

@@ -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

View File

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

View File

@@ -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 ;-)"

View File

@@ -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 ;-)"

View File

@@ -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("<html><h1>"..zfilename.." not found - 404 error</h1><a href='/'>Home</a><br></html>")
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)

View File

@@ -0,0 +1,44 @@
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset='utf-8' name='viewport' content='width=device-width, initial-scale=1.0'>
<title>WIFI get config</title>
</head>
<body>
<h1>WIFI get config 191124.2333</h1>
<br>
Coucou c'est WIFI get config !<br>
<a href="/">Retour à la home page...</a><br><br><br>
<form action="wifi_set_conf.html" method="get">
<table>
<tr>
<td>AP:</td>
<td><input type="text" name="zssid"></td>
</tr>
<tr>
<td>PASSWD:</td>
<td><input type="text" name="zpasswd"></td>
</tr>
<tr>
<td>Entrer YES:</td>
<td><input type="text" name="zverif"></td>
</tr>
</table>
<input type="submit" value="Ok">
</form>
<br>
<%
ztemp=ztemp+1
zout(ztemp.."°C")
%>
<br>Mais il fait encore trop froid !<br>
</body>
</html>

View File

@@ -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()

View File

@@ -0,0 +1,18 @@
-- Petit script pour initaliser la couche WIFI
function wifi_init()
print("\n wifi_init.lua zf191030.2040 \n")
-- charge les secrets pour le wifi
f= "secrets_wifi.lua" if file.exists(f) then dofile(f) end
wifi.setmode(wifi.STATIONAP,true)
wifi.ap.config({ ssid = ap_ssid.." "..wifi.ap.getmac(), pwd = ap_pwd, save=true })
wifi.sta.config{ssid=cli_ssid, pwd=cli_pwd, auto=true, save=true}
wifi.sta.autoconnect(1)
wifi.sta.connect()
end
wifi_init()

View File

@@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset='utf-8' name='viewport' content='width=device-width, initial-scale=1.0'>
<title>WIFI set config</title>
</head>
<body>
<h1>WIFI set config 191124.2334</h1>
<br>
Coucou c'est WIFI set config !<br>
<a href="/">Retour à la home page...</a><br><br><br>
<%
if (vars ~= nil) then
zout("<br>vars: "..vars.."<br><br>")
for k, v in string.gmatch(vars, "(%w+)=(%w+%p+%w+)&*") do
_GET[k] = v
zout(k..": "..v.."<br>")
end
end
zout("<br>toto<br>")
--[[
zout("t1: ",_GET.zssid,"<br>")
zout("t2: ",_GET.zpasswd,"<br>")
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")
%>
<br>Mais il fait encore trop froid !<br>
</body>
</html>

View File

@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset='utf-8' name='viewport' content='width=device-width, initial-scale=1.0'>
<title>ESP8266 home page</title>
</head>
<body>
<h1>ESP8266 home page 191124.2332</h1>
<h2>Différentes pages HTML:</h2>
<h3>
<a href="z_page1.html">Page 1, affichage de la température dynamique en code Lua inline.</a><br>
<a href="z_page2.html">Page 2, tableau dynamique écrit en Lua inline.</a><br>
<a href="z_page3.html">Page 3, affichage du capteur non linéaire corrigé.</a><br>
<a href="z_page4.html?field1=11&field2=12&field3=13">Page 4, test de récupération d'arguments pour un web service.</a><br>
<a href="api_hub_temp.html?field1=11&field2=12&field3=13">API HUB Temp,test d'un web service hub de mesures de température.</a><br>
<a href="disp_temp.html">Affichage des températures, affiche les températures mesurées.</a><br>
<a href="wifi_get_conf.html">WIFI configuration.</a><br>
<br><a href="page_qui_existe_pag.html">Page qui n'existe pas !</a><br>
</h3>
</body>
</html>

View File

@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset='utf-8' name='viewport' content='width=device-width, initial-scale=1.0'>
<title>ESP8266 page 1</title>
</head>
<body>
<h1>ESP8266 page 1 190127.1445</h1>
<br>
Coucou c'est la page 1 !<br>
<a href="/">Retour à la home page...</a><br><br><br>
La température est:
<%
ztemp=ztemp+1
zout(ztemp.."°C")
%>
<br>Mais il fait encore trop froid !<br>
</body>
</html>

View File

@@ -0,0 +1,51 @@
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset='utf-8' name='viewport' content='width=device-width, initial-scale=1.0'>
<title>ESP8266 page 2</title>
</head>
<body>
<h1>ESP8266 page 2 190127.1449</h1>
<br>
Coucou c'est la page 2 !<br>
<a href="/">Retour à la home page...</a><br><br><br>
Voici un tableau dynamique écrit en Lua inline.<br><br>
Le code Lua pour créer ce tableau se trouve dans le code HTML de cette page et est exécuté sur le NodeMCU.<br>
Les données du tableau viennent du NodeMCU !<br><br>
<%
-- création du tableau sur le NodeMCUjuste juste pour la démo ici !
zmac_adrs={}
zmac_adrs["b8:d7:af:a6:bd:86"]={["zname"]="S7 zf", ["zrssi"]=45, ["ztime"]="12:03:36"}
zmac_adrs["cc:c0:79:7d:f5:d5"]={["zname"]="S7 Mélanie", ["zrssi"]=50, ["ztime"]="14:23:46"}
zmac_adrs["5c:f9:38:a1:f7:f0"]={["zname"]="MAC zf", ["zrssi"]=40, ["ztime"]="11:53:16"}
zmac_adrs["d8:30:62:5a:d6:3a"]={["zname"]="IMAC Maman", ["zrssi"]=55, ["ztime"]="17:07:23"}
%>
<table border='1'>
<tr>
<th>MAC</th><th>Name</th><th>RSSI</th><th>Time</th>
</tr>
<%
for k, v in pairs(zmac_adrs) do
zout("<tr>\n")
zout("\t<td>" .. k .. "</td>\n")
zout("\t<td>" .. tostring(zmac_adrs[k]["zname"]) .. "</td>\n")
zout("\t<td>" .. tostring(zmac_adrs[k]["zrssi"]) .. "</td>\n")
zout("\t<td>" .. tostring(zmac_adrs[k]["ztime"]) .. "</td>\n")
zout("</tr>\n")
end
%>
</table>
<%
-- libère la mémoire du tableau sur le NodeMCU qui avait été créé pour la démo ici !
zmac_adrs=nil
%>
</body>
</html>

View File

@@ -0,0 +1,50 @@
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset='utf-8' name='viewport' content='width=device-width, initial-scale=1.0'>
<title>ESP8266 page 3</title>
</head>
<body>
<h1>ESP8266 page 3 190505.1156</h1>
<br>
Coucou c'est la page 3 !<br>
<a href="/">Retour à la home page...</a><br><br><br>
Voici le résultat du capteur non linéaire corrigé avec une table
d'interpolation dans un fichier .csv sur la flash.<br><br>
Le code Lua pour afficher ce résultat se trouve dans le code HTML de cette page et est exécuté sur le NodeMCU.<br>
Les données viennent du NodeMCU !<br><br>
<%
zout("Il reste: "..node.heap().." de RAM !<br><br>\n")
%>
<%
zx0=83
get_correction(zx0)
zout("la valeur corrigée de "..zx0.." est "..zy0.."<br>")
%>
<%
zx0=91
get_correction(zx0)
zout("la valeur corrigée de "..zx0.." est "..zy0.."<br>")
%>
<%
zx0=100
get_correction(zx0)
zout("la valeur corrigée de "..zx0.." est "..zy0.."<br>")
%>
<br>Yeah... cela fonctionne vachement bien !<br><br>
<%
zout("Il reste: "..node.heap().." de RAM !<br><br>\n")
%>
</body>
</html>

View File

@@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset='utf-8' name='viewport' content='width=device-width, initial-scale=1.0'>
<title>ESP8266 page 3</title>
</head>
<body>
<h1>ESP8266 page 4 190726.1955</h1>
<br>
Web service concentrateur de mesures de température !<br>
<a href="/">Retour à la home page...</a><br><br><br>
Test d'un web service qui fonctionne avec l'Active Server Page ZYX.<br><br>
Le code Lua pour afficher ce résultat se trouve dans le code HTML de cette page et est exécuté sur le NodeMCU.<br>
Les données viennent du NodeMCU !<br><br>
<%
zout("Il reste: "..node.heap().." de RAM !<br><br>\n")
%>
Les arguments du web service (GET) sont:<br><br>
<%
if (vars ~= nil) then
zout("<br>vars: "..vars.."<br>")
for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
_GET[k] = v
zout(k..": "..v.."<br>")
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("<br>Les températures récupérées sont: "..ztemp1_conc..", "..ztemp2_conc..", "..ztemp3_conc)
%>
<br><br>Yeah... cela fonctionne vachement bien !<br><br>
<%
zout("Il reste: "..node.heap().." de RAM !<br><br>\n")
%>
</body>
</html>

View File

@@ -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
]]

View File

@@ -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
]]