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?
Newbie fragt: Rules schreiben in OH5
- udo1toni
- Beiträge: 15724
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Newbie fragt: Rules schreiben in OH5
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)
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
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.
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)
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)
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
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
Re: Newbie fragt: Rules schreiben in OH5
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.
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.