Ankündigung

Einklappen
Keine Ankündigung bisher.

Persistence in Regeln

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

    Persistence in Regeln

    Hallo zusammen,

    ich versuche per Regel zu ermitteln, ob Vebraucher zu lange an sind. Dazu habe ich die entsprechenden Items in die Persistence Konfiguration aufgenommen (nutze db4o) und folgende Testregel definiert:

    Code:
    rule "Test to long rule 2"
    when
    	Time cron "0 0/15 * * * ?"
    then	
    	if (Steckdosen_Arbeiten_hinten_rechts_Schalten.state == ON)
    	{
    		if(!Steckdosen_Arbeiten_hinten_rechts_Schalten.changedSince(now.minusMinutes(70))) 
    		{
    			logInfo("Test rules", "Steckdosen_Arbeiten_hinten_rechts_Schalten seems to be on for more than 70 minutes")
    		}		
    	}
    end
    Nun kommte die Log-Meldung aber schon bei ersten Aufruf der Regel nach dem Einschalten der Steckdose und nicht erst nach 70min.

    Inzwischen hab ich mal per Editor kontrolliert, dass der String "Steckdosen_Arbeiten_hinten_rechts_Schalten" in der db4o Datendatei auftaucht, daher sollte die Konfiguration wohl stimmen. Außerdem hab ich das ! versuchsweise durch eine Abfrage == false ersetzt und Klammern gesetzt. Das war es alles nicht.

    Übersehe ich da irgend etwas? Im Moment stehe ich ziemlich auf dem Schlauch.

    Installiert ist das aktuelle Release von openHAB, ich hatte das Problem aber schon mit der vorherigen Version. Da hab ich es noch darauf geschoben, dass die Werte aufgrund des Bugs beim Lesen der Reihenfolge der Konfigurationsdateien nicht mit in die Datenbank aufgenommen wurden (
    die db4o Datendateien hab ich mit dem Update auch vorsichtshalber gelöscht).

    #2
    Ich kann noch ergänzen, dass der mit
    Steckdosen_Arbeiten_hinten_rechts_Schalten.histori cState(now.minusMinutes(70)))

    ermittelte Status korrekt ist, 70min nach Einschalten der Steckdose springt er von OFF nach ON.

    Nur warum gibt dann changedSince(now.minusMinutes(70)) auch unmittelbar nach dem Umschalten schon ein False zurück?

    Kommentar


      #3
      Heute habe ich noch einmal versucht das ganze etwas zu debuggen. Dabei bin ich auf folgende neue Erkenntnisse gestoßen:

      1. Der per historicState(now.minusMinutes(xx)) ermittelte historische Wert ist immer korrekt, daher gehe ich davon aus, dass die Persistance für das Objekt richtig konfiguriert ist und grundsätzlich funktioniert.

      2. Dann folgender Test: Den fraglichen Switch ausschalten, 15min abwarten (hab den Wert im fraglichen if-Statement von 70min auf 10min geändert) und dann einschalten. Unmittelbar nach dem Einschalten und den folgenden Aufrufen liefert changedSince(now.minusMinutes(10))) "false" zurück, was ja offensichtlich falsch ist.

      3. In der fraglichen Funktion changedSince() in der Datei PersistenceExtensions.java gibt es einen Aufruf result = getAllStatesSince(item, timestamp, serviceName);
      Dabei zeigt mir der Debugger in der Ergebnisliste nur den Eintrag zum Zeitpunkt des Einschaltens des Switches (Punkt 2), den allerdings doppelt. Es fehlt also der historische Eintrag "Off" vor dem Einschalten der Lampe, vermutlich weil er aufgrund der Filterkriterien in der Funktion getAllStatesSince() herausgefallen ist (das Ausschalten ist länger als die fraglichen 10min her)

      4. Die Gegenprobe: Ausschalten und unmittelbar danach Einschalten der Lampe innerhalb der 10min Frist: Alles läuft wie erwartet, die Funktion changedSince() liefert true zurück.


      Aktuell gehe ich also davon aus, dass der Bug durch das Filter nach der Zeit in
      getAllStatesSince(Item item, AbstractInstant timestamp, String serviceName)
      ausgelöst wird, wodurch Zustandsänderungen und damit der aktuelle Zustand vor dem Umschalten des Switches herausfallen wenn sie vor dem Zeitpunkt des Arguments in changedSince() stattgefunden haben.

      Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken... Einen direkte Lösung habe ich bislang aber leider auch nicht.

      Kommentar


        #4
        Jetzt ist mir vielleicht doch noch eine Idee gekommen: Wie wäre es denn, den State in changedSince() nicht zu null sondern zum Zustand zu Beginn des Abfragezeitraums zu initialisieren also in Pseudo-Code:

        ...
        Iterator<HistoricItem> it = result.iterator();
        State state = historicState(timestamp);
        while(it.hasNext()) {
        ...

        Das kann ich morgen vielleicht noch mal probieren.

        Kommentar


          #5
          Hab heute noch mal ein wenig gespielt und schlage jetzt den angehängten Fix für die PersistenceExtensions.java vor.

          Mein ursprüngliches Problem ist damit gelöst, ich kann aber nicht abschätzen ob es eventuelle Nebeneffekte gibt. Vielleicht kann sich das ja noch jemand anschauen, der mehr in den Details der Persistence steckt.

          Gegenüber der ursprünglichen Version ist nur folgende Zeile in der Funktion changedSince() geändert:
          State state = null; wird zu
          State state = historicState(item, timestamp);


          Den gleichen Effekt kann man natürlich innerhalb der Regel mit einer zusätzlichen Abfrage des historicState() erziehlen, nach meinem Verständnis der Funktion changedSince() sollte das aber auch dort geändert werden.

          Viele Grüße,
          Jockel
          Angehängte Dateien

          Kommentar


            #6
            Danke für Deine Mühen, ich werde mir das bei Gelegenheit im Detail anschauen, um die Nebenwirkungen abschätzen zu können.

            Kommentar


              #7
              Hab ich ganz vergessen: Soll ich da eigentlich mal ein Issue eintragen?

              Kommentar


                #8
                Oh, ja, das wäre super - leider kam ich noch nicht so schnell dazu, wie erhofft...

                Kommentar


                  #9
                  Ist als Issue 297 eingetragen. Bei weiteren Fragen bitte einfach melden!

                  Kommentar


                    #10
                    Da ich gerade vom geplanten Release 1.3 gelesen habe, wollten ich fragen ob das hier diskutierte Issue 297 bzw. der Fix dazu eine Chance hat dort mit aufgenommen zu werden?

                    Kommentar


                      #11
                      Chance, ja, ich fände es ebenfalls schön :-) Mal sehen ob ich die Zeit finde, ich bemühe mich!

                      Grüße,
                      Kai

                      Kommentar


                        #12
                        Habe Deinen Patch soeben gepusht, danke für Deine Geduld!
                        Habe es neben db4o auch erfolgreich mit rrd4j getestet.

                        Viele Grüße,
                        Kai

                        Kommentar

                        Lädt...
                        X