Ankündigung

Einklappen
Keine Ankündigung bisher.

Zeitliche Verzögerung von 2 Items

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

    Zeitliche Verzögerung von 2 Items

    Hallo wertes Forum,

    ich habe unter openHAB2, 2 Rules geschrieben die mir eine Zeitliche Verzögerung von 2 Items realisieren sollen.
    Erstes Item Steckdose_Wohnz (soll eine Lampe darstellen), wird über die Sitemap geschaltet und leuchtet, wenn dieses Item Steckdose_Wohnz dann 10 Sekunden aktiv ist, soll erst dann, das zweite Item Power_4_1 (soll ein Lüfter darstellen) verzögert nach 3 Sekunden aktiv werden.
    Wenn dann das Item Steckdose_Wohnz ausgeschaltet wird, soll dann das Item Power_4_1 für 15 Sekunden nachlaufen.

    Prinzipiell habe ich das ganze fast zum Laufen gebracht, mit anderen Worten, darf das zweite Item Power_4_1
    (Lüfter) erst dann aktiv werden wenn 10 Sekunden, das erste Item Steckdose_Wohnz aktiv war.
    Das hat leider noch nicht funktioniert.

    Für eure Hilfe wäre ich sehr Dankbar.
    Gruß savana

    Anbei noch mein Code



    Code:
    [SIZE=20px][FONT=Calibri]rule "Zeitverzögerung"
    when
        Item Steckdose_Wohnz received command ON
    then
        if (Nachlauf !== null)
        {  
            Nachlauf.cancel
            Nachlauf = null
        }
        Nachlauf = createTimer(now.plusSeconds(3))
        [|
            Power_4_1.sendCommand(ON)
        ]
    end
    
    
    rule "Nachlauf"
    when
        Item Steckdose_Wohnz received command OFF
    then
        Nachlauf = createTimer(now.plusSeconds(15))
        [|
            Power_4_1.sendCommand(OFF)
        ]
    end[/FONT][/SIZE]
    
    [SIZE=16px][FONT=Calibri][/FONT][/SIZE]


    #2
    Zum einen bietet es sich an, das in einer Rule zu erledigen, zum anderen ist der Trigger ungünstig. Du möchtest eigentlich nicht auf den Schaltbefehl reagieren, sondern auf die Statusänderung des Lichts:
    Code:
    // globale Variablen zu Beginn der Datei definieren!
    
    var Timer tNachlauf = null                                               // Timervariable
    
    rule "Zeitverzögerung"
    when
        Item Steckdose_Wohnz changed                                         // Licht wurde geschaltet
    then
        tNachlauf?.cancel                                                    // Timer löschen
        if(Steckdose_Wohnz.state == ON && Power_4_1.state != ON)             // eingeschaltet, aber Lüfter aus
            tNachlauf = createTimer(now.plusSeconds(10), [|                  // mit 10 Sekunden Verzögerung
                Power_4_1.sendCommand(ON)                                    // Lüfter an
            ])
        else if(Steckdose_Wohnz.state == OFF && Power_4_1.state != OFF)      // ausgeschaltet, aber Lüfter an
            tNachlauf = createTimer(now.plusSeconds(15), [|                  // mit 15 Sekunden Verzögerung
                Power_4_1.sendCommand(OFF)                                   // Lüfter aus
            ])
    end
    Diese Regel triggert nur, wenn sich der Zustand des Lichts geändert hat.
    Wenn die Rule läuft, wird zunächst ein eventuell noch laufender Timer abgebrochen. Anschließend prüft die Rule, ob der Status von Licht und Lüfter übereinstimmen. Ist das nicht der Fall, erzeugt sie den Timer mit dem passenden Schaltbefehl.
    der Befehl tNachlauf?.cancel ist gleichbedeutend mit if(tNachlauf !== null) tNachlauf.cancel, aber kürzer
    Die leicht geänderte Schreibweise der createTimer Anweisung (Lambda in der Klammer) macht deutlich, dass das Lambda Teil des Funktionsaufrufs ist.
    Zuletzt geändert von udo1toni; 03.02.2020, 00:47.

    Kommentar


      #3
      Hallo udo1toni,

      vielen dank für die schnelle Antwort.

      ich habe den Code übernommen und getestet, allerdings habe ich den Namen der Variable geändert.Siehe Code unten
      Nach dem Test habe ich festgestellt das nach 10 Sekunden kein Aktion von Power_4_1 kommt.


      In meinem Rule Code #1 hatte ich einen Nachlauf von 15 Sekunden.(Power_4_1) // Funktioniert soweit
      In meinem vorhaben geht es darum, wenn ich die Steckdose_Wohnz (Lampe) aktiviere müssen 10 Sekunden ablaufen, so das der Lüfter aktiv wird und 15 Sekunden nachläuft.
      Wenn ich innerhalb der 10 Sekunden also kleiner gleich 10 Sekunden bin darf der Lüfter nicht aktiv werden.
      Beispiel Scenario 1 , ich komme ins WC mache das Licht an (Steckdose_Wohnz) stelle dort etwas ab, mache das Licht nach 5 Sekunden aus, der Lüfter (Power_4_1) bleibt aus.
      Beispiel Scenario 2 , ich komme ins WC mache das Licht an (Steckdose_Wohnz) stelle etwas grösseres ab, mache das Licht nach 11 Sekunden aus, der Lüfter (Power_4_1) läuft dann für 15 Sekunden nach.

      anbei den Code den ich in die .rules implementiert habe.

      Vielleicht habe ich irgendwas übersehen.
      Besten Dank vorab.


      Code:
      var Timer Nachlauf = null                                                // Timervariable
      
      rule "Zeitverzögerung"
      when
          Item Steckdose_Wohnz changed                                         // Licht wurde geschaltet
      then 
              Nachlauf.cancel                                                  // Timer löschen
          if(Steckdose_Wohnz.state == ON && Power_4_1.state != ON)             // eingeschaltet, aber Lüfter aus
              Nachlauf = createTimer(now.plusSeconds(10), [|                   // mit 10 Sekunden Verzögerung
                  Power_4_1.sendCommand(ON)                                    // Lüfter an
              ])
          else if(Steckdose_Wohnz.state == OFF && Power_4_1.state != OFF)      // ausgeschaltet, aber Lüfter an
              Nachlauf = createTimer(now.plusSeconds(15), [|                   // mit 15 Sekunden Verzögerung
                  Power_4_1.sendCommand(OFF)                                   // Lüfter aus
              ])
      end












      Kommentar


        #4
        Wie die Variable heißt, ist egal, solange sie überall identisch geschrieben wird. Ich habe mit angewöhnt, über den ersten Buchstaben die Funktion anzugeben (in diesem Fall also t für Timer).
        Nicht optional ist aber das Fragezeichen, es muss Nachlauf?.cancel heißen. Stattdessen könntest Du auch schreiben:
        Code:
        if([FONT=Courier New]Nachlauf !== null[/FONT]) [FONT=Courier New]Nachlauf.cancel[/FONT]
        Und in diesem Fall muss es !== heißen, nicht !=.
        Zuletzt geändert von udo1toni; 09.02.2020, 17:36.

        Kommentar


          #5
          Hallo udo1toni,

          besten Dank für Deine Hilfe.
          habe hier das ? übersehen.
          Der Code läuft einwandfrei.

          Danke und Gruß savana


          Code:
          [SIZE=16px]var Timer Nachlauf = null  
          rule "Zeitverzögerung"
          when
              Item Steckdose_Wohnz changed                                         // Licht wurde geschaltet
          then 
                  Nachlauf[/SIZE][SIZE=22px][I][B]?[/B][/I][/SIZE][SIZE=16px].cancel                                                 // Timer löschen
              if(Steckdose_Wohnz.state == ON && Power_4_1.state != ON)             // eingeschaltet, aber Lüfter aus
                  Nachlauf = createTimer(now.plusSeconds(10), [|                   // mit 10 Sekunden Verzögerung
                      Power_4_1.sendCommand(ON)                                    // Lüfter an
                  ])
              else if(Steckdose_Wohnz.state == OFF && Power_4_1.state != OFF)      // ausgeschaltet, aber Lüfter an
                  Nachlauf = createTimer(now.plusSeconds(15), [|                   // mit 15 Sekunden Verzögerung
                      Power_4_1.sendCommand(OFF)                                   // Lüfter aus
                  ])
          end[/SIZE]



          Kommentar

          Lädt...
          X