Jump to content

Welcome to Smart Home Forum by FIBARO

Dear Guest,

 

as you can notice parts of Smart Home Forum by FIBARO is not available for you. You have to register in order to view all content and post in our community. Don't worry! Registration is a simple free process that requires minimal information for you to sign up. Become a part of of Smart Home Forum by FIBARO by creating an account.

 

As a member you can:

  •     Start new topics and reply to others
  •     Follow topics and users to get email updates
  •     Get your own profile page and make new friends
  •     Send personal messages
  •     ... and learn a lot about our system!

 

Regards,

Smart Home Forum by FIBARO Team


Search the Community

Showing results for tags 'lua'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • FIBARO Community
    • FIBARO Portal and Forum policy
    • FIBARO
    • Say hello!
    • Off-topics
  • FIBARO Update
    • FIBARO System Update
    • FIBARO Mobile Update
  • FIBARO Community Support
    • Scenes and Interface
    • FIBARO Products
    • FIBARO Mobile
    • FIBARO HomeKit
    • FIBARO Assistant Integrations
    • Other Devices / Third-party devices
    • Tutorials and Guides
    • Home Automation
    • Suggestions
  • FIBARO Społeczność
    • FIBARO
    • Przywitaj się!
    • Off-topic
  • FIBARO Aktualizacja
    • FIBARO System Aktualizacja
    • FIBARO Mobile Aktualizacja
  • FIBARO Wsparcie Społeczności
    • Sceny i Interfejs
    • FIBARO Urządzenia
    • FIBARO Mobilnie
    • FIBARO HomeKit
    • Integracja z Amazon Alexa i Google Home
    • Urządzenia Firm Trzecich
    • Poradniki
    • Automatyka Domowa
    • Sugestie

Categories

  • Scenes
  • Virtual Devices
  • Quick Apps
  • Icons

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Facebook


Google+


Skype


Website URL


WhatsApp


Country


Gateway/s


