Aller au contenu

jang

Membres confirmés
  • Compteur de contenus

    196
  • Inscription

  • Dernière visite

Réputation sur la communauté

206 Excellent

2 abonnés

À propos de jang

  • Rang
    Membre passionné

Profile Information

  • Sexe :
    Homme
  • Ville :
    Home
  • Box
    Home Center 2
  • Version
    HC3

Visiteurs récents du profil

1 342 visualisations du profil
  1. jang

    Appeler une "function" de plusieurs scénarios

    The only problem is that hub.call can't return any value - to do this you need to add additional sorcery...
  2. jang

    vider une propriété de type tableau dans l'API

    Well, you have the tools, the rest is just some list manipulations... ;-) local days = { monday=0, tuesday=1, wednesday=2, thursday=3, friday=4, saturday=5, sunday=6 } local function map(list) local r ={} for _,e in ipairs(list) do assert(days[e],"Bad day:"..tostring(e)) r[e]=true end return r end local function flatten(list) local r ={} for e,_ in pairs(list) do assert(days[e],"Bad day:"..tostring(e)) r[#r+1]=e end table.sort(r,function(a,b) return days[a] <= days[b] end) return r end -- self:setSprinklerDays(4,{"monday",wednesday"}) -- will set scheduled days to monday and wednesday for sprinkler schedule 4 function QuickApp:setSprinklerDays(sprinkerId,list) return api.put("/panels/sprinklers/4" ,{ days = json.util.InitArray(flatten(map(list)))}) end -- self:addSprinklerDays(4,{"monday",wednesday"}) -- will add monday and wednesday to currently scheduled days for sprinkler schedule 4 function QuickApp:addSprinklerDays(sprinklerId,list) local days = map(api.get("/panels/sprinklers/"..sprinklerId).days or {}) for _,d in ipairs(list) do days[d]=true end return api.put("/panels/sprinklers/4" ,{ days = json.util.InitArray(flatten(days))}) end -- self:removeSprinklerDays(4,{"monday",wednesday"}) -- will remove monday and wednesday from currently scheduled days for sprinkler schedule 4 function QuickApp:removeSprinklerDays(sprinklerId,list) local days = map(api.get("/panels/sprinklers/"..sprinklerId).days or {}) for _,d in ipairs(list) do days[d]=nil end return api.put("/panels/sprinklers/4" ,{ days = json.util.InitArray(flatten(days))}) end function QuickApp : onInit () print(self:setSprinklerDays(4,{"monday","friday"})) print(self:addSprinklerDays(4,{"saturday"})) print(self:removeSprinklerDays(4,{"monday"})) end
  3. jang

    vider une propriété de type tableau dans l'API

    Btw, this is the json encoder/decoder used in QAs https://github.com/harningt/luajson/ (Scenes use another implementation)
  4. jang

    vider une propriété de type tableau dans l'API

    You could try local ListDay = json.util.InitArray({}) --<----- empty array MyPanel = api.get("/panels/sprinklers/11" ) res = api.put("/panels/sprinklers/11" , { days = ListDay })  The reason is that the json.encoder don't know if the Lua table {} should be encoded as an empty json key-value table "{}" or an empty json array "[]" The json.util.InitArray() function creates an object that the json.encoder always encodes as an array. Of course, the suggestion above only works if api.put uses the QAs built-in json.encode...
  5. jang

    Bug MAJ slider

    Yes, it's really buggy. Try to add function QuickApp : OnReleased ( event ) self : updateView ( "slider" , "value" , "75" ) -- Any other value than 25... self : updateView ( "slider" , "value" , "25" ) end
  6. jang

    os.clock vs os.time

    os.time gives seconds in absolute time since 1973... os.clock returns cpu timed used so far by the process (QA or Scene). When the QA starts the os.clock will return 0, and then start to count cpu time used. cpu time used is usually smaller then absolute time (over any measured time interval)
  7. jang

    Command Class Time Parameters

    ...it's kind of an mqtt mechanism between QAs... but with a much simpler api...
  8. jang

    Command Class Time Parameters

    Oh, finally someone discovered that function :-) Yes, it's really cool and quite efficient as the publisher only sends to subscribers actually subscribing on the event (source filtering). Also it works well with the fibaroExtra event mechanism that makes it easy to work with HC3 device and internal events.
  9. jang

    Tests d'utilisation de /api/refreshStates

    I wouldn't call it a mega optimization... If it would run million of times / sec I would agree... but not for 4 times per second... Of course it's not the monthly energy savings that are of importance here but to make sure we can complete the 4 calls per seconds and still do all other stuff... ...then 0.26 microseconds is more like a micro optimization... local n,t0=100000 a = { b = function() end } c = function() end local d = function() end print("----------") t0 = os.clock() for i=1,n do a.b() end local v0 = (os.clock()-t0)*1000 print(string.format("Time '%s' = %0.6f",'a',v0/n)) t0 = os.clock() for i=1,n do c() end local v1 = (os.clock()-t0)*1000 print(string.format("Time '%s' = %0.6f",'c',v1/n)) t0 = os.clock() for i=1,n do d() end local v2 = (os.clock()-t0)*1000 print(string.format("Time '%s' = %0.6f",'d',v2/n)) local save = (v0-v2)/n printf("Saving %0.6f milliseconds per call, using local fun vs global table fun",save) printf("Saving %0.3f seconds per month, using 4 calls / second",30*24*3600*4*save/1000) ...and the answer is [19.04.2023] [07:27:56] [DEBUG] [QUICKAPP1090]: Saving 0.000264 milliseconds per call, using local fun vs global table fun [19.04.2023] [07:27:56] [DEBUG] [QUICKAPP1090]: Saving 2.734 seconds per month, using 4 calls / second
  10. jang

    formattage os.date avec Time zone - ajout séparateur ":"

    Excessive typing can affect your health
  11. jang

    formattage os.date avec Time zone - ajout séparateur ":"

    print(os.date("%FT%T%z"):sub(1,-3)..":00") print(os.date("%FT%T%z",os.time()+24*3600):sub(1,-3)..":00") Assuming timezone offset always even hours.
  12. jang

    CURL Token en LUA

    You shouldn't encode response.data. It's already encoded. Just use decode. The '\n' is no problem. print("My_Json:" , response.data) local My_Json = json.decode ( response.data ) access_token = My_Json.access_token token_type = My_Json.token_type expires_in = My_Json.expires_in print ( "access_token:" , access_token ) print ( "token_type:" , token_type ) print ( "expires in:" , expires_in )
  13. jang

    Questions de débutant en Quick Apps sur HC3

    It's just to cater for a variable number of arguments in the provided table. Now it's just a table with an single url so it is kind of an overkill (and then we tuck on the success and error handlers at the end). By allowing join to take a function with unknown number of arguments we keep it generic and let the sendRequest deal with the number of args. Yes you need the count the number of calls and use that later to count down... because register is a key/value table you can't just use #register... I'm not sure how your 'registerscan' is implemented but I assume that the callback is called at success. Then I would add another callback for errors and implement it something like this local function scallAll(register) local n,finish=0 for _, register in pairs(register) do n=n+1 local cb = register.callback registerscan(registerNumber, function(res) cb(res) isFinished() end, -- success callback function(err) print("Err:",err) isFinished() end -- error callback ) end function isFinished() n=n-1 if n==0 then self:debug("Scan completed") end end end Yes, it's just a reuse of the name 'err'. The second err in "function(err) ..." shadows the previous definition. What's bother me now is that the code is buggy as the call to the builtin error function can't take two string error messages. The correct code would have been error(url..err)
  14. jang

    Questions de débutant en Quick Apps sur HC3

    Your debug at the end is a callback when all are done. see https://forum.fibaro.com/topic/42993-wait-until-httprequest-returns/?do=findComment&comment=181106
  15. jang

    string.gsub()

    '.' is a pattern that matches any character. To match against decimal point you need to escape it with a %, use '%.'. But if you just want to replace '.' with ',' and convert to a string just use if type(DeviceProperty) == "number" then DeviceProperty = tostring(DeviceProperty):gsub("%.",",") if debugD then self:trace("Device property = "..DeviceProperty) end end If you want it with a specific number of decimals do -- 2 decimals DeviceProperty = string.format("%.02f",1.0*DeviceProperty):gsub("%.",",")
×