2017-02-01
L'objectif est d'inclure un commutateur Sonoff de ITEAD
utilisant le micrologiciel NodeMCU parmi les dispositifs contrôlés avec le logiciel de
domotique Domoticz. C'est la suite logique de deux textes :
Il faut modifier le script, sonoff_01.lua
de Michael Andresen (captain-slow.dk) qu'on avait
installé. Voici la nouvelle version, nommée
sonoff_02.lua
.
dofile('config.lua')
deviceID = 'sonoff_'..DomoticzIdx
topicToDomoticz = "domoticz/in"
topicFromDomoticz = "domoticz/out"
messageToDomoticz = '{ "idx" : %s, "nvalue" : %d }'
relayPin = 6
buttonPin = 3
mqttLed = 7
wifi.setmode(wifi.STATION)
wifi.sta.config (SSID, PSK)
gpio.mode(relayPin, gpio.OUTPUT)
gpio.write(relayPin, gpio.LOW)
buttonDebounce = 250
gpio.mode(buttonPin, gpio.INPUT, gpio.PULLUP)
gpio.mode(mqttLed, gpio.OUTPUT)
gpio.write(mqttLed, gpio.HIGH)
function mqttAct()
if (gpio.read(mqttLed) == 1) then gpio.write(mqttLed, gpio.HIGH) end
gpio.write(mqttLed, gpio.LOW)
tmr.alarm(5, 50, 0, function() gpio.write(mqttLed, gpio.HIGH) end)
end
m = mqtt.Client(deviceID, 180, mqttUser, mqttPass)
m:lwt("/lwt", deviceID, 0, 0)
m:on("offline", function(con)
ip = wifi.sta.getip()
print ("MQTT reconnecting to " .. mqttBroker .. " from " .. ip)
tmr.alarm(1, 10000, 0, function()
node.restart();
end)
end)
buttondebounced = 0
gpio.trig(buttonPin, "down",function (level)
if (buttondebounced == 0) then
buttondebounced = 1
tmr.alarm(6, buttonDebounce, 0, function() buttondebounced = 0; end)
if (gpio.read(relayPin) == 1) then
gpio.write(relayPin, gpio.LOW)
print("Was on, turning off")
else
gpio.write(relayPin, gpio.HIGH)
print("Was off, turning on")
end
mqttAct()
mqtt_update()
end
end)
function mqtt_update()
if (gpio.read(relayPin) == 0) then
n = 0
else
n = 1
end
msg = string.format(messageToDomoticz, DomoticzIdx, n)
print(topicToDomoticz..msg)
m:publish(topicToDomoticz, msg, 0, 0)
end
m:on("message",
function(conn, topic, data)
t = cjson.decode(data)
if tostring(t["idx"]) == DomoticzIdx then
nval = t["nvalue"]
if nval == nil then
nval = 0
end
print(topicFromDomoticz..'{ "idx" : '..DomoticzIdx..', "nvalue" : '..nval..' }')
mqttAct()
if (nval==1) then
print("Turning relay ON")
gpio.write(relayPin, gpio.HIGH)
elseif (nval==0) then
print("Turning realy OFF")
gpio.write(relayPin, gpio.LOW)
else
print("Invalid nvalue: "..nval)
end
end
end
)
function mqtt_sub()
mqttAct()
m:subscribe(topicFromDomoticz, 0, function(conn)
print("MQTT subscribed to ".. topicFromDomoticz)
end)
end
tmr.alarm(0, 1000, 1, function()
if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then
tmr.stop(0)
m:connect(mqttBroker, 1883, 0, function(conn)
gpio.write(mqttLed, gpio.HIGH)
print("MQTT connected to:" .. mqttBroker)
mqtt_sub()
end)
end
end)
Voici le fichier de configuration,
config.lua
, qui est invoqué au
début de sonoff_02.lua
. Ce fichier contient les seuls éléments devant
être modifiés.
SSID = "yourWiFiSSid"
PSK = "yourWiFiPassword"
mqttBroker = "192.168.1.30"
mqttUser = ""
mqttPass = ""
DomoticzIdx = "12"
Enfin voici le très court script init.lua
qui est automatiquement exécuté quand le ESP8266 est mis sous tension ou
lorsqu'il est remis à zéro.
dofile('sonoff_02.lua')
Il ne fait que lancer le script principal.
Initialement, on ne téléverse pas ce dernier fichier. On se contente de modifier
les paramètres dans config.lua
puis de téléverser les deux
scripts et d'exécuter sonoff_02.lua
michel@hp:~/Documents/test$ nodemcu-uploader upload init.lua
michel@hp:~/Documents/test$ nodemcu-uploader upload sonoff_02.lua
michel@hp:~/Documents/test$ nodemcu-uploader exec sonoff_02.lua
On peut alors tester avec
Domoticz que l'on peut
contrôler le relai du Sonoff avec le logiciel de domotique et que ce dernier
reflète l'état du commutateur lorsqu'on utilise l'interrupteur du Sonoff.
Lorsqu'on est satisfait des résultats avec le script sonoff_02.lua
,
on peut téléverser init.lua
et puis redémarrer le commutateur Sonoff
pour vérifier que tout fonctionne même après une remise sous tension.