iTob hat geschrieben: 30. Jan 2026 19:01
Wenn ich das richtig verstehe, kann ich mit if auch keine Strings vergleichen?
Doch, warum sollte das nicht gehen?
if(expression) liefert true oder false. Du benötigst also lediglich die korrekte expression
Vorweg: Gerade Einsteiger tun sich oftmals leichter mit Blockly. Inzwischen gibt es auch kaum noch Dinge, die man nicht (irgendwie) in Blockly lösen könnte.
Und das Schöne: Du kannst Dir den Code anschließend anschauen. Blockly erzeugt ECMA JavaScript Scripte, Du kannst also bei Bedarf jederzeit Code Snippets mittels Blockly zusammenklicken.
Wieder zurück zur DSL:
Eine der wichtigen Eigenschaften der DSL ist, dass sie sehr picky ist, was Datentypen betrifft. es
kann sein, dass Du mit einer unsauberen Definition der Datentypen davon kommst, dann hast Du Glück gehabt

normalerweise wird sich die Rule Engine aber beschweren, weil Datentypen nicht zueinander passen.
Die Fehlermeldung aus dem ersten Posting:
Code: Alles auswählen
Could not invoke method: org.eclipse.xtext.xbase.lib.IntegerExtensions.operator_equals(int,int) on instance: null
besagt, dass der Vergleich mit null nicht möglich war. Der Vergleich geschieht explizit zwischen zwei Integer Werten, aber mindestens einer davon (der erste... der zweite ist ja die Ziffer 1) ist null, also keine (Integer) Zahl. Das bedeutet, dass die Variable h_akt keine gültige Integer Zahl enthält.
Warum der Vergleich auf
int,int? Weil Du die Variable als Integer definiert hast
Wenn Du zwei Strings miteinander vergleichst, wird DSL korrekt
org.eclipse.xtext.xbase.lib.StringExtensions.operator_equals(string,string) verwenden.
Die offizielle Doku quillt quasi über vor lauter Beispielen, z.B.
https://www.openhab.org/docs/configurat ... s-dsl.html oder
https://www.openhab.org/docs/concepts/rules.html#dsl (man beachte das #DSL, Du kannst innerhalb der Seite umschalten, für welche Sprache die Code-Beispiele angezeigt werden). Das Dumme daran: es gibt speziell für die DSL kein echtes Tutorial, welches engmaschig alles erklärt. Ganz grob kannst Du Dich an Java orientieren, aber eben nur ganz grob.
Ein paar grundsätzliche Befehle:
if(expression) befehl [else befehl] Der Befehl nach
if() wird ausgeführt, falls
expression true ergibt, ansonsten wird der Befehl nach
else ausgeführt. Der else-Teil ist optional. Es wird immer exakt ein Befehl ausgeführt. Allerdings kann man mehrere Befehle zu eine mBlock zusammenfassen, und zwar mit geschwungenen Klammern, also so:
Code: Alles auswählen
if(a == b) {
befehl 1
befehl 2
befehl 3
} else {
befehl 4
befehl 5
}
Du kannst auch mehrere Optionen auswerten: if(expression1) Option1 else if(expression2) Option2 else if(expression3) Option3 else Option4
Oder Du nutzt stattdessen den switch() Befehl:
Code: Alles auswählen
switch(value) {
case value1: Option1
case value2: Option2
case value3: Option3
case value4: Option4
default: Option5
}
Einschränkung hier: pro case hast Du immer einen Test auf Gleichheit (es sei denn, Du schreibst den kompletten Vergleich hin...)
Wenn Du einen Vergleich mit if() ausführst, muss der Ausdruck innerhalb der Klammer vom Typ Boolean sein, also entweder true oder false ergeben. Entsprechend braucht es Vergleichsoperatoren, als da wären:
a < b -> a Kleiner b
a > b -> a größer b
a <= b -> a kleiner oder gleich b
a >= b -> a größer oder gleich b
a == b -> a gleich b.
a != b -> a ungleich b
a === b -> a identisch b (Sonderfall, wird ausschließlich im Zusammenhanb mit Prüfung auf null verwendet)
a !== b -> a nicht identisch b (siehe voriger Vergleich)
!(a > b) a nicht größer b (eigentlich: nicht a größer b) (einfacher: a <= b, hier eher, um das NOT zu zeigen)
und es gibt noch ein paar speziellere Methoden, z.B. instanceof, das liefert ebenfalls true oder false, abhängig davon, ob ein Datum einem bestimmten Datentyp zugehörig ist:
a instanceof Number ist wahr, falls a eine Zahl enthält.
openHAB5.1.2 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.5 - 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