从json-list

时间:2017-07-31 11:32:33

标签: json lua timeout extraction

在我的系统中,来自json-call http://192.168.1.6:8080/json.htm?type=devices&rid=89我得到了下面的输出。

{
   "ActTime" : 1501360852,
   "ServerTime" : "2017-07-29 22:40:52",
   "Sunrise" : "05:50",
   "Sunset" : "21:28",
   "result" : [
      {
         "AddjMulti" : 1.0,
         "AddjMulti2" : 1.0,
         "AddjValue" : 0.0,
         "AddjValue2" : 0.0,
         "BatteryLevel" : 255,
         "CustomImage" : 0,
         "Data" : "73 Lux",
         "Description" : "",
         "Favorite" : 1,
         "HardwareID" : 4,
         "HardwareName" : "Dummies",
         "HardwareType" : "Dummy (Does nothing, use for virtual switches only)",
         "HardwareTypeVal" : 15,
         "HaveTimeout" : true,
         "ID" : "82089",
         "LastUpdate" : "2017-07-29 21:16:22",
         "Name" : "ESP8266C_Licht1",
         "Notifications" : "false",
         "PlanID" : "0",
         "PlanIDs" : [ 0 ],
         "Protected" : false,
         "ShowNotifications" : true,
         "SignalLevel" : "-",
         "SubType" : "Lux",
         "Timers" : "false",
         "Type" : "Lux",
         "TypeImg" : "lux",
         "Unit" : 1,
         "Used" : 1,
         "XOffset" : "0",
         "YOffset" : "0",
         "idx" : "89"
      }
   ],
   "status" : "OK",
   "title" : "Devices"
}

通过以下脚本时间lua脚本“自动化”此类调用旨在提取特定信息,以便在应用程序中进一步使用。

前11行没有问题,但进一步提取信息是一个问题。

我已经尝试了各种脚本线来获得A),B),C),D)和E)的解决方案,但是他们要么生成错误报告,要么他们没有给出结果:请参阅下面的进一步说明'最好的'试验 - 脚本和相关结果。

为了避免误解:在A),B),C),D)和E)这个问题下面的脚本中的那些虚线注释行仅描述了所需的动作/功能并且在没有方式意味着脚本线!

问题:

在本邮件末尾的试验内容中,以A)到E)的更好的适用脚本形式请求帮助,或提示在哪里找到适用的示例脚本。

-- Lua-script to determine staleness, time-out and value for data from Json-call
print('Start of Timeout-script')
commandArray = {}
TimeOutLimit = 10  -- Allowed timeout in seconds
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
--  json = (loadfile "D:\\Domoticz\\scripts\\lua\\json.lua")()  -- For Windows
-- Line 07
   local content=assert(io.popen('curl "http://192.168.1.6:8080/json.htm?type=devices&rid=89"')) -- notice double quotes
   local list = content:read('*all')
   content:close()
   local jsonList = json:decode(list)
-- Line 12 Next scriptlines describe desired actions 
-- A) Extract ServerTime as numeric value (not as string)
-- B) Extract LastUpdate as numeric value (not as string)
--  Staleness = ServerTime - LastUpdate
-- C) Extract HaveTimeout as boolean (not as string)
--  If HaveTimeout and (Staleness > TimeOutlimit) then
--       Print('TimeOutLimit exceeded by ' .. (Staleness - TimeOutLimit) .. 'seconds')
--  End
-- D) Extract textstring from Type or Data
-- E) Extract numeric value from Data
print('End of Timeout-script')
return commandArray

对于第11行等,以下试用脚本行给出了“最佳”结果(=无错误):

-- Line 11
--       local Servertime = json:decode(ServerTime)
--       print('Servertime   :  '..Servertime)
-- Line 14
--       CheckTimeOut =jsonValue.result[1].HaveTimeout -- value from "HaveTimeout", inside "result" bloc number 1 (even if it's the only one)
       CurrentServerTime =jsonValue.Servertime -- value from "ServerTime"
       CurrentLastUpdate = jsonValue.result[1].LastUpdate
       CurrentData = jsonValue.result[1].Data
-- Line 19
       print('TimeOut      : '..CheckTimeOut)
       print('Servertime   : '..CurrentServerTime)
       print('LastUpdate   : '..CurrentLastUpdate)
       print('Data-content : '..CurrentData)
print('End of Timeout-script')
return commandArray

结果:

在第12行和第13行之前没有破折号,分别为15,然后出现以下错误报告:

660: nil passed to JSON:decode()

lua:15: attempt to index global 'jsonValue' (a nil value)

在第12行,第13行和第15行之前使用破折号显示上面显示的试用脚本行,根据日志没有错误存在(如2张打印所示)

2017-07-31 16:30:02.520 LUA: Start of Timeout-script
2017-07-31 16:30:02.563 LUA: End of Timeout-script 

但为什么没有打印结果从第20行到第23行? 没有那些打印结果使得很难确定数据提取的后续步骤,以实现A)到E)中描述的目标。

;-)错误报告通常比“没有错误,但没有结果”更有用的信息

1 个答案:

答案 0 :(得分:0)

无需通过网络下载内容,工作脚本如下所示:

local json = require("json")
    local jj = [[
{
   "ActTime" : 1501360852,
   "ServerTime" : "2017-07-29 22:40:52",
   "Sunrise" : "05:50",
   "Sunset" : "21:28",
   "result" : [
      {
         "AddjMulti" : 1.0,
         "AddjMulti2" : 1.0,
         "AddjValue" : 0.0,
         "AddjValue2" : 0.0,
         "BatteryLevel" : 255,
         "CustomImage" : 0,
         "Data" : "73 Lux",
         "Description" : "",
         "Favorite" : 1,
         "HardwareID" : 4,
         "HardwareName" : "Dummies",
         "HardwareType" : "Dummy (Does nothing, use for virtual switches only)",
         "HardwareTypeVal" : 15,
         "HaveTimeout" : true,
         "ID" : "82089",
         "LastUpdate" : "2017-07-29 21:16:22",
         "Name" : "ESP8266C_Licht1",
         "Notifications" : "false",
         "PlanID" : "0",
         "PlanIDs" : [ 0 ],
         "Protected" : false,
         "ShowNotifications" : true,
         "SignalLevel" : "-",
         "SubType" : "Lux",
         "Timers" : "false",
         "Type" : "Lux",
         "TypeImg" : "lux",
         "Unit" : 1,
         "Used" : 1,
         "XOffset" : "0",
         "YOffset" : "0",
         "idx" : "89"
      }
   ],
   "status" : "OK",
   "title" : "Devices"
}
]]
    print('Start of Timeout-script')

    local jsonValue = json.decode(jj)
    CheckTimeOut =jsonValue.result[1].HaveTimeout 
    CurrentServerTime =jsonValue.Servertime
    CurrentLastUpdate = jsonValue.result[1].LastUpdate
    CurrentData = jsonValue.result[1].Data
    print('TimeOut      : '.. (CheckTimeOut and "true" or "false") )
    print('Servertime   : '.. (CurrentServerTime or "nil") )
    print('LastUpdate   : '.. (CurrentLastUpdate or "nil") )
    print('Data-content : '.. (CurrentData or "nil") )
    print('End of Timeout-script')

结果:

Start of Timeout-script
TimeOut      : true
Servertime   : nil
LastUpdate   : 2017-07-29 21:16:22
Data-content : 73 Lux
End of Timeout-script