Need help to make a delay in the code

Hi.

Please be aware that i´m very new to openhab :slight_smile:

I made some changes to this and it works. But it check the temperature every second, and make the connecting to google home crash. I think its maybe because of the request so often.
Is its possible to make some kind of delay.

Items file:

Group g_vaerelse0_TSTAT “Værelse 0” [ “Thermostat” ]
Number RaumTempG0 “[%.1f °C]” (g_vaerelse0_TSTAT) [ “CurrentTemperature” ]
Number SollTempG0 “[%.1f °C]” (g_vaerelse0_TSTAT) [ “TargetTemperature” ]

Group g_vaerelse1_TSTAT “Værelse 1” [ “Thermostat” ]
Number RaumTempG0 “[%.1f °C]” (g_vaerelse1_TSTAT) [ “CurrentTemperature” ]
Number SollTempG0 “[%.1f °C]” (g_vaerelse1_TSTAT) [ “TargetTemperature” ]

Group g_vaerelse2_TSTAT “Værelse 2” [ “Thermostat” ]
Number RaumTempG0 “[%.1f °C]” (g_vaerelse2_TSTAT) [ “CurrentTemperature” ]
Number SollTempG0 “[%.1f °C]” (g_vaerelse2_TSTAT) [ “TargetTemperature” ]

Group g_vaerelse3_TSTAT “Værelse 3” [ “Thermostat” ]
Number RaumTempG0 “[%.1f °C]” (g_vaerelse3_TSTAT) [ “CurrentTemperature” ]
Number SollTempG0 “[%.1f °C]” (g_vaerelse3_TSTAT) [ “TargetTemperature” ]

Group g_vaerelse4_TSTAT “Værelse 4” [ “Thermostat” ]
Number RaumTempG0 “[%.1f °C]” (g_vaerelse4_TSTAT) [ “CurrentTemperature” ]
Number SollTempG0 “[%.1f °C]” (g_vaerelse4_TSTAT) [ “TargetTemperature” ]

Group g_vaerelse5_TSTAT “Værelse 5” [ “Thermostat” ]
Number RaumTempG0 “[%.1f °C]” (g_vaerelse5_TSTAT) [ “CurrentTemperature” ]
Number SollTempG0 “[%.1f °C]” (g_vaerelse5_TSTAT) [ “TargetTemperature” ]

Group g_vaerelse6_TSTAT “Værelse 6” [ “Thermostat” ]
Number RaumTempG0 “[%.1f °C]” (g_vaerelse6_TSTAT) [ “CurrentTemperature” ]
Number SollTempG0 “[%.1f °C]” (g_vaerelse6_TSTAT) [ “TargetTemperature” ]

Group g_vaerelse7_TSTAT “Værelse 7” [ “Thermostat” ]
Number RaumTempG0 “[%.1f °C]” (g_vaerelse7_TSTAT) [ “CurrentTemperature” ]
Number SollTempG0 “[%.1f °C]” (g_vaerelse7_TSTAT) [ “TargetTemperature” ]

Group g_vaerelse8_TSTAT “Værelse 8” [ “Thermostat” ]
Number RaumTempG0 “[%.1f °C]” (g_vaerelse8_TSTAT) [ “CurrentTemperature” ]
Number SollTempG0 “[%.1f °C]” (g_vaerelse8_TSTAT) [ “TargetTemperature” ]

Group g_vaerelse9_TSTAT “Værelse 9” [ “Thermostat” ]
Number RaumTempG0 “[%.1f °C]” (g_vaerelse9_TSTAT) [ “CurrentTemperature” ]
Number SollTempG0 “[%.1f °C]” (g_vaerelse9_TSTAT) [ “TargetTemperature” ]

Group g_vaerelse10_TSTAT “Værelse 10” [ “Thermostat” ]
Number RaumTempG0 “[%.1f °C]” (g_vaerelse10_TSTAT) [ “CurrentTemperature” ]
Number SollTempG0 “[%.1f °C]” (g_vaerelse10_TSTAT) [ “TargetTemperature” ]

Group g_vaerelse11_TSTAT “Værelse 11” [ “Thermostat” ]
Number RaumTempG0 “[%.1f °C]” (g_vaerelse11_TSTAT) [ “CurrentTemperature” ]
Number SollTempG0 “[%.1f °C]” (g_vaerelse11_TSTAT) [ “TargetTemperature” ]

Rules file

