From 1d8bec95253ee8a88a85cb88be521f28b23504aa Mon Sep 17 00:00:00 2001
From: Trygve Laugstøl <trygvis@inamo.no>
Date: Fri, 2 Oct 2015 23:52:52 +0200
Subject: wip of serial commands to mqtt bridge.

---
 .gitignore            |  2 ++
 README.md             | 53 +++++++++++++++++++++++++++++++++++++
 mqtt-bridge/init.lua  |  4 +++
 mqtt-bridge/inter.lua | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++
 mqtt-bridge/main.lua  | 22 ++++++++++++++++
 mqtt-bridge/mq.lua    | 34 ++++++++++++++++++++++++
 mqtt-bridge/wlan.lua  | 18 +++++++++++++
 upload.sh             | 22 ++++++++++++++++
 8 files changed, 228 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 README.md
 create mode 100644 mqtt-bridge/init.lua
 create mode 100644 mqtt-bridge/inter.lua
 create mode 100644 mqtt-bridge/main.lua
 create mode 100644 mqtt-bridge/mq.lua
 create mode 100644 mqtt-bridge/wlan.lua
 create mode 100755 upload.sh

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..67b1caa
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+esptool
+nodemcu-uploader
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ca445c5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,53 @@
+# Installing `esptool`
+
+    $ git clone https://github.com/themadinventor/esptool.git
+    $ cd esptool
+    $ python setup.py install -local
+
+# NodeMCU Uploader
+
+This tool uploads the Lua files. Requires that the device is runnig the Lua firmware.
+
+    $ git clone https://github.com/kmpm/nodemcu-uploader.git
+    $ cd nodemcu-uploader
+
+https://github.com/nodemcu/nodemcu-firmware
+
+# Talking to the Lua firmware
+
+On unix Screen is a useful tool to talk to serial ports. Usage: 
+
+    $ screen <device> <baud rate>
+    
+    $ screen /dev/ttyUSB0 9600
+
+After starting screen and pressing reset you should get some output similar to this:
+
+    <��������������x�
+
+    NodeMCU 0.9.6 build 20150704  powered by Lua 5.1.4
+    lua: cannot open init.lua
+    > 
+
+The first garbage output is expected and is from the bootloader trying to autodetect the baud rate.
+
+# First Code
+
+Open screen and paste this code:
+
+    -- Get the current IP
+    ip = wifi.sta.getip()
+    -- This should print nil
+    print(ip)
+
+    -- Configure the device
+    wifi.setmode(wifi.STATION)    
+    wifi.sta.config("...", "...")
+
+    -- Now check that the IP is assigned. It might take some time so try again.
+    ip = wifi.sta.getip()
+    print(ip)
+
+# References
+
+ * [Lua API](https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en)
diff --git a/mqtt-bridge/init.lua b/mqtt-bridge/init.lua
new file mode 100644
index 0000000..0b29341
--- /dev/null
+++ b/mqtt-bridge/init.lua
@@ -0,0 +1,4 @@
+-- Upload this file if you want the bridge to autostart
+uart.setup(0, 115200, 8, 0, 1)
+
+require('main')
diff --git a/mqtt-bridge/inter.lua b/mqtt-bridge/inter.lua
new file mode 100644
index 0000000..eb64a98
--- /dev/null
+++ b/mqtt-bridge/inter.lua
@@ -0,0 +1,73 @@
+function inter_parse(line)
+  print("inter_parse: line="..line)
+
+  line = string.sub(line, 1, string.find(line, "\r"))
+
+  local cmd = nil;
+  local i = string.find(line, ":")
+  if i == nil then
+    print("inter_parse: invalid line: no command, line="..line)
+    return
+  end
+  local cmd = string.sub(line, 1, i - 1)
+  print("inter_parse: cmd="..cmd)
+
+  local args = {}
+  last = i+1
+  while i ~= nil do
+    local key
+    local value
+
+    i = string.find(line, " ", last)
+
+    arg = string.sub(line, last, i)
+    print("inter_parse: arg: "..arg)
+    j = string.find(arg, "=")
+    if j == nil then
+      key = arg
+      args[key] = true
+      print("inter_parse: key="..key.."=true")
+    else
+      key = string.sub(arg, 1, j-1)
+      value = string.sub(arg, j+1)
+      print("inter_parse: key="..key..", value="..value)
+    end
+    if i == nil then
+      break
+    end
+    last = i + 1
+  end
+
+  return cmd, args
+end
+
+local cb
+-- require('inter'); inter_init();
+-- cmd:abc=123 xyz=qwe woot
+function inter_on_line(line)
+  print("line:"..line)
+
+  local cmd, args = inter_parse(line)
+  if cmd == nil then
+    return
+  end
+
+--  print("cmd="..cmd)
+--  for k, v in pairs(args) do
+--    print(k.."="..tostring(v))
+--  end
+  if cb then
+    cb(cmd, args)
+  end
+end
+
+function inter_init(callback)
+  -- uart.setup(id, baud, databits, parity, stopbits, echo)
+  -- uart.setup(0, 115200, 8, 0, 1, 0)
+  -- uart.setup(0, 9600, 8, 0, 1, 0)
+  cb = callback
+
+  tmr.alarm(0, 1000, 0, function() print("still alive!"); end)
+  uart.on("data", "\r", inter_on_line, 0)
+  print("inter ready: callback.."..tostring(cb))
+end
diff --git a/mqtt-bridge/main.lua b/mqtt-bridge/main.lua
new file mode 100644
index 0000000..d8773cb
--- /dev/null
+++ b/mqtt-bridge/main.lua
@@ -0,0 +1,22 @@
+
+function on_cmd(cmd, args)
+  print("on_cmd: "..cmd)
+
+  mq_publish("cmd="..cmd)
+end
+
+function main()
+  require('wlan')
+  wlan_init()
+
+  local client_id = "esp8266-"..wifi.sta.getmac()
+  require('mq')
+  mq_init(client_id)
+
+  require('inter')
+  inter_init(on_cmd)
+
+  print("init done")
+end
+
+main()
diff --git a/mqtt-bridge/mq.lua b/mqtt-bridge/mq.lua
new file mode 100644
index 0000000..291bf01
--- /dev/null
+++ b/mqtt-bridge/mq.lua
@@ -0,0 +1,34 @@
+function mq_connected(con)
+  print("MQTT connected, con="..tostring(con))
+end
+
+function mq_disconnected(con)
+  print("MQTT disconnected, con="..tostring(con))
+end
+
+function mq_client_connected(con)
+  print("connected="..tostring(con))
+end
+
+local m
+local topic
+
+function mq_init(client_id)
+  print("MQTT: Configuring")
+
+  topic = "/esp8266/"..client_id
+
+  -- client id, keepalive, username, password
+  m = mqtt.Client(client_id, 120)
+  m:on("connect", mq_connected)
+
+  m:on("offline", mq_disconnected)
+  -- host, port, secure, auto_reconnect, function(client), ssl=8883
+  m:connect("trygvis.io", 1883, 0, 0, mq_client_connected)
+
+  print("MQTT: Configured")
+end 
+
+function mq_publish(payload)
+  m:publish(topic, payload, 0, 0)
+end
diff --git a/mqtt-bridge/wlan.lua b/mqtt-bridge/wlan.lua
new file mode 100644
index 0000000..03fd923
--- /dev/null
+++ b/mqtt-bridge/wlan.lua
@@ -0,0 +1,18 @@
+local function is_connected()
+  local ipAddr = wifi.sta.getip()
+  return ipAddr ~= nil and ipAddr ~= "0.0.0.0"
+end
+
+function wlan_init()
+  print("WLAN: Configuring")
+
+  wifi.setmode(wifi.STATION)
+  wifi.sta.config("", "")
+
+  repeat
+    tmr.wdclr()
+  until (is_connected())
+
+  local ip = wifi.sta.getip()
+  print("WLAN: Configured, ip="..ip)
+end
diff --git a/upload.sh b/upload.sh
new file mode 100755
index 0000000..be9e1be
--- /dev/null
+++ b/upload.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+set -e
+dir=$1; shift
+
+basedir=`pwd`
+cmd=()
+paths=()
+for path in `git status --porcelain "$dir"/*.lua|sed -n 's,^.M \(.*\),\1,p'`
+do
+  filename=`basename $path`
+  cmd+=("$path:$filename")
+  paths+=("$path")
+done
+
+if [[ ${#cmd[@]} -gt 0 ]]
+then
+  "$basedir/nodemcu-uploader/nodemcu-uploader.py" upload "${cmd[@]}"
+  git add "${paths[@]}"
+fi
+
+echo "require('main'); main();"
-- 
cgit v1.2.3