Nur eine Rule für mehrere Items

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
MonkeyT
Beiträge: 18
Registriert: 23. Jun 2019 21:44

Nur eine Rule für mehrere Items

Beitrag von MonkeyT »

Ich habe das Problem, dass ich viele Items habs, die eigentlich alle durch die gleiche Rule verarbeitet werden müssen. Ich möchte ungern für 10 Items 10 nahezu identische Rules erstellen. Gibt es dafür eine elegantere Lösung?

Hier das Beispiel mit 2 Items:

Code: Alles auswählen

rule "Calc Setpoint-Shift Kueche"
when
	Item KuecheVirtual received command
then
	var Number shift = 0
	shift = (receivedCommand as Number) *2 - basisSollwert *2
	KuecheSollwertverschiebung.sendCommand(shift)
end

rule "Calc Setpoint-Shift Flur"
when
	Item FlurVirtual received command
then
	var Number shift = 0
	shift = (receivedCommand as Number) *2 - basisSollwert *2
	FlurSollwertverschiebung.sendCommand(shift)
end

Benutzeravatar
udo1toni
Beiträge: 13860
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Nur eine Rule für mehrere Items

Beitrag von udo1toni »

Ja sicher, Du musst dazu nur ein paar Dinge beachten.
  1. Alle Items, die zueinander gehören, müssen Namen haben, die sich voneinander ableiten lassen. Dabei muss es einen identishcne Namensteil geben, der eindeutig ist und am besten mit einem _ vom Rest getrennt wird.
  2. Die Items kommen in zwei Gruppen, die, welche das Kommanodo empfangen, und die, welche dadurch gesteuert werden.
  3. Die Rule muss dann mit den Gruppen arbeiten.
Weil es schon etwas später ist, hier ein Link auf das knx Forum, https://knx-user-forum.de/forum/support ... ost1403977 dort habe ich als Beispiel erläutert, wie ich die Betriebsart meiner RTR automatisch setze (es werden unterschiedliche Formate für Befehl und Rückmeldung verwendet)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

eiGelbGeek
Beiträge: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

Re: Nur eine Rule für mehrere Items

Beitrag von eiGelbGeek »

Ne Möglichkeit ist auch eine Funktion zu nehmen :)

Ich habe sie nicht getestet, aber müsste in etwa so aussehen.

Code: Alles auswählen

val setpoint= [ GenericItem r, GenericItem s |
		var Number shift = 0
		shift = r *2 - basisSollwert *2
		s.sendCommand(shift)
]

rule "Call Function"
when
	Item FlurVirtual received command or
	Item KuecheVirtual received command
then
	if (triggeringItem.name == "FlurVirtual") {
		setpoint.apply(receivedCommand as Number, FlurSollwertverschiebung)
	} else if (triggeringItem.name == "KuecheVirtual") {
			setpoint.apply(receivedCommand as Number, KuecheSollwertverschiebung)
	}
end

Benutzeravatar
udo1toni
Beiträge: 13860
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Nur eine Rule für mehrere Items

Beitrag von udo1toni »

Mit zwei Pärchen mag das noch in Ordnung sein, aber mit 9 Pärchen ist das einfach nur ineffizient, 9 Trigger, 9 if-Anweisungen, 9 Funktionsaufrufe, alle identisch, bis auf die Itemnamen...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

AGH
Beiträge: 21
Registriert: 18. Okt 2019 17:44

Re: Nur eine Rule für mehrere Items

Beitrag von AGH »

Ich kann das jetzt nicht testen.
Nutze aber ähnliches um Batteriespannungen in % Werte zu wandeln.

Es müssten allerdings noch Voraussetzungen getroffen werden, z.B. KücheVirtual und KücheVirtualSollwertverschiebung und nicht KücheSollwertverschiebung

Code: Alles auswählen

rule "CalC SetPoint-Shift"
when
	Item FlurVirtual received command or
	Item KuecheVirtual received command
then
	var Number shift = triggeringItem.receivedcommand as Number // oder triggeringsItem.state 
	shift = shift *2 - basisSollwert *2
	
	sendCommand(triggeringItem.name+"Sollwertverschiebung" , shift)
end
Ich hoffe es klappt. Evtl. kann ja noch jemand etwas dazu sagen, wie triggeringItem.Name so verändert werden kann, dass "Virtual" gelöscht wird und der sendcommand-Befehl dann so aussieht: sendCommand(neuerName+"Sollwertverschiebung", shift)

Ich üb auch noch und müsste mich erst mit Stringverarbeitung auseinander setzen :)

Benutzeravatar
udo1toni
Beiträge: 13860
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Nur eine Rule für mehrere Items

Beitrag von udo1toni »

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

AGH
Beiträge: 21
Registriert: 18. Okt 2019 17:44

Re: Nur eine Rule für mehrere Items

Beitrag von AGH »

Ich hab meine Regel zur Berechnung des Batteriestatus herangezogen. In Unkenntnis über receivedCommand kommt es dann natürlich zu Deinem Hinweis. Also wieder was gelernt.
Hier mal meine Regel

Code: Alles auswählen

rule "battery changed"
when
  Item OG_Schlaf_Therm1_BatterieStatus changed or
  Item OG_Musik_Therm1_BatterieStatus changed or
  Item OG_Bad_Therm1_BatterieStatus changed or 
  Item EG_Kueche_Therm1_BatterieStatus changed or 
  Item EG_WC_Therm1_BatterieStatus changed
then
    var Number battery = triggeringItem.state as DecimalType
   //var Number battery = OG_Bad_Therm1_BatterieStatus.state as DecimalType
    battery = (battery/3.2 * 100)
    
    //logInfo("** TEST **","VALUE: " + String::format("%.0f", battery))
    //postUpdate(OG_Bad_Therm1_BatterieStatus_hm, String::format("%.0f", battery))
    postUpdate(triggeringItem.name + "_hm", String::format("%.0f", battery))
end
Ich war froh, als ich diese Lösung fand und wollte dies einfach mal weitergeben, weil es mir einfach geholfen hat.
Wenn ich allerdings Deine Lösung mit den Gruppen sehe, habe ich die Vermutung es geht noch einfacher. Muss ich bei Gelegenheit mal ausprobieren. Dann bräuchte ich das nie mehr ändern, wenn ich ein Gerät hinzufüge. Danke für den Tipp.

Antworten