Es gibt kein Item.receivedcommand ! Wenn eine Rule auf received command triggert, dann gibt es eine implizite Variable, die den Befehl enthält, diese Variable heißt receivedCommand.
Wenn eine Rule auf received command triggert, ist es gefährlich, den Status des Items auszuwerten, welches die Rule getriggert hat, weil openHAB asynchron arbeitet. Die Rule wird ausgelöst, sobald der Befehl empfangen wurde. Gleichzeitig wird der Befehl an alle verlinkten Channel abgesetzt. Außerdem passt openHAB den Status des Items an. Zu diesem Zeitpunkt läuft die Rule aber bereits. Es ist also höchst wahrscheinlich, dass der Status des Items sich ändert, während die Rule schon läuft.
Außer bei einem Switch Item, einem Number Item oder einem String Item gibt es außerdem keinen 1:1 Zusammenhang zwischen gesendetem Befehl und anschließend gesetztem Status - abgesehen davon, dass der Status auch bei den genannten Itemtypen von außen geändert werden kann, ohne dass die Rule dadurch triggert.
Lösung: Gruppen.
Items:
Code: Alles auswählen
Group gVirtSetpoint
Group gShiftSoll
Number Virtual_Kueche "Küche [%.1f °C]" (gVirtSetpoint)
Number Virtual_Flur "Flur [%.1f °C]" (gVirtSetpoint)
Number ShiftSoll_Kueche (gShiftSoll)
Number ShiftSoll_Flur (gShiftSoll)
Rule für beide (und beliebig viele weitere Paare):
Code: Alles auswählen
var basisSollwert = 21
rule "Calc Setpoint-Shift Kueche"
when
Member of gVirtSetpoint received command
then
var Number shift = 0
val String strName = triggeringItem.name.split("_").get(1)
shift = (receivedCommand as Number) *2 - basisSollwert *2
gShiftSoll.members.filter[i | i.name.endsWith(strName)].head.sendCommand(shift)
end
Natürlich sollte man darauf achten, dass alle Items Paare bilden. Der jeweils zweite Namensteil muss eindeutig sein, aber jeweils genau einmal pro Gruppe auftauchen.
Man sollte auch prüfen, ob das empfangene Kommando tatsächlich eine gültige Zahl ist (nur zur Sicherheit)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet