Hallo,
ich beschäftige mich seit 2 Wochen mit openhab, bin schwer begeistert und meine Ideen und Todo Liste für unser Haus wächst und wächst :-) openhab läuft auf einem recht langsamen ARM5 Prozessor in einem QNAP 119 mit Debian. Es läuft langsam aber sehr akzeptabel und stabil bei sehr geringem Stromverbrauch der Hardware.
Bei der Implementierung für Regeln der Steuerung für die Rolläden ist mir aufgefallen, dass die einzelnen Rules nicht synchronized sind und eine Rule von openhab parallel in mehreren Threads ausgeführt werden kann.
Meine Rules reagieren teilweise auf unterschiedliche Events (SystemStarted, Cron und wenn (mehrere) Items sich verändert haben).
Falls sich jemand über das exemplarische Codebeispiel wundert nur ein kurze Erklärung: Meine Rolläden sind eigentlich über eine SPS gesteuert, die ich nicht per Schnittstelle ansteuern kann. Ich simuliere daher mit einer Relaiskarte die Tastendrücke. Die Relaiskarte ist per exec Bindung angebunden. In meinen Regeln werden erst die Zeiten für Oben runter und Unten runter berechnet (je nach Sonnenuntergang und Berücksichtung von max und min Fahrzeitpunkten und das für oben und unten recht unterschiedlich). In dieser Beispiel-Regel vergleiche ich dann die berechneten Fahrzeiten. Wenn diese identisch sind werden die Timer für oben und unten wieder zurückgesetzt und ein gemeinsamer Timer angelegt, da sonst die Ansteuerung der Relaiskarte nicht passt, wenn gleichzeitig Timer für oben und unten darauf zugreifen
Ich habe nun in den Rules Variablen genutzt, die ich außerhalb der Rule deklariert habe (z.B. für den Timer).
Dies führte dazu, dass teilweise mehrere Timer angelegt wurden (in manchen Regeln bis zu drei), da mehrere Threads parallel dieselbe Rule ausgeführt haben. Dies kann auch in anderen Beispielen zu sehr unschönen Fehlern führen, die man nicht sofort auf mehrere Threads zurückführen kann.
Ich habe meinen Code jetzt überall angepasst in der Form, dass ich manuelle locks einfüge.
Ich würde mir allerdings wünschen, dass openhab sich darum kümmert und Rules nur synchronized ausgeführt werden per default.
Wie ist Eure Meinung dazu? Wäre das ein feature Request?
Vielen Dank und Gruß
Dennis
ich beschäftige mich seit 2 Wochen mit openhab, bin schwer begeistert und meine Ideen und Todo Liste für unser Haus wächst und wächst :-) openhab läuft auf einem recht langsamen ARM5 Prozessor in einem QNAP 119 mit Debian. Es läuft langsam aber sehr akzeptabel und stabil bei sehr geringem Stromverbrauch der Hardware.
Bei der Implementierung für Regeln der Steuerung für die Rolläden ist mir aufgefallen, dass die einzelnen Rules nicht synchronized sind und eine Rule von openhab parallel in mehreren Threads ausgeführt werden kann.
Meine Rules reagieren teilweise auf unterschiedliche Events (SystemStarted, Cron und wenn (mehrere) Items sich verändert haben).
Falls sich jemand über das exemplarische Codebeispiel wundert nur ein kurze Erklärung: Meine Rolläden sind eigentlich über eine SPS gesteuert, die ich nicht per Schnittstelle ansteuern kann. Ich simuliere daher mit einer Relaiskarte die Tastendrücke. Die Relaiskarte ist per exec Bindung angebunden. In meinen Regeln werden erst die Zeiten für Oben runter und Unten runter berechnet (je nach Sonnenuntergang und Berücksichtung von max und min Fahrzeitpunkten und das für oben und unten recht unterschiedlich). In dieser Beispiel-Regel vergleiche ich dann die berechneten Fahrzeiten. Wenn diese identisch sind werden die Timer für oben und unten wieder zurückgesetzt und ein gemeinsamer Timer angelegt, da sonst die Ansteuerung der Relaiskarte nicht passt, wenn gleichzeitig Timer für oben und unten darauf zugreifen
Ich habe nun in den Rules Variablen genutzt, die ich außerhalb der Rule deklariert habe (z.B. für den Timer).
Code:
var Timer ivTimerRollaedenAlleRunter = null rule "setRollaedenZeitAlleRunter" when Item RollaedenZeitObenRunter received update or Item RollaedenZeitUntenRunter received update then //Timer zurücksetzen, wenn er existiert if (ivTimerRollaedenAlleRunter!=null) { ivTimerRollaedenAlleRunter.cancel } //Hier einige Bedingungen prüfen ivTimerRollaedenAlleRunter = createTimer(now.plusMinutes(lvFahrenInXMinuten)) [| //Code zur Ausführung des Timers ] end
Ich habe meinen Code jetzt überall angepasst in der Form, dass ich manuelle locks einfüge.
Code:
import java.util.concurrent.locks.ReentrantLock var Timer ivTimerRollaedenAlleRunter = null var ReentrantLock ivLockAlleRunter = new ReentrantLock() rule "setRollaedenZeitAlleRunter" when Item RollaedenZeitObenRunter received update or Item RollaedenZeitUntenRunter received update then ivLockAlleRunter.lock try { //Timer zurücksetzen, wenn er existiert if (ivTimerRollaedenAlleRunter!=null) { ivTimerRollaedenAlleRunter.cancel } //Hier einige Bedingungen prüfen ivTimerRollaedenAlleRunter = createTimer(now.plusMinutes(lvFahrenInXMinuten)) [| //Code zur Ausführung des Timers ] } finally { ivLockAlleRunter.unlock } end
Wie ist Eure Meinung dazu? Wäre das ein feature Request?
Vielen Dank und Gruß
Dennis
Kommentar