Du musst die Variable XMLString dynamisch füllen, am einfachsten, indem Du den String in zwei Teile aufteilst, eben den Teil vor dem Wert und den Teil hinter dem Wert. Anschließend baust Du den String zusammen, also ungefähr so:
Code: Alles auswählen
rule "Solltemperatur Wohnzimmer"
when
Item SollTempWohnTest changed
then
logInfo("Heizung","Neuer Sollwert Wohnzimmer: {}°C",SollTempWohnTest.state)
val String strXML1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <Devices> <Device> <ID>EZR010A49</ID> <HEATAREA nr=\"1\"> <T_TARGET>"
val String strXML2 = "</T_TARGET> </HEATAREA> </Device> </Devices>"
sendHttpPostRequest(http://192.168.178.29/data/changes.xml, "application/xml", strXML1 + SollTempWohnTest.state.toString + strXML2)
end
Man beachte auch das Escapen der Anführungszeichen...
Die fixen Strings kann man wunderbar als Konstante (val statt var) definieren. Da diese Strings sich ausschließlich auf dieses eine Gerät beziehen kann (die ID ist mit eingebaut) ist es sinnlos, sie außerhalb der Rule zu definieren.
Natürlich kannst Du die ID ebenfalls auslagern (ebenso wie die Heatarea), nach dem gleichen Schema wie die Temperatur.
dann böte es sich allerdings an, alle Solltemperaturen in einer Gruppe zusammenzufassen und die IDs sowie die Heatareas in einer Hashmap zu hinterlegen. Dann kann man die Rule so allgemein gestalten, dass alle Thermostaten individuell gesetzt werden, durch nur eine einzige Rule.
Ich nutze knx, aber das Prinzip ist ähnlich.
Folgende Rule verwende ich, um die Betriebsarten zu setzen. Dabei passt die Rückmeldung von knx nicht exakt zum Steuerbefehl, also brauche ich eine Rule, um das passende Item korrekt zu setzen.
Code: Alles auswählen
rule "Betriebsart RTR"
when
Member of GHeat_Mode changed
then
var Integer newMode
val mode = (triggeringItem.state as DecimalType).toBigDecimal.toBigInteger
val iName = triggeringItem.name.split("_").get(0).toString
logDebug("rtr","Name is: {}, Mode is: {}",iName,mode)
switch (mode) {
case mode.testBit(0) : newMode = 1
case mode.testBit(2) : newMode = 3
case mode.testBit(3) : newMode = 4
default : newMode = 2
}
var myItem = GHeat_Set.members.filter[ f | f.name.startsWith(iName) ].head
var Integer oldMode = 0
if(myItem.state instanceof Number) oldMode = (myItem.state as Number).intValue
if(oldMode != newMode) {
logDebug("rtr","Name is: {}, oldMode is: {}, newMode is: {}",myItem.name,oldMode,newMode)
myItem.postUpdate(newMode)
}
end
Die rule triggert auf alle Items, die sich in der Gruppe GHeat_Mode befinden (das ist die Rückmeldung der Betriebsart). Es wird der rückgemeldete wert bestimmt, und um welchen Thermostaten es sich handelt.
Anschließend prüft die Rule, ob die gemeldete Betriebsart zur angezeigten Betriebsart passt, falls nicht, korrigiert sie die angezeigte Betriebsart.
Die wesentlichen Punkte sind also, alle Items der einen Seite und alle Items der anderen Seite in zwei Gruppen zusammenzufassen. Dabei sollten die Namen so gewählt werden, dass der Name des zu steuernden Items aus dem triggernden Item "errechnet" werden kann.
In Deinem Fall müsstest Du über eine Hashmap die passende ID und die korrekte Heatarea bestimmen, um den nötigen String zu errechnen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet