Wenn ich es richtig verfolgt habe, bist Du mit OH 2.x unterwegs. Vermutlich ist es dann das einfachste, den Gesamtstatus mit einer Rule auf die einzelnen Items umzulegen. Du bekommst den Gesamtstatus wie im Posting in ein String Item. Dann schreibst Du eine Rule, die das String Item analysiert. Die Rule triggert auf Item anelStatus received update (oder wahlweise Item anelStatus changed)
Jetzt hast Du zwei Möglichkeiten, entweder Du zerlegst den String mit REGEX, oder Du zerlegst den String mit split().
Vorteil REGEX: Du erhältst exakt die Daten zurück, welche Du haben willst. Nachteil: Du musst für jeden Kanal ein eigenes REGEX anwenden.
Vorteil split(); Du musst nur einmal zerlegen. Dafür musst Du aber zählen.
Beispiel:
Code: Alles auswählen
rule "anel Status zerlegen"
when
Item anelStatus changed
then
val myList = anelStatus.state.toString.split(";")
var i = 0
while ((i=i+1) < myList.size) { // myList durchlaufen
switch(myList.get(i)) { // i-tes Element von myList
case "8.Treppenlichter": Relais01.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "7.Pumpe" : Relais02.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "5.Baumhaus" : Relais03.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "4.Wasser LED" : Relais04.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "5.Wasserlauf" : Relais05.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "6.Grillplatz" : Relais06.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "7.Baumlichter" : Relais07.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "3.Licht EIngang" : Relais08.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "1.Alle Lichter" : Relais09.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "2.Wasser Lichter": Relais10.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "IO.3" : Relais11.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "IO.4" : Relais12.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "IO.5" : Relais13.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "IO.6" : Relais14.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "IO.7" : Relais15.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
case "IO.8" : Relais16.postUpdate(if(myList.get(i+1) == "1") ON else OFF)
}
}
end
Da ich nicht weiß, wie Deine Items heißen, habe ich einfach mal Items mit den generischen Namen Relais01 bis Relais16 genommen.
Die Rule durchläuft die Liste der Elemente, die im String durch Semikola voneinander getrennt sind. Falls der Inhalt dem Text entspricht, nimmt es das darauffolgende Element (i+1) und wertet es aus. bei 1 setzt es das passende Item auf ON, sonst auf OFF.
Die Rule ließe sich wesentlich eleganter gestalten, wenn die Namen in der Statusantwort generische wären (also z.B. Relais01 bis Relais16...), dann müsste man lediglich auf den identischen Teil des Namens triggern (if(myList.get(i).toString.startsWith("Relais"))), anschließend die Zahl abtrennen (relNumber = myList.get(i).toString.substring(6,2)) und das passende Item setzen (postUdate("Relais"+relNumber,if(myList.get(i+1) == "1") ON else OFF)).
Das wären dann nur drei Zeilen statt 18 (von denen etwa 90% redundant sind).