From 8083a7274a99b04f2748ca8bbc900d372d506416 Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Sun, 24 Mar 2019 14:10:24 +0000 Subject: [PATCH] Initial commit --- .gitignore | 1 + .mqttbutton.lua.swp | Bin 0 -> 12288 bytes config.example.lua | 21 +++++++++++ init.lua | 12 ++++++ mqttbutton.lua | 87 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 121 insertions(+) create mode 100644 .gitignore create mode 100644 .mqttbutton.lua.swp 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/.mqttbutton.lua.swp b/.mqttbutton.lua.swp new file mode 100644 index 0000000000000000000000000000000000000000..d2cb8bd2b44782945e6ea9e7fdfd01fb22be2460 GIT binary patch literal 12288 zcmeI2zmFS56vw}bAYOa@BjQpZXa>`)CEvyu5-B?2BFQC^rQ}WtCMP5mYtK8r3|a4P zcE@L(KuG~r8Y;v;fP_*a1bvWbNF-7q3JPeU08t^73eC*UdTr;fh|&bjr||C1ykGO) zoAI5zJDuyjE99)Z1^~x_PmX^6{;~J)(%?4WPg2f8F>yFN@_aYmPom*uGzwUF%iRek zbXn()GI(-)oAaFs=TY(24JO{Qiosxb9!&UX^=u7qom%S%b8j}^AS9k1{4yJ6x2Aqv)(vmvj*-g3U4x@0yb{%zb)o{xEHYtw8Q@;hNr+o^P zFy-UOr;dDhr+=>B+uBqv*odgn-AtrK?sS!smLvQo4KbR8L(Za5&ZU%3Vy6XYPrEUT z^q}^tpL5OGi++Q#$HJn%wj($&Q)`{hfvFP22@AQ?+-8>;xe$dRRRLd2k|c?VHvycT@skFr)8hQa?G06%lIw>J=@iWDs1c_%YhPVJxj~D~EBbn= z*|l`B-1&CVliHM6!7yMn;-I(9xS2? z$o!c^A$ro4PwoZTmyYzaSiElW*qJ-$^?t}(zL?wMy?};=Txb@BG*Nh1)wPsHL@d6X z+=P0*=#Z8OT8>=a+Fm#?1#*ffY*)2Y(~qWMvrY8koPh4pV7^{bMSj1^4wR3*&HhYi z6eXf{^X4QhB(cYmRQI83}&1=-Z{K2ZnPtv1=4WnQ?>Ge7rt2I-PDV0D%3 ZvGF=dDJSW)dz$dHdzz&3lX9|-{{S`Q>g)gj literal 0 HcmV?d00001 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