#!/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 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") 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") 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/'..web_devid 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 "..web_iface end if web_user then command = command.." -u "..web_user..":"..web_pass end command = command.." \""..url.."\"" print(command) 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 mqtt_param = {} 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) mqtt_param[k]=v end mqtt_msg = { type=sensor_type, data=mqtt_param } if mqtt_client then serializedString = json.encode(mqtt_msg) mqtt_client:publish(mqtt_topic,serializedString) end end end getConfig() if mqtt_host then MQTT = require "paho.mqtt" mqtt_client = MQTT.client.create(mqtt_host, mqtt_port) mqtt_client:connect(mqtt_id) json = require( "json" ) end serialin=io.open(serial_port,"r") while 1 do line=serialin:read() print(line) processLine(line) end