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'.
-
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?
-
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?
-
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.
-
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 !!!
-
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 }
-
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?
-
Change a single parameter value using lua code scene
IanRow posted a question in Scenes and Interface
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. -
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
-
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)
-
How to synchronize the mode, temperature and wind speed of two HVAC
Gee posted a question in Scenes and Interface
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 -
fibaro.call can't sent a class object to another QuickDevice
NLWaard posted a question in Home Center 3
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? -
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
-
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!
- 15 replies
-
- lua
- tempsensor
-
(and 4 more)
Tagged with:
-
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.
-
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
-
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ć?
-
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
-
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
- 2 replies
-
- mobilepopupnotification
- lua
-
(and 1 more)
Tagged with:
-
Witam, Ciekaw jestem, czy można napisać scenę LUA, która da odpowiedź w formie debug lub wyśle rezultat na maila odnośnie wyszukania, w których scenach znajduje się, jest użyte dane ID urządzenia. Np. chcę poszukać, w których scenach jest załączane lub wyłączane światło przed domem o ID 1101. Wiem, że jak wejdę w urządzenie o ID 1101, to zobaczę wynik dla if lub then ale okazuje się, że nie są to wszystkie sceny... Pozdrawiam, Łukasz
-
I have moved to the HC3 and trying to work out how the LUA programming works. The HC2 programming seemed a lot more logical and I am struggling to work out how to convert some of my old routines over. One of the first routines is remotes. Setting this up by blocks wouldn't work as it looks like I'd have to setup a scene for each button for each remote. Could someone help tell me how to convert this simple program into a HC3 computable version? --[[%% properties13 sceneActivation%% globals--]]local buttonPressed = fibaro:getValue(13, "sceneActivation")if ( tonumber(buttonPressed) == 1) thenfibaro:debug("MiniMote button 1 pressed")elseif ( tonumber(buttonPressed) == 2) thenfibaro:debug("MiniMote button 2 pressed")elseif ( tonumber(buttonPressed) == 3) thenfibaro:call(4, "turnOn")fibaro:debug("MiniMote button 3 pressed - Light ON")elseif ( tonumber(buttonPressed) == 4) thenfibaro:call(4, "turnOff")fibaro:debug("MiniMote button 4 pressed - Light OFF")elseif ( tonumber(buttonPressed) == 5) thenfibaro:debug("MiniMote button 5 pressed")elseif ( tonumber(buttonPressed) == 6) thenfibaro:debug("MiniMote button 6 pressed")elseif ( tonumber(buttonPressed) == 7) thenfibaro:debug("MiniMote button 7 pressed")elseif ( tonumber(buttonPressed) == ? thenfibaro:debug("MiniMote button 8 pressed")elsefibaro:debug("No response")end Thanks
-
I'm using a ZRC-90EU and everything works fine but I don't like the way I need to assign a action to a button (function). As you can see in the picture, in the Advanced page of the device you can assign an action to each button but you have to start from scratch every time (I can not assign an existing scene to a button).... With a block scene it is possible as well but if you want to assign 1 function/scene to one button and you know that every button has 4 options (1x,released, held and 2x) than I have to create 32 scenes.... I am new and have a HC3 so I never had HC2, HCL .... but once I've seen a LUA script that contained all button options and in the script it was possible to assign a function/scene to every possible option per button within that script so you could assign existing scenes as well. I already tried some HC2 LUA scripts and they don't work in HC3 so copying the script from HC2 isn't an option (+ I can(t find it anymore ) Does someone have a solution so I can use a LUA script or a QA to assign functions/scenes to the buttons without creating a new scene per button .... ? Thank you
-
Yes/no and run/cancel are the only options when using block scenes. Can I use LUA to make an interactive push notification that lets me choose between 2 or more scenes to run? If so, how?
-
response, status = api.get("/scenes") fibaro:sleep(1000) if (status == 200) then fibaro:debug("Get Scenes Successful") created = true else fibaro:debug("Failed to get Scenes " ) end for _,s1 in ipairs(response) do local s2 = api.get("/scenes/"..s1.id) if s1.name == gSceneName then fibaro:debug("SceneName: " .. s1.name .. " Scene ID: " ..s1.id) print (s1.isLua) -- ** gets correctly print (s1.lua) -- <=== RETURNS a null --- HOW do I get this print (s1.roomID) -- ** gets correctly print (s1.iconID) -- ** gets correctly print (s1.sortOrder) -- ** gets correctly SceneID= s1.id fibaro:sleep(1000) Essentially I'm trying to get the Lua code from a scene so I jason encode it so I can then populate another scene with the same lua code. I'm trying to automatically update/create Lua scenes without having to go in and edit each one individually. I can populate the "lua " field with an API PUT ... But I can't read it back. The code above returns all the other fields but not the s1.lua Any help would be greatly appreciated - thanks.
-
Witam, Scena LUA utworzona ze sceny blokowej mi nie działa. Tak w danym moncie aktywna jest tylko jedna z dwóch scen. Scena blokowa: Utworzona z niej scena LUA: Ktoś ma pojęcie o co chodzi?
-
Fetch data from wunderground.com, send morning and afternoon forecast to your smartphone using Fibaro app, Telegram or Pushover. Data from wunderground.com can be from a PersonalWeatherStation(PWS) or nearest LocationID(LOCID) Example of forecast and pushoptions to use. 1'st value is smartphoneID, 2'nd value is morning forecast, 3'rd is afternoon forecast, 4'th is pushoption smartphoneID_and_fcst ={{281, "06:30", "17:00", "Telegram"},{320, "08:00", "17:00", "Pushover"},{32, "08:00", "17:00", "Fibaro"}} Sending as Pushover message requires an own scene that monitors Pushover variable, read about it here: http://forum.fibaro.com/index.php?/topic/17422-tutorial-pushover-lua-vd-global-function/#entry55857 All important keys like API keys, tokens etc will be saved to variable panel. Supports many languages (EN, FR, SW, PL, NL, DE, NO, RO, CZ, GR, PT, RU (default is en)) Complete lua code (save in a new scene) --[[ %% autostart %% properties %% globals --]] ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- -- HOWTO -- -- 1. Create a virtual device with 9 labels and set the ID to like below, else this scene will not work. -- 2. lblTemp, lblHum, lblBar, lblWind, lblRain, lblFcst, lblStation, lblUpdate, lblNotify -- 3. Change ID of virtual device in WU.selfId -- FIRST TIME USERS NEEDS TO COPY ALL CODE TO SCENE, after version 2.5.0 it should only be neccessary to update from "UPDATE FROM HERE" text -- NOTE -- -- Scheduled time you set for forecast push is just an indication of time. -- Real time will be the hour you set + minute of when scene starts. -- Script will check server version for new updated version (default = true) -- WU WeatherData - Fetch weather data from wunderground.com. Multilanguage support! -- Inspired by GEA(steven), stevenvd, Krikroff and many other users. -- Source - forum.fibaro.com, domotique-fibaro.fr and worldwideweb -- Special thanks to petergebruers from forum.fibaro.com with demo script -- -- -- PWS = Personal Weather Station -- LOCID = Public station -- -- -- 2014-03-22 - Permissions granted from Krikroff -- 2014-03-23 - Added rain and forecast, Added FR language. -- 2014-03-23 - Language variable changed to get the translation from wunderground.com in forcast -- 2014-03-24 - Added PL language -- 2014-03-24 - Select between PWS or LOCID to download weather data -- 2015-10-23 - New source code. -- 2015-10-23 - Added NL translation -- 2015-11-16 - Added DE, FR translation. Fixed some bug in the code(hardcoded smartphoneID,inch to metric for rain value) -- 2015-11-18 - Script moved to scene instead of mainloop in VD. VD is only used as GUI. -- 2015-11-18 - Send push if script cannot fetch data -- 2015-11-26 - adjustment of code. Function from sebcbien at domotique-fibaro.fr -- 2015-11-27 - Oops! Removed forecast push by mistace. -- 2016-02-11 - send push if new version of script is out -- 2016-03-31 - Added NO translation, did cleanup the code a little bit. -- 2016-03-31 - It is now posible to use Telegram as push. Change WU.pushOption value to Telegram or Fibaro. -- - also change WU.Telegramtoken and WU.Telegramchat_id to your values -- 2016-04-01 - Fixed bug when using Telegram push, forecast must send with lowercases. -- 2016-05-26 - Added support for multiple smartphone id when sending push -- 2016-05-30 - Implemented "UPDATE SECTION" -- 2016-07-13 - Bug fixed some code for sendPush to fibaro app -- 2016-07-14 - Telegram, possible to have forecast pushed to 2 different chat_id's -- 2016-07-15 - Save all importent values to variable. -- 2016-07-15 - Added RO, GR, PT, RU and CZ translation -- 2016-07-16 - Possible to have different time for push to all smartphones -- 2016.07-17 - Bugfixes. Changed layout of JSON table for smartphoneID, time and push option -- 2016-07-18 - Bugfixes and better error reporting. Supports Pushover (works together with -- 2016-07-19 - Bugfixes again. -- 2016-07-22 - Added seconde forcast to both morning and afternoon push message. Added parse_mode for bold telegram text message -- 2016-07-24 - Added ES (Spanish) translation -- 2016-08-03 - Bugfixes (in WU.dualChat_ID part of code) WU = {} versionCheck = true -- check if new version of script exist on server WU.language = "SW"; -- EN, FR, SW, PL, NL, DE, NO, RO, CZ, GR, PT, RU, ES (default is en) ---- UPDATE FROM HERE ---- -- WU settings if not fibaro:getGlobal("WUAPI") == nil then WU.APIkey = fibaro:getGlobal("WUAPI") else -- [CHANGE THIS IF VALUES ARE NOT STORED IN VARIABLE PANEL] WU.APIkey = "14eaffxxxxxxxxxxxxxx" --Put your WU api key here end WU.PWS = "IGVLEBOR5" -- The PWS location to get data for (Personal Weather Station) WU.LOCID = "SWXX0076" -- The location ID to get data for (City location) WU.station = "PWS" -- PWS or LOCID ---- UPDATE FROM HERE ---- version = "{V3.0.5}" -- Other settings smartphoneID_and_fcst ={{281, "06:30", "21:10", "Telegram"},{32, "08:00", "16:00", "Fibaro"}} -- ID, time for morning and afternoon forecast and what push to use WU.sendPush = true -- send forecast with push -- Telegram settings -- IMPORTANT -- -- Telegramtoken needs to splitted into 2 parts. First part1 is before the ":", part2 is after the ":" if not fibaro:getGlobal("Telegramtoken1_part1") == nil then WU.Telegramtoken1_part1 = fibaro:getGlobal("Telegramtoken1_part1") else -- [CHANGE THIS IF VALUES ARE NOT STORED IN VARIABLE PANEL] Telegramtoken needs to splitted into 2 parts. First part1 is before the ":", part2 is after the ":" WU.Telegramtoken1_part1 = "187xxxxxx" -- ******** end if not fibaro:getGlobal("Telegramtoken1_part2") == nil then WU.Telegramtoken1_part2 = fibaro:getGlobal("Telegramtoken1_part2") else -- [CHANGE THIS IF VALUES ARE NOT STORED IN VARIABLE PANEL]Telegramtoken needs to splitted into 2 parts. First part1 is before the ":", part2 is after the ":" WU.Telegramtoken1_part2 = "AAHfzhTcsKloviNxxxxxxxxxxxxxxxxx" -- ******** end if not fibaro:getGlobal("Telegramchat_id1") == nil then WU.Telegramchat_id1 = fibaro:getGlobal("Telegramchat_id1") else -- [CHANGE THIS IF VALUES ARE NOT STORED IN VARIABLE PANEL] Telegramtoken chat_id 1 WU.Telegramchat_id1 = "2025xxxxx" -- ******** end -- If you want forecast to be pushed to a second phone WU.dualChat_ID = false -- set to true if more then 1 smartphone that should have forecast pushed. if not fibaro:getGlobal("Telegramtoken2_part1") == nil then WU.Telegramtoken2_part1 = fibaro:getGlobal("Telegramtoken2_part1") else -- [CHANGE THIS IF VALUES ARE NOT STORED IN VARIABLE PANEL] Telegramtoken needs to splitted into 2 parts. First part1 is before the ":", part2 is after the ":" WU.Telegramtoken2_part1 = "187xxxxxx" end if not fibaro:getGlobal("Telegramtoken2_part2") == nil then WU.Telegramtoken2_part2 = fibaro:getGlobal("Telegramtoken2_part2") else -- [CHANGE THIS IF VALUES ARE NOT STORED IN VARIABLE PANEL] Telegramtoken needs to splitted into 2 parts. First part1 is before the ":", part2 is after the ":" WU.Telegramtoken2_part2 = "AAHfzhTcsKloviNxxxxxxxxxxxxxxxxx" -- ******** end if not fibaro:getGlobal("Telegramchat_id2") == nil then WU.Telegramchat_id2 = fibaro:getGlobal("Telegramchat_id2") else -- [CHANGE THIS IF VALUES ARE NOT STORED IN VARIABLE PANEL]Telegramtoken chat_id 2 WU.Telegramchat_id2 = "2025xxxxx" -- ******** end updateEvery = 5 -- get data every xx minutes WU.selfId = 150 -- ID of virtual device WU.translation = {true} WU.currentDate = os.date("*t"); DoNotRecheckBefore = os.time() WU.scheduler = os.time()+60*updateEvery WU.translation["EN"] = { Exiting_loop_push = "Exiting_loop_push", Push_forecast = "Push forecast", Temperature = "Temperature", Humidity = "Humidity", Pressure = "Pressure", Wind = "Wind", Rain = "Rain", Forecast = "Forecast", Station = "Station", Fetched = "Fetched", Data_processed = "Data processed", Update_interval = "Next update will be in (min)", No_data_fetched = "No data fetched", new_version = "New version of WUWeather.lua script is out! ", script_url = "http://jonnylarsson.se/JL/", NO_STATIONID_FOUND = "No stationID found", NO_DATA_FOUND = "No data found" } WU.translation["FR"] = { Exiting_loop_push = "Exiting_loop_push", Push_forecast = "Push prévisions", Temperature = "Température", Humidity = "Humidité", Pressure = "Pression", Wind = "Vent", Rain = "Pluie", Forecast = "Prévisions", Station = "Station", Fetched = "Reçu", Data_processed = "Données Analysées", Update_interval = "Prochaine update prévue dans (min)", No_data_fetched = "Pas de données reçues", new_version = "New version of WUWeather.lua script is out! ", script_url = "http://jonnylarsson.se/JL/", NO_STATIONID_FOUND = "StationID non trouvée", NO_DATA_FOUND = "Pas de données disponibles" } WU.translation["SW"] = { Exiting_loop_push = "Push loop avslutad", Push_forecast = "Push forecast", Temperature = "Temperatur", Humidity = "Fuktighet", Pressure = "Barometer", Wind = "Vind", Rain = "Regn", Forecast = "Prognos", Station = "Station", Fetched = "Hämtat", Data_processed = "All data processat", new_version = "New version of WUWeather.lua script is out! ", script_url = "http://jonnylarsson.se/JL/", Update_interval = "Nästa uppdatering är om (min)", No_data_fetched = "Inget data hämtat", NO_STATIONID_FOUND = "StationID ej funnet", NO_DATA_FOUND = "Ingen data hos WU" } WU.translation["PL"] = { Exiting_loop_push = "Kończę pętlę PUSH", Push_forecast = "PUSH prognozy", Temperature = "Temperatura", Humidity = "Wilgotność", Pressure = "Ciśnienie", Wind = "Wiatr", Rain = "Deszcz", Forecast = "Prognoza", Station = "Stacja", Fetched = "Nie pobrano danych", Data_processed = "Dane przetworzone", new_version = "Dostępna nowa wersja skryptu WUWeather.lua ! ", script_url = "http://jonnylarsson.se/JL/", No_data_fetched = "Brak danych", Update_interval = "Następna aktualizacja za (min)", NO_STATIONID_FOUND = "Nie znaleziono ID Stacji", NO_DATA_FOUND = "Brak danych" } WU.translation["NL"] = { Exiting_loop_push = "Exiting_loop_push", Push_forecast = "Push verwachting", Temperature = "Temperatuur", Humidity = "Vochtigheid", Pressure = "Druk", Wind = "Wind", Rain = "Regen", Forecast = "Verwachting", Station = "Weerstation", Fetched = "Ontvangen", Data_processed = "Gegevens verwerkt", new_version = "New version of WUWeather.lua script is out! ", script_url = "http://jonnylarsson.se/JL/", Update_interval = "Volgende update in (min)", No_data_fetched = "Geen gegevens ontvangen", NO_STATIONID_FOUND = "Geen stationID gevonden", NO_DATA_FOUND = "Geen gegevens gevonden" } WU.translation["DE"] = { Exiting_loop_push = "Exiting_loop_push", Push_forecast = "Push vorhersage", Temperature = "Temperatur", Humidity = "Luftfeuchtigkeit", Pressure = "Luftdruck", Wind = "Wind", Rain = "Regen", Forecast = "Vorhersage", Station = "Station", Fetched = "Abgerufen", Data_processed = "Daten verarbeitet", new_version = "New version of WUWeather.lua script is out! ", script_url = "http://jonnylarsson.se/JL/", No_data_fetched = "Keine Daten abgerufen", Update_interval = "Das nächste Update in (min)", NO_STATIONID_FOUND = "Keine stationID gefunden", NO_DATA_FOUND = "Keine Daten gefunden" } WU.translation["NO"] = { Exiting_loop_push = "Exiting_loop_push", Push_forecast = "Push værmelding", Temperature = "Temperatur", Humidity = "Fuktighet", Pressure = "Barometer", Wind = "Vind", Rain = "Regn", Forecast = "Prognose", Station = "Stasjon", Fetched = "Hentet", Data_processed = "All data prosessert", Update_interval = "Neste oppdatering om (min)", No_data_fetched = "Ingen data hentet", NO_STATIONID_FOUND = "StasjonID ikke funnet", NO_DATA_FOUND = "Ingen data hos WU" } WU.translation["CZ"] = { Exiting_loop_push = "Exiting_loop_push", Push_forecast = "Push forecast", Temperature = "Teplota", Humidity = "Vlhkost", Pressure = "(Atmosférický) Tlak", Wind = "Vítr", Rain = "Déšť ", Forecast = "Předpověď", Station = "Stanice", Fetched = "Předána", Data_processed = "Data_zpracována", Update_interval = "Časová_prodleva_mezi_aktualizacemi", No_data_fetched = "Data_nebyla_předána", NO_STATIONID_FOUND = "Stanice_nenalezena", NO_DATA_FOUND = "Data_Nenalezena" } WU.translation["RO"] = { Exiting_loop_push = "Exiting_loop_push", Push_forecast = "Prognoza apăsare", Temperature = "Temperatura", Humidity = "Umiditate", Pressure = "Presiune", Wind = "Vant", Rain = "Ploaie", Forecast = "Prognoza", Station = "Statie", Fetched = "Preluat", Data_processed = "Datele prelucrate", Update_interval = "Urmatorul update va fi in (min)", No_data_fetched = "Nu exista date preluate", NO_STATIONID_FOUND = "Nu a fost gasit stationID ", NO_DATA_FOUND = "Datele nu au fost gasite" } WU.translation["GR"] = { Exiting_loop_push = "Exiting_loop_push", Push_forecast = "Πρόγνωση push", Temperature = "Θερμοκρασία", Humidity = "Υγρασία", Pressure = "Πίεση", Wind = "Άνεμος", Rain = "Βροχή", Forecast = "Πρόβλεψη", Station = "Σταθμός", Fetched = "Παραλήφθηκαν", Data_processed = "Επεξεργασμένα δεδομένα", Update_interval = "Η επόμενη ενημέρωση θα γίνει σε (min)", No_data_fetched = "Δεν παραλήφθηκαν δεδομένα", NO_STATIONID_FOUND = "Δεν βρέθηκε το Station ID", NO_DATA_FOUND = "Δεν βρέθηκαν δεδομένα" } WU.translation["PT"] = { Exiting_loop_push = "Exiting_loop_push", Push_forecast = "Previsão do impulso", Temperature = "Temperatura", Humidity = "Humidade", Pressure = "Pressão", Wind = "Vento", Rain = "Chuva", Forecast = "Previsão", Station = "Estação", Fetched = "Procurar", Data_processed = "Dados processados", Update_interval = "Próxima atualização será em (min)", No_data_fetched = "Não foram encontrados dados", NO_STATIONID_FOUND = "Não foi detetada nenhuma estação", NO_DATA_FOUND = "Não foram encontrados dados" } WU.translation["RU"] = { Exiting_loop_push = "Exiting_loop_push", Push_forecast = "Прогноз Нажмите", Temperature = "Температура", Humidity = "Влажность", Pressure = "Давление", Wind = "Ветер", Rain = "Дождь", Forecast = "Прогноз", Station = "Станция", Fetched = "Получено", Data_processed = "Данные обработаны", Update_interval = "Следующее обновление через (мин.)", No_data_fetched = "Данные не получены", NO_STATIONID_FOUND = "Данная станция не найдена", NO_DATA_FOUND = "Данные не найдены" } WU.translation["ES"] = { Exiting_loop_push = "Exiting_loop_push", Push_forecast = "Pronóstico enviado", Temperature = "Temperatura", Humidity = "Humedad", Pressure = "Presión", Wind = "Viento", Rain = "Precipitaciones", Forecast = "Pronóstico", Station = "Estación", Fetched = "Extraído", Data_processed = "Datos procesados", Update_interval = "La próxima actualización será en (min)", No_data_fetched = "Ningún dato extraído", new_version = "Nueva versión del script WUWeather.lua disponible! ", script_url = "http://jonnylarsson.se/JL/", NO_STATIONID_FOUND = "No se ha encontrado la stationID", NO_DATA_FOUND = "Datos no encontrados" } if WU.station == "LOCID" then locationID = WU.LOCID elseif WU.station == "PWS" then locationID = WU.PWS end Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span")); end function log(str) if debug then fibaro:debug(str); end end function errorlog(str) fibaro:debug("<font color='red'>"..str.."</font>") end function Telegrambot(msg) -- Read settings from variable WU.Telegramtoken1 = fibaro:getGlobal("Telegramtoken1_part1")..":"..fibaro:getGlobal("Telegramtoken1_part2") WU.Telegramchat_id1 = fibaro:getGlobal("Telegramchat_id1") WU.Telegramurl1 = "https://api.telegram.org/bot"..WU.Telegramtoken1.."/sendMessage?chat_id="..WU.Telegramchat_id1.."&text=" if WU.dualChat_ID then WU.Telegramtoken2 = fibaro:getGlobal("Telegramtoken2_part1")..":"..fibaro:getGlobal("Telegramtoken2_part2") WU.Telegramchat_id2 = fibaro:getGlobal("Telegramchat_id2") WU.Telegramurl2 = "https://api.telegram.org/bot"..WU.Telegramtoken2.."/sendMessage?chat_id="..WU.Telegramchat_id2.."&text=" end -- End read settings from variable local selfhttp = net.HTTPClient({timeout=2000}) url = WU.Telegramurl1 .. msg selfhttp:request(url, { options={ headers = selfhttp.controlHeaders, data = requestBody, method = 'GET' }, success = function(status) local result = json.decode(status.data); if result.ok == true then Debug("grey", "Sucessfully sent message to Telegram Bot...") else --errorlog("failed"); print(status.data); end end, error = function(error) --errorlog("ERROR") Debug("red", error) end }) if WU.dualChat_ID then url2 = WU.Telegramurl2 .. msg selfhttp:request(url2, { options={ headers = selfhttp.controlHeaders, data = requestBody, method = 'GET' }, success = function(status) local result = json.decode(status.data); if result.ok == true then Debug("grey", "Sucessfully sent message to Telegram Bot...") else --errorlog("failed"); print(status.data); end end, error = function(error) --errorlog("ERROR") Debug("red", error) end }) end end function versionChecker() local function getMethod(requestUrl, successCallback, errorCallback) local http = net.HTTPClient() http:request(requestUrl, { options = { method = 'GET', headers = { }, }, success = successCallback, error = errorCallback }) end content = "WUWeather.lua" local url = 'http://jonnylarsson.se/JL/'..content getMethod(url, function(resp) s = resp.data serverVersion = string.match(s, "{V(.-)}"); scriptVersion = string.match(version, "{V(.-)}"); if serverVersion > scriptVersion then Debug("grey", "Checking script version...") Debug("yellow", "There is a new version out! "..'<a href="http://jonnylarsson.se/JL/WUWeather.lua" target="_blank" style="display:inline;color:Cyan">Get it!</a>') if WU.sendPush then for k,smartphoneID_and_fcst in ipairs(smartphoneID_and_fcst) do if smartphoneID_and_fcst[4] == "Fibaro" then fibaro:call(smartphoneID_and_fcst[1] , "sendPush", WU.translation[WU.language]["new_version"].." "..WU.translation[WU.language]["script_url"]) elseif smartphoneID_and_fcst[4] == "Telegram" then Telegrambot(WU.translation[WU.language]["new_version"].." "..WU.translation[WU.language]["script_url"]) end end end end end, function(err) print('error' .. err) end ) end local http = net.HTTPClient() local function errorWU(err) if WU.pushOption == "Fibaro" then fibaro:call(WU.smartphoneID , "sendPush", "[WUWeather scene]. Error: "..err ) elseif WU.pushOption == "Telegram" then Telegrambot("[WUWeather scene]. Error: "..err ) end Debug( "red", "[HTTPClient:request]. Error: "..err ); end local function sendPopup() -- variable containing path of Motion Sensor’s icon local imgUrl = popupIMG -- pop-up call HomeCenter.PopupService.publish({ -- title (required) title = 'Weather forecast', -- subtitle(optional), e.g. time and date of the pop-up call subtitle = os.date("%I:%M:%S %p | %B %d, %Y"), -- content header (optional) contentTitle = 'Forecast from WU Weather', -- content (required) contentBody = fcastday.." - "..fcast, -- notification image (assigned from the variable) img = imgUrl, -- type of the pop-up type = 'Info', }) end function createGlobalIfNotExists(varName, defaultValue) if (fibaro:getGlobal(varName) == nil) then Debug("cyan", "Creating the variable: "..varName.." with value: "..defaultValue) newVar = {} newVar.name = varName newVar.value = defaultValue local http = net.HTTPClient() http:request("http://127.0.0.1:11111/api/globalVariables", { options = { method = 'POST', data = json.encode(newVar)}}) end end local function processWU(response) http:request("http://api.wunderground.com/api/"..WU.APIkey.."/conditions/forecast/lang:"..WU.language.."/q/"..WU.station..":"..locationID..".json",{ options = {method = 'GET'}, success = processWU, error = errorWU }) Debug( "green", "Now downloading data from www.wunderground.com"); if response then -- the first time you enter the loop, this will be nil jsonTable = json.decode(response.data) if jsonTable.response.error ~= nil then Debug( "red", jsonTable.response.error.description) else jsonTable = json.decode(response.data) WU.now = os.date("%H:%M") stationID = jsonTable.current_observation.station_id city = jsonTable.current_observation.observation_location.city humidity = jsonTable.current_observation.relative_humidity temperature = jsonTable.current_observation.temp_c pression = jsonTable.current_observation.pressure_mb wind = jsonTable.current_observation.wind_kph rain = jsonTable.current_observation.precip_today_metric icon = jsonTable.current_observation.icon weathericon = jsonTable.current_observation.icon_url fcstday1 = jsonTable.forecast.txt_forecast.forecastday[1].title fcst1 = jsonTable.forecast.txt_forecast.forecastday[1].fcttext_metric fcst1icon = jsonTable.forecast.txt_forecast.forecastday[1].icon_url fcstday2 = jsonTable.forecast.txt_forecast.forecastday[2].title fcst2 = jsonTable.forecast.txt_forecast.forecastday[2].fcttext_metric fcst2icon = jsonTable.forecast.txt_forecast.forecastday[2].icon_url fcstday3 = jsonTable.forecast.txt_forecast.forecastday[3].title fcst3 = jsonTable.forecast.txt_forecast.forecastday[3].fcttext_metric fcst3icon = jsonTable.forecast.txt_forecast.forecastday[3].icon_url fcst1_mobile = jsonTable.forecast.simpleforecast.forecastday[1].conditions fcst2_mobile = jsonTable.forecast.simpleforecast.forecastday[2].conditions if (stationID ~= nil) then fibaro:call(WU.selfId , "setProperty", "ui.lblStation.value", locationID); fibaro:call(WU.selfId , "setProperty", "ui.lblCity.value", city); fibaro:call(WU.selfId , "setProperty", "ui.lblTemp.value", WU.translation[WU.language]["Temperature"].." "..temperature.." °C"); fibaro:call(WU.selfId , "setProperty", "ui.lblHum.value", WU.translation[WU.language]["Humidity"].." "..humidity); fibaro:call(WU.selfId , "setProperty", "ui.lblBar.value", WU.translation[WU.language]["Pressure"].." "..pression.." mb"); fibaro:call(WU.selfId , "setProperty", "ui.lblWind.value", WU.translation[WU.language]["Wind"].." "..wind.." km/h"); fibaro:call(WU.selfId , "setProperty", "ui.lblRain.value", WU.translation[WU.language]["Rain"].." "..rain.." mm"); if (WU.now >= "03:00" and WU.now <= "15:59") then fibaro:call(WU.selfId , "setProperty", "ui.lblFcst.value",WU.translation[WU.language]["Forecast"].." "..fcstday1.." - "..fcst1_mobile); --fibaro:call(WU.selfId , "setProperty", "ui.lblIcon.value","<img src=http://jonnylarsson.se/JL/png/"..icon..".png>"); elseif (WU.now >= "16:00" and WU.now <= "23:59") then --fibaro:call(WU.selfId , "setProperty", "ui.lblIcon.value","<img src=http://jonnylarsson.se/JL/png/nt_"..icon..".png>"); fibaro:call(WU.selfId , "setProperty", "ui.lblFcst.value", WU.translation[WU.language]["Forecast"].." "..fcstday2.." - "..fcst2_mobile); end if WU.sendPush then for k,smartphoneID_and_fcst in ipairs(smartphoneID_and_fcst) do if (os.date("%H:%M") == smartphoneID_and_fcst[2]) then if versionCheck then versionChecker() end if smartphoneID_and_fcst[4] == "Fibaro" then fcastday = fcstday1 fcast = fcst1 fibaro:call(smartphoneID_and_fcst[1], "sendPush", fcstday1.." - "..fcst1) popupIMG = "http://jonnylarsson.se/JL/png/"..icon..".png" sendPopup() Debug("grey", "Sucessfully sent push message to "..smartphoneID_and_fcst[1]) elseif smartphoneID_and_fcst[4] == "Telegram" then Telegrambot(fcstday1.."%0A"..string.lower(fcst1).."%0A"..fcst1icon.."%0A".."%0A"..fcstday2.."%0A"..string.lower(fcst2)) elseif smartphoneID_and_fcst[4] == "Pushover" then fibaro:setGlobal("pushoverBody", fcstday1.." - "..string.lower(fcst1).." - "..fcst1icon) end end end for k,smartphoneID_and_fcst in ipairs(smartphoneID_and_fcst) do if (os.date("%H:%M") == smartphoneID_and_fcst[3]) then if smartphoneID_and_fcst[4] == "Fibaro" then fcastday = fcstday2 fcast = fcst2 fibaro:call(smartphoneID_and_fcst[1] , "sendPush", fcstday2.."\n"..string.lower(fcst2).."\n"..fcst2icon.."\n".."\n"..fcstday3.."\n"..string.lower(fcst3)) popupIMG = "http://jonnylarsson.se/JL/png/nt_"..icon..".png" sendPopup() Debug("grey", "Sucessfully sent push message to "..smartphoneID_and_fcst[1]) elseif smartphoneID_and_fcst[4] == "Telegram" then Telegrambot(fcstday2.."%0A"..string.lower(fcst2).."%0A"..fcst2icon.."%0A".."%0A"..fcstday3.."%0A"..string.lower(fcst3)) elseif smartphoneID_and_fcst[4] == "Pushover" then fibaro:setGlobal("pushoverBody", fcstday2.."\n"..string.lower(fcst2).."\n"..fcst2icon.."\n".."\n"..fcstday3.."\n"..string.lower(fcst3)) end end end end if WU.sendPush then fibaro:call(WU.selfId , "setProperty", "ui.lblNotify.value", WU.translation[WU.language]["Push_forecast"].." = true"); else fibaro:call(WU.selfId , "setProperty", "ui.lblNotify.value",WU.translation[WU.language]["Push_forecast"].." = false"); end WU.scheduler = os.time()+updateEvery*60 fibaro:call(WU.selfId, "setProperty", "ui.lblUpdate.value", os.date("%c")); fibaro:debug(WU.translation[WU.language]["Data_processed"]) fibaro:debug(WU.translation[WU.language]["Update_interval"].." "..updateEvery) else fibaro:debug(WU.translation[WU.language]["NO_STATIONID_FOUND"]) end end sleepAndcheck = 0 while sleepAndcheck <= 20*updateEvery do fibaro:sleep(3000) sleepAndcheck = sleepAndcheck+1 for k,smartphoneID_and_fcst in ipairs(smartphoneID_and_fcst) do if (DoNotRecheckBefore <= os.time()) and ((WU.scheduler == os.time) or (os.date("%H:%M") == smartphoneID_and_fcst[2]) or (os.date("%H:%M") == smartphoneID_and_fcst[3])) then fibaro:debug(WU.translation[WU.language]["Push_forecast"]) Debug("orange", WU.translation[WU.language]["Exiting_loop_push"]); DoNotRecheckBefore = os.time()+60 sleepAndcheck = 20*updateEvery end end end end end Debug( "orange", "WU Weather - LUA Scripting by Jonny Larsson 2015/2016" ); Debug( "orange", "Version: "..version); if versionCheck then versionChecker() end createGlobalIfNotExists("WUAPI", WU.APIkey) createGlobalIfNotExists("Telegramtoken1_part1", WU.Telegramtoken1_part1) createGlobalIfNotExists("Telegramtoken1_part2", WU.Telegramtoken1_part2) createGlobalIfNotExists("Telegramchat_id1", WU.Telegramchat_id1) if WU.dualChat_ID then createGlobalIfNotExists("Telegramtoken2_part1", WU.Telegramtoken2_part1) createGlobalIfNotExists("Telegramtoken2_part2", WU.Telegramtoken2_part2) createGlobalIfNotExists("Telegramchat_id2", WU.Telegramchat_id2) end for k,smartphoneID_and_fcst in ipairs(smartphoneID_and_fcst) do Debug( "yellow", "Morning forecast push will be for ID: "..smartphoneID_and_fcst[1].." @ "..smartphoneID_and_fcst[2].." with "..smartphoneID_and_fcst[4]); Debug( "yellow", "Afternoon forecast push will be for ID: "..smartphoneID_and_fcst[1].." @ "..smartphoneID_and_fcst[3].." with "..smartphoneID_and_fcst[4]); end processWU() --this starts an endless loop, until an error occurs ---- END OF UPDATE ----
- 50 replies