-#!/usr/bin/lua
-
-function getConfig()
-
- local uci=require("uci")
- local cur=uci.cursor()
- local config="weathermon"
-
- web_url = cur.get(config,"web","url")
- web_user = cur.get(config,"web","user")
- web_pass = cur.get(config,"web","password")
- web_devid = cur.get(config,"web","devid")
-
- web_iface = cur.get(config,"web","iface")
-
- if web_iface then
-
- command = '/sbin/ifconfig '..web_iface..' | grep \'\\<inet\\>\' | sed -n \'1p\' | tr -s \' \' | cut -d \' \' -f3 | cut -d \':\' -f2'
- f=io.popen(command,'r')
- ip_addr=f:read()
-
- end
-
- if not web_devid then
-
- if web_iface then
- io.input("/sys/class/net/"..web_iface.."/address")
- else
- io.input("/sys/class/net/eth0/address")
- end
-
- mac = io.read("*line")
- mac = mac:gsub(":","")
- mac = mac:upper()
-
- web_devid = mac
-
- end
-
- logging = cur.get(config,"logging","enabled")
-
- serial_port = cur.get(config,"serial","port")
- serial_baud = cur.get(config,"serial","baud")
-
- input_file = cur.get(config,"input","file")
- input_exec = cur.get(config,"input","exec")
- alarm_exec = cur.get(config,"alarm","exec")
-
- if serial_port then
-
- command = "stty -F "..serial_port.." "..serial_baud
- os.execute(command)
-
- end
-
- mqtt_host = cur.get(config,"mqtt","host")
- mqtt_port = cur.get(config,"mqtt","port")
- mqtt_id = cur.get(config,"mqtt","id")
- mqtt_topic = cur.get(config,"mqtt","topic")
- mqtt_alarm_topic = cur.get(config,"mqtt","alarm_topic")
-
- mqtt_user = cur.get(config,"mqtt","user")
- mqtt_passwd = cur.get(config,"mqtt","password")
-
- if mqtt_host and not mqtt_id then
- mqtt_id="weather-"..web_devid
- end
-
- if mqtt_host and not mqtt_port then
- mqtt_port = 1883
- end
-
- if mqtt_host and not mqtt_topic then
- mqtt_topic = 'weathermon/{dev}/{type}/{id}/{param}'
- end
-
- if mqtt_host and not mqtt_alarm_topic then
- mqtt_alarm_topic = 'alarm/{dev}/{type}/{id}'
- end
-
-end
-
-require "socket"
-
-function sleep(sec)
- socket.select(nil, nil, sec)
-end
-
-function splitStr(str,char)
-
- local res = {}
- local idx = 1
-
-
- while str:len()>0 do
- pos = str:find(char);
- if pos == nil then
- res[idx]=str
- str=""
- else
- res[idx]=str:sub(1,pos-1)
- idx=idx+1
- str=str:sub(pos+1)
- end
- end
-
- return res
-
-end
-
-function printLog(str)
- print(str)
- if logging=="on" then
- os.execute("logger -t weathermon "..str)
- end
-end
-
-function submitValue(type,id,param,val)
-
- url = web_url.."?stype="..type.."&sid="..id.."¶m="..param.."&value="..val
-
- command = "curl"
-
- if web_iface then
- command = command.." --interface "..ip_addr
- end
-
- if web_user then
- command = command.." -u "..web_user..":"..web_pass
- end
-
- command = command.." \""..url.."\""
-
- os.execute(command)
- print()
-
-end
-
-function processLine(str)
-
- msg=splitStr(line,':')
- msg_type=msg[1] or ''
- msg_body=msg[2] or ''
- if msg_type=="STATUS" then
- printLog("Status: "..msg_body)
- elseif msg_type=="ERROR" then
- printLog("Error: "..msg_body)
- elseif msg_type=="SENSOR" then
- printLog("SENSOR: "..msg_body)
- sens = splitStr(msg_body,",")
- sensor = {}
- idx = 1
- sensor_type = nil
- sensor_id = web_devid
- for i,rec in ipairs(sens) do
- recrd=splitStr(rec,'=')
- key=recrd[1] or ''
- value=recrd[2] or ''
- if value then
- if key=="TYPE" then
- sensor_type=value
- elseif key=="ID" then
- sensor_id=value
- else
- sensor[key]=value
- end
- end
- end
- if not (sensor_type==nil or sensor_id==nil or sensor_type=='' or sensor_id=='') then
- for k,v in pairs(sensor) do
- printLog("Type = "..sensor_type..", ID = "..sensor_id..", Param = "..k..", Value = "..v)
- submitValue(sensor_type,sensor_id,k,v)
- if mqtt_client then
- mqtt_path=string.gsub(mqtt_topic,"{(.-)}",
- function (name)
- if name=="dev" then
- return web_devid
- elseif name=="type" then
- return sensor_type
- elseif name=="id" then
- return sensor_id
- elseif name=="param" then
- return k
- else
- return '{'..name..'}'
- end
- end)
- mqtt_client:publish(mqtt_path,v)
- end
- end
- else
- printLog("Cannot parse sensor input: "..msg_body)
- end
- elseif msg_type=="ALARM" then
- printLog("ALARM: "..msg_body)
- sens = splitStr(msg_body,",")
- sensor = {}
- idx = 1
- sensor_type = nil
- sensor_id = web_devid
- mqtt_param = {}
- for i,rec in ipairs(sens) do
- recrd=splitStr(rec,'=')
- key=recrd[1] or ''
- value=recrd[2] or ''
- if value then
- if key=="TYPE" then
- alarm_type=value
- elseif key=="ID" then
- alarm_id=value
- end
- end
- end
- if not (alarm_type==nil or alarm_id==nil or alarm_type=='' or alarm_id=='') then
- if mqtt_client then
- mqtt_path=string.gsub(mqtt_alarm_topic,"{(.-)}",
- function (name)
- if name=="dev" then
- return web_devid
- elseif name=="type" then
- return sensor_type
- elseif name=="id" then
- return sensor_id
- else
- return '{'..name..'}'
- end
- end)
- mqtt_client:publish(mqtt_path,msg_body)
- end
- if alarm_exec then
- command=alarm_exec..
- " \""..string.gsub(alarm_type,"\"","\\\"")..
- "\" \""..string.gsub(alarm_id,"\"","\\\"")..
- "\" \""..string.gsub(msg_body,"\"","\\\"").."\""
- os.execute(command)
- end
- else
- printLog("Cannot parse alarm input: "..msg_body)
- end
- end
-
-end
-
-getConfig()
-
-if mqtt_host then
- MQTT = require "paho.mqtt"
- mqtt_client = MQTT.client.create(mqtt_host, mqtt_port)
- if mqtt_user then
- mqtt_client:auth(mqtt_user, mqtt_passwd)
- end
- mqtt_client:connect(mqtt_id)
- json = require( "json" )
-end
-
-if serial_port then
- serialin=io.open(serial_port,"r")
-elseif input_file == "-" then
- serialin=io.stdin;
-elseif input_file then
- serialin=io.open(input_file,"r")
-elseif input_exec then
- serialin=io.popen(input_exec,"r")
-else
- printLog("No input selected")
- return
-end
-while 1 do
- line=serialin:read()
- print(line)
- processLine(line)
-end
-