Ankündigung

Einklappen
Keine Ankündigung bisher.

Rule Problem (vermutlich mit createTimer)

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

    Rule Problem (vermutlich mit createTimer)

    Hallo zusammen,
    ich versuche innerhalb einer Rule einen zeitlichen Ablauf zu steuern, d.h. mehrere Bewässerungsventile hintereinander gehen an und dann nach voreingestellter Zeit (Items Dauer_* vom Typ Number) wieder aus usw..

    Die Rule wird korrekt getriggert, das konnte ich über ein temporär direkt nach dem "then" eingebautes sendcommand testen. Der eigentliche Ablauf erfolgt aber leider nicht. Sieht jemand das Problem?
    Basis war ein Beispiel aus Openhab1.

    Danke
    Christian

    Code:
    rule "Irrigation run"
    when
    Item Bew_Ablauf_laufend changed to ON
    then
    
        var DateTime startTime
        var DateTime endTime        
            // get the raw run times for each zone (in mins)
            var Number NordMins = Dauer_Nord.state as DecimalType
            var Number SuedMins = Dauer_Sued.state as DecimalType
            var Number WestMins = Dauer_West.state as DecimalType
            var Number Teil4Mins = Dauer_Teil4.state as DecimalType
    
            // turn on each zone in turn (with a minute gap between each zone activation)
            if (NordMins > 0) {
                endTime = now.plusMinutes(NordMins)
                Timer1S = createTimer(now) [| RS_Beet_N.sendCommand(ON) ]
                Timer1E = createTimer(endTime) [| RS_Beet_N.sendCommand(OFF) ]
                startTime = endTime.plusSeconds(2)
            }
            if (SuedMins > 0) {
                endTime = startTime.plusMinutes(SuedMins)
                createTimer(startTime) [| sendCommand(RS_Rasen_S, ON) ]
                createTimer(endTime) [| sendCommand(RS_Rasen_S, OFF) ]          
                startTime = endTime.plusSeconds(2)
            }
    
            if (WestMins > 0) {
                endTime = startTime.plusMinutes(WestMins)
                createTimer(startTime) [| sendCommand(RS_Rasen_W, ON) ]
                createTimer(endTime) [| sendCommand(RS_Rasen_W, OFF) ]
                startTime = endTime.plusSeconds(2)
            }
    
            if (Teil4Mins > 0) {
                endTime = startTime.plusMinutes(Teil4Mins)
                createTimer(startTime) [| sendCommand(RS_Beet_N, ON) ]
                createTimer(endTime) [| sendCommand(RS_Beet_N, OFF) ]
                startTime = endTime.plusSeconds(2)
            }
    
    end

    #2
    Mach dir doch mal Logausgaben ob die NordMins usw. überhaupt Werte enthalten bzw. setze diese in der Rule erstmal auf einen festen Wert.
    createtimer(now) halte ich für sinnlos, da kannst du auch das ON Command gleich senden.
    Timer1E brauchst auch nicht, da reicht der einfache createTimer()

    Holger (kenn mich aber nur mit OH1 aus)

    PS: mit DateTime würde ich hier garnicht arbeiten. Eine einfache Variable enthält den Offset und der Timer wird dann immer mit
    createTimer(now.plusSeconds(x)) gestartet
    Zuletzt geändert von HolgerW; 15.04.2018, 08:54.

    Kommentar


      #3
      Danke für die Tipps, hab es nun einiges vereinfacht und bin wohl auf dem richtigen Weg; wenn dann alles final ist, poste ich gerne das Ergebnis

      Kommentar


        #4
        so, folgende Variante funktioniert nun:
        Code:
        rule "Irrigation run"
        when
        Item Bew_Ablauf_laufend changed to ON
        then
                    logInfo("rules", "Rule gestartet")
                // get the raw run times for each zone (in mins)
                var Number NordEnde = 5
                    var Number SuedEnde = 10
                var Number WestEnde = 15
                var Number Teil4Ende = 20
        
        /*          val NordEnde = Dauer_Nord.state as DecimalType
                    val SuedEnde = Dauer_Nord + Dauer_Sued
                    val WestEnde = Dauer_Nord + Dauer_Sued + Dauer_West
                    val Teil4Ende = Dauer_Nord + Dauer_Sued + Dauer_West + Dauer_Teil4
        */
                // turn on each zone in turn
                // Reihenfolge: Nord, Sued, West, Teil4
        
                    // Nord
                    createTimer(now) [|
                            RS_Rasen_N.sendCommand(ON)
                            Wasser_Laufend_Nord.sendCommand(ON) ]
                    createTimer(now.plusSeconds(NordEnde)) [|
                            RS_Rasen_N.sendCommand(OFF)
                            Wasser_Laufend_Nord.sendCommand(OFF) ]
                    // Sued
                    createTimer(now.plusSeconds(NordEnde)) [|
                            sendCommand(RS_Rasen_S, ON) ]
                    createTimer(now.plusSeconds(SuedEnde)) [|
                            sendCommand(RS_Rasen_S, OFF) ]          
                    // West
                    createTimer(now.plusSeconds(SuedEnde)) [|
                            sendCommand(RS_Rasen_W, ON) ]
                    createTimer(now.plusSeconds(WestEnde)) [|
                            sendCommand(RS_Rasen_W, OFF) ]          
                    // Teil4
                    createTimer(now.plusSeconds(WestEnde)) [|
                            sendCommand(RS_Beet_N, ON) ]
                    createTimer(now.plusSeconds(Teil4Ende)) [|
                            sendCommand(RS_Beet_N, OFF)
                            sendCommand(Bew_Ablauf_laufend, OFF) ]          
        end
        Probleme habe ich nun, die Werte aus den Items (Dauer_*) korrekt in die Variablen der Rule zu übernehmen. Dass die Items die richtigen Werte haben, konnte ich durch Anzeige via Sitemap prüfen.

        Kommentar


          #5
          Ich hätte es jetzt so gemacht (ungeprüft):

          Code:
          rule "Irrigation run"
          when
          Item Bew_Ablauf_laufend changed to ON
          then
                  var Integer my_delay = 1
          
                  // get the raw run times for each zone (in mins)
                  var Number NordMins =  1 *60
                  var Number SuedMins =  2 *60
                  var Number WestMins =  3 *60
                  var Number Teil4Mins = 4 *60
          
                  // turn on each zone in turn (with a minute gap between each zone activation)
                  if (NordMins > 0) {
                      RS_Beet_N.sendCommand(ON)
                      my_delay = my_delay + NordMins            
                      createTimer(now.plusSeconds(my_delay)) [| RS_Beet_N.sendCommand(OFF) ]
                      my_delay = my_delay + 2 // wait 2 seconds
                  }
                  if (SuedMins > 0) {            
                      createTimer(now.plusSeconds(my_delay)) [| sendCommand(RS_Rasen_S, ON) ]
                      my_delay = my_delay + SuedMins
                      createTimer(now.plusSeconds(my_delay)) [| sendCommand(RS_Rasen_S, OFF) ]          
                      my_delay = my_delay + 2 // wait 2 seconds
                  }
          
                  if (WestMins > 0) {            
                      createTimer(now.plusSeconds(my_delay)) [| sendCommand(RS_Rasen_W, ON) ]
                      my_delay = my_delay + WestMins
                      createTimer(now.plusSeconds(my_delay)) [| sendCommand(RS_Rasen_W, OFF) ]
                      my_delay = my_delay + 2 // wait 2 seconds
                  }
          
                  if (Teil4Mins > 0) {            
                      createTimer(now.plusSeconds(my_delay) [| sendCommand(RS_Beet_N, ON) ]
                      my_delay = my_delay + Teil4Mins
                      createTimer(now.plusSeconds(my_delay)) [| sendCommand(RS_Beet_N, OFF) ]            
                  }
          
          end
          Wenn die Items Setpoints sind (ist bei mir unter OH1 so) dann hole ich mir die mit:
          Code:
          var int sollMinute =(setpoint_Wecker_Minute.state as DecimalType).intValue
          Holger
          Zuletzt geändert von HolgerW; 16.04.2018, 11:23.

          Kommentar


            #6
            Danke, entscheidend war nun die letzte Codezeile "var int..."; nun funktioniert es wie gewünscht

            Kommentar

            Lädt...
            X