#!/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 \'\\\' | 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 nil msg_body=msg[2] or nil 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 nil value=recrd[2] or nil if value then if key=="TYPE" then sensor_type=value elseif key=="ID" then sensor_id=value else sensor[key]=value end end end 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 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 nil value=recrd[2] or nil if value then if key=="TYPE" then alarm_type=value elseif key=="ID" then alarm_id=value end end end 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 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