Refactorisé mon projet mesure de température en mesures et ajouté le projet mesure de la consommation électrique en temps réel
118
Mesures/energy/README.md
Normal file
@@ -0,0 +1,118 @@
|
||||
# temp_zf
|
||||
|
||||
Petit projet pour mesurer la consommation électrique en temps réel chez moi avec un NodeMCU en LUA, et l'afficher sur ThingSpeak.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
On peut voir, 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 dynamique avec du code LUA in line
|
||||
* serveur WEB service pour le HUB (API GET)
|
||||
* serveur WEB pour l'affichage de la consommation électrique
|
||||
* 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 de la consommation
|
||||
* serveur TELNET, utilisation de la console en remote pour le debug
|
||||
|
||||
Toutes les fonctions sont bien séparées dans des scripts, ce qui facilite la portabilité entre les projets mais aussi sa mise au point.
|
||||
|
||||
|
||||
|
||||
## Astuces de mesures
|
||||
|
||||
Dans ce projet il y a 1x NodeMCU qui mesure la consommation électrique en détectant simplement le petite LED du compteur électrique
|
||||
:
|
||||
|
||||
Il envoie la puissance sur le NodeMCU de la mesure **extérieure sud** fait office de hub des deux autres mesures de températures et, envoie en même temps les 4x mesures à Thingspeak. Ceci afin de les avoir tous dans le même channel (on économise les channels).<br>
|
||||
Cela permet de mesurer des valeurs physiques éloignées dans la maison en utilisant le WIFI comme câble de liaison entre les sondes !
|
||||
|
||||
|
||||
## Installation
|
||||
|
||||
Il faut *flasher* le NodeMCU avec ce firmware:
|
||||
|
||||
https://github.com/zuzu59/NodeMCU_Lua/blob/master/Firmware/nodemcu-master-20-modules-2019-07-01-06-35-13-float.bin
|
||||
|
||||
|
||||
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 la mesure de consommation est faite avec 1x NodeMCU, il y a donc 1x fichiers de *secrets*. C'est dans ce fichier de *secrets* qu'il y a l'information de l'adresse IP du NodeMCU qui fait office de *hub* !<br>
|
||||
|
||||
```
|
||||
secrets_energy.lua
|
||||
```
|
||||
|
||||
C'est aussi là qu'il y a le *numéro du field* (zfield), c'est à dire le rôle joué par le NodeMCU_Lua:
|
||||
|
||||
* **4**, consommation électrique
|
||||
|
||||
Et c'est le NodeMCu de mesure de température *sud* qui fait office de *hub*, qui concentre les mesures et les envoie en une fois à Thingspeek !
|
||||
|
||||
|
||||
**faut encore modifier le readme depuis ici ! zf190803.1917**
|
||||
|
||||
### 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
|
||||
|
||||
|
||||
zf190803.1917
|
||||
17
Mesures/energy/_secrets_energy.lua_
Normal file
@@ -0,0 +1,17 @@
|
||||
-- Petit script pour configurer les choses secrètes que l'on n'aimerait
|
||||
-- pas être exportées sur Internet (github)
|
||||
-- faut donc le mettre ailleurs que dans le dépôt !
|
||||
|
||||
function secrets()
|
||||
print("\n secrets_temp_zf_out_sud.lua zf190727.1006 \n")
|
||||
|
||||
cli_ssid="xxx"
|
||||
cli_pwd="xxx"
|
||||
|
||||
thingspeak_url="http://api.thingspeak.com/update?api_key=xxx&"
|
||||
hub_url="http://192.168.0.180/api_hub_temp.html?"
|
||||
zfield=1 ou 2 ou 3 !
|
||||
|
||||
end
|
||||
secrets()
|
||||
secrets=nil
|
||||
37
Mesures/energy/boot.lua
Normal file
@@ -0,0 +1,37 @@
|
||||
-- Scripts à charger après le boot pour démarrer son appli
|
||||
|
||||
print("\n boot.lua zf190803.1908 \n")
|
||||
|
||||
function heartbeat()
|
||||
f= "flash_led_xfois.lua" if file.exists(f) then dofile(f) end
|
||||
flash_led_xfois()
|
||||
boottimer1=tmr.create()
|
||||
boottimer1:alarm(1*1000, tmr.ALARM_AUTO, function()
|
||||
xfois =2
|
||||
blink_LED ()
|
||||
end)
|
||||
end
|
||||
|
||||
-- charge ses propres secrets
|
||||
f= "secrets_energy.lua" if file.exists(f) then dofile(f) end
|
||||
|
||||
--f= "led_rgb.lua" if file.exists(f) then dofile(f) end
|
||||
--f= "wifi_ap_start.lua" if file.exists(f) then dofile(f) end
|
||||
f= "wifi_ap_stop.lua" if file.exists(f) then dofile(f) end
|
||||
f= "wifi_cli_conf.lua" if file.exists(f) then dofile(f) end
|
||||
f= "wifi_cli_start.lua" if file.exists(f) then dofile(f) end
|
||||
f= "telnet_srv2.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
|
||||
|
||||
--f= "0_get_temp.lua" if file.exists(f) then dofile(f) end
|
||||
--f= "0_send_temp.lua" if file.exists(f) then dofile(f) end
|
||||
--f= "0_cron_temp.lua" if file.exists(f) then dofile(f) end
|
||||
|
||||
f=nil
|
||||
--heartbeat=nil
|
||||
heartbeat()
|
||||
|
||||
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 439 KiB After Width: | Height: | Size: 439 KiB |
|
Before Width: | Height: | Size: 681 KiB After Width: | Height: | Size: 681 KiB |
|
Before Width: | Height: | Size: 655 KiB After Width: | Height: | Size: 655 KiB |
|
Before Width: | Height: | Size: 670 KiB After Width: | Height: | Size: 670 KiB |
|
Before Width: | Height: | Size: 406 KiB After Width: | Height: | Size: 406 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 210 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
19
Mesures/temp_zf - copie/0_cron_temp.lua
Normal file
@@ -0,0 +1,19 @@
|
||||
-- Petit script pour faire office de crontab pour les mesures de température
|
||||
print("\n 0_cron_temp.lua zf190728.1054 \n")
|
||||
|
||||
cron1=tmr.create()
|
||||
cron1:alarm(10*1000, tmr.ALARM_AUTO, function()
|
||||
get_temp()
|
||||
end)
|
||||
|
||||
if zfield == 2 then
|
||||
cron2=tmr.create()
|
||||
cron2:alarm(20*1000, tmr.ALARM_AUTO, function()
|
||||
print("cron2........................")
|
||||
zurl=thingspeak_url.."field1="..tostring(ztemp1).."&field2="..tostring(ztemp2).."&field3="..tostring(ztemp3)
|
||||
send_temp()
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
|
||||
34
Mesures/temp_zf - copie/0_get_temp.lua
Normal file
@@ -0,0 +1,34 @@
|
||||
-- Lit le capteur de température solaire en fonction de son field qui se trouve dans les secrets !
|
||||
print("\n 0_get_temp.lua zf190728.1014 \n")
|
||||
|
||||
-- lecture: https://thingspeak.com/channels/802784/private_show
|
||||
-- source: https://nodemcu.readthedocs.io/en/master/modules/ds18b20/
|
||||
|
||||
local ow_pin = 3
|
||||
ds18b20.setup(ow_pin)
|
||||
|
||||
function get_temp()
|
||||
ds18b20.read(
|
||||
function(ind,rom,res,temp,tdec,par)
|
||||
print(ind, temp, zfield)
|
||||
if zfield == 1 then
|
||||
ztemp1 = temp
|
||||
zurl=hub_url.."field1="..tostring(ztemp1)
|
||||
send_temp()
|
||||
elseif zfield == 2 then
|
||||
ztemp2 = temp
|
||||
elseif zfield == 3 then
|
||||
ztemp3 = temp
|
||||
zurl=hub_url.."field3="..tostring(ztemp3)
|
||||
send_temp()
|
||||
end
|
||||
print(ztemp1, ztemp2, ztemp3)
|
||||
end,{})
|
||||
end
|
||||
|
||||
--[[
|
||||
|
||||
get_temp()
|
||||
|
||||
]]
|
||||
|
||||
25
Mesures/temp_zf - copie/0_send_temp.lua
Normal file
@@ -0,0 +1,25 @@
|
||||
-- Petit script pour envoyer les valeurs de température sur un serveur WEB via un HTTP GET
|
||||
print("\n 0_send_temp.lua zf190727.1331 \n")
|
||||
|
||||
function send_temp()
|
||||
print("send_web_temp: ")
|
||||
print(zurl)
|
||||
|
||||
http.get(zurl, nil, function(code, data)
|
||||
-- print("toto")
|
||||
if (code < 0) then
|
||||
print("HTTP request failed")
|
||||
print("zuzu", code, data)
|
||||
else
|
||||
print(code, data)
|
||||
end
|
||||
-- print("tutu")
|
||||
end)
|
||||
-- print("titi")
|
||||
end
|
||||
|
||||
--[[
|
||||
|
||||
send_temp()
|
||||
|
||||
]]
|
||||
@@ -5,11 +5,12 @@
|
||||
function secrets()
|
||||
print("\n secrets_temp_zf_out_sud.lua zf190727.1006 \n")
|
||||
|
||||
cli_ssid=""
|
||||
cli_pwd=""
|
||||
cli_ssid="xxx"
|
||||
cli_pwd="xxx"
|
||||
|
||||
thingspeak_url="http://api.thingspeak.com/update?api_key=xxx&"
|
||||
hub_url="http://192.168.0.180/api_hub_temp.html?"
|
||||
zfield=1 ou 2 ou 3 !
|
||||
|
||||
end
|
||||
secrets()
|
||||
23
Mesures/temp_zf - copie/a1.lua
Normal file
@@ -0,0 +1,23 @@
|
||||
-- programme pour faire un test depuis de le webide
|
||||
|
||||
-- source: https://nodemcu.readthedocs.io/en/master/modules/ds18b20/
|
||||
|
||||
function a1()
|
||||
print("\n a1.lua zf190601.1627 \n")
|
||||
end
|
||||
|
||||
a1()
|
||||
|
||||
local ow_pin = 3
|
||||
ds18b20.setup(ow_pin)
|
||||
|
||||
print("toto182538")
|
||||
|
||||
-- read all sensors and print all measurement results
|
||||
ds18b20.read(
|
||||
function(ind,rom,res,temp,tdec,par)
|
||||
print(ind,string.format("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",string.match(rom,"(%d+):(%d+):(%d+):(%d+):(%d+):(%d+):(%d+):(%d+)")),res,temp,tdec,par)
|
||||
end,{})
|
||||
|
||||
print("tutu152603")
|
||||
|
||||
1
Mesures/temp_zf - copie/a2.lua
Normal file
@@ -0,0 +1 @@
|
||||
-- programme pour faire un test depuis de le webide
|
||||
1
Mesures/temp_zf - copie/a3.lua
Normal file
@@ -0,0 +1 @@
|
||||
-- programme pour faire un test depuis de le webide
|
||||
30
Mesures/temp_zf - copie/disp_temp.html
Normal file
@@ -0,0 +1,30 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr" dir="ltr">
|
||||
|
||||
<head>
|
||||
<meta charset='utf-8' name='viewport' content='width=device-width, initial-scale=1.0'>
|
||||
<title>Affichage des températures</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Affichage des températures 190727.1349</h1>
|
||||
<br>
|
||||
Les températures mesurées sont:<br>
|
||||
|
||||
|
||||
<%
|
||||
if (ztemp1 ~= nil) then
|
||||
zout("<br>Température intérieure chambre à coucher "..ztemp1.."°C")
|
||||
end
|
||||
if (ztemp2 ~= nil) then
|
||||
zout("<br>Température extérieure sud (nodemcu 29) "..ztemp2.."°C")
|
||||
end
|
||||
if (ztemp3 ~= nil) then
|
||||
zout("<br>Température extérieure nord (nodemcu 30) "..ztemp3.."°C")
|
||||
end
|
||||
|
||||
zout("<br><br>RAM: "..node.heap().."<br>")
|
||||
%>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
39
Mesures/temp_zf - copie/flash_led_xfois.lua
Normal file
@@ -0,0 +1,39 @@
|
||||
-- programme pour faire clignoter x fois une LED avec un rapport on/off
|
||||
|
||||
function flash_led_xfois()
|
||||
print("\n flash_led_xfois.lua zf190601.1618 \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
|
||||
|
||||
-- xfois =2
|
||||
-- blink_LED ()
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
1
Mesures/temp_zf - copie/goodies/a6.lua
Normal file
@@ -0,0 +1 @@
|
||||
-- programme pour faire un test depuis de le webide
|
||||
1
Mesures/temp_zf - copie/goodies/a7.lua
Normal file
@@ -0,0 +1 @@
|
||||
-- programme pour faire un test depuis de le webide
|
||||
1
Mesures/temp_zf - copie/goodies/a8.lua
Normal file
@@ -0,0 +1 @@
|
||||
-- programme pour faire un test depuis de le webide
|
||||
1
Mesures/temp_zf - copie/goodies/a9.lua
Normal file
@@ -0,0 +1 @@
|
||||
-- programme pour faire un test depuis de le webide
|
||||
6
Mesures/temp_zf - copie/goodies/a_tst_variables.lua
Normal file
@@ -0,0 +1,6 @@
|
||||
-- Scripts pour afficher toutes les variables et fonctions en cours dans le système
|
||||
|
||||
print("\n a_tst_variable.lua zf190310.1525 \n")
|
||||
|
||||
for n in pairs (_G) do print(n) end
|
||||
|
||||
37
Mesures/temp_zf - copie/goodies/led_rgb.lua
Normal file
@@ -0,0 +1,37 @@
|
||||
-- Scripts juste pour allumer ou éteindre une LED sur un ruban RGB
|
||||
-- tout sur la couleur: https://www.w3schools.com/colors/default.asp
|
||||
-- roue des couleurs: https://iro.js.org/?ref=oldsite
|
||||
|
||||
print("\n led_rgb.lua zf190303.1436 \n")
|
||||
|
||||
nbleds=3
|
||||
ws2812.init()
|
||||
myLedStrip = ws2812.newBuffer(nbleds, 3)
|
||||
|
||||
function RGB_clear()
|
||||
myLedStrip:fill(0, 0, 0) ws2812.write(myLedStrip)
|
||||
end
|
||||
|
||||
function RGB_reform(R1, G1, B1) --conversion de RGB à BRG
|
||||
rR1=B1 rG1=R1 rB1=G1
|
||||
end
|
||||
|
||||
function zled_rgb(num_led, R1, G1, B1, zpower)
|
||||
RGB_reform(R1, G1, B1)
|
||||
myLedStrip:set(num_led, rR1*zpower, rG1*zpower, rB1*zpower)
|
||||
ws2812.write(myLedStrip)
|
||||
end
|
||||
|
||||
function zled_write()
|
||||
ws2812.write(myLedStrip)
|
||||
end
|
||||
|
||||
|
||||
RGB_clear()
|
||||
|
||||
--[[
|
||||
zled_rgb(1,255,0,0,1)
|
||||
zled_rgb(2,0,255,0,1)
|
||||
zled_rgb(2,0,255,0,0.05)
|
||||
zled_rgb(3,0,0,255,1)
|
||||
]]
|
||||