Добавлена начальная поддержка MQTT
[weathermon.git] / weathermon.lua
1 #!/usr/bin/lua
2
3 function getConfig()
4
5   local uci=require("uci")
6   local cur=uci.cursor()
7   local config="weathermon"
8
9   web_url  = cur.get(config,"web","url")
10   web_user = cur.get(config,"web","user")
11   web_pass = cur.get(config,"web","password")
12   web_devid = cur.get(config,"web","devid")
13
14   web_iface = cur.get(config,"web","iface")
15
16   if not web_devid then
17   
18     if web_iface then
19       io.input("/sys/class/net/"..web_iface.."/address")
20     else
21       io.input("/sys/class/net/eth0/address")
22     end
23
24     mac = io.read("*line")
25     mac = mac:gsub(":","")
26     mac = mac:upper()
27
28     web_devid = mac
29
30   end
31
32   logging = cur.get(config,"logging","enabled") 
33
34   serial_port = cur.get(config,"serial","port")
35   serial_baud = cur.get(config,"serial","baud")
36
37   if serial_port then
38
39     command = "stty -F  "..serial_port.." "..serial_baud
40     os.execute(command)
41
42   end
43
44   mqtt_host = cur.get(config,"mqtt","host")
45   mqtt_port = cur.get(config,"mqtt","port")
46   mqtt_id = cur.get(config,"mqtt","id")
47   mqtt_topic = cur.get(config,"mqtt","topic")
48
49   if mqtt_host and not mqtt_id then
50     mqtt_id="weather-"..web_devid
51   end
52
53   if mqtt_host and not mqtt_port then
54     mqtt_port = 1883
55   end
56
57   if mqtt_host and not mqtt_topic then
58     mqtt_topic = 'weathermon/'..web_devid
59   end
60
61 end
62
63 require "socket"
64
65 function sleep(sec)
66   socket.select(nil, nil, sec)
67 end
68
69 function splitStr(str,char)
70
71   local res = {}
72   local idx = 1
73
74
75   while str:len()>0 do
76     pos = str:find(char); 
77     if pos == nil then
78       res[idx]=str
79       str=""
80     else
81       res[idx]=str:sub(1,pos-1)
82       idx=idx+1
83       str=str:sub(pos+1)
84     end
85   end
86
87   return res
88
89 end
90
91 function printLog(str)
92   print(str)
93   if logging=="on" then
94     os.execute("logger -t weathermon "..str)
95   end 
96 end
97
98 function submitValue(type,id,param,val)
99
100   url = web_url.."?stype="..type.."&sid="..id.."&param="..param.."&value="..val
101
102   command = "curl"
103
104   if web_iface then
105     command = command.." --interface "..web_iface
106   end
107
108   if web_user then
109     command = command.." -u "..web_user..":"..web_pass
110   end
111
112   command = command.." \""..url.."\""
113
114   print(command)
115   os.execute(command)
116   print("")
117
118 end
119
120 function processLine(str)
121
122   msg=splitStr(line,':')
123   msg_type=msg[1] or nil
124   msg_body=msg[2] or nil
125   if msg_type=="STATUS" then
126     printLog("Status: "..msg_body)
127   elseif msg_type=="ERROR" then
128     printLog("Error: "..msg_body)  
129   elseif msg_type=="SENSOR" then
130     printLog("SENSOR: "..msg_body)  
131     sens = splitStr(msg_body,",")
132     sensor = {}
133     idx = 1
134     sensor_type = nil
135     sensor_id = web_devid
136     for i,rec in ipairs(sens) do
137       recrd=splitStr(rec,'=')
138       key=recrd[1] or nil
139       value=recrd[2] or nil
140       if value then
141         if key=="TYPE" then
142           sensor_type=value
143         elseif key=="ID" then
144           sensor_id=value
145         else
146           sensor[key]=value
147         end
148       end
149     end
150     mqtt_param = {}
151     for k,v in pairs(sensor) do
152       printLog("Type = "..sensor_type..", ID = "..sensor_id..", Param = "..k..", Value = "..v)
153       submitValue(sensor_type,sensor_id,k,v)
154       mqtt_param[k]=v
155     end
156     mqtt_msg = { type=sensor_type, data=mqtt_param }
157     if mqtt_client then
158       serializedString = json.encode(mqtt_msg)
159       mqtt_client:publish(mqtt_topic,serializedString)
160     end
161   end
162
163 end
164
165 getConfig()
166
167 if mqtt_host then
168   MQTT = require "paho.mqtt"
169   mqtt_client = MQTT.client.create(mqtt_host, mqtt_port)
170   mqtt_client:connect(mqtt_id)
171   json = require( "json" )
172 end
173
174 serialin=io.open(serial_port,"r")
175 while 1 do
176   line=serialin:read()
177   print(line)
178   processLine(line)
179 end