-- relay.lua
CNAME="relay1" -- Client name
AMBIENT="home" -- Ambient name
STOPIC = AMBIENT.."/"..CNAME.."/status" -- Status topic
CTOPIC = AMBIENT.."/"..CNAME.."/command" --Command topic
MTOPIC = AMBIENT.."/"..CNAME.."/monitor" --Monitor topic
sleep_in_seconds= nil --Sleep in seconds
TUPDATE = 20 -- Time interval for update monitor in seconds
RPIN =1 -- Relay Pin
TGEN = 5 -- Time interval in seconds usend in various trm
gpio.mode(RPIN,gpio.OUTPUT) -- Set Relay pin mode
gpio.write(RPIN,gpio.LOW) -- Default output is OFF
-- Define Client Name and connection parameters
mqt = mqtt.Client(CNAME, 60, "", "", 1)
-- Subscribe to the topics and send status to the status topic
mqt:on("connect", function()
mqt:subscribe(STOPIC, MQTTQOS)
mqt:subscribe(CTOPIC, MQTTQOS)
mqt:subscribe(MTOPIC, MQTTQOS)
send_status("Relay ready again")
end )
-- Callback when mqtt is offline
mqt:on("offline", function() print("mqtt offline"); end)
--Callback to manage messages
mqt:on("message", function(client, topic, data)
manage_message(client, topic, data)
end)
-- Function to filter the messages
function manage_message(client, topic, data)
-- If CTOPIC: command topic
if topic == CTOPIC then
-- If the command is Restart
if data == "Restart" then
send_status("Restarting")
send_mstatus("Restarting")
tmr.alarm(2, TGEN*1000, tmr.ALARM_SINGLE, node.restart)
-- If the command is null
elseif data == nil then
send_status("Command not valid")
-- Command to turn on the Relay
elseif data == "ON" then
relay_on()
-- Command to turn off the Relay
elseif data == "OFF" then
relay_off()
-- Command to check the state of the Relay
elseif data == "Status" then
relay_status()
else
-- Check the Sleep command
i=string.len(data)
dato=string.sub(data,1,5)
if dato == "Sleep" then
ndato=string.sub(data,6)
TSLEEP=tonumber(ndato)
if TSLEEP ~= nil then
if TSLEEP >= 1 then
-- Sets the interval in seconds to sleep
sleep_in_seconds=TSLEEP*60
esp_sleep()
else
-- Send an error in Sleep command
send_status("Sleep command error")
end
else
-- Send an error in Sleep command
send_status("Sleep command error")
end
else
-- Command not managed
send_status("Command not valid")
end
end
end
end
-- Function to turn on the relay
function relay_on()
gpio.write(RPIN,gpio.HIGH)
send_status("Relay ON")
end
-- Function to turn off the relay
function relay_off()
gpio.write(RPIN,gpio.LOW)
send_status("Relay OFF")
end
-- Function to check if the the relay is on or off
function relay_status()
risultato=gpio.read(RPIN)
if(risultato==1) then
send_status("Relay ON")
elseif(risultato==0) then
send_status("Relay OFF")
end
end
-- Function to send messages to to STOPIC: status topic
function send_status(message)
mqt:publish(STOPIC, message, MQTTQOS, 0)
end
-- Fucntion to send messages to MTOPIC: monitor topic
function send_mstatus(message)
mqt:publish(MTOPIC, message, MQTTQOS, 0)
end
-- Function that sleeps esp8266
function esp_sleep()
send_status("Relay going to sleep now")
send_mstatus("Relay going to sleep now")
-- Delayd sleep to send the message above.
tmr.alarm(3, TGEN*1000, tmr.ALARM_SINGLE, function()
node.dsleep(sleep_in_seconds*1000000)
end)
end
-- Connection to the mqtt server at the msttport
mqt:connect(MQTTSERVER, MQTTPORT, 0, 1)
-- Send periodically a message to the monitor topic
tmr.alarm(4, TUPDATE*1000, tmr.ALARM_AUTO, function() send_mstatus("Relay Ready") end)