//Make sure the exec v2 binding is installed //Complete all the information here with your details //Add both switches from the items file to habpanel / sitemap //Turn on the setup switch - this will create the base files and authenticate //Ensure that Refresh_Token has now got a value - if not then there is an authentication switch you can trigger //Turn on the Update Switch - This will get all your items and setup all the rules //If at any point you want to update as you have added or removed items then just trigger the update switch again ***Backup your files first as this will overwrite them*** //Refresh rate is how often it polls the api for changes, 6 seconds is the minimum interval without error //On Manual change (ie switch in habpanel) the item will be locked for 12 seconds from the refresh rule so that you dont get race conditions, if you change the refresh rate you may need to adjust this var String username = "UserName" var String password = "Password" var String OpenHabRulesPath = "/openhab/conf/rules/" var String OpenHabItemsPath = "/openhab/conf/items/" var String OpenHabThingsPath = "/openhab/conf/things/" var String OpenHabScriptsPath = "/openhab/conf/scripts/" var String FirstTimeRun = "true" var String RefreshRate = "6" // --------------------------------------------------------------------------------------------------------------------------------------------- rule LwSetup when Item Lw_Setup changed from OFF to ON then if(FirstTimeRun == "true"){ //Define Items File var String BaseItemsFile = "String LwAuth_Inp {channel=\\\"exec:command:LwAuth:input\\\"}\r\n" + "String LwAuth_Out {channel=\\\"exec:command:LwAuth:output\\\"}\r\n" + "Switch LwAuth_Run {channel=\\\"exec:command:LwAuth:run\\\"}\r\n" + "String LwGet_Inp {channel=\\\"exec:command:LwGet:input\\\"}\r\n" + "String LwGet_Out {channel=\\\"exec:command:LwGet:output\\\"}\r\n" + "Switch LwGet_Run {channel=\\\"exec:command:LwGet:run\\\"}\r\n" + "String LwUpdate_Structures_Inp {channel=\\\"exec:command:LwUpdate_Structures:input\\\"}\r\n" + "String LwUpdate_Structures_Out {channel=\\\"exec:command:LwUpdate_Structures:output\\\"}\r\n" + "Switch LwUpdate_Structures_Run {channel=\\\"exec:command:LwUpdate_Structures:run\\\"}\r\n" + "String LwUpdate_Features_Inp {channel=\\\"exec:command:LwUpdate_Features:input\\\"}\r\n" + "String LwUpdate_Features_Out {channel=\\\"exec:command:LwUpdate_Features:output\\\"}\r\n" + "Switch LwUpdate_Features_Run {channel=\\\"exec:command:LwUpdate_Features:run\\\"}\r\n" + "String LwUpdate_Inp {channel=\\\"exec:command:LwUpdate:input\\\"}\r\n" + "String LwUpdate_Out {channel=\\\"exec:command:LwUpdate:output\\\"}\r\n" + "Switch LwUpdate_Run {channel=\\\"exec:command:LwUpdate:run\\\"}\r\n" + "String LwUpdate_Structures\r\n" + "String LwUpdate_Features\r\n" + "String Refresh_Token\r\n" + "String Access_Token\r\n" + "String LwGet_Start\r\n" + "Switch Authentication_Switch\r\n" //Create Base Items File var File1 = executeCommandLine("sh@@-c@@echo \"" + BaseItemsFile + "\" > " + OpenHabItemsPath + "Lw_Base.items",5000) logInfo("LwSetup - File 1",File1) //Define Update Script var String UpdateFile = "#!/bin/bash\r\n" + "curl -s -X POST https://publicapi.lightwaverf.com/v1/feature/\\$1 -H Content-Type:application/json -H \\\"Authorization:bearer \\$2\\\" -d '{\\\"value\\\":\\\"'\\$3'\\\"}'" //Create Update Script var File2 = executeCommandLine("sh@@-c@@echo \"" + UpdateFile + "\" > " + OpenHabScriptsPath + "Lw_Update.sh",5000) logInfo("LwSetup - File 2",File2) //Define Update_Features Script var String UpdateFeaturesFile = "#!/bin/bash\r\n" + "curl -s -X GET https://publicapi.lightwaverf.com/v1/Structure/\\$1 -H \\\"Authorization:bearer \\$2\\\"" //Create Update_Features Script var File3 = executeCommandLine("sh@@-c@@echo \"" + UpdateFeaturesFile + "\" > " + OpenHabScriptsPath + "Lw_Update_Features.sh",5000) logInfo("LwSetup - File 3",File3) //Define Update_Structures Script var String UpdateStructuresFile = "#!/bin/bash\r\n" + "curl -s -X GET https://publicapi.lightwaverf.com/v1/Structures -H \\\"Authorization:bearer \\$1\\\"" //Create Update_Structures Script var File4 = executeCommandLine("sh@@-c@@echo \"" + UpdateStructuresFile + "\" > " + OpenHabScriptsPath + "Lw_Update_Structures.sh",5000) logInfo("LwSetup - File 4",File4) //Define Things File var String RulesFile = "Thing exec:command:LwAuth [ command=\\\"%2\\$s\\\", interval=3600,timeout=5, autorun=true ]\r\n" + "Thing exec:command:LwGet [ command=\\\"sh " + OpenHabScriptsPath + "Lw_Get.sh %2\\$s\\\", interval=" + RefreshRate + ",timeout=10, autorun=true ]\r\n" + "Thing exec:command:LwUpdate_Structures [ command=\\\"sh " + OpenHabScriptsPath + "Lw_Update_Structures.sh %2\\$s\\\", interval=0,timeout=1000, autorun=true ]\r\n" + "Thing exec:command:LwUpdate_Features [ command=\\\"sh " + OpenHabScriptsPath + "Lw_Update_Features.sh %2\\$s\\\", interval=0,timeout=1000, autorun=true ]\r\n" + "Thing exec:command:LwUpdate [ command=\\\"sh " + OpenHabScriptsPath + "Lw_Update.sh %2\\$s\\\", interval=0,timeout=1000, autorun=true ]\r\n" //Create Things File var File5 = executeCommandLine("sh@@-c@@echo \"" + RulesFile + "\" > " + OpenHabThingsPath + "Lw.things",5000) logInfo("LwSetup - File 5",File5) Lw_Setup.sendCommand(OFF) LwUpdate.sendCommand(OFF) } end // rule LwAuth when System started or Time cron "30 0 0 1/1 * ? *" or Item Authentication_Switch changed from OFF to ON then var String Authentication = "curl -X POST https://auth.lightwaverf.com/v2/lightwaverf/autouserlogin/lwapps -H Content-Type:application/json -H x-lwrf-appid:ios-01 -d {\"email\":\"" + username + "\",\"password\":\"" + password + "\"}" if(LwAuth_Inp.state.toString == Authentication){LwAuth_Run.sendCommand(ON)} else LwAuth_Inp.sendCommand(Authentication) logInfo("Lw.Rules","Authentication Rule Ran") Authentication_Switch.sendCommand(OFF) end rule LwGet when Item LwAuth_Out changed then var String Result = LwAuth_Out.state.toString var String RefreshToken = transform("JSONPATH", "$.refresh_token" , "{" + Result.substringBetween("\"tokens\":{","}}") + "}") var String AccessToken = transform("JSONPATH", "$.access_token" , "{" + Result.substringBetween("\"tokens\":{","}}") + "}") Refresh_Token.postUpdate(RefreshToken) Access_Token.postUpdate(AccessToken) logInfo("Lw.Rules","Refresh Token Changed To " + Refresh_Token) LwGet_Inp.sendCommand(AccessToken) end rule LwUpdate when Item LwUpdate changed from OFF to ON then if(LwUpdate_Structures_Inp.state.toString == Access_Token.state.toString){LwUpdate_Structures_Run.sendCommand(ON)} else LwUpdate_Structures_Inp.sendCommand(Access_Token.state.toString) logInfo("Lw.Rules","Structures Rule Ran") end rule LwUpdate_Structures when Item LwUpdate_Structures_Out received update then LwUpdate_Structures.postUpdate(transform("JSONPATH", "$.structures" , LwUpdate_Structures_Out.state.toString)) if(LwUpdate_Features_Inp.state.toString == LwUpdate_Structures.state.toString + " " + Access_Token.state.toString){LwUpdate_Features_Run.sendCommand(ON)} else LwUpdate_Features_Inp.sendCommand(LwUpdate_Structures.state.toString + " " + Access_Token.state.toString) end rule LwUpdate_Create when Item LwUpdate_Features_Out received update then var String Features = LwUpdate_Features_Out.state.toString LwUpdate_Features.sendCommand(Features) //Get Items And Features var Number Devices_Count = 0 var Number Devices_Current = 0 var String FeatureSets_JSONFilter = "" var Number FeatureSets_Count = 0 var Number FeatureSets_Current = 0 var Number Features_Count = 0 var Number Features_Current = 0 var String FeatureSets_Name_JSONFilter = "" var String FeatureSets_Name = "" var String Features_JSONFilter = "" var String Features_Id = "" var String Features_Id_JSONFilter = "" var String Features_Type = "" var String Features_Type_JSONFilter = "" var String Features_Writable = "" var String Features_Writable_JSONFilter = "" var String Features_OpenhabItemType = "" var String Features_OpenhabItemName = "" var String Features_OpenhabItemIcon = "" var String Features_OpenhabItemGroup = "" var String Features_OpenhabItem = "" var String Features_OpenhabItemStatus = "" var String Features_OpenhabItemStatusUpdate = "" var String Features_OpenhabItemRule = "" var String Features_OpenhabStatus = "#!/bin/bash\r\n" + "curl -s -X POST https://publicapi.lightwaverf.com/v1/features/read -H \\\"Authorization:bearer \\$1\\\" -H Content-Type:application/json -d '{\\\"features\\\":[" var String OpenhabStatusUpdate = "rule Lw_Refresh when Item LwGet_Out changed then\r\nvar String Readme = LwGet_Out.state.toString\r\nvar Number Electricity_Cost = 0.13\r\n\r\n" var String OpenhabRule = "" var String StatusRule = "" var String Features_OpenhabItemPowerCost = "" var String Features_OpenhabItemEnergyCost = "" Devices_Count = Integer::parseInt(transform("JSONPATH","$.devices.length()", Features).toString) while (Devices_Current < Devices_Count) { FeatureSets_JSONFilter = "$.devices[" + Devices_Current + "].featureSets.length()" FeatureSets_Count = Integer::parseInt(transform("JSONPATH",FeatureSets_JSONFilter, Features).toString) while (FeatureSets_Current < FeatureSets_Count) { Features_JSONFilter = "$.devices[" + Devices_Current + "].featureSets[" + FeatureSets_Current + "].features.length()" FeatureSets_Name_JSONFilter = "$.devices[" + Devices_Current + "].featureSets[" + FeatureSets_Current + "].name" FeatureSets_Name = transform("JSONPATH",FeatureSets_Name_JSONFilter, Features) Features_Count = Integer::parseInt(transform("JSONPATH",Features_JSONFilter, Features).toString) OpenhabStatusUpdate = OpenhabStatusUpdate + "//" + FeatureSets_Name + "\r\n" while (Features_Current < Features_Count) { Features_Id_JSONFilter = "$.devices[" + Devices_Current + "].featureSets[" + FeatureSets_Current + "].features[" + Features_Current + "].featureId" Features_Id = transform("JSONPATH",Features_Id_JSONFilter, Features) Features_Type_JSONFilter = "$.devices[" + Devices_Current + "].featureSets[" + FeatureSets_Current + "].features[" + Features_Current + "].type" Features_Type = transform("JSONPATH",Features_Type_JSONFilter, Features) Features_Writable_JSONFilter = "$.devices[" + Devices_Current + "].featureSets[" + FeatureSets_Current + "].features[" + Features_Current + "].writable" Features_Writable = transform("JSONPATH",Features_Writable_JSONFilter, Features) Features_OpenhabItemStatus = "{\\\"featureId\\\":\\\"" + Features_Id + "\\\"}" + if (Devices_Current == (Devices_Count - 1) && FeatureSets_Current == ( FeatureSets_Count - 1 ) && Features_Current == (Features_Count - 1 )) {""} else {","} //Item Type if ( Features_Type == "protection" || Features_Type == "identify" || Features_Type == "reset" || Features_Type == "upgrade" ) { Features_OpenhabItemType = "Switch " Features_OpenhabItemName = " \\\"" + FeatureSets_Name.toString + " " + Features_Type + if(Features_Writable == "false"){"(Read Only)\\\""}else {""} + "\\\"" Features_OpenhabItemIcon = " " Features_OpenhabItemGroup = " (GroupGroundSocketsOther)" Features_OpenhabItemStatusUpdate = "if(Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state.toString == \\\"\\\" || Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state == NULL){if(transform(\\\"JSONPATH\\\",\\\"$." + Features_Id + "\\\", Readme) == \\\"1\\\"){Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + ".postUpdate(ON)} else {Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + ".postUpdate(OFF)}}" Features_OpenhabItemPowerCost = "" Features_OpenhabItemEnergyCost = "" } else if ( Features_Type == "switch" ) { Features_OpenhabItemType = "Switch " Features_OpenhabItemName = " \\\"" + FeatureSets_Name.toString + if(Features_Writable == "false"){"(Read Only)\\\""}else {""} + "\\\"" Features_OpenhabItemIcon = " " Features_OpenhabItemGroup = " (GroupGroundSockets)" Features_OpenhabItemStatusUpdate = "if(Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state.toString == \\\"\\\" || Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state == NULL){if(transform(\\\"JSONPATH\\\",\\\"$." + Features_Id + "\\\", Readme) == \\\"1\\\"){Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + ".postUpdate(ON)} else {Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + ".postUpdate(OFF)}}" Features_OpenhabItemPowerCost = "" Features_OpenhabItemEnergyCost = "" } else if ( Features_Type == "dimLevel" ) { Features_OpenhabItemType = "Dimmer " Features_OpenhabItemName = " \\\"" + FeatureSets_Name.toString + " " + Features_Type + if(Features_Writable == "false"){"(Read Only)\\\""}else {""} + "\\\"" Features_OpenhabItemIcon = " " Features_OpenhabItemGroup = " (GroupGroundLights)" Features_OpenhabItemStatusUpdate ="if(Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state.toString == \\\"\\\" || Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state == NULL){Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + ".postUpdate(Integer::parseInt(transform(\\\"JSONPATH\\\",\\\"$." + Features_Id + "\\\", Readme)))}" Features_OpenhabItemPowerCost = "" Features_OpenhabItemEnergyCost = "" } else if ( Features_Type == "power" ) { Features_OpenhabItemType = "Number " Features_OpenhabItemName = " \\\"" + FeatureSets_Name.toString + " " + Features_Type + " [%.1f W] " + if(Features_Writable == "false"){"(Read Only)\\\""}else {""} + " Power [%.1f W]\\\"" Features_OpenhabItemIcon = " " Features_OpenhabItemGroup = " (GroupGroundSocketsPower)" Features_OpenhabItemStatusUpdate = "if(Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state.toString == \\\"\\\" || Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state == NULL){Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + ".postUpdate(Float::parseFloat(transform(\\\"JSONPATH\\\",\\\"$." + Features_Id + "\\\", Readme)))}" Features_OpenhabItemPowerCost = "\r\nLightwave_" + FeatureSets_Name.replace(" ","") + "_Power_Cost.postUpdate(Float::parseFloat(transform(\\\"JSONPATH\\\",\\\"$." + Features_Id + "\\\", Readme)) / 1000 * Electricity_Cost)" Features_OpenhabItemEnergyCost = "" } else if ( Features_Type == "energy" ) { Features_OpenhabItemType = "Number " Features_OpenhabItemName = " \\\"" + FeatureSets_Name.toString + " " + Features_Type + " [%.2f kWh] " + if(Features_Writable == "false"){"(Read Only)\\\""}else {""} + " Energy [%.2f KwH]\\\"" Features_OpenhabItemIcon = " " Features_OpenhabItemGroup = " (GroupGroundSocketsEnergy)" Features_OpenhabItemStatusUpdate ="if(Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state.toString == \\\"\\\" || Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state == NULL){Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + ".postUpdate(Float::parseFloat(transform(\\\"JSONPATH\\\",\\\"$." + Features_Id + "\\\", Readme)) / 1000)}" Features_OpenhabItemEnergyCost = "\r\nLightwave_" + FeatureSets_Name.replace(" ","") + "_Energy_Cost.postUpdate(Float::parseFloat(transform(\\\"JSONPATH\\\",\\\"$." + Features_Id + "\\\", Readme)) / 1000 * Electricity_Cost)" Features_OpenhabItemPowerCost = "" } else if ( Features_Type == "outletInUse" ) { Features_OpenhabItemType = "String " Features_OpenhabItemName = " \\\"" + FeatureSets_Name.toString + " " + Features_Type + if(Features_Writable == "false"){"(Read Only)\\\""}else {""} + " \\\"" Features_OpenhabItemIcon = " " Features_OpenhabItemGroup = " " Features_OpenhabItemStatusUpdate = "if(Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state.toString == \\\"\\\" || Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state == NULL){Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + ".postUpdate(if(transform(\\\"JSONPATH\\\",\\\"$." + Features_Id + "\\\", Readme) == 1){\\\"Yes\\\"} else {\\\"No\\\"})}" Features_OpenhabItemPowerCost = "" Features_OpenhabItemEnergyCost = "" } else if ( Features_Type == "periodOfBroadcast" ) { Features_OpenhabItemType = "String " Features_OpenhabItemName = " \\\"" + FeatureSets_Name.toString + " " + Features_Type + if(Features_Writable == "false"){"(Read Only)\\\""}else {""} + " \\\"" Features_OpenhabItemIcon = " " Features_OpenhabItemGroup = " " Features_OpenhabItemStatusUpdate = "if(Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state.toString == \\\"\\\" || Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state == NULL){Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + ".postUpdate(transform(\\\"JSONPATH\\\",\\\"$." + Features_Id + "\\\", Readme))}" Features_OpenhabItemPowerCost = "" Features_OpenhabItemEnergyCost = "" } else if ( Features_Type == "rgbColor" || Features_Type == "diagnostics" ) { Features_OpenhabItemType = "Number " Features_OpenhabItemName = " \\\"" + FeatureSets_Name.toString + " " + Features_Type + if(Features_Writable == "false"){"(Read Only)\\\""}else {""} + " \\\"" Features_OpenhabItemIcon = " " Features_OpenhabItemGroup = " " Features_OpenhabItemStatusUpdate = "if(Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state.toString == \\\"\\\" || Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state == NULL){Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + ".postUpdate(Integer::parseInt(transform(\\\"JSONPATH\\\",\\\"$." + Features_Id + "\\\", Readme)))}" Features_OpenhabItemPowerCost = "" Features_OpenhabItemEnergyCost = "" } else if ( Features_Type == "voltage" ) { Features_OpenhabItemType = "Number " Features_OpenhabItemName = " \\\"" + FeatureSets_Name.toString + " " + Features_Type + " [%.1f V] " + if(Features_Writable == "false"){"(Read Only)\\\""}else {""} + " \\\"" Features_OpenhabItemIcon = " " Features_OpenhabItemGroup = " " Features_OpenhabItemStatusUpdate = "if(Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state.toString == \\\"\\\" || Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state == NULL){Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + ".postUpdate(Integer::parseInt(transform(\\\"JSONPATH\\\",\\\"$." + Features_Id + "\\\", Readme)))}" Features_OpenhabItemPowerCost = "" Features_OpenhabItemEnergyCost = "" } else { Features_OpenhabItemType = "String " Features_OpenhabItemName = " \\\"" + FeatureSets_Name.toString + " " + Features_Type + if(Features_Writable == "false"){"(Read Only)\\\""}else {""} + " \\\"" Features_OpenhabItemIcon = " " Features_OpenhabItemGroup = " " Features_OpenhabItemStatusUpdate = "if(Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state.toString == \\\"\\\" || Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state == NULL){Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + ".postUpdate(transform(\\\"JSONPATH\\\",\\\"$." + Features_Id + "\\\", Readme))}" Features_OpenhabItemPowerCost = "" Features_OpenhabItemEnergyCost = "" } if(Features_Writable == "true" && Features_OpenhabItemType == "Switch ") { Features_OpenhabItemRule = "//" + FeatureSets_Name.toString + " " + Features_Type + " Rules \r\n" + "rule \\\"" + FeatureSets_Name.toString + " " + Features_Type + " Rule\\\" when Item Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + " received command then \r\n" + "val temp = now\r\n" + "Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.postUpdate(temp.toString)\r\n" + "if(receivedCommand==ON){LwUpdate_Inp.sendCommand(\\\"" + Features_Id + " \\\" + Access_Token.state.toString + \\\" 1\\\")}\r\n" + "else if (receivedCommand==OFF){LwUpdate_Inp.sendCommand(\\\"" + Features_Id + " \\\" + Access_Token.state.toString + \\\" 0\\\")}\r\n" + "createTimer(now.plusSeconds(12),[|\r\n" + "if(Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state.toString == temp.toString){Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.postUpdate(\\\"\\\")}])\r\n" + "end \r\n\r\n"} else if(Features_Writable == "true" && Features_OpenhabItemType == "Number "){ Features_OpenhabItemRule = "//" + FeatureSets_Name.toString + " " + Features_Type + " Rules \r\n" + "rule \\\"" + FeatureSets_Name.toString + " " + Features_Type + " Rule\\\" when Item Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + " received command then \r\n" + "val temp = now\r\n" + "Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.postUpdate(temp.toString)\r\n" + "LwUpdate_Inp.sendCommand(\\\"" + Features_Id + " \\\" + Access_Token.state.toString + \\\" \\\" + receivedCommand.toString)\r\n" + "createTimer(now.plusSeconds(12),[|\r\n" + "if(Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state.toString == temp.toString){Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.postUpdate(\\\"\\\")}])\r\n" + "end \r\n\r\n"} else if(Features_Writable == "true" && Features_OpenhabItemType == "String "){ Features_OpenhabItemRule = "//" + FeatureSets_Name.toString + " " + Features_Type + " Rules \r\n" + "rule \\\"" + FeatureSets_Name.toString + " " + Features_Type + " Rule\\\" when Item Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + " received command then \r\n" + "val temp = now\r\n" + "Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.postUpdate(temp.toString)\r\n" + "LwUpdate_Inp.sendCommand(\\\"" + Features_Id + " \\\" + Access_Token.state.toString + \\\" \\\" + receivedCommand.toString)\r\n" + "createTimer(now.plusSeconds(12),[|\r\n" + "if(Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.state.toString == temp.toString){Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock.postUpdate(\\\"\\\")}])\r\n" + "end \r\n\r\n"} else {Features_OpenhabItemRule = ""} //Create Item File Base Features_OpenhabItem = Features_OpenhabItem + Features_OpenhabItemType + " Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + " " + Features_OpenhabItemName + " " + Features_OpenhabItemIcon + " " +Features_OpenhabItemGroup +"\r\n" + "String" + " Lightwave_" + FeatureSets_Name.replace(" ","") + "_" + Features_Type + "_Lock\r\n" //Create Rule File Base Features_OpenhabStatus = Features_OpenhabStatus + Features_OpenhabItemStatus OpenhabStatusUpdate = OpenhabStatusUpdate + Features_OpenhabItemStatusUpdate + Features_OpenhabItemPowerCost + Features_OpenhabItemEnergyCost +"\r\n" OpenhabRule = OpenhabRule + Features_OpenhabItemRule Features_Current = Features_Current + 1 } Features_OpenhabItem = Features_OpenhabItem + "Number Lightwave_" + FeatureSets_Name.replace(" ","") + "_Power_Cost \\\"" + FeatureSets_Name + " Power Cost [%.3f �/Hour]\\\" (GroupGroundSocketsPowerCost)\r\n" + "Number Lightwave_" + FeatureSets_Name.replace(" ","") + "_Energy_Cost \\\"" + FeatureSets_Name + " Energy Cost [� %.2f to date]\\\" (GroupGroundSocketsEnergyCost)\r\n" Features_Current = 0 FeatureSets_Current = FeatureSets_Current + 1 } FeatureSets_Current = 0 Devices_Current = Devices_Current + 1 } StatusRule = Features_OpenhabStatus + "]}'" // Create Device Items var Exec1 = executeCommandLine("sh@@-c@@echo \"" + Features_OpenhabItem + "\" > " + OpenHabItemsPath + "Lw.items",5000) logInfo("Exec1",Exec1) var Exec2 = executeCommandLine("sh@@-c@@echo \"" + StatusRule + "\" > " + OpenHabScriptsPath + "Lw_Get.sh",5000) logInfo("Exec2",Exec2) //Create Switch Rules var Exec3 = executeCommandLine("sh@@-c@@echo \"" + OpenhabStatusUpdate + "end\r\n\r\n" + OpenhabRule + "\r\" > " + OpenHabRulesPath + "Lw.rules",5000) logInfo("Exec3",Exec3) LwUpdate.sendCommand(OFF) end