guinnes hat geschrieben: 31. Mai 2022 11:31
weil var nicht außerhalb einer For Each-Schleife definiert werden darf
Nein. Du kannst eine Variable oder Konstante beliebig im Code definieren. Außerhalb einer Rule (ganz oben in der Datei) gilt die Definition in allen Rules dieser Datei. Innerhalb einer Rule (unmittelbar hinter dem then) gilt die Definition nur für die Rule selbst, und nur, solange die Rule noch ausgeführt wird. Innerhalb eines Blocks (egal ob durch {} oder durch [] gebildet) gilt die Definition auch nur innerhalb dieses Blocks. Wenn Du hier andere Erfahrungen machst, poste bitte mal Beispielcode.
guinnes hat geschrieben: 31. Mai 2022 11:31
In meinem Fall sind alle Items sinnvoll initialisiert
Ja, solange es sich um eine Simulation handelt, wo also Items ausschließlich über eigenen Programmcode beeinflusst werden, ist das korrekt, nicht aber, sobald auch nur eines der beteiligten Items über ein Binding gefüllt wird. Dann entzieht sich der Inhalt des Items Deiner Kontrolle und Du kannst nur noch vermuten, dass "eigentlich" ein gültiger Wert vorliegen müsste.
openHAB ist übrigens keine Simulationssoftware. Nutze bitte keinen Hammer, um eine Schraube in ein Stück Holz zu bekommen.
guinnes hat geschrieben: 31. Mai 2022 11:31
Eindeutig ist die Definition außerhalb der Rules der Grund für den Fehler. Das hängt wahrscheinlich damit zusammen, daß jede Rule in einem eigenen Thread läuft und die Thread-Verwaltung dafür sorgt, daß auf eine Konstante nur mit einem Thread zugegriffen werden darf.
Nein! Wenn die Konstanten und Variablen zu Beginn der Datei definiert sind, kannst Du ohne jegliche Einschränkungen mit jeder Rule in dieser Datei auf die Konstanten und Variablen zugreifen. Ist das nicht der Fall, dann lösche bitte openHAB vollständig und installiere es neu, denn dann hast Du ein kaputtes System.
guinnes hat geschrieben: 31. Mai 2022 11:31
Auf der einen Seite treibe ich Aufwand und breche die Funktion im Fehlerfall selber ab, auf der anderen Seite bricht der Interpreter die Funktion ab und das ohne mein Zutun. Ist aber schon klar, sauberer ist deine Lösung aber mit einem viel zu hohem Aufwand
Was ist denn daran hoher Aufwand? Du prüfst jeden Wert auf Korrektheit und kannst sicher sein, dass die Rule anschließend funktioniert.
Oder Du scheust den Aufwand, die Rule funktioniert nicht und Du weißt nach zwei Tagen immer noch nicht, woran es letztlich liegt.
Ich nutze globale Variablen und Konstanten in großer Menge und habe weder Probleme mit parallelem Zugriff noch mit fehlerhaften Berechnungen. Ich habe im Fehlerfall auch keine NullPointer Exception über 60 Zeilen oder mehr, mit der ich (bis auf Teile der ersten und zweiten sowie letzten Zeile genau gar nichts anfangen kann), sondern eine klare Meldung, die mir verrät, warum die Rule nicht ausgeführt wird.
Du musst solche Mechansimen auch nicht unbedingt in jede Rule einbauen, aber wenn es Probleme gibt, ist es sinnvoll, die Rule, welche Probleme bereitet so aufzubauen, dass der Fehler möglichst präzise eingegrenzt werden kann. Um mehr geht es nicht.
By the way: Welche openHAB Version nutzt Du?
openHAB5.1.3 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.9 - 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