val logName = “rothreadset”
val String roth_read = “http://192.168.0.70/cgi-bin/ILRReadValues.cgi
val String roth_set = “http://192.168.0.70/cgi-bin/writeVal.cgi
val String roth_post = “<item_list>
G0.nameG0.RaumTempG0.SollTemp
G1.nameG1.RaumTempG1.SollTemp
G2.nameG2.RaumTempG2.SollTemp
G3.nameG3.RaumTempG3.SollTemp
G4.nameG4.RaumTempG4.SollTemp
G5.nameG5.RaumTempG5.SollTemp
G6.nameG6.RaumTempG6.SollTemp
G7.nameG7.RaumTempG7.SollTemp
G8.nameG8.RaumTempG8.SollTemp
G9.nameG9.RaumTempG9.SollTemp
G10.nameG10.RaumTempG10.SollTemp
G11.nameG11.RaumTempG11.SollTemp
</item_list>”

rule "Update Roth Touchline+ temperatures"
when
  System started or
  //Time cron "*/10 * * * * ? *" or
  Time cron "23 */10 * * * ? *"
then
  var String SetPoint_read = sendHttpPostRequest(roth_read, "text/xml", roth_post)

  RaumTempG0.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G0.RaumTemp')]/v", SetPoint_read)))
  RaumTempG1.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G1.RaumTemp')]/v", SetPoint_read)))
  RaumTempG2.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G2.RaumTemp')]/v", SetPoint_read)))
  RaumTempG3.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G3.RaumTemp')]/v", SetPoint_read)))
  RaumTempG4.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G4.RaumTemp')]/v", SetPoint_read)))
  RaumTempG5.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G5.RaumTemp')]/v", SetPoint_read)))
  RaumTempG6.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G6.RaumTemp')]/v", SetPoint_read)))
  RaumTempG7.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G7.RaumTemp')]/v", SetPoint_read)))
  RaumTempG8.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G8.RaumTemp')]/v", SetPoint_read)))
  RaumTempG9.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G9.RaumTemp')]/v", SetPoint_read)))
  RaumTempG10.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G10.RaumTemp')]/v", SetPoint_read)))
  RaumTempG11.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G11.RaumTemp')]/v", SetPoint_read)))

  SollTempG0.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G0.SollTemp')]/v", SetPoint_read)))
  SollTempG1.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G1.SollTemp')]/v", SetPoint_read)))
  SollTempG2.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G2.SollTemp')]/v", SetPoint_read)))
  SollTempG3.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G3.SollTemp')]/v", SetPoint_read)))
  SollTempG4.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G4.SollTemp')]/v", SetPoint_read)))
  SollTempG5.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G5.SollTemp')]/v", SetPoint_read)))
  SollTempG6.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G6.SollTemp')]/v", SetPoint_read)))
  SollTempG7.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G7.SollTemp')]/v", SetPoint_read)))
  SollTempG8.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G8.SollTemp')]/v", SetPoint_read)))
  SollTempG9.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G9.SollTemp')]/v", SetPoint_read)))
  SollTempG10.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G10.SollTemp')]/v", SetPoint_read)))
  SollTempG11.sendCommand(transform("REGEX", "s/(.?.)(..)/$1.$2/g", transform("XPATH", "/body/item_list/i[contains(n,'G11.SollTemp')]/v", SetPoint_read)))

  SollTempG0.label = transform("XPATH", "/body/item_list/i[contains(n,'G0.name')]/v", SetPoint_read).toString + " " + RaumTempG0.state as Number + "°C"
  SollTempG1.label = transform("XPATH", "/body/item_list/i[contains(n,'G1.name')]/v", SetPoint_read).toString + " " + RaumTempG1.state as Number + "°C"
  SollTempG2.label = transform("XPATH", "/body/item_list/i[contains(n,'G2.name')]/v", SetPoint_read).toString + " " + RaumTempG2.state as Number + "°C"
  SollTempG3.label = transform("XPATH", "/body/item_list/i[contains(n,'G3.name')]/v", SetPoint_read).toString + " " + RaumTempG3.state as Number + "°C"
  SollTempG4.label = transform("XPATH", "/body/item_list/i[contains(n,'G4.name')]/v", SetPoint_read).toString + " " + RaumTempG4.state as Number + "°C"
  SollTempG5.label = transform("XPATH", "/body/item_list/i[contains(n,'G5.name')]/v", SetPoint_read).toString + " " + RaumTempG5.state as Number + "°C"
  SollTempG6.label = transform("XPATH", "/body/item_list/i[contains(n,'G6.name')]/v", SetPoint_read).toString + " " + RaumTempG6.state as Number + "°C"
  SollTempG7.label = transform("XPATH", "/body/item_list/i[contains(n,'G7.name')]/v", SetPoint_read).toString + " " + RaumTempG7.state as Number + "°C"
  SollTempG8.label = transform("XPATH", "/body/item_list/i[contains(n,'G8.name')]/v", SetPoint_read).toString + " " + RaumTempG8.state as Number + "°C"
  SollTempG9.label = transform("XPATH", "/body/item_list/i[contains(n,'G9.name')]/v", SetPoint_read).toString + " " + RaumTempG9.state as Number + "°C"
  SollTempG10.label = transform("XPATH", "/body/item_list/i[contains(n,'G10.name')]/v", SetPoint_read).toString + " " + RaumTempG10.state as Number + "°C"
  SollTempG11.label = transform("XPATH", "/body/item_list/i[contains(n,'G11.name')]/v", SetPoint_read).toString + " " + RaumTempG11.state as Number + "°C"
  //logInfo(logName, "return from post" + SetPoint_read)
end


rule "Set Roth Touchline+ temperatures room 0"
when
  Item SollTempG0 changed 
then
  sendHttpGetRequest(roth_set + "?G0.SollTemp=" + (SollTempG0.state as Number * 100).intValue())
end

rule "Set Roth Touchline+ temperatures room 1"
when
  Item SollTempG1 changed 
then
  sendHttpGetRequest(roth_set + "?G1.SollTemp=" + (SollTempG1.state as Number * 100).intValue())
end

rule "Set Roth Touchline+ temperatures room 2"
when
  Item SollTempG2 changed 
then
  sendHttpGetRequest(roth_set + "?G2.SollTemp=" + (SollTempG2.state as Number * 100).intValue())
end

rule "Set Roth Touchline+ temperatures room 3"
when
  Item SollTempG3 changed 
then
  sendHttpGetRequest(roth_set + "?G3.SollTemp=" + (SollTempG3.state as Number * 100).intValue())
end

rule "Set Roth Touchline+ temperatures room 4"
when
  Item SollTempG4 changed 
then
  sendHttpGetRequest(roth_set + "?G4.SollTemp=" + (SollTempG4.state as Number * 100).intValue())
end

rule "Set Roth Touchline+ temperatures room 5"
when
  Item SollTempG5 changed 
then
  sendHttpGetRequest(roth_set + "?G5.SollTemp=" + (SollTempG5.state as Number * 100).intValue())
end

rule "Set Roth Touchline+ temperatures room 6"
when
  Item SollTempG6 changed 
then
  sendHttpGetRequest(roth_set + "?G6.SollTemp=" + (SollTempG6.state as Number * 100).intValue())
end

rule "Set Roth Touchline+ temperatures room 7"
when
  Item SollTempG7 changed 
then
  sendHttpGetRequest(roth_set + "?G7.SollTemp=" + (SollTempG7.state as Number * 100).intValue())
end

rule "Set Roth Touchline+ temperatures room 8"
when
  Item SollTempG8 changed 
then
  sendHttpGetRequest(roth_set + "?G8.SollTemp=" + (SollTempG8.state as Number * 100).intValue())
end

rule "Set Roth Touchline+ temperatures room 9"
when
  Item SollTempG9 changed 
then
  sendHttpGetRequest(roth_set + "?G9.SollTemp=" + (SollTempG9.state as Number * 100).intValue())
end

rule "Set Roth Touchline+ temperatures room 10"
when
  Item SollTempG10 changed 
then
  sendHttpGetRequest(roth_set + "?G10.SollTemp=" + (SollTempG10.state as Number * 100).intValue())
end

rule "Set Roth Touchline+ temperatures room 11"
when
  Item SollTempG11 changed 
then
  sendHttpGetRequest(roth_set + "?G11.SollTemp=" + (SollTempG11.state as Number * 100).intValue())
end

//logInfo(logName, "GET request" + roth_set + "?G0.SollTemp=" + (SollTempG0.state as Number * 100).intValue())

Site file

