Newbie fragt: Rules schreiben in OH5

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
ube
Beiträge: 1
Registriert: 8. Mai 2023 08:46
Answers: 0

Newbie fragt: Rules schreiben in OH5

Beitrag von ube »

Guten Tag,
ich möchte gerne eine Rule schreiben, die den einen Wert vom anderen abzieht.

Leider komme ich mit der OH-Doku nicht klar. so dass mir jeder Ansatz fehlt, die Rule zu editieren.
Im Menue links finde ich "Rules >", dann kann ich meine Idee benennen und When-Events zuordnen (s.u).

Bei "Then" komme ich nicht weiter. Edit: nun doch, habe den Schaltet 'Inline-Script' gefunden um eine DSL-Rule einzugeben:

mit hilfe göögle, liefert jedoch keinen Wert aus:
//Variante 1: Mit Einheiten (Empfohlen)
//Verwende diese Variante, wenn dein Ergebnis-Item ein Number:Power oder Number:Energy Item ist. Die Einheit wird automatisch beibehalten.
Zeile1: val val1 = Sonnen_Battery_Battery_Charging as QuantityType<Number>
Z2: val val2 = Sonnen_Battery_Battery_Discharging as QuantityType<Number>
//val val1 = (Sonnen_Battery_Battery_Charging as QuantityType<Number>).floatValue
//val val2 = (Sonnen_Battery_Battery_Discharging as QuantityType<Number>).floatValue


//Variante 2: Als reiner Zahlenwert (Fließkommazahl)
//Verwende diese Variante, wenn dein Ergebnis-Item ein einfaches Number Item ohne feste physikalische Einheit ist.
//val val1 = Sonnen_Battery_Battery_Charging.state as QuantityType<Number>
//val val2 = Sonnen_Battery_Battery_Discharging.state as QuantityType<Number>

Zeile3: val differenz = val1.subtract(val2)

// Wert an das Ergebnis-Item senden
Zeile4: Battery Bilanz Charging (sonnenbattery_bilanz_batteryCharging).postUpdate(differenz)
// (sonnenbattery_bilanz_batteryCharging).postUpdate(differenz)

Dem Ergebnis-Item wird kein Wert zugeordnet (NULL) - Was mache ich bitte falsch?

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

Re: Newbie fragt: Rules schreiben in OH5

Beitrag von udo1toni »

Eine KI kann nur gute Ergebnisse liefern, wenn sie genug Ausgangsmaterial hat :)

Zunächst mal: die Zuordnung oben ist durcheinander geraten. Du hast zwei Werte, Charging und Discharging und möchtest die Different dieser beiden Werte.
Variante 1 (mit Einheiten)
Gegeben:
Die Items Sonnen_Battery_Battery_Charging, Sonnen_Battery_Battery_Discharging und
sonnenbattery_bilanz_batteryCharging, alle vom Typ Number:Power (oder Number:Energy, aber alle vom selben Typ)

Code: Alles auswählen

val nCharge    = Sonnen_Battery_Battery_Charging.state as QuantityType<Number>
val nDischarge = Sonnen_Battery_Battery_Discharging.state as QuantityType<Number>
val nDiff      = nCharge.subtract(nDischarge)
sonnenbattery_bilanz_batteryCharging.postUpdate(differenz)
Variante 2 (ohne Einheiten)
Gegeben:
Die Items Sonnen_Battery_Battery_Charging, Sonnen_Battery_Battery_Discharging und
sonnenbattery_bilanz_batteryCharging, alle vom Typ Number:Power (oder Number:Energy, aber alle vom selben Typ)
Alle Items enthalten den gelieferten Wert in der gleichen Größe, also z.B. alle Power-Werte in Watt

Code: Alles auswählen

val nCharge    = (Sonnen_Battery_Battery_Charging.state as Number).floatValue
val nDischarge = (Sonnen_Battery_Battery_Discharging.state as Number).floatValue
val nDiff      = nCharge - nDischarge
sonnenbattery_bilanz_batteryCharging.postUpdate(differenz)
Im Gegensatz zur ersten Variante muss bei der zweiten Variante die Einheit identisch sein, mischen (z.B. Wert 1 in Watt und Wert 2 in Milliwatt) ist nicht erlaubt
Als Trigger für die Rule musst Du zwei changed-Ereignisse setzen, und zwar
Sonnen_Battery_Battery_Charging changed orSonnen_Battery_Battery_Discharging changed, so dass bei jeder möglichen Änderung auch das Ergebnis neu berechnet wird.
openHAB5.2.0 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.2.4 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

Herta
Beiträge: 1
Registriert: Heute 08:45
Answers: 0

Re: Newbie fragt: Rules schreiben in OH5

Beitrag von Herta »

Ich sehe, dass Sie Regeln schreiben, um die Differenz in OpenHAB zu berechnen, aber das Endergebnis ist NULL. Dies liegt höchstwahrscheinlich an einem Fehler bei den Elementtypen.

In Ihrem Code sind die Elemente `Sonnen_Battery_Battery_Charging` und `Discharging` möglicherweise keine rein numerischen Datentypen, sondern `Number:Power` mit Einheiten (z. B. W). Nachdem Sie den Wert mit `as QuantityType` abgerufen haben, funktioniert `subtract()` einwandfrei, aber das Ergebnis `differential` hat immer noch Einheiten. Die direkte nachträgliche Aktualisierung auf ein reguläres `Number`-Element führt zu einem Fehler und somit zu NULL.

Es gibt zwei Lösungen:

Um sicherzustellen, dass das Ergebnis auch Einheiten hat: Ändern Sie den Typ des Elements `sonnenbattery_bilanz_batteryCharging` in `Number:Power`, um ihn an die Eingabe anzupassen.

Um in einen rein numerischen Wert zu konvertieren: Konvertieren Sie den Wert beim Abrufen direkt mit `.floatValue` in eine Zahl und subtrahieren Sie ihn anschließend.

Vergessen Sie außerdem nicht, das `changed`-Ereignis zu beiden Eingabeelementen im Trigger hinzuzufügen. Dadurch wird das Ergebnis aktualisiert, sobald sich eines der Elemente ändert.
Oyostepper bietet folgende Produkte online an: Servomotoren,Planetengetriebe, Gewindetriebe und Schrittmotoren, die bei Bedarf online bestellt werden können.

Antworten