Дописана обработка сбойных данных на входе программы
[weathermon.git] / weathermon.lua
index b2ca89897c47834c7bc6a93d8c71f0131f13c3ef..f2b584b90ad777ba20dedf3951bfb5a26d978e7f 100755 (executable)
@@ -139,8 +139,8 @@ end
 function processLine(str)
 
   msg=splitStr(line,':')
-  msg_type=msg[1] or nil
-  msg_body=msg[2] or nil
+  msg_type=msg[1] or ''
+  msg_body=msg[2] or ''
   if msg_type=="STATUS" then
     printLog("Status: "..msg_body)
   elseif msg_type=="ERROR" then
@@ -154,8 +154,8 @@ function processLine(str)
     sensor_id = web_devid
     for i,rec in ipairs(sens) do
       recrd=splitStr(rec,'=')
-      key=recrd[1] or nil
-      value=recrd[2] or nil
+      key=recrd[1] or ''
+      value=recrd[2] or ''
       if value then
         if key=="TYPE" then
           sensor_type=value
@@ -166,26 +166,30 @@ function processLine(str)
         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  
+    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)  
@@ -197,8 +201,8 @@ function processLine(str)
     mqtt_param = {}
     for i,rec in ipairs(sens) do
       recrd=splitStr(rec,'=')
-      key=recrd[1] or nil
-      value=recrd[2] or nil
+      key=recrd[1] or ''
+      value=recrd[2] or ''
       if value then
         if key=="TYPE" then
           alarm_type=value
@@ -207,27 +211,31 @@ function processLine(str)
         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)
+    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
 
@@ -262,3 +270,4 @@ while 1 do
   print(line)
   processLine(line)
 end
+