Text label=“Gulvvarme” icon=“temperature” {
//Setpoint item=SollTempG0 valuecolor=[>22=“red”,>21=“green”,>20=“orange”,<=20=“blue”]
Setpoint item=SollTempG0 minValue=5 maxValue=30 step=0.5
Setpoint item=SollTempG1 minValue=5 maxValue=30 step=0.5
Setpoint item=SollTempG2 minValue=5 maxValue=30 step=0.5
Setpoint item=SollTempG3 minValue=5 maxValue=30 step=0.5
Setpoint item=SollTempG4 minValue=5 maxValue=30 step=0.5
Setpoint item=SollTempG5 minValue=5 maxValue=30 step=0.5
Setpoint item=SollTempG6 minValue=5 maxValue=30 step=0.5
Setpoint item=SollTempG7 minValue=5 maxValue=30 step=0.5
Setpoint item=SollTempG8 minValue=5 maxValue=30 step=0.5
Setpoint item=SollTempG9 minValue=5 maxValue=30 step=0.5
Setpoint item=SollTempG10 minValue=5 maxValue=30 step=0.5
Setpoint item=SollTempG11 minValue=5 maxValue=30 step=0.5
}

Maybe first consider to use a less iterative solution.
Items (be aware of additional groups):

Group gSollTemp
Group gRaumTemp

Group g_vaerelse0_TSTAT "Værelse 0" [ "Thermostat" ]
Number RaumTempG0 "[%.1f °C]" (g_vaerelse0_TSTAT,gRaumTemp) [ "CurrentTemperature" ]
Number SollTempG0 "[%.1f °C]" (g_vaerelse0_TSTAT,gSollTemp) [ "TargetTemperature" ]

Group g_vaerelse1_TSTAT "Værelse 1" [ "Thermostat" ]
Number RaumTempG1 "[%.1f °C]" (g_vaerelse1_TSTAT,gRaumTemp) [ "CurrentTemperature" ]
Number SollTempG1 "[%.1f °C]" (g_vaerelse1_TSTAT,gSollTemp) [ "TargetTemperature" ]

Group g_vaerelse2_TSTAT "Værelse 2" [ "Thermostat" ]
Number RaumTempG2 "[%.1f °C]" (g_vaerelse2_TSTAT,gRaumTemp) [ "CurrentTemperature" ]
Number SollTempG2 "[%.1f °C]" (g_vaerelse2_TSTAT,gSollTemp) [ "TargetTemperature" ]

Group g_vaerelse3_TSTAT "Værelse 3" [ "Thermostat" ]
Number RaumTempG3 "[%.1f °C]" (g_vaerelse3_TSTAT,gRaumTemp) [ "CurrentTemperature" ]
Number SollTempG3 "[%.1f °C]" (g_vaerelse3_TSTAT,gSollTemp) [ "TargetTemperature" ]

Group g_vaerelse4_TSTAT "Værelse 4" [ "Thermostat" ]
Number RaumTempG4 "[%.1f °C]" (g_vaerelse4_TSTAT,gRaumTemp) [ "CurrentTemperature" ]
Number SollTempG4 "[%.1f °C]" (g_vaerelse4_TSTAT,gSollTemp) [ "TargetTemperature" ]

Group g_vaerelse5_TSTAT "Værelse 5" [ "Thermostat" ]
Number RaumTempG5 "[%.1f °C]" (g_vaerelse5_TSTAT,gRaumTemp) [ "CurrentTemperature" ]
Number SollTempG5 "[%.1f °C]" (g_vaerelse5_TSTAT,gSollTemp) [ "TargetTemperature" ]

Group g_vaerelse6_TSTAT "Værelse 6" [ "Thermostat" ]
Number RaumTempG6 "[%.1f °C]" (g_vaerelse6_TSTAT,gRaumTemp) [ "CurrentTemperature" ]
Number SollTempG6 "[%.1f °C]" (g_vaerelse6_TSTAT,gSollTemp) [ "TargetTemperature" ]

Group g_vaerelse7_TSTAT "Værelse 7" [ "Thermostat" ]
Number RaumTempG7 "[%.1f °C]" (g_vaerelse7_TSTAT,gRaumTemp) [ "CurrentTemperature" ]
Number SollTempG7 "[%.1f °C]" (g_vaerelse7_TSTAT,gSollTemp) [ "TargetTemperature" ]

Group g_vaerelse8_TSTAT "Værelse 8" [ "Thermostat" ]
Number RaumTempG8 "[%.1f °C]" (g_vaerelse8_TSTAT,gRaumTemp) [ "CurrentTemperature" ]
Number SollTempG8 "[%.1f °C]" (g_vaerelse8_TSTAT,gSollTemp) [ "TargetTemperature" ]

