如何使用Lua将表格中的值保存到变量中?

我正在使用Fibaro HC2改善我的家庭自动化。

建筑物被分成几个部分,我想创建一个包含每个部分名称的设备列表。使用Fibaro API时,我仅获得部分ID而不是名称。使用json.encode,我获得了此表格的内容:

[
   {
      "Id":4,
      "sortOrder":3,
      "name":"地下室"
   },
   {
      "id":5,
      "sortOrder":2,
      "name":"一楼"
   },
   {
      "id":6,
      "sortOrder":4,
      "name":"二楼"
   },
   {
      "id":7,
      "sortOrder":1,
      "name":"室外"
   }
]

sortOrder不重要。我做了什么:

local jS = json.encode (sections)
for i = 1, #sections do
    local jS = json.encode (sections [i])
    s = string.gsub (jS, ', "sortOrder":% d', "")
    print (s)
end

这是输出:

{ "Id": 4, "name": "地下室"}
{ "Id": 5, "name": "一楼"}
{ "Id": 6, "name": "二楼"}
{ "Id": 7, "name": "室外"}

我不知道这是否有意义。我想要一个将名称存储在变量中的函数:

function getSectionNamebyID (secID)
    if secId == "4" then sectionname = "地下室" end
    if secId == "5" then sectionname = "一楼" end
    --...
    return sectionname
end
点赞
用户484145
用户484145

一个非常不错的教程,讲述了如何在Fibaro中读取所有设备等信息,并将该信息表存储为全局变量中的json字符串值。

最有趣的部分是作为lua场景在Fibaro中实现的脚本。只需创建一个名为“HomeTable”的全局变量,并手动运行场景即可将所有设备/场景等存储在一个变量中:

--[[
%% autostart
%% properties
%% events
%% globals
--]]

local debug = true --设置为false停止调试信息

-- 任何附加到设备,VD,iOS设备之外的主页表
-- 根据需要编辑或保留为空白:jsonHome = {}
jsonHome = {

    scene = {
        HueSceneStart = 43,
        AlexaSceneStart = 67,
    },

    users = {
        --admin = 2,frank = 1564,sylvia = 1565
    },
}

--下面无需用户编辑

local function log(str) if debug then fibaro:debug(str);end; end

devices = fibaro:getDevicesId({visible = true,enabled = true})-获取所有可见和已启用设备的列表
log("Fill hometable with "..#devices.." devices")

--使用所有VD,设备和iOS设备填充主页表
for k,i in ipairs(devices) do
    deviceName = string.gsub(fibaro:getName(i),"%s+","")-消除设备名称中的空格

    -取消此注释以消除设备名称中的所有非字母数字字符
    - deviceName = string.gsub(fibaro:getName(i),“%W”,“”)

    if fibaro:getType(i) ==“virtual_device ”then - 将VD添加到Hometable
        if jsonHome.VD == nil then - 将VD添加到表中
            jsonHome.VD = {}
        end
        jsonHome.VD [deviceName] = i
        log("i ="..i ..“,type =”..fibaro:getType(i)..“,device =”..deviceName)
    else if fibaro:getType(i) ==“iOS_device ”then - 将iOS设备添加到Hometable
        if jsonHome.devices == nil then - 将iOS设备添加到表中
            jsonHome.devices = {}
        end
        jsonHome.devices [deviceName] = i
        log("i ="..i ..“,type =”..fibaro:getType(i)..“,device =”..deviceName)
    否则 - 将所有其他设备添加到表中
        roomID = fibaro:getRoomID(i)
        如果roomID == 0 then
            roomname = "Unallocated"
        other
            roomname = string.gsub(fibaro:getRoomName(roomID),"%s+","")--消除房间名称中的空格
            -取消此注释以消除房间名称中的所有非字母数字字符
            -roomname = string.gsub(fibaro:getRoomName(roomID),“%W”,"")
        end
        if jsonHome [roomname] == nil then - 添加房间到表中
            jsonHome [roomname] = {}
        end
        jsonHome [roomname] [deviceName] = i
        log("i ="..i ..“,type =”..fibaro:getType(i)..“,device =”..deviceName ..“,room =”..roomname)
    end
  end

jHomeTable = json.encode(jsonHome) - 存储数据之前将其编码为JSON格式
fibaro:setGlobal(“HomeTable”,jHomeTable) - 这将数据存储在变量中
log("global jTable created:") - 显示消息的标准调试行
log(jHomeTable)

运行之后,您可以按以下示例使用它。在我的情况下,房间名称为“Workingroom”,设备名称为“Shutter”:

--[[
%% properties
%% events
%% globals
--]]

local ht = json.decode(fibaro:getGlobalValue(“HomeTable”))
fibaro:call(ht.Workingroom.Shutter,“open”)
2021-01-04 14:43:44