Ankündigung

Einklappen
Keine Ankündigung bisher.

Racecondition in Rules?

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

    Racecondition in Rules?

    Hallo Zusammen,

    ich habe ein Problem mit den rules.

    Vorgeschichte: Mein Wasserzähler hat einen S0 Ausgang, der an einem Binäreingang hängt. Der Binäreingang schickt einen Zähler auf den Bus, in der Regel nach jedem Impuls (Differenz also 1), je nach Durchflussmenge können es aber auch mal 2 oder mehr Impulse sein.

    Um die Daten besser auswerten zu können, möchte ich nicht die absoluten Zählerstände speichern, sondern nur die Differenz zum letzten Stand. Als Rule verwende ich dafür folgendes:

    Code:
    import org.openhab.core.library.types.*
    import org.openhab.model.script.actions.*
    import java.util.concurrent.locks.ReentrantLock
    
    var java.util.concurrent.locks.ReentrantLock lock  = new java.util.concurrent.locks.ReentrantLock()
    
    rule "Wasserverbrauch"
    when
        Item Wasser_Garten changed
    then
        lock.lock()
    
        try {
            var Number oldVal = previousState as DecimalType
            var Number newVal = Wasser_Garten.state as DecimalType
            var Number deltaVal = newVal - oldVal
    
            logError("rules.wasser", "Wasser: oldval=" + oldVal + " newval=" + newVal + " deltaVal=" + deltaVal)
            postUpdate(Wasser_Garten_Minute, deltaVal)          
        } finally {                                                 
            lock.unlock()                                       
        }                                                           
    end

    Im Logfile taucht dann folgendes auf:


    Code:
     [FONT=Monaco][SIZE=10px]2015-04-23 10:59:00.748 [ERROR] [nhab.model.script.rules.wasser] - Wasser: oldval=6510 newval=6511 deltaVal=1[/SIZE][/FONT]
      [FONT=Monaco][SIZE=10px]2015-04-23 10:59:01.077 [ERROR] [nhab.model.script.rules.wasser] - Wasser: oldval=6511 newval=6512 deltaVal=1[/SIZE][/FONT]
      [FONT=Monaco][SIZE=10px]2015-04-23 10:59:01.314 [ERROR] [nhab.model.script.rules.wasser] - Wasser: oldval=6512 newval=6513 deltaVal=1[/SIZE][/FONT]
      [FONT=Monaco][SIZE=10px]2015-04-23 10:59:01.691 [ERROR] [nhab.model.script.rules.wasser] - Wasser: oldval=6513 newval=6514 deltaVal=1[/SIZE][/FONT]
      [FONT=Monaco][SIZE=10px]2015-04-23 10:59:01.993 [ERROR] [nhab.model.script.rules.wasser] - Wasser: oldval=6514 newval=6515 deltaVal=1[/SIZE][/FONT]
      [FONT=Monaco][SIZE=10px]2015-04-23 10:59:02.804 [ERROR] [nhab.model.script.rules.wasser] - Wasser: oldval=6515 newval=6517 deltaVal=2 <--- Problem[/SIZE][/FONT]
      [FONT=Monaco][SIZE=10px]2015-04-23 10:59:03.307 [ERROR] [nhab.model.script.rules.wasser] - Wasser: oldval=6516 newval=6517 deltaVal=1[/SIZE][/FONT]
      [FONT=Monaco][SIZE=10px]2015-04-23 10:59:03.691 [ERROR] [nhab.model.script.rules.wasser] - Wasser: oldval=6517 newval=6518 deltaVal=1[/SIZE][/FONT]
    Problem: Ab und zu wird ein deltaVal=2 berechnet, obwohl auf dem Bus nur deltaVal=1 Telegramme verschickt wurden. previousState scheint offensichtlich auch in allen Fällen korrekt zu sein, Wasser_Garten.state hat allerdings sporadisch schon den Wert des nächsten Telegrams, obwohl die aktuell laufende Rule noch nicht beendet wurde.

    Ist das ein Bug oder muss man by design damit umgehen?

    Danke,
    Florian

    #2
    Hi Florian,
    ich kann dir zwar mit dem aktuellen Fall nicht helfen, wäre aber sehr daran interessiert zu erfahren, welche Zähler du hast. Die Eichung meines Gartenwasserzählers läuft am 31.12. diesen Jahres ab und da würde ich gleich was einbauen wollen, was sich dann auch abfragen lässt.

    Danke und Grüße

    Michael

    Kommentar


      #3
      I think the problem could be that the execution of the rule took too long. The Wasser_Garten value is updated outside.
      In this scenario the 5th execution took too long, so that for the 6th execution the value has been updated twice. Can you measure the execution time for this rule.

      Kommentar

      Lädt...
      X