Seite 1 von 1

Allgemeines zu Regeln

Verfasst: 11. Mai 2020 14:49
von Fossi
In letzter Zeit habe ich viel Zeit gehabt, meine Regeln zu überarbeiten. Leider falle ich dabei immer wieder über die eignen Füße bzw. meine eigene Unzulänglichkeit.

Wo kann man sich denn mal einen guten Überblick verschaffen? Was genau sind die Unterschiede:
- Number Decimal Float, etc. ?
- var, val, var Number, etc.
- wann reicht ein >, wann muss es ein = oder ein == sein, >= und !== habe ich jetzt auch irgendwo gesehen. Was genau ist !=?
- wie genau müssen Variablen angewendet werden, um sie in Rules sauber zu verarbeiten?

Mir fällte es derzeit richtig schwer, gezielte if-Statements aufzusetzen, das ist eher ein try and error und macht so wenig Freude. Auch der Wechsel von OH1 auf OH2 vor zwei Jahr war da nicht ganz einfach und hat das Ganze nicht übersichtlicher gemacht. Auf OH1 bin ich da irgendwie besser durchgekommen, vielleicht war die Prüfung des Editors präziser.

Inzwischen hab ich den Öl und den Stromverbrauch wieder online, aber um z.B. die Schwellen des Sonnensensors für die Jalousiesteuerung da fehlt mir irgendwie noch was.

Für einen Verweis auf eine ausführlichere und am Besten noch verständliche Lektüre wäre ich wirklich dankbar. Vielleicht muss ich auch mal ein Buch kaufen, wenns da was vernünftiges gibt.

Vielen Dank und viele Grüsse - Fossi

Re: Allgemeines zu Regeln

Verfasst: 11. Mai 2020 18:32
von udo1toni
Number -> entspricht eben einer Zahl
Float -> Gleitkommazahl
DecimalType -> auch eine Zahl. (keine Ahnung, was der genaue Unterschied zu Number ist), es stehen aber bestimmte Funktionen zur Verfügung, die Number nicht beherrscht (und umgekehrt).
Integer -> Eine Integer Zahl ;)

Groß geschrieben bedeutet, es ist ein Objekt, klein geschrieben (z.B. int) bedeutet, es ist ein Primitive. Der Unterschied: bei einem Primitive gibt es z.B. kein .toString. Bei int gibt es dafür bestimmte Abkürzungen, die es für Integer nicht gibt. (i ++)

var -> eine Variable, das heißt, nach der Definition darf sich der Wert ändern.
val -> eine Konstante. Nach der Definition ist dieser Wert unveränderlich.

Außerhalb einer Rule ist die Definition global. Innerhalb der Rule ist die val/var nur im Kontext gültig. z.B.

Code: Alles auswählen

if(true)
    var a = 5
logInfo("test","a = {}",a)
funktioniert nicht, da a zum Zeitpunkt der Ausgabe nicht mehr definiert ist. hingegen funktioniert

Code: Alles auswählen

var a = 0
if(true)
    a = 5
logInfo("test","a = {}",a)
sehr wohl, da der Kontext vererbt wird, a ist also auch innerhalb der if-Anweisung gültig.

Ohne Typ entscheidet openHAB selbst, welcher Typ der richtige ist. Meistens ist das gut und richtig, aber es gibt spezielle Situationen, wo man einen bestimmten Typ erzwingen will, z.B. Integer.

Vergleiche: a > b -> wahr wenn a größer b
a < b -> wahr wenn a kleiner b
a >= b -> wahr wenn a größer oder gleich b
a == b -> wahr wenn a gleich b
a != b -> wahr wenn a ungleich b (! -> logisches NOT)
a === b -> wahr wenn a identisch mit b
a !== b -> wahr wenn a nicht identisch mit b
a = b -> a bekommt den Wert von b zugewiesen. Das ist also kein Vergleich!

Der Unterschied zwischen gleich und identisch tritt gewöhnlich nur mit dem speziellen Wert null auf (nicht verwechseln mit NULL!)
a === null wenn der Zeiger auf die Speicherzelle verweist, welche für den null-Wert steht. Also

Code: Alles auswählen

a = null
if(a === null) {
    // bla
}
Der Vergleich

Code: Alles auswählen

if(a == null)
würde die beiden Werte vergleichen, was auch wahr sein kann, obwohl a !== null ist.

Java ist als Grundlage ganz gut, ansonsten xTend. Das Problem ist glaube ich, immer die Sprache, da gibt es auf deutsch wohl nichts (ist mir jedenfalls nicht bekannt). Aber hier im Forum gibt es ja eigentlich ganz gute Hilfe ;)

Re: Allgemeines zu Regeln

Verfasst: 12. Mai 2020 09:15
von Fossi
Super, danke Dir. Das gibt auf jeden Fall schonmal einen Überblick.