From 877bb0b0a0c133741d7ec87d63bd00c75274db1a Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Sun, 24 Mar 2019 14:12:01 +0000 Subject: [PATCH] Initial commit --- .gitignore | 1 + config.example.lua | 21 +++++++++++ init.lua | 12 +++++++ mqttbutton.lua | 87 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 121 insertions(+) create mode 100644 .gitignore create mode 100644 config.example.lua create mode 100644 init.lua create mode 100644 mqttbutton.lua diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..338c30b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +config.lua diff --git a/config.example.lua b/config.example.lua new file mode 100644 index 0000000..91219eb --- /dev/null +++ b/config.example.lua @@ -0,0 +1,21 @@ +-- vim: set sw=4 ts=4 sts=4 et : + +config = { + wifi = { + ssid = "homeassistant", + pwd = "somereallylongandsecurewpapassphrasehopefully" + }, + mqtt = { + host = "192.168.1.10", + clientid = "client1", + user = "homeassistant", + pwd = "mqttpassword", + keepalive = 120, + topic = "buttons/basement" + }, + buttons = { + [1] = "theatre_lights", + [2] = "main_basement_lights", + [7] = "office_lights" + } +} diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..a67dc7e --- /dev/null +++ b/init.lua @@ -0,0 +1,12 @@ +-- vim: set sw=4 ts=4 sts=4 et : + +function main() + dofile("config.lua") + dofile("mqttbutton.lua") + + mqttbutton_main() +end + +-- Wait 1 second before starting. If there is a bug that crashes the +-- microcontroller, this hopefully gives enough time to delete the program. +tmr.alarm(0, 1000, 0, main) diff --git a/mqttbutton.lua b/mqttbutton.lua new file mode 100644 index 0000000..757c318 --- /dev/null +++ b/mqttbutton.lua @@ -0,0 +1,87 @@ +-- 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") + client:close() + 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