mqttbutton/mqttbutton.lua

88 lines
2.2 KiB
Lua

-- vim: set sw=4 ts=4 sts=4 et :
WIFI_TIMER_ID = 1
function gpiosetup()
local k, v
if (config.buttons ~= nil) then
for pin, payload in pairs(config.buttons) do
gpio.mode(pin, gpio.INT)
gpio.trig(pin, "down", function(level)
if (gpio.read(pin) == gpio.LOW) then
on_button_press(pin, payload)
end
end)
end
end
end
function mqttsetup()
if (mqtt_client == nil) then
mqtt_client = mqtt.Client(
config.mqtt.clientid,
config.mqtt.keepalive,
config.mqtt.user,
config.mqtt.pwd
)
mqtt_client:on("connect", on_mqtt_connected)
mqtt_client:on("offline", on_mqtt_disconnected)
end
mqtt_client:connect(config.mqtt.host)
end
function on_button_press(pin, payload)
print("Button pressed: " .. pin)
if (mqtt_client ~= nil) then
mqtt_client:publish(config.mqtt.topic, payload, 0, 0)
end
end
function on_mqtt_connected(client)
print("MQTT Connected")
end
function on_mqtt_disconnected(client)
print("MQTT Disconnected")
mqtt_client:close()
tmr.alarm(WIFI_TIMER_ID, 1000, 0, on_wifi_timer)
end
function on_wifi_connected()
mqttsetup()
end
function on_wifi_timer()
local status = wifi.sta.status()
if (status == 0) then -- Idle
wifi.sta.connect()
tmr.alarm(WIFI_TIMER_ID, 250, 0, on_wifi_timer)
elseif (status == 1) then -- Connecting
tmr.alarm(WIFI_TIMER_ID, 250, 0, on_wifi_timer)
elseif (status == 5) then -- Connected
local ip = wifi.sta.getip()
if (ip ~= nil) then
print("WiFi Connected: " .. wifi.sta.getip())
on_wifi_connected()
else
tmr.alarm(WIFI_TIMER_ID, 250, 0, on_wifi_timer)
end
else -- Error
print("WiFi Connection Error: " .. status)
tmr.alarm(WIFI_TIMER_ID, 1000, 0, on_wifi_timer)
end
end
function mqttbutton_main()
wifisetup()
gpiosetup()
end
function wifisetup()
if (wifi.getmode() ~= wifi.STATION) then
wifi.setmode(wifi.STATION)
end
wifi.sta.config(config.wifi.ssid, config.wifi.pwd)
tmr.alarm(WIFI_TIMER_ID, 250, 0, on_wifi_timer)
end