Group g_vaerelse9_TSTAT "Værelse 9" [ "Thermostat" ]
Number RaumTempG9 "[%.1f °C]" (g_vaerelse9_TSTAT,gRaumTemp) [ "CurrentTemperature" ]
Number SollTempG9 "[%.1f °C]" (g_vaerelse9_TSTAT,gSollTemp) [ "TargetTemperature" ]

Group g_vaerelse10_TSTAT "Værelse 10" [ "Thermostat" ]
Number RaumTempG10 "[%.1f °C]" (g_vaerelse10_TSTAT,gRaumTemp) [ "CurrentTemperature" ]
Number SollTempG10 "[%.1f °C]" (g_vaerelse10_TSTAT,gSollTemp) [ "TargetTemperature" ]

Group g_vaerelse11_TSTAT "Værelse 11" [ "Thermostat" ]
Number RaumTempG11 "[%.1f °C]" (g_vaerelse11_TSTAT,gRaumTemp) [ "CurrentTemperature" ]
Number SollTempG11 "[%.1f °C]" (g_vaerelse11_TSTAT,gSollTemp) [ "TargetTemperature" ]

the rules (you need only 2!):

val logName = "rothreadset"
val String roth_read = "http://192.168.0.70/cgi-bin/ILRReadValues.cgi"
val String roth_set = "http://192.168.0.70/cgi-bin/writeVal.cgi"
val String roth_post = "<item_list>
G0.nameG0.RaumTempG0.SollTemp
G1.nameG1.RaumTempG1.SollTemp
G2.nameG2.RaumTempG2.SollTemp
G3.nameG3.RaumTempG3.SollTemp
G4.nameG4.RaumTempG4.SollTemp
G5.nameG5.RaumTempG5.SollTemp
G6.nameG6.RaumTempG6.SollTemp
G7.nameG7.RaumTempG7.SollTemp
G8.nameG8.RaumTempG8.SollTemp
G9.nameG9.RaumTempG9.SollTemp
G10.nameG10.RaumTempG10.SollTemp
G11.nameG11.RaumTempG11.SollTemp
</item_list>"

rule "Update all Roth Touchline+ temperatures"
when
//  System started or // once a minute should suffice
  Time cron "23 * * * * ?" // once a minute
then
  var String SetPoint_read = sendHttpPostRequest(roth_read, "text/xml", roth_post)
    gRaumTemp.members.forEach[i|
        val strMember = i.name.split("p").get(1)                                   // Gn/Gnn
        val strXPATH = transform("XPATH", "/body/item_list/i[contains(n,'"+strMember + ".RaumTemp')]/v", SetPoint_read)
        val strREGEX = transform("REGEX", "s/(.?.)(..)/$1.$2/g", strXPATH)
        i.postUpdate(strREGEX)
    ]
    gSollTemp.members.forEach[i|
        val strMember = i.name.split("p").get(1)                                   // Gn/Gnn
        val nRaumTemp = gRaumTemp.members.filter[i|i.name.endsWith(strMember)].head.state as Number
        val strXPATH1 = transform("XPATH", "/body/item_list/i[contains(n,'"+strMember+".SollTemp')]/v", SetPoint_read)
        val strXPATH2 = transform("XPATH", "/body/item_list/i[contains(n,'"+strMember+".name')]/v", SetPoint_read)
        val strREGEX = transform("REGEX", "s/(.?.)(..)/$1.$2/g", strXPATH1)
        i.postUpdate(strREGEX)
        i.label = strXPATH2.toString + " " + nRaumTemp.toString + "°C"
    ]
end

rule "Set Roth Touchline+ temperatures for any room"
when
  Member of gSollTemp received command 
then
    val String strMember = triggeringItem.name.split("p").get(1) // Gn/Gnn
    sendHttpGetRequest(roth_set + "?"+strMember+".SollTemp=" + (receivedCommand as Number * 100).intValue())
end

I’m not sure about the label, but I guess, you want to get both is and set temperature at the same item. Please be aware that there is no guarantee that the sitemap will respect this label.

I think the real problem of your rules is, that every trigger of the first rule will trigger all 12 other rules in a few Milliseconds. But this is not the correct way. Instead of using sendCommand, use postUpdate to change the status of the item and use received command as trigger for the second rule. now the second rule will only trigger, if you are changing the set temperature via UI or a sendCommand.

1 Like