Ankündigung

Einklappen
Keine Ankündigung bisher.

Warten auf Ereignis

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

    Warten auf Ereignis

    Hi,

    gibt es in Regeln die Möglichkeit einer Warte-auf-Ereignis-Schleife?

    Also zum Beispiel möchte ich nicht in 10 Sekunden schauen, ob ein Item einen bestimmten Status hat, sondern mit einer Warteschleife.

    Gibt so da etwas?

    Danke & Gruß
    Sascha

    #2
    Wahrscheinlich verstehe ich die Frage nicht richtig, aber warum kannst Du nicht auf die Änderung des Items triggern?

    Ansonsten ginge auch eine Cron getriggerte Regel.

    Kommentar


      #3
      Zitat von Jockel Beitrag anzeigen
      ... Änderung des Items triggern?
      Cron getriggerte
      Danke für die Ansätze, aber ich habe so ein Szenario, welches einfach einfacher mit einer Schleife wäre (Pseudocode):
      Code:
      rule "Haus verlassen"
      when
       Abwesenheit steht bevor (Taste gedrückt)
      then
        Haustür entriegeln (Benutzer öffnet Tür)
        solange Haustür noch offen:
          warten
        Wenn Haustür zu:
          Abschließen
          Strom sparen (Bereiche/Licht/Verbraucher abschalten)
      end
      Gibt es vielleicht eine Sprachreferenz, die ich noch nicht gesehen habe?
      Den Syntax habe ich sonst aus den Beispielen im Wiki und hier aus dem Forum

      Mit Cron/Item Trigger könnte ich den Fall auch abfrühstücken, aber bräuchte für die Statusspeicherung noch zusätzliche Variablen/Items, die zwischen den Regeln vermitteln. Das will ich nicht wirklich - habe schon genug Variablen/Items
      Gruß
      Sascha

      Kommentar


        #4
        Ich hab so etwas in einer minütlichen Regel.
        Da werden Zustände abgefragt und reagiert.
        Über Zähler verzögere ich auch bestimmte Aktionen z.b.
        - jemand anwesend, dann Zähler auf 16
        - keiner anwesend, Zähler wird minütlich auf 0 runter gezählt
        - erreicht er 1 dann werden Standby Geräte abgeschaltet

        Holger

        Kommentar


          #5
          Hi,

          Ich mache das mit verschiedenen Statii.

          Pseudecode:

          Code:
          rule "Abwesenheits Sequenz"
          When
             Item Abwesenheitstaste changed from OFF to On
          Then
             sendCommand(AbwesenheistStatus1,ON)
             sendCommand(Haustüre,"entriegeln")
          End
          
          Rule "Haustüre öffnen nach Abwesenheitsschalter gedrückt"
          When
              Item Haustüre changed from OPEN to CLOSED
          Then
             If (AbwesenheistStatus1.status == ON) {
               sendCommand(Haustuerschloss, "closed")
               sendCommand(Haus, "Stromsparmode")
                SendCommand(AbwesenheistStatus1, OFF)
              }
          End
          
          Rule "States on Start setzen"
          When
              System started
          Then
              sendCommand(AbwesenheistStatus1'0, OFF)
          End
          Prinzip verstanden?

          Kommentar


            #6
            Vielen Dank für eure Antworten - besonders Raks hat mir gefallen. Ich werde heute abend mal trotzdem an einer Warteschleife forschen ;-)

            Kommentar


              #7
              Total einfach - hier mal ein Testbeispiel:
              Code:
              rule "Test"
              when
                Item Auto_Light changed to ON
              then
                logInfo("runtime.busevents", "Kommode AUS")
                sendCommand(L_Kommode, OFF)
                while(L_Pilzlampe.state == ON) {
                  Thread::sleep(1000)
                  logInfo("runtime.busevents", "Warten")
                }
                logInfo("runtime.busevents", "Kommode AN")
                sendCommand(L_Kommode, ON)
              end
              Code:
              21:51:36.764 INFO  o.o.m.script.runtime.busevents[:53] - Kommode AUS
              21:51:37.263 INFO  runtime.busevents[:22] - L_Kommode received command OFF
              21:51:37.862 INFO  runtime.busevents[:26] - L_Kommode state updated to OFF
              21:51:39.146 INFO  o.o.m.script.runtime.busevents[:53] - Warten
              21:51:40.157 INFO  o.o.m.script.runtime.busevents[:53] - Warten
              21:51:41.168 INFO  o.o.m.script.runtime.busevents[:53] - Warten
              21:51:42.178 INFO  o.o.m.script.runtime.busevents[:53] - Warten
              21:51:43.189 INFO  o.o.m.script.runtime.busevents[:53] - Warten
              21:51:44.200 INFO  o.o.m.script.runtime.busevents[:53] - Warten
              21:51:45.211 INFO  o.o.m.script.runtime.busevents[:53] - Warten
              21:51:46.222 INFO  o.o.m.script.runtime.busevents[:53] - Warten
              21:51:47.232 INFO  o.o.m.script.runtime.busevents[:53] - Warten
              21:51:48.244 INFO  o.o.m.script.runtime.busevents[:53] - Warten
              21:51:49.255 INFO  o.o.m.script.runtime.busevents[:53] - Warten
              21:51:50.266 INFO  o.o.m.script.runtime.busevents[:53] - Warten
              21:51:50.296 INFO  runtime.busevents[:22] - L_Pilzlampe received command OFF
              21:51:50.845 INFO  runtime.busevents[:26] - L_Pilzlampe state updated to OFF
              21:51:51.277 INFO  o.o.m.script.runtime.busevents[:53] - Warten
              21:51:51.418 INFO  o.o.m.script.runtime.busevents[:53] - Kommode AN
              Habe meine Abwesenheitsregel nun auch produktiv am Laufen
              Code:
              val max = 60
              
              // Tür aufziehen
              sendCommand(Frontdoor, 16)
              
              // Energie sparen und abwesend wenn Tür auf und dann zu
              max = 60
              while(Frontdoor.state == CLOSED) {
                Thread::sleep(500)
                max = max - 1
                if (max==0) return
              }
              max = 90
              while(Frontdoor.state == OPEN) {
                Thread::sleep(500)
                max = max - 1
                if (max==0) return
              }
              createTimer(now.plusSeconds(3)) [|
                sendCommand(Present, OFF)
              ]
              Hier gibt es eine Sprachreferenz, die anscheinend für die Scripte/Regeln gilt: Xtend - Modernized Java

              Grüße
              Sascha

              Kommentar


                #8
                Auch wenn es Funktioniert, einen Thread lange Schlafen zu legen und solche Warteschleifen sind eigentlich keine gute Idee, ich würde mir daher noch mal die von Rak skizzierte Lösung anschauen!

                Kommentar

                Lädt...
                X