Hi, your example works great!
Thanks a lot. Just amazing how I could avoid a rule with 600 lines of code with just one rule with 15 lines.
The strange this is that, everytime the rule is executed, I get the following
2017-05-18 18:57:56.187 [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'Update door/window contacts': The argument 'state' must not be null or empty.
Even though the rule works fine.
These are (some of) my items:
/* Alarm interface */
String Tex_UDP_Incoming "Incoming UDP String1 [%s]" <settings> (gSet) { udp="<[192.168.3.10:*:'REGEX((.*))']" }
/* Zone Status */
Number Tex_Zone_Z001 "Z01 - Sabotage Sirene [MAP(windows.map):%s]" <error> (gAlarm)
Number Tex_Zone_Z002 "Z02 - Glasbreukdetector praktijkruimte [MAP(windows.map):%s]" <error> (gKE_Praktijkruimte, gGlasbreuk)
Number Tex_Zone_Z003 "Z03 - Glasbreukdetector garage [MAP(windows.map):%s]" <error> (gGV_Garage, gGlasbreuk)
Number Tex_Zone_Z004 "Z04 - Glasbreukdetector berging [MAP(windows.map):%s]" <error> (gGV_Berging, gGlasbreuk)
Number Tex_Zone_Z005 "Z05 - Glasbreukdetector keuken [MAP(windows.map):%s]" <error> (gGV_Keuken, gGlasbreuk)
Number Tex_Zone_Z006 "Z06 - Glasbreukdetector living [MAP(windows.map):%s]" <error> (gGV_Living, gGlasbreuk)
Number Tex_Zone_Z007 "Z07 - Glasbreukdetector bureau [MAP(windows.map):%s]" <error> (gGV_Bureau, gGlasbreuk)
Number Tex_Zone_Z008 "Z08 - Glasbreukdetector nachthal [MAP(windows.map):%s]" <error> (gEV_Nachthal, gGlasbreuk)
Number Tex_Zone_Z009 "Z09 - Glasbreukdetector dressing [MAP(windows.map):%s]" <error> (gEV_Dressing, gGlasbreuk)
Number Tex_Zone_Z010 "Z10 - Glasbreukdetector badkamer [MAP(windows.map):%s]" <error> (gEV_Badkamer, gGlasbreuk)
Number Tex_Zone_Z011 "Z11 - Glasbreukdetector slaapkamer K&D [MAP(windows.map):%s]" <error> (gEV_MasterBedroom, gGlasbreuk)
Number Tex_Zone_Z012 "Z12 - Glasbreukdetector logeerkamer [MAP(windows.map):%s]" <error> (gEV_Logeerkamer, gGlasbreuk)
Number Tex_Zone_Z013 "Z13 - Glasbreukdetector ontspanningsruimte [MAP(windows.map):%s]" <error> (gEV_Ontspanningsruimte, gGlasbreuk)
Number Tex_Zone_Z014 "Z14 - Voordeur [MAP(windows.map):%s]" <door> (gGV_Inkomhal, gDeur)
Number Tex_Zone_Z015 "Z15 - Zijdeur [MAP(windows.map):%s]" <door> (gGV_Sas, gDeur)
Number Tex_Zone_Z016 "Z16 - Achterdeur [MAP(windows.map):%s]" <door> (gGV_Keuken, gDeur)
Number Tex_Zone_Z017 "Z17 - Raam garage rechts open/dicht [MAP(windows.map):%s]" <window> (gGV_Garage, gRaamcontact)
Number Tex_Zone_Z018 "Z18 - Raam garage rechts kipstand [MAP(windows.map):%s]" <window> (gGV_Garage, gRaamcontact)
Number Tex_Zone_Z019 "Z19 - Raam garage links voor open/dicht [MAP(windows.map):%s]" <window> (gGV_Garage, gRaamcontact)
Number Tex_Zone_Z020 "Z20 - Raam garage links voor kipstand [MAP(windows.map):%s]" <window> (gGV_Garage, gRaamcontact)
Number Tex_Zone_Z021 "Z21 - Raam garage links achter open/dicht [MAP(windows.map):%s]" <window> (gGV_Garage, gRaamcontact)
Number Tex_Zone_Z022 "Z22 - Raam garage links achter kipstand [MAP(windows.map):%s]" <window> (gGV_Garage, gRaamcontact)
Number Tex_Zone_Z023 "Z23 - Raam berging open/dicht [MAP(windows.map):%s]" <window> (gGV_Berging, gRaamcontact)
Number Tex_Zone_Z024 "Z24 - Raam berging kipstand [MAP(windows.map):%s]" <window> (gGV_Berging, gRaamcontact)
Number Tex_Zone_Z025 "Z25 - Raam keuken zijkant links open/dicht [MAP(windows.map):%s]" <window> (gGV_Keuken, gRaamcontact)
Number Tex_Zone_Z026 "Z26 - Raam keuken zijkant links kipstand [MAP(windows.map):%s]" <window> (gGV_Keuken, gRaamcontact)
Number Tex_Zone_Z027 "Z27 - Raam keuken zijkant rechts open/dicht [MAP(windows.map):%s]" <window> (gGV_Keuken, gRaamcontact)
Number Tex_Zone_Z028 "Z28 - Raam keuken zijkant rechts kipstand [MAP(windows.map):%s]" <window> (gGV_Keuken, gRaamcontact)
Number Tex_Zone_Z029 "Z29 - Raam keuken achter rechts kipstand [MAP(windows.map):%s]" <window> (gGV_Keuken, gRaamcontact)
Number Tex_Zone_Z030 "Z30 - Raam keuken achter rechts open/dicht [MAP(windows.map):%s]" <window> (gGV_Keuken, gRaamcontact)
Number Tex_Zone_Z031 "Z31 - Raam keuken achter midden open/dicht [MAP(windows.map):%s]" <window> (gGV_Keuken, gRaamcontact)
Number Tex_Zone_Z032 "Z32 - Raam keuken achter midden kipstand [MAP(windows.map):%s]" <window> (gGV_Keuken, gRaamcontact)
Number Tex_Zone_Z033 "Z33 - Raam keuken achter links kipstand [MAP(windows.map):%s]" <window> (gGV_Keuken, gRaamcontact)
Number Tex_Zone_Z034 "Z34 - Raam keuken achter links open/dicht [MAP(windows.map):%s]" <window> (gGV_Keuken, gRaamcontact)
Number Tex_Zone_Z035 "Z35 - Raam bureau zijkant open/dicht [MAP(windows.map):%s]" <window> (gGV_Bureau, gRaamcontact)
Number Tex_Zone_Z036 "Z36 - Raam bureau zijkant kipstand [MAP(windows.map):%s]" <window> (gGV_Bureau, gRaamcontact)
Number Tex_Zone_Z037 "Z37 - Raam bureau voorkant open/dicht [MAP(windows.map):%s]" <window> (gGV_Bureau, gRaamcontact)
Number Tex_Zone_Z038 "Z38 - Raam bureau voorkant kipstand [MAP(windows.map):%s]" <window> (gGV_Bureau, gRaamcontact)
Number Tex_Zone_Z039 "Z39 - Raam nachthal open/dicht [MAP(windows.map):%s]" <window> (gEV_Nachthal, gRaamcontact)
Number Tex_Zone_Z040 "Z40 - Raam nachthal kipstand [MAP(windows.map):%s]" <window> (gEV_Nachthal, gRaamcontact)
An this is mine (your) rule:
rule "Update door/window contacts"
when
Item Tex_UDP_Incoming received update
then
val inStr = Tex_UDP_Incoming.state.toString
if(inStr.startsWith("\"Z")) {
val itemName = "Tex_Zone_"+inStr.substring(1, 5)
postUpdate(itemName, inStr.substring(5))
}
end
An example value that triggers the rule is: "Z0360
(including the ").