Ankündigung

Einklappen
Keine Ankündigung bisher.

Regeln nicht synchronized - feature Request?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Regeln nicht synchronized - feature Request?

    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).

    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
    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.
    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
    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

    #2
    Hi Dennis,

    Zitat von Dennis650 Beitrag anzeigen
    Wie ist Eure Meinung dazu? Wäre das ein feature Request?
    ja, aber nicht für openHAB ;-)

    Die Ausführung der Regeln und die Regeln allgemein sind aber auf jeden Fall ein Thema, dass im Rahmen von Eclipse Smarthome diskutiert werden sollte. Es gibt es auch schon einen Thread der zu dazu passen könnte (siehe https://www.eclipse.org/forums/index.php/t/860533/).

    Danke und Gruß,

    Thomas E.-E.
    Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

    Kommentar


      #3
      Hallo Thomas,

      wird man eigentlich dann auch das Startup Verhalten überarbeiten?
      Notwendig ware, dass Regeln erst dann getriggert werden , NACHDEM alle Bindings initialisiert sind, insbesondere die Persistenz alle Items restored hat und auch das Astrobinding alle Items berechnet hat.
      Außerdem, sollten alle Regeln, die durch System Startup getriggert werden, auch schon einmal abgearbeitet sein.

      Gruß Martin

      Kommentar


        #4
        Hallo,

        kann man das nicht lösen, indem beim Startup ein Timer gesetzt wird, sagen wir 15 Minuten. Der Timer triggert einen Item Change und dieser Item Change dann die Regeln die das machen, was du "NACHDEM alle Bindings initialisiert sind, insbesondere die Persistenz alle Items restored hat und auch das Astrobinding alle Items berechnet hat" machen willst.

        Gruss

        Kommentar


          #5
          Genau, dass ist der Workarround.

          Kommentar

          Lädt...
          X