Interests

  1. Hi I have to understand the Quick app HC2 code to make the same app to HC3. This Quick App control Multiroom AMCP MR4.50-XT - 4 Zones with Itach RS232 Serial Interface. I do not understand where in the LUA Code call function like above: local ID_VD = fibaro:getSelfId() fibaro:call(ID_VD, "pressButton", "6") fibaro:sleep(600) fibaro:call(ID_VD, "pressButton", "16") fibaro:sleep(600) fibaro:call(ID_VD, "pressButton", "26") fibaro:sleep(600) fibaro:call(ID_VD, "pressButton", "36") fibaro:sleep(300) Where I need to looking for some information about this code? MULTIROOM.vfib
  2. Hi. I'm an experienced programmer, but a novice in LUA. 1. I have some qubino smart meters, and would like (of course) to read all the parameters they can provide. It seems to me that every single parameter in them get an ID in HC2. When I want one of the values, i use fibaro:getValue(63,'value'); But: For some of the parameters there are no ID's! So how can I get their values? Examples of missing parameters are 143: Reactive power total and 144: Power factor total How can I get to those? 2. Is there a way to get parameters based on the device parameter numbers? I'd like to use some function v=fibaro:getParameter(main id,parameter number); Is this possible? 3. Where can I find a list of legal parameter values to the getValue call? Helgemor
  3. Hello Forum members, I am a Newbie on Fibaro HC2 / LUA and struggling with my next project: I have a Hydrawise Irrigation Controller (sister company of Hunter). This controller is already smart and adjusting the irrigation schedule based on weather data via WUnderground. My plan is to track the status of each zone in HC2 and switch the pump (wall plug) on and off. API key is available and the connection is working on browser and in LUA code. I can run and stop specific irrigation zones via code but I do not know how to get the datastring into HC2 variables. start relay 485761 / zone 3 for 600 seconds: local http = net.HTTPClient() http:request('https://api.hydrawise.com/api/v1/setzone.php?action=run&api_key=XXXXXX&period_id=999&relay_id=485761&custom=600') stop same relay: http:request('https://api.hydrawise.com/api/v1/setzone.php?action=stop&api_key=XXXXXXX&relay_id=485761') Both is working and I can see the effect on the Hydrawise controller. code for the statusschedule: https://api.hydrawise.com/api/v1/statusschedule.php?api_key=XXXXXXXXX I receive following string in the browser: {"time":1613911956,"nextpoll":60,"message":"","simRelays":1,"options":17,"master":12,"master_timer":0,"master_post_timer":0,"expanders":[],"sensors":[{"input":0,"type":1,"mode":1,"timer":0,"offtimer":0, "relays":[{"id":485761},{"id":488979},{"id":488980},{"id":488981}]}], "relays":[{"relay_id":488979,"time":1576800000,"type":110,"run":0,"relay":1,"name":"Rasen Terrasse","period":259200,"timestr":""}, {"relay_id":488980,"time":1576800000,"type":110,"run":0,"relay":2,"name":"Beete Eingang","period":259200,"timestr":""}, {"relay_id":485761,"time":1576800000,"type":110,"run":0,"relay":3,"name":"Rasen Erker","period":259200,"timestr":""}, {"relay_id":488981,"time":1576800000,"type":110,"run":0,"relay":4,"name":"Hochbeet","period":259200,"timestr":""}] Hopefully somebody can support in this topic. Hydrawise REST API.pdf
  4. Möchte gerne, wenn ich den KeyFob Taste 1 drücke das, eine Push Nachricht geschickt wird, wenn das Garagentor offen ist. Und wenn ich wieder drücke , das eine Push Nachricht geschickt wird, wenn das Garagentor geschlossen ist. Kann mir jemand dabei helfen ? LUA ist für mich sehr neu. Vielen Dank für eure Hilfe. Trigger: { conditions = { { id = 97, isTrigger = true, operator = „==“, property = „centralSceneEvent“, type = „device“, value = { keyAttribute = „Pressed“, keyId = 1 } }, { id = 100, isTrigger = true, operator = „==“, property = „value“, type = „device“, value = true }, { id = 100, isTrigger = true, operator = „==“, property = „value“, type = „device“, value = false } }, operator = „all“ } AKTION: local Taste = json.encode(sourceTrigger.value.keyId) – Betätigte Taste local Aktion = json.encode(sourceTrigger.value.keyAttribute) – Anzahl Betätigungen if Taste == „1“ and Aktion == ‚„Pressed“‘ then fibaro.call(90, ‚toggle‘) print(„Garagentor“) end fibaro.alert(‚simplePush‘, {[1] = 98, }, 'Garagentor ist offen’false) print(„Garagentor ist offen“) end fibaro.alert(‚simplePush‘, {[1] = 98, }, ‚Garagentor ist geschlossen‘, false) print(„Garagentor ist geschlossen“) end
  5. knuth

    HC3 LUA vs HC2

    In making the transfer from HC2 to HC3 based on a cloud backup (update 4.581 Beta) it is stated that "scenes will not be moved and need to be created again". That's OK, but it would be helpful when planning the transfer to know what the differences are (in syntax and available functions) between the two LUA versions. I know that the new LUA editor is documented in https://manuals.fibaro.com/home-center-3-lua-scenes/ . What I would hope to see in addition, is a side by side comparison of all the crucial differences, to enable a pre-edit of the old LUA scenes before entering them into the new editor. Something like this: If you used this in HC2 LUA: You need to do this in HC3 LUA: fibaro.debug("txt") fibaro.debug("tag", "txt") os.time() ??? etc. If we all contribute to such a table as we identify all the differences, we may be able to help each other prepare for HC3. Not all differences can easily be summarized in the simple two-column format above, however. For the new definition of conditions and triggers, it seems it would be more appropriate to give a few examples of old codes (with triggers) converted to new codes. PS: I haven't even decided to buy the HC3 yet! But getting a feel for the amount of re-programming needed to convert my scene is an important factor in making that decision. The suggested table is now shown in a pdf file attached to this post, see below. It is regularly updated as new contributions are posted. LUA HC2 vs HC3.pdf
  6. Hello everyone, As many before on this forum I'm working on my heating system and want to convert my current single room heating plan into to a multi zone heating plan. I want to integrate my boiler into my heating plan but want to create some safety interlock that I won't fire up the boiler if all the thermostats are closed. I think this is a very important feature and often overlooked as the behavior of a thermostat is to close more and more when the thermostat is reaching it's set-point to prevent overshoot. So therefore I need to know what to position is of the valve, based on that condition i went for the TRV's of eurotronic as it stated in the manual that it is able to report it's current valve position. And it looked like everything would work correct with the fibaro template as I was able to set parameter 6 and enable the valve postion reporting. I think everything is configured correctly but i have a bit of strange behavior now in fibaro when I enable parameter 6. The setpoint value is getting overwritten with the valve position percentage: Setpoint displays: new setpoint in degree Celsius After few minutes same device is overwritten and setpoint value displays Open valve percentage (unit doesn't update and stays on degree Celsius): Enabled parameter 6. When i change setpoint and debug the info. I noticed the following behavior: Setpoint change -> Setpoint value displays setpoint -> after few minutes Setpoint value displays: valve position -> Setpoint value displays setpoint value again. Maybe I'm looking at the wrong values but here is the list of the available values: I wasn't able to locate the opening valve percentage value in this list to make a virtual device as work around.. Does someone have a solution for my problem? I would like to receive the actual setpoint and the open valve percentage on a different value/device.
  7. Hello Everyone, I am working on some projects that seeks help in finding the appropriate tutorials for lua programming. I want to learn lua right from the basics and take it step by step. Where can I get these tutorials?
  8. Hello, I found a project who reverse engineered the Wi-Fi protocol from the Mertik controller connected to my fireplace. Yeay! ? With the following (simplified) NodeJS code I can send the standby command to my fireplace: var net = require('net'); const prefix = '0233303330333033303830' var msg = "3136303003"; var packet = Buffer.from(prefix + msg, 'hex'); var client = new net.Socket(); client.connect(2000, '192.168.1.1'); client.write(packet); I know how to open a socket in HC3 QA but I don't get how to convert the message to a RAW buffer. The JavaScript line does it with Buffer.from(prefix + msg, 'hex'); Does some LUA god know how to convert the message in QA LUA for the HC3?
  9. Anybody knows a way to know what triggered the scene? For example I have a scene, that can be triggered by one of two switches. And in the Lua code I'd like to know which one of these two switches triggered the scene.
  10. Hello, Is it posible in HC2 LUA to create global functions? I use o lot of functions over and over again and have to include them in every scene Is it possible to create functions in a centralized scene and use them from every other scene? Example: ------------------------------------------------------------------------------------ GlobalFunctions ------------------------------------------------------------------------------------ global function BeepXseconds(x) fibaro:call(42, "turnOn") fibaro:sleep(x * 1000) fibaro:call(42, "turnOff") end global function MyDebug(text, color) -- read GlobalGlob if DebugGlob = true then -- do something with formatting text, add OS.date and add colors fibaro:debug(text) end end ------------------------------------------------------------------------------------ now i can use the global functions in other scenes ------------------------------------------------------------------------------------ scene 161 - TurnAlarmOn ------------------------------------------------------------------------------------ -- do something MyDebug("Turn Alarm on", "red") BeepXseconds(5) -- do something ------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------ scene 254 - Doorbell ------------------------------------------------------------------------------------ -- do something MyDebug("Someone is ringing", "BLUE") BeepXseconds(2) -- do something ------------------------------------------------------------------------------------ AND OFCOURSE I CAN CREATE SCENES AND USE THEM LIKE GLOBAL FUNCTIONS BUT PARSING VARIABLES IS NOT THAT SIMPLE, I THEN HAVE TO USE GLOBAL VARIABLES REAL GLOBAL FUNCTIONS (LIKE A LIBRARY) WOULD BE GREAT !!!
  11. Does this Trigger autostart a lua scene ? Its supposed to be gateway start, which makes no sense { type = "se-start", property = "start", operator = "==", value = true, isTrigger = true }
  12. Micx

    email subject

    The new HC3 LUA sytax for email fibaro.alert('email', users, "xxx") has no room for the subject. The subject is always "Message from FIBARO". Is there a way to change this?
  13. Hi - I would like to modify a device parameter configuration using a scene. In this example I have a set of security lights which have a timer to switch on for 60 seconds. sometimes we want to use them as normal lights and i'd like to be able to set the timer to 20 minutes so they dont keep turning on and off. Parameter number 1 desired value would change using lua code to 1200. thanks.
  14. Hello I'm new to making scenes in HC3, -just bear with me. Thought to start with some simple things like Trigger and Conditioning. Have a source I want to get a message if the temperature is above 9 degrees But the scene is running even though the temperature is below 9 degrees (see picture) Have tried to read on how to do. Feels like it's a simple thing I am missing I have also the same problem with freezer (not unexpected but i guess ) But i would like to have that on -18 in stead
  15. I have used a LUA script which is triggered by pushing the switch 2 on a Fibaro switch. Depending on whether the key is pushed once, twice or held, I control another device (a light) according to set rules. How the key is pushed, is found by the variable pressSource = fibaro:getSourceTrigger().event.data. This solution has been used previously by several contributors on the forum. My current code looks like this (only first part shown): --[[ %% properties %% events 394 CentralSceneEvent %% globals --]] -- Uses first slave for "CentralSceneEvent" ID (not master, not switch itself). Here 394 local trigger = fibaro:getSourceTrigger() if (trigger.type == "other") then fibaro:debug("Scene started by clicking 'start' button") else local pressSource = fibaro:getSourceTrigger().event.data fibaro:debug("New: CentralSceneEvent received from key: " .. pressSource.keyId) if (pressSource.keyId == 2) then local ledId = "306" local ledValue = fibaro:getValue(ledId, "value") if pressSource.keyAttribute == "Pressed" then fibaro:debug("Pressed") if ledValue == "0" then fibaro:call(ledId, "turnOn") else fibaro:call(ledId, "turnOff") end elseif pressSource.keyAttribute == "Pressed2" then fibaro:debug("Pressed 2 times") fibaro:call(ledId, "setValue", "100") elseif pressSource.keyAttribute == "HeldDown" then -- etc. (complete code not shown) I now want to add a second trigger, i.e. another Fibaro switch being pushed. Depending on which switch is used, I want different lights to be adjusted. Below is my first edit (still incomplete). In line 5, the new trigger 494 is added. How do I know if the scene was triggered by 394 or 494? The answer is probably in fibaro:getSourceTrigger(), but I cannot find the complete specification for this function documented anywhere. Specifically: - How do I find whether 394 or 494 was the trigger? The syntax trigger.event.id in line 14 is my guest guess. What is correct? - Once I have the right triggerID, I can easily make the variable ledID dependent on triggerID, by having two related lists (arrays): {394, 494} for the triggers and {306, 406} for the corresponding LED lights. This needs to be implemented in line 18. Can anyone please provide a more complete specification for the data returned by fibaro:getSourceTrigger in HC2, and show me how I can use it to implement double triggers? Or are you all too busy converting to HC3? PS: I have simplified this to TWO triggers. In reality I want to have several more. But if I can do two, I can do any number. --[[ %% properties %% events 394 CentralSceneEvent 494 CentralSceneEvent -- <<--- NEW TRIGGER %% globals --]] -- Uses first slave for "CentralSceneEvent" ID (not master, not switch itself). Here 394 and 494 respectively. local trigger = fibaro:getSourceTrigger() if (trigger.type == "other") then fibaro:debug("Scene started by clicking 'start' button") else local triggerID = trigger.event.id -- <<--- WHAT IS CORRECT SYNTAX?? local pressSource = fibaro:getSourceTrigger().event.data fibaro:debug("New: CentralSceneEvent received from key: " .. pressSource.keyId) if (pressSource.keyId == 2) then local ledId = "306" -- <<<< NEEDS TO BE CHANGED TO CORRESPOND TO triggerID local ledValue = fibaro:getValue(ledId, "value") if pressSource.keyAttribute == "Pressed" then fibaro:debug("Pressed") if ledValue == "0" then fibaro:call(ledId, "turnOn") else fibaro:call(ledId, "turnOff") end elseif pressSource.keyAttribute == "Pressed2" then fibaro:debug("Pressed 2 times") fibaro:call(ledId, "setValue", "100") elseif pressSource.keyAttribute == "HeldDown" then fibaro:debug("HeldDown") -- etc. (complete code not shown)
  16. How to synchronize the mode, temperature and wind speed of two HVAC I can't find a way in the associated page. Is there any way to synchronize with LUA scenes or other ways? Thank you
  17. Locally I can place the current class (self) in a variable and call an Object in this class. This code is working (localy): function QuickApp:onInit() local sender = {value='Yes', class=self} sender.class:localPrintValue(sender.value) end function QuickApp:localPrintValue(value) if value == nil then value = 'No' end self:debug('Can I print this : '..value) end [15.09.2020] [13:22:42] [DEBUG] [QUICKAPP105]: Can I print this : Yes If I send this variable to another class using fibaro.call(id, 'action', variable) , the call disappears into the darkness. Calling the Object in the other class(QuickApp) results in calling the nil value? !!! This next code is (because of the class=self) not working: fibaro.call(qaID,"updateMyProperty", {value=newValue, class=self}) function QuickApp:updateMyProperty (sender) local value = 0 if type(sender) == 'table' then -- Call comes from elsewhere.. value = sender.value self:debug('Device updated from: '..tostring(sender.class.id)..'.'..tostring(sender.class.name)..' with value: '..tostring(value)) else value = sender self:debug('local call, with value: '..tostring(value)) end end This is a pity because I would like to indicate in the called class where the call was coming from. Now I solve this by sending a table with : sender = {id=self.id, name=self.name, value=newValue}. Do I do something wrong? or has Fibaro disabled the oop function for sending object classes?
  18. Hi, I have several problems to get my HUE lights working white my Fibaro HC2. I have made a scene for my bathroom just to turn on and off the light in combination white a motion sensor. This is working fine but the light is always changing back to the warm color after about 24 hours. So i like to set the color by a LUA command. I used the debug function for the settings (see below) --[[ %% properties %% events %% globals --]] fibaro:debug(fibaro:getValue(162, "ui.brightness.value")) fibaro:debug(fibaro:getValue(162, "ui.saturation.value")) fibaro:debug(fibaro:getValue(162, "ui.hue.value")) If i change the Brightness on the HUE app the value changed. But the saturation and HUE value doesn't change at all. Whats the problem? is it a error of the Hue bridge (square one) or anything else??? This Youtube example looks oke to me: All you input is welcome and of course i can provite more information if necessary. Thank you in advance. Michel
  19. Hi Im Serching for a simple Lua Script that sends me a Message when the outdoor temperature is under the indoor temperature. My Outdoor temp Sensor is ID: 263 and indoor temp Sensor ID is 258. Can me anybody help Please? Thanks a Lot!
  20. **MAJOR UPDATE TO THIS TUTORIAL** Hi, This tutorial has been going through a major update and expansion since the first release. Special thanks deserved to @petergebruers and others for helping me understand many of the underlying table concepts and for also contributing a lot to this tutorial. It may be a good idea to paste some of the code in this tutorial into a test scene to understand how they work by reviewing the output Topics covered with lots of sample code and expected outputs Table basics Creating tables and printing (ordered, non-ordered, numerical and non numerical keys) #operator - pros and cons kv pairs - advantages Updating tables - adding adding, inserting values Nested Tables - printing, updating, inserting, Summary of key points Storing tables in global variables I would have found this very useful when I started so hopefully some users will find it useful as well. -frank & peter Tables A table is a tree structure, consisting of field and each field has a "key" and "value" pair. The key can be any Lua value except nil and NaN. A table can store anything except nil. The name of the table is the variable that stores a reference to the table so it can be accessed Creating Tables and displaying the table data a = {} This is the smallest table and stores the reference to the table {} in the variable a Consider the following table print("table with numerical keys") fav = {[1] = "4FM", [2] = "96FM", [3] = "Calm", [4] = "Heart", [5] = "Red_FM"} fav is the table (or at least the name of the variable where the table is stored), in the above table 'fav', it has 5 fields and each field consists of a key/value pair 4 is the key and 4FM is the value , 2 is a key and 96FM is the value, etc You can display all the key/value pairs using the following ... print("table with numerical keys and using k/v pairs to display the fields but they won't be in order") fav = {[1] = "4FM", [2] = "96FM", [3] = "Calm", [4] = "Heart", [5] = "Red_FM"} for k,v in pairs(fav) do print("k: " ..k..", v: "..v) end the result is ... and you'll notice that the results are NOT returned in order if you have numerical keys [1], [2] then you will need to use ipairs to return them in order print("table with numerical keys and using k/v ipairs to display the fields in order") fav = {[1] = "4FM", [2] = "96FM", [3] = "Calm", [4] = "Heart", [5] = "Red_FM"} for k,v in ipairs(fav) do print("k: " ..k..", v: "..v) end #operator The #operator (#tablename) is used by a lot of people to identify the length of the table and use this to iterate through the table but it is not always recommended an example of where it will work is here print("table with numerical keys and using the #operator to iterate through the table") radio = {"4FM", "96FM", "Calm", "Heart", "Red_FM"} print("#operator: "..#radio) for i = 1, #radio do print(radio[i]) end if the table keys are numerical and contiguous, it will work.. ....but if they are not or you have inserted or removed values then it won't work A good example of where it doesn't work very well is here print("table where numerical keys are not explicitly defined but are still the table keys") print(" example where the #operator doesnt return the correct count") radio = {"4FM", "96FM", "Calm", "Heart", "Red_FM"} for k,v in pairs(radio) do print("k: " ..k..", v: "..v) end print("#operator: "..#radio) -- remove one value, set it to nil radio[3] = nil for k,v in pairs(radio) do print("k: " ..k..", v: "..v) end print("#operator: "..#radio) you can see that the second loop in the debug is showing an #operator value of 5 (because it is the last key but there are only 4 key/value pairs as we removed one Another approach that is recommended to use is as follows use the k/v approach to count the fields and then use the counter to iterate through.. print("table where numerical keys are not explicitly defined but are still the table keys") print(" example using k/v pairs to calculate the correct table field count") radio = {"4FM", "96FM", "Calm", "Heart", "Red_FM"} counter = 0 for k,v in pairs(radio) do counter=counter+1 end print("counter: "..counter) for i = 1, counter do print(radio[i]) end radio[3] = nil -- remove the row by setting the key to nil counter = 0 for k,v in pairs(radio) do counter=counter+1 end print("counter: "..counter) for i = 1, counter do print(radio[i]) end and you can see that the counter is correct in both loops Updating Tables you can update a table by setting Key/Value pairs or delete a value as follows print("table where numerical keys are not explicitly defined but are still the table keys") print("examples of updating the table") fav = {"4FM", "96FM", "Calm", "Heart", "Red_FM"} -- update one value add another value fav[2] = "Soul" fav[4] = "Classic" -- delete value at key 1 fav[1] = nil for k,v in pairs(fav) do print("k: " ..k..", v: "..v) end if the k/v pair already exists it overwrites it or of the k/v pair didn't exist, it simply adds it as above This is the same example but the table has the numerical keys explicitly defined print("updating a table") fav = { [1] = "4FM", [2] = "96FM", [3] = "Calm", } fav[2] = "Soul" fav[4] = "Classic" for k,v in ipairs(fav) do print("k: " ..k..", v: "..v) end Example of adding key/value pairs to this table using table.insert fav= {"4FM","96FM", "Soul", "Jazz"} table.insert(fav, "Calm") table.insert(fav, "Red_FM") table.insert(fav, "Heart") for k,v in pairs(fav) do print("k: " ..k..", v: "..v) end The extra key/value pairs will be added as extra fields as you cannot specify the exact field you want to update as in the approach above Tables with non-numerical keys are also possible as shown below print("Table initialiser with alpha keys") fav = { ["a"] = "4FM", ["b"] = "96FM", ["c"] = "Calm", ["d"] = "Heart", ["e"] = "Red_FM"} for k,v in pairs(fav) do print("k: " ..k..", v: "..v) end the same table can be represented in a simpler form print("Table initialiser with alpha keys - simplified") fav = { a = "4FM", b= "96FM", c= "Calm", d = "Heart", e= "Red_FM"} for k,v in pairs(fav) do print("k: " ..k..", v: "..v) end If you chose or have to use non numerical keys or a mix, then Lua makes no guarantee on order as the spec says random. The only way to order a table with non-numerical keys (such as alphabetical order) is to use an external reference. Nested Tables Lets take the following table, it looks like each value in the key/value pair is a table in itself as if one table is nested inside the other table = { [1] = {loc="utility_room", name="HeatingTemp"}, [2] = {loc="bed_room", name="FreezerTemp"}, } for k,v in pairs(table) do print(k,v) end if you run the usual k/v code you will see the second/nested set of tables To list the k/v inside the second table you need to iterate through the first table we use a counter like before to find out how many fields are in the outer most table There are two tables nested within the outer most table table [1] which has two fields with k/v pairs table [2] which has two fields with k/v pairs print("Nested table example") table = { [1] = {loc="utility_room", name="HeatingTemp"}, [2] = {loc="bed_room", name="FreezerTemp"}, } for k,v in pairs(table) do print("first level key: " ..k..", first level value: "..tostring(v)) for k2,v2 in pairs(v) do -- This works because we KNOW v is a table. print(" second level key: " ..k2..", second level value: "..v2) end end we then use the counter to expose the k/v pairs at table[1] and table [2] with the following result You could also expose specific values (in the nested able) using the following table = { [1] = {loc="utility_room", name="HeatingTemp"}, [2] = {loc="bed_room", name="FreezerTemp"}, } for k,v in pairs(table) do print("location: "..table[k].loc) end with the following expected result You could also have used the #operator that we discussed earlier BUT only because the key's in the outer-most table are numerical and contingous for i = 1, #table do -- #list refers to the max number of items in the table fibaro:debug(table[i].ip, table[i].port) end Updating a value in a nested table If you want to update a specific value in the nested table you need to use the k/v method we have discussed fav = { [1] = {loc="utility_room", name="HeatingTemp"}, [2] = {loc="bed_room", name="FreezerTemp"}, } -- update nested table on the second field with a new value fav[2].loc = "kitchen" fav[2].name = "Hobtemp" -- or you could use the following format to do accomplish the same update fav[2]["loc"] = "kitchen" fav[2]["name"] = "Hobtemp" -- print out the updated table... for k,v in pairs(fav) do for k,v in pairs(fav[k]) do print("k: " ..k..", v: "..v) end end -- second option to print out the updated table with more explanation for k,v in pairs(fav) do print("first level key: " ..k..", first level value: "..tostring(v)) for k2,v2 in pairs(v) do -- This works because we KNOW v is a table. print(" second level key: " ..k2..", second level value: "..v2) end end the result is If you want to add/insert a new k/v pair in the nested level, you can use the table.insert method fav = { [1] = {loc="utility_room", name="HeatingTemp"}, [2] = {loc="bed_room", name="FreezerTemp"}, } -- insert a new value table.insert(fav,{loc="bedroom", name="sinktemp"}) -- print out the updated table... for k,v in pairs(fav) do for k,v in pairs(fav[k]) do print("k: " ..k..", v: "..v) end end -- second option to print out the updated table with more explanation for k,v in pairs(fav) do print("first level key: " ..k..", first level value: "..tostring(v)) for k2,v2 in pairs(v) do -- This works because we KNOW v is a table. print(" second level key: " ..k2..", second level value: "..v2) end end and the result is three fields in the table So before we go to the last task of storing the table in a global variable, I thought it would be good to have a quick recap.. Summary A table is a tree structure, consisting of field and each field has a "key" and "value" pair. The name of the table is the variable that stores a reference to the table so it can be accessed you can explicitly declare a numerical key in a table but you don't have to for a table with a numerical key - use ipairs to print the table fields in order #operator can be used but ONLY for tables with numerical keys that are contiguous it is recommended to use the standard k/v approach to count the number of fields remove a value by setting its key = nil update a table using the table[key] method add a new field using table.insert(table, "value") and will add a numerical key table.insert will not work with tables with non-numerical keys tables with non-numerical keys cannot be printed in order by ipairs, result will be random nested tables require iteration to print the inner-most tables multiple levels of iteration required for multi-nested tables updating nested table - iterate with k/v and use table[key].nested-key = "value" inserting into nested table - iterate with k/v and use table.insert(table,{key="value, key="value} tables can be very confusing and frustrating to us newbie's , so take your time Storing a table in a global variable if you take the following table structure Table = { group = { option1=1560,option2=1507,option3=881 }, } If you want to store this table in a global variable you will need to encode the table as a string. One of the most common formats to encode a table (structure) is json from json.org "JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate." To save the table you need to encode it and then save it to the global variable jTable = json.encode(table) fibaro:setGlobal("StateTable", jTable) In order to read back a single value you need to decode the string local jT = json.decode(fibaro:getGlobalValue("Table")) once it's decoded you can then read one of the values or manipulate the table fibaro:debug(jT.group.option1) Updating a single value - assign the new value, encode it and the store it..... jT.group.option3 = 987 jTable = json.encode(jT) fibaro:setGlobal("StateTable", jTable) Making json strings/output easier to read... Sometimes a json string can be difficult to read and understand its structure. Typically they would look something like this... {"widget": {"debug": "on","window": {"title": "Sample Konfabulator Widget","name": "main_window","width": 500,"height": 500},"image": {"src": "Images/Sun.png","name": "sun1","hOffset": 250, "vOffset": 250,"alignment": "center"},"text": {"data": "Click Here","size": 36,"style": "bold","name": "text1","hOffset": 250,"vOffset": 100,"alignment": "center","onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"}}} There are a number of websites that will 'pretify' the string make it easier to read the structure and enable you to understand how you might navigate it. If you take json string above and paste it into http://jsonprettyprint.com/ it will display it more like a table This format is easier to understand { "widget": { "debug": "on", "window": { "title": "Sample Konfabulator Widget", "name": "main_window", "width": 500, "height": 500 }, "image": { "src": "Images\/Sun.png", "name": "sun1", "hOffset": 250, "vOffset": 250, "alignment": "center" }, "text": { "data": "Click Here", "size": 36, "style": "bold", "name": "text1", "hOffset": 250, "vOffset": 100, "alignment": "center", "onMouseUp": "sun1.opacity = (sun1.opacity \/ 100) * 90;" } } } Finally.... There is a very good discussion on using a table in a predefined variables to store the ID's of scenes and devices for the HC2 - https://forum.fibaro.com/index.php?/topic/23942-tutorial-using-a-hometable-to-store-device-and-scene-ids/ suggestions to improve welcome -f
  21. Hi I recently figured out that my scenes with sending picture to e-mail from a ip camera not working anymore. It stops working around November 2017, I think after update to 4.150 or 4.140. Now running 4.170 on HC2 and command "sendPhotoToUser" not working. Button with camera logo on the device which used to send a snapshot to mail, also doesn't work. Has anyone else same issue? Code which should send a picture looks like this: Exactly the same code coming from block scene, when I making new scene now and converting to lua. --[[ %% properties 874 value %% weather %% events %% globals --]] local startSource = fibaro:getSourceTrigger(); if ( ( tonumber(fibaro:getValue(874, "value")) > 0 ) -- id 874 is triggering device or startSource["type"] == "other" ) then fibaro:call(648, "sendPhotoToUser", "2"); -- 648 is a camera id, 2 is a user id end Camera's settings and plugins/for cameras wasn't changed since this worked.
  22. Hello I'm new at lua programming and trying to use a variable to change light on or off, from a second button. But i can't get the variable to work. What is wrong here. Declaration { conditions = { { id = 187, isTrigger = true, operator = "==", property = "state", type = "device", value = false } }, operator = "all" } Actions local Status_186 = fibaro.getValue(186, "value") if Status_186 == 'ON' then fibaro.call(186, 'turnOff') else fibaro.call(186, 'turnOn') end
  23. Próbuję właśnie napisać scenę aktywowaną KeyFob, która w zależności od stanu żaluzji będzie kontynuowała poprzedni kierunek działania lub zatrzymywała żaluzję. Natrafiłem na pewne braki w dokumentacji, wiem tylko jak pobrać poziom zamknięcia rolet: fibaro.getValue(117, "value") Wiem też że za pomocą kilku warunków mogę napisać funkcję sprawdzającą czy ta wartość się nie zmienia. Szukałem jednak w internecie jakie inne własności urządzenia mogę pobrać za pomocą `getValue` niestety jednak nie znalazłem nic na ten temat. Czy ktoś może wie gdzie taka dokumentacja może się znajdować?
  24. Hello, I am trying to build a Lua script that will tell Fibaro if I am working from home, working at home or off work. Here is what I have so far but I need some help to get the scene trigger when either I am at home or at work when all the conditions have been met at the specific times. Does anyone have a similar scene or suggestions? --[[ %% properties %% events %% globals --]] local currentDate = os.date("*t"); local time=os.date('*t'); local ct=os.date('*t'),os.date("%H:%M",os.time()) if (fibaro:countScenes() > 1) then fibaro:abort(); end if ((fibaro:getGlobalValue("AndyPresentstate") == "Home") and (currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6) and ((ct>= "08:30") and (ct<"17:00")) ) then fibaro:setGlobal("Working", "At Home"); fibaro:debug("working at home"); elseif ((fibaro:getGlobalValue("AndyPresentstate") == "Home") and (currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6) and ((ct>= "17:00") or (ct<"08:30"))) then fibaro:setGlobal("Working", "Off Work"); fibaro:debug("off work"); elseif (fibaro:getGlobalValue("AndyPresentstate") == "Away" and (currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6) and ((ct>= "08:30") and (ct<"17:00")) ) then fibaro:setGlobal("Working", "At Work"); fibaro:debug("Working at Work"); end
  25. Hi everybody, I seem to be stuck in my search how to implement a (large) mobile popup, triggered in a LUA scene in HC3. I found this example for HC2: https://manuals.fibaro.com/knowledge-base-browse/how-to-create-mobile-pop-up/ This is actually what I want to create, a large popup with buttons and actions connected to it. But the example (obviously) does not work in HC3. I am using the following code and the fibaro.homeCenter.notificationService.publish function with type set to MobilePopupNotification as described in https://manuals.fibaro.com/home-center-3-lua-scenes/ local function popupMessage(message) local request = { type = "MobilePopupNotification", priority = "warning", data = { title = "Door(s) Open", text = message, } } local response, code = fibaro.homeCenter.notificationService.publish(request) fibaro.debug("Scene109", json.encode(response)) fibaro.debug("Scene109", code) end The debug responses are: for response: {"data":{"title":"Door(s) Open","buttons":[],"text":"Alarm in kelder en begane grond armed"},"created":1586512755,"type":"MobilePopupNotification","id":208,"priority":"warning","wasRead":false,"canBeDeleted":true} for code: 200 My Notification page in the web interface displays the warning as "Notification title" but no mobile notification is received. I also had this scene running with fibaro.alert() but that did not give me the desired large popup, only a smal one with limited text and not button options. BTW: I couldn't get the button functionality to work in any way. Tried arrays, objects, array of objects, object of objects etc but always got an error code 400 or simply a load error code ((load):34: unexpected symbol near '[') So, can anybody point me in the right direction, or tell me if what I want is possible in HC3? Thanks a lot
×
×
  • Create New...