diff --git a/lua/.nodemcutool b/lua/.nodemcutool new file mode 100644 index 0000000..361f6b5 --- /dev/null +++ b/lua/.nodemcutool @@ -0,0 +1,7 @@ +{ + "baudrate": "115200", + "port": "/dev/ttyUSB0", + "minify": false, + "compile": false, + "keeppath": false +} \ No newline at end of file diff --git a/lua/8-mosfet.lua b/lua/8-mosfet.lua new file mode 100644 index 0000000..e32eae2 --- /dev/null +++ b/lua/8-mosfet.lua @@ -0,0 +1,59 @@ +sda = 23 -- pins as on Adafruit Huzzah32 silkscreen +scl = 22 +id = i2c.HW0 -- hardware interface +speed = i2c.SLOW + +-- values for TCA9534A +i2c_addr = 0x3F + +-- initialize i2c software interface +i2c.setup(id, sda, scl, speed) + +port_input = 0x00 +port_output = 0x01 +reg_polarity = 0x02 +reg_config = 0x03 + +function write_reg(addr, reg, data, callback) + i2c.start(id) + i2c.address(id, dev_address, i2c.TRANSMITTER) + i2c.write(id, reg, data, true) + i2c.stop(id) + return i2c.transfer(id, callback, 5000) +end + +function read_reg(dev_address, dev_register, callback) + i2c.start(id) + i2c.address(id, dev_address, i2c.TRANSMITTER) + i2c.write(id, dev_register) + i2c.start(id) -- repeated start condition + i2c.address(id, dev_address, i2c.RECEIVER) + i2c.read(id, 1) + i2c.stop(id) + return i2c.transfer(id, callback, 5000) +end + +write_reg(i2c_addr, reg_config, 0x00, function(_,_) print("8-mosfet: reg_config done") end) + +function set_mosfet(value) + write_reg(i2c_addr, reg_config, value, function(_,a) + print("set mosfet") + end) +end + +mosfet_value = 0xFF +function publish_status(value) + mosfet_value = read_reg(i2c_addr, reg_output) + for i = 0,8 do + oskar_m:publish("/shannon/kontrol/relay/"..i, bit.band(bit.rshift(mosfet_value, i), 0x1), 0, 0) + end +end + +oskar_topichandle["/shannon/kontrol/relay"] = function (client, topic, data) + n = tonumber(string.sub(topic, -1)) + if n<8 and n>=0 then + if data then mosfet_value = bit.band(mosfet_value, bit.lshift(1, n)) + else mosfet_value = bit.bor(mosfet_value, bit.bnot(bit.lshift(1, n))) end + set_mosfet(mosfet_value) + end +end diff --git a/lua/Makefile b/lua/Makefile index 5e76781..8daf437 100644 --- a/lua/Makefile +++ b/lua/Makefile @@ -1,2 +1,5 @@ upload: init.lua luatool.py --ip 192.168.1.174:2323 -vd -f init.lua + +check: *.lua + ./../nodemcu-firmware-esp32/build/luac_cross/luac.cross -p $? && touch $@ diff --git a/lua/init.lua b/lua/init.lua index f535a58..f1ce3ad 100644 --- a/lua/init.lua +++ b/lua/init.lua @@ -7,6 +7,8 @@ end tryfile('display.lua') tryfile('wifi.lua') +tryfile('kontrol.lua') + function reload() tryfile('init.lua') end function ls() for k,v in pairs(file.list()) do print(k.."\t\tsize: "..v) end end diff --git a/lua/kontrol.lua b/lua/kontrol.lua new file mode 100644 index 0000000..72aac64 --- /dev/null +++ b/lua/kontrol.lua @@ -0,0 +1,10 @@ + + + +mqtt = tryfile("mqtt.lua") +fet8 = tryfile("8-mosfet.lua") + +mqtt:publish("/shannon/kontrol/status", "hello", 0, 0, function(client) print("sent hello") end) + + + diff --git a/lua/mqtt.lua b/lua/mqtt.lua index 319d5f7..2ba5ea5 100644 --- a/lua/mqtt.lua +++ b/lua/mqtt.lua @@ -1,29 +1,96 @@ +-- mqtt.lua +local M = {} -- public interface + +function M:on_connect(client, topic, message) + self.connected = true +end + +function M:on_offline(client, topic, message) + self.connected = false +end + +function M:on_message(client, topic, message) +end + +function M:on_newconnection() +end + +function M:subscribe(topic, qos) + self.subscriptions[topic] = qos + self.attempt_subscribes() +end + +function attmpet_subscribes() + + local uv_topic, uv_qos = next(self.subscriptions, nil) -- more upvals + + + local function subscribe_cb(client) + print("subscribed to topic", uv_topic) + uv_topic, uv_qos = next(uv_topics, uv_topic) + if uv_topic ~= nil and uv_qos ~= nil then + client:subscribe(uv_topic, uv_qos, subscribe_cb) + else + uv_cb(client) + end + end + + client:subscribe(uv_topic, uv_qos, subscribe_cb) +end -m = mqtt.Client(hostname, 120) +function M:connect(host, port) + self.m:connect(host, port, 0, + function(client) + self.connected = true + self.on_newconnection() + end, + function(client, reason) + print("mqtt "..name.." failed to connect: "..reason) + tmr.create():alarm(10*1000, tmr.ALARM_SINGLE, self.connect(host, port)) + end + ) +end -m:lwt("/lwt", "offline", 0, 0) +setmetatable( + M, { __call = function (cls, name) + local self = setmetatable({}, MyClass) + self.m = mqtt.Client(name, 120) + self.name = name + self.connected = false + self.m:on("connect", M.on_connect) + self.m:on("offline", M.on_offline) + self.m:on("message", M.on_message) + return self + end, +}) -m:on("connect", function(client) print ("connected") end) -m:on("offline", function(client) print ("offline") end) - - -m:on("message", function(client, topic, data) +oskar_m:lwt("/lwt", "offline", 0, 0) +oskar_m:on("connect", function(client) print ("connected") end) +oskar_m:on("offline", function(client) print ("offline") end) +oskar_topicsub = { + +} +oskar_topichandle = { + status=(function (client, topic, message) + print("Handle status") end), +} +oskar_m:on("message", function(client, topic, data) print("MQTT: msg recieved: "..topic) if data ~= nil then print(data) end + oskar_topichandle[topic](client,topic,message) end) -- for TLS: m:connect("192.168.11.118", secure-port, 1) -m:connect("departmentofinter.net", 1883, 0, function(client) +oskar_m:connect("172.105.7.171", 1883, 0, function(client) print("connected") -- Calling subscribe/publish only makes sense once the connection -- was successfully established. You can do that either here in the -- 'connect' callback or you need to otherwise make sure the -- connection was established (e.g. tracking connection status or in -- m:on("connect", function)). - -- subscribe topic with qos = 0 client:subscribe("/topic", 0, function(client) print("subscribe success") end) -- publish a message with data = hello, QoS = 0, retain = 0 @@ -33,5 +100,9 @@ function(client, reason) print("failed reason: " .. reason) end) -m:close(); --- you can call m:connect again + + + + + +return M