Ankündigung

Einklappen
Keine Ankündigung bisher.

Rule mit zwei Bedingungen

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

    Rule mit zwei Bedingungen

    Hallo zusammen,
    eigentlich ist mein Vorhaben ganz einfach: Ich möchte Lichter schalten, wenn mein Denon Receiver ausgeschaltet wird und es nach 22 Uhr ist. Das heißt in dem Fall, dass ich ins Bett gehe. :-)

    Code:
    rule "Bettzeit"
        when
            Item DenonPower changed to OFF
        then
            if (now.getHourOfDay <22) {
                return (false)
            }
            else {
                sendCommand(Schlafzimmer_Dimmer,10)
                sendCommand(Arbeitszimmer_Dimmer,10)
                createTimer(now.plusMinutes(10)) [| sendCommand(EG_Licht, OFF) ]
                createTimer(now.plusMinutes(3)) [| sendCommand(OG_Licht, OFF) ]
            }
    end
    Leider klappt das nicht. Was mache ich falsch?

    Vielen Dank.

    #2
    Code:
    var Timer tEG_Licht = null
    var Timer tOG_Licht = null
    
    rule "Bettzeit"    
    when    
        Item DenonPower changed to OFF    
    then
        if (now.getHourOfDay > 21) {    
            Schlafzimmer_Dimmer.sendCommand(10)    
            Arbeitszimmer_Dimmer.sendCommand(10)
            if(tEG_Licht != null)
                tEG_Licht.cancel
            tEG_Licht = createTimer(now.plusMinutes(10)) [|      //10 Minuten nach Ausschalten des Receivers
                EG_Licht.sendCommand(OFF)
            ]
            if(tOG_Licht != null)
                tOG_Licht.cancel
            tOG_Licht = createTimer(now.plusMinutes(3)) [|      //3 Minuten nach Ausschalten des Receivers!!!
                OG_Licht.sendCommand(OFF)
            ]
        }
    end
    Grundsätzlich sollte Deine Rule funktionieren. Ich hab sie zum einen etwas entschlackt (if umgekehrt) und zum anderen an allen Stellen die Methode anstatt der Action eingebaut. Der Unterschied zwischen beiden Varianten ist, dass die Action nur mit Strings umgehen kann. Das automatische Wandeln von Primitives in Strings schlägt regelmäßig fehl, weshalb es sinnvoll ist, wann immer möglich die Methode zu verwenden.
    Wenn Du garantieren kannst, dass Du die Timer niemals abbrechen möchtest, kannst Du die Timer einfach so erzeugen. Besserer Stil ist es, Variablen zu definieren. Damit behältst Du die Kontrolle und kannst z.B. das Ende verschieben, während der Timer schon aktiv ist, oder den Timer einfach canceln.

    Möchtest Du tatsächlich das Licht im Obergeschoss nach 3 Minuten löschen, oder bist Du davon ausgegangen, dass dieses Licht dann 3 Minuten nach dem Licht im Erdgeschoss ausgeht?

    Kommentar


      #3
      Hi,
      das probiere ich heute direkt mal aus. Ja, es ist korrekt, dass das Licht nach 3 Minuten ausgehen soll. :-) Vielen Dank für deine Hilfe.

      Kommentar


        #4
        Ich scheitere schon an einer (wahrscheinlich) einfacheren Aufgabe...

        Ich möchte Abends ab 19 Uhr eine Nachricht aufs Iphone (via myopenhab, schon angelegt) bekommen
        wenn das Garagentor noch offen istRule.JPG

        Kommentar


          #5
          Das erste ist, dass Du auf getHourOfDay > 20 testest. getHourOfDay ist vom Typ Integer. Wenn Du also auf > 20 testest, muss das Ergebnis 21 oder größer sein, das heißt, die Bedingung ist erst ab 21 Uhr wahr. Wenn Du ab 19 Uhr eine Nachricht bekommen willst, musst Du schon auf getHourOfDay > 18 testen (wahlweise auch >= 19)
          Das zweite ist, dass die Rule triggert, wenn das Garagentor öffnet (ich gehe mal davon aus, dass dies die Logik von Garagentor ist). Die Nachricht bekommst Du also, wenn nach 19 Uhr die Garage geöffnet wird, nicht, wenn sie bereits offen ist.
          Wenn dies das eigentliche Ziel ist, sollte die geänderte Bedingung ausreichen, ansonsten wäre ein weiterer Trigger (mit zusätzlicher Bedingung) oder alternativ eine weitere Rule sinnvoll:
          Code:
          rule "Schließerinnerung"
          when
              Time cron "0 0 19 * * ?" or
              Item Garagentor changed to OFF
          then
              if(now.getHourOfDay > 18 && Garagentor.state == OFF)
                  sendNotification("MailAnMich@gmx.at","Garagentor offen!")
          end
          Die neuerliche Überprüfung des Status ist notwendig, weil es ja nun zwei Trigger gibt.

          Kommentar

          Lädt...
          X