L'idée est de pouvoir indiquer avec un ESP8266 à mes jeunes enfants qu'il a beau faire jour dehors en ce mois de Juin, ce n'est pas l'heure de venir réveiller leurs pauvres parents en manque de sommeil.

Je ne suis pas le premier à avoir eu la même idée de père fatigué, puisqu'en cherchant un peu je suis tombé sur l'excellent blog de Dani Eichhorn.

Son billet explique qu'il fait une connection HTTP à intervalle régulier, afin de récupérer l'heure sur Internet, puis allume une LED ou une autre suivant qu'il est l'heure de se lever ou non.

Cependant, j'avais imaginé une autre façon de procéder, donc je suis resté sur ma première idée qui a "l'inconvénient" d'utiliser mon Rasp à tout faire sur le réseau local, mais l'avantage de pouvoir changer l'heure de "réveil" sans avoir à modifier le script sur l'ESP8266. Et puis c'est plus sympa d'essayer de faire à sa sauce.

L'idée est la suivante:
- L'ESP8266 faire tourner les serviettes un petit serveur HTTP.
- S'il recoit une requête "jour", il allume la LED verte
- S'il recoit une requête "nuit", il allume la LED rouge "laisse tes parents dormir, ils ne se couchent pas à 20h30 eux ! ".
- Le Rasp sur le réseau local exécute le script toutes les minutes, regarde l'heure, et en fonction, envoi la requête HTTP "jour" ou "nuit" à l'ESP 8266.
- Il y a en réalité 2 scripts dans la cron du Rasp, un qui s'exécute les jours de la semaine, et un autre le WE. L'heure de l'allumage "jour" est donc reglé plus tardivement le WE.
- Une page web pourrait éventuellement être créée à l'avenir sur le Rasp pour que Madame Yop puisse elle même changer l'heure avec un navigateur... sans aller modifier le Rasp en SSH... (WAF) Mais avant cela, faudrait d'abord voir si les 2 loustics vont bien vouloir suivre les indications des LEDs...

Tests sur Breadboard:

esp-led-verte.jpg

esp-led-rouge.jpg

On soude un peu et on range tout çà:

esp-led-boitier1.jpg

esp-led-boitier2.jpg

Schéma

esp-led-schema.png

Scripts

init.lua
wifi.setmode(wifi.STATION)
wifi.sta.config("SSID","Password")
wifi.sta.connect()
wifi.sta.setip({ip="192.168.1.247",netmask="255.255.255.0",gateway="192.168.1.1"})
print("ESP8266 mode is: " .. wifi.getmode())
print("The module MAC address is: " .. wifi.ap.getmac())
print("Config done, IP is "..wifi.sta.getip())
dofile("jour-nuit.lua")@@

J'ai récupéré le code suivant sur un github, mais je ne retouve pas lequel...

jour-nuit.lua
-- Relay pin as output
gpio.mode(5, gpio.OUTPUT)
gpio.mode(6, gpio.OUTPUT)

-- Include url_parser module
local parser = require "url_parser"

-- Create server
srv=net.createServer(net.TCP) 

srv:listen(80,function(conn) 
  conn:on("receive",function(conn,payload) 
    
    -- Parse request
    parsed_request = parser.parse(payload)

    if parsed_request == 'jour' then gpio.write(6, gpio.LOW) gpio.write(5, gpio.HIGH) end
    if parsed_request == 'nuit' then gpio.write(5, gpio.LOW) gpio.write(6, gpio.HIGH) end

    -- Display main page
    conn:send("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n")
    conn:send('<head>')
    conn:send('<meta name="viewport" content="width=device-width, initial-scale=1">')
    conn:send('<script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>')
    conn:send('<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">')
    conn:send('</head>')
    
    conn:send('<div class="container">')
    conn:send("<h1>Control Sommeil</h1>")
    conn:send('<div class="row">')
    
    conn:send('<div class="col-md-2"><input class="btn btn-block btn-lg btn-primary" type="button" value="Jour" onclick="jour()"></div>')
    conn:send('<div class="col-md-2"><input class="btn btn-block btn-lg btn-danger" type="button" value="Nuit" onclick="nuit()"></div>')

    conn:send('</div></div>')
    
    conn:send('<script>function jour() {$.get("/jour");}</script>')
    conn:send('<script>function nuit() {$.get("/nuit");}</script>')
  end) 
  conn:on("sent",function(conn) conn:close() end)
end)@@
url_parser.lua
-- Module declaration
local parser = {}

function parser.parse(request)

     -- Find start
     local e = string.find(request, "/")
     local request_handle = string.sub(request, e + 1)
     
     -- Cut end
     e = string.find(request_handle, "HTTP")
     request_handle = string.sub(request_handle, 0, (e-2))

     return request_handle

end

return parser
jour-nuit.sh sur le Rasp
 
#!/bin/bash
# Control de la LED pour jour/nuit enfants

LEVER="0720"
COUCHER="2030"

IP="192.168.1.247"
CUR_TIME=`date +%H%M`

if [ $CUR_TIME -ge $LEVER -a $CUR_TIME -le $COUCHER ]
    then 
        echo "Jour"
	curl http://$IP/jour > /dev/null 2>&1
    else
        echo "Nuit"
	curl http://$IP/nuit > /dev/null 2>&1
fi

Le résultat final

ou presque (manque les autocollants de Spiderman et de la Reine de Neige)

esp-led-end.jpg

Evolutions possibles futures

(ou pas) dépendra surtout si les bambins suivent les indications des LEDs:

- Serveur web de configuration de l'heure
- Ajout d'une sonde de température ds18b20
- Utilisation du mode "veille" / utilisation sur batterie