Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

apifibaro [30.10.2017 10:24] (Version actuelle)
Steven Piccand créée
Ligne 1: Ligne 1:
 +Voici le code de Fibaro
  
 +<code lua>
 +HomeCenter = {
 +        PopupService = {
 +                publish = function(request)
 +                    local response = api.post('/​popups',​ request)
 +                    return response
 +                end
 +        },
 +        SystemService = {
 +            reboot = function()
 +              local client = net.HTTPClient()
 +              client:​request("​http://​localhost/​reboot.php"​)
 +            end,
 +            shutdown = function()
 +              local client = net.HTTPClient()
 +              client:​request("​http://​localhost/​shutdown.php"​)
 +            end
 +        }
 +}
 +
 +
 +fibaro = {}
 +
 +fibaro.debug = function(self,​ text)
 +  print(text)
 +end
 +
 +fibaro.sleep = function(self,​ time)
 +  __fibaroSleep(time)
 +end
 +
 +function __convertToString(value)
 +  if (type(value) == '​boolean'​) then
 +    if (value) then
 +      return '​1'​
 +    else
 +      return '​0'​
 +    end
 +  elseif (type(value) == '​number'​) then
 +    return tostring(value)
 +  elseif (type(value) == '​table'​) then
 +    return json.encode(value)
 +  end
 +
 +  return value
 +end
 +
 +function __assert_type(value,​ typeOfValue)
 +  if (type(value) ~= typeOfValue) then
 +    error("​Assertion failed: Expected " .. typeOfValue,​ 3)
 +  end
 +end
 +
 +function __fibaro_get_device(deviceID)
 +  __assert_type(deviceID,​ "​number"​)
 +  return api.get("/​devices/"​ .. deviceID)
 +end
 +
 +function __fibaro_get_room(roomID)
 +  __assert_type(roomID,​ "​number"​)
 +  return api.get("/​rooms/"​ .. roomID)
 +end
 +
 +function __fibaro_get_scene(sceneID)
 +  __assert_type(sceneID,​ "​number"​)
 +  return api.get("/​scenes/"​ .. sceneID)
 +end
 +
 +function __fibaro_get_global_variable(varName)
 +  __assert_type(varName,​ "​string"​)
 +  return api.get("/​globalVariables/"​ .. varName)
 +end
 +
 +function __fibaro_get_device_property(deviceId,​ propertyName)
 +  return api.get("/​devices/"​ .. deviceId .. "/​properties/"​ .. propertyName)
 +end
 +
 +--
 +-- getting device properties
 +-- 
 +fibaro.get = function(self,​ deviceID, propertyName)
 +  local property = __fibaro_get_device_property(deviceID,​ propertyName)
 +
 +  if (property == nil) then
 +  return nil
 +  end
 +
 +  return __convertToString(property.value),​ property.modified
 +end
 +
 +fibaro.getValue = function(self,​ deviceID, propertyName)
 +  local value = fibaro:​get(deviceID,​ propertyName)
 +  return value
 +end
 +
 +fibaro.getModificationTime = function(self,​ deviceID, propertyName)
 +  local _, modified = fibaro:​get(deviceID,​ propertyName)
 +  return modified
 +end
 +
 +--
 +-- global variables
 +--
 +fibaro.getGlobal = function(self,​ varName)
 +  local globalVar = __fibaro_get_global_variable(varName)
 +  if (globalVar == nil) then
 +    return nil
 +  end
 +
 +  return globalVar.value,​ globalVar.modified
 +end
 +
 +fibaro.getGlobalValue = function(self,​ varName)
 +  local globalVar = __fibaro_get_global_variable(varName)
 +  if (globalVar == nil) then
 +    return nil
 +  end
 +
 +  return globalVar.value
 +end
 +
 +fibaro.getGlobalModificationTime = function(self,​ varName)
 +  local globalVar = __fibaro_get_global_variable(varName)
 +  if (globalVar == nil) then
 +    return nil
 +  end
 +
 +  return globalVar.modified
 +end
 +
 +fibaro.setGlobal = function(self,​ varName, value)
 +  __assert_type(varName,​ "​string"​)
 +  local data = {["​value"​]=tostring(value),​ ["​invokeScenes"​]=true}
 +  api.put("/​globalVariables/"​ .. varName, data)
 +end
 +
 +--
 +-- scenes
 +--
 +fibaro.countScenes = function(self,​ sceneID)
 +  sceneID = sceneID or __fibaroSceneId
 +  ​
 +  local scene = __fibaro_get_scene(sceneID)
 +  if (scene == nil) then
 +  return 0
 +  end
 +
 +  return scene.runningInstances
 +end
 +
 +fibaro.isSceneEnabled = function(self,​ sceneID)
 +  local scene = __fibaro_get_scene(sceneID)
 +  if (scene == nil) then
 +    return nil
 +  end
 +
 +  local enabled
 +  if (scene.runConfig == "​TRIGGER_AND_MANUAL"​ or scene.runConfig == "​MANUAL_ONLY"​) then
 +    enabled = true
 +  else
 +    enabled = false
 +  end
 +
 +  return enabled
 +end
 +
 +fibaro.startScene = function(self,​ sceneID)
 +  api.post("/​scenes/"​ .. sceneID .. "/​action/​start"​)
 +end
 +
 +fibaro.killScenes = function(self,​ sceneID)
 +  api.post("/​scenes/"​ .. sceneID .. "/​action/​stop"​)
 +end
 +
 +fibaro.setSceneEnabled = function(self,​ sceneID, enabled)
 +  __assert_type(sceneID,​ "​number"​)
 +  __assert_type(enabled,​ "​boolean"​)
 +
 +  local runConfig
 +  if (enabled == true) then
 +    runConfig = "​TRIGGER_AND_MANUAL"​
 +  else
 +    runConfig = "​DISABLED"​
 +  end
 +
 +  local data = {
 +    id = sceneID, ​
 +    runConfig = runConfig
 +  }
 +  api.put("/​scenes/"​ .. sceneID, data)
 +end
 +
 +fibaro.getSceneRunConfig = function(self,​ sceneID)
 +  local scene = __fibaro_get_scene(sceneID)
 +  if (scene == nil) then
 +    return nil
 +  end
 +
 +  return scene.runConfig
 +end
 +
 +fibaro.setSceneRunConfig = function(self,​ sceneID, runConfig)
 +  __assert_type(sceneID,​ "​number"​)
 +  __assert_type(runConfig,​ "​string"​)
 +
 +  local data = {
 +    id = sceneID, ​
 +    runConfig = runConfig
 +  }
 +  api.put("/​scenes/"​ .. sceneID, data)
 +end
 +
 +--
 +-- other
 +-- 
 +fibaro.getRoomID = function(self,​ deviceID)
 +  local dev = __fibaro_get_device(deviceID)
 +  if (dev == nil) then
 +    return nil
 +  end
 +
 +  return dev.roomID
 +end
 +
 +fibaro.getSectionID = function(self,​ deviceID)
 +  local dev = __fibaro_get_device(deviceID)
 +  if (dev == nil) then
 +    return nil
 +  end
 +
 +  if (dev.roomID ~= 0) then
 +    return __fibaro_get_room(dev.roomID).sectionID
 +  end
 +  return 0
 +end
 +
 +fibaro.getType = function(self,​ deviceID)
 +  local dev = __fibaro_get_device(deviceID)
 +  if (dev == nil) then
 +    return nil
 +  end
 +
 +  return dev.type
 +end
 +
 +fibaro.abort = function(self)
 +  os.exit()
 +end
 +
 +fibaro.getSourceTrigger = function(self)
 +  return __fibaroSceneSourceTrigger
 +end
 +
 +fibaro.getSourceTriggerType = function(self)
 +  return __fibaroSceneSourceTrigger["​type"​]
 +end
 +
 +fibaro.calculateDistance = function(self,​ position1, position2)
 +  __assert_type(position1,​ "​string"​)
 +  __assert_type(position2,​ "​string"​)
 +  return __fibaroCalculateDistance(position1,​ position2)
 +end
 +
 +fibaro.call = function(self,​ deviceID, actionName, ...)
 +  deviceID = tonumber(deviceID)
 +  __assert_type(actionName,​ "​string"​)
 +  args=""​
 +  for i, v in ipairs({...}) do
 +    args = args .. '&​arg'​ .. tostring(i) .. '​='​ .. urlencode(tostring(v))
 +  end
 +  api.get("/​callAction?​deviceID="​ .. deviceID .. "&​name="​ .. actionName .. args)
 +end
 +
 +function urlencode(str)
 +   if (str) then
 +      str = string.gsub (str, "​([^%w])",​
 +         ​function (c) return string.format ("​%%%02X",​ string.byte(c)) end)
 +   end
 +   ​return str
 +end 
 +
 +fibaro.getName = function(self,​ deviceID)
 +  __assert_type(deviceID,​ '​number'​)
 +  local dev = __fibaro_get_device(deviceID)
 +  if (dev == nil) then
 +    return nil
 +  end
 +
 +  return dev.name
 +end
 +
 +fibaro.getRoomName = function(self,​ roomID)
 +  __assert_type(roomID,​ '​number'​)
 +  local room = __fibaro_get_room(roomID)
 +  if (room == nil) then
 +    return nil
 +  end
 +
 +  return room.name
 +end
 +
 +fibaro.getRoomNameByDeviceID = function(self,​ deviceID)
 +  __assert_type(deviceID,​ '​number'​)
 +  local dev = __fibaro_get_device(deviceID)
 +  if (dev == nil) then
 +    return nil
 +  end
 +
 +  local room = __fibaro_get_room(dev.roomID)
 +
 +  if (dev.roomID == 0) then
 +    return "​unassigned"​
 +  else
 +      if (room == nil) then
 +        return nil
 +      end
 +  end
 +
 +  return room.name
 +end
 +
 +fibaro.wakeUpDeadDevice = function(self,​ deviceID)
 +  __assert_type(deviceID,​ '​number'​)
 +  fibaro:​call(1,​ '​wakeUpDeadDevice',​ deviceID)
 +end
 +
 +--[[
 +Expected input:
 +{
 +  name: value, ​       //: require name to be equal to value
 +  properties: {       //:
 +    volume: "​nil", ​   //: require property volume to exist, any value
 +    ip: "​127.0.0.1" ​  //: require property ip to equal 127.0.0.1
 +  },
 +  interface: ifname ​  //: require device to have interface ifname
 +
 +}
 +]]--
 +fibaro.getDevicesId = function(self,​ filter)
 +    if type(filter) ~= '​table'​ or
 +        (type(filter) == '​table'​ and next(filter) == nil)
 +    then
 +        return fibaro:​getIds(fibaro:​getAllDeviceIds())
 +    end
 +
 +    local args = '/?'​
 +    for c, d in pairs(filter) do
 +        if c == '​properties'​ and d ~= nil and type(d) == '​table'​ then
 +            for a, b in pairs(d) do
 +                if b == "​nil"​ then
 +                    args = args .. '​property='​ .. tostring(a) .. '&'​
 +                else
 +                    args = args .. '​property=['​ .. tostring(a) .. ','​ .. tostring(b) .. '​]&'​
 +                end
 +            end
 +        elseif c == '​interfaces'​ and d ~= nil and type(d) == '​table'​ then
 +            for a, b in pairs(d) do
 +                args = args .. '​interface='​ .. tostring(b) .. '&'​
 +            end
 +        else
 +            args = args .. tostring(c) .. "​="​ .. tostring(d) .. '&'​
 +        end
 +    end
 +
 +    args = string.sub(args,​ 1, -2)
 +    return fibaro:​getIds(api.get('/​devices'​ .. args))
 +end
 +
 +fibaro.getAllDeviceIds = function(self)
 +    return api.get('/​devices/'​)
 +end
 +
 +fibaro.getIds = function(self,​ devices)
 +    local ids = {}
 +    for _, a in pairs(devices) do
 +        if a ~= nil and type(a) == '​table'​ and a['​id'​] ~= nil and a['​id'​] > 3 then
 +            table.insert(ids,​ a['​id'​])
 +        end
 +    end
 +    return ids
 +end
 +
 +</​code>​