Ja, sicher. Leider habe ich das Thema nicht angezeigt bekommen...
also, ausgehend von Deiner Rule oben:
Code: Alles auswählen
var Boolean bBatterieKZ = false
rule "Batterie Thermoastat GWC"
when
Item BatteryLevelKZ changed
then
val nLevel = (BatteryLevelKZ.state as Number).intValue
if(!bBatterieKZ && nLevel >= 30)
bBatterieKZ = true
if(bBatterieKZ && nLevel < 30) {
sendTelegram("Sascha","Thermostat Gäste WC Batterie 30%")
bBatterieKZ = false
}
end
Nehme ich mal an, dass die anderen Items, um die es geht, dann ebenfalls mit BatteryLevel beginnen. Wie erwähnt wäre es vermutlich das einfachste, die Boolean Variable durch einen Switch zu ersetzen. Ich nenne das Item dann der Einfachheit halber AlarmBatteryLevelKZ, die Status sind ON und OFF.
Der Trick ist nun, alle gleichartigen Items in zwei Gruppen zusammenzufassen, ich nenne diese Gruppen mal gBatteryLevel und gAlarmBatteryLevel. Letztlich sind aber die Group Namen egal, genauso wie der Typ. Nun muss die Rule noch etwas geändert werden:
Code: Alles auswählen
rule "Batterie Level"
when
Member of gBatteryLevel changed // Trigger auf Group-Member change
then
val nLevel = if(newState instanceof Number) (newState as Number).intValue else -1 // Lese den Level
val String strItem = triggeringItem.name // Der Name des Items, welches die Rule ausgelöst hat
val mySwitch = gAlarmBatteryLevel.members.filter[i|i.name endsWith(strItem)].head // Suche das passende Alarm Item heraus
val strLabel = mySwitch.label // oder triggeringItem.label, wenn das Label passt
if(nLevel < 0) {
logWarn("batlevel","Achtung! Sensor {} lieferte keine Zahl: {}",strItem,newState)
return;
}
if(mySwitch.state != ON && nLevel >= 30) // Rest wie gehabt, nur mit Item statt Variable...
mySwitch.postUpdate(ON)
if(mySwitch.state == ON && nLevel < 30) {
sendTelegram("Sascha","Thermostat " + strLabel + " Batterie 30%")
mySwitch.postUpdate(OFF)
}
end
Der eigentliche Trick besteht darin, die Namen der Items so zu wählen, dass man aus dem einen Namen den anderen Namen direkt ableiten kann.
Damit in der Message ein Klartextname genannt werden kann, muss dieser aus dem Label abgeleitet werden können. Es bietet sich an, hierfür das Label der Alarm Switches oder evtl. sogar des Original Items zu verwenden.
Sollte es noch andere Geräte als nur Thermostate geben, man die Label nur entsprechend anpassen und das Telegramm einkürzen, so dass das Wort "Thermostat " auch im Label vorkommt.
Wenn es komplexer wird, bietet es sich an, die Namensteile durch _ voneinander zu trennen, z.B. Battery_Level_KZ. Dann kann man mittels
.name.split("_").get(2) z.B. auf den letzten Namensteil zugreifen (get() arbeitet 0-indiziert).
Für den Fall, dass ein Item keinen gültigen Wert liefert, wird ein Eintrag ins Log geschrieben und die Rule bricht ab.