Ankündigung

Einklappen
Keine Ankündigung bisher.

Trigger auslesen in einer Rule

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

    [Codebeispiel] Trigger auslesen in einer Rule

    Hallo ihr Lieben,

    gibt es eine effektive Möglichkeit in einer Rule den Trigger auszulesen ? Ich meine damit folgendes:
    Code:
    rule "Trigger"
    when
    Item HM_C_A changed to CLOSED or
    Item HM_C_B changed to CLOSED or
    Item HM_C_C changed to CLOSED
    then
    logInfo( "Trigger", "Kontakt XYZ wurde ausgelöst.")
    end
    XYZ soll ersetzt werden durch den Trigger der die Rule ausgelöst hat.

    Jemand einen Vorschlag ? Merci!

    #2
    Du solltest alle HM_C_x in einer Gruppe zusammenfassen (die Gruppe odert die Items zusammen, zeigt dann also an, wieviele Kontakte geschlossen sind, in der Demo gibt es ein Beispiel dazu).
    Dann kannst Du in der Rule mit
    Code:
    Gruppe.members.forEach(kontakt|If (kontakt.state==CLOSED) logInfo( "Trigger","Kontakt "+kontakt.name+" ist geschlossen."))
    für jeden geschlossenen Kontakt eine Meldung erzeugen (in der Theorie, bin auf Arbeit)
    Die Rule muss natürlich auf einen einfachen change triggern. Und natürlich wird für jeden geschlossenen Kontakt immer wieder ein log-Eintrag erzeugt, auch, wenn ein anderer Kontakt wieder geöffnet wurde. Könnte man aber bestimmt auch irgendwie unterdrücken

    Kommentar


      #3
      Ich glaube hardoverflow meinte eher, wie er herausbekommt, wer von den drei Kontakten der Auslöser für das Ausführen der Regel war.

      Kommentar


        #4
        Hi udo1toni,

        danke für die Antwort, aber sja hat recht. Ich möchte wissen, welche der Kontakte der Auslöser war.
        Zuletzt geändert von hardoverflow; 12.03.2015, 06:00.

        Kommentar


          #5
          Ich würde das wie folgt lösen.
          Code:
          rule "Trigger"
          when
          Item HM_C_A changed or
          Item HM_C_B changed or
          Item HM_C_C changed
          then
          if (HM_C_A.state== closed)
          {
          loginfo("Trigger", Kontakt HM_C_A wurde ausgelöst")
          }
          if (HM_C_B.state == closed)
          {
          logInfo( "Trigger", "Kontakt HM_C_B wurde ausgleöst")
          }
          if (HM_C_C.state == closed)
          {
          logInfo("Trigger", "Kontakt HM_C_C wurde ausgelöst")
          }
          end

          Kommentar


            #6
            Zitat von sja Beitrag anzeigen
            Ich glaube hardoverflow meinte eher, wie er herausbekommt, wer von den drei Kontakten der Auslöser für das Ausführen der Regel war.
            Das hatte ich mir auch schon gedacht, das geht aber nicht mit einer Rule. Da darf der Trigger eben nicht geodert werden. Man könnte natürlich ein Konstrukt bauen, in dem man den Zeitpunkt der letzten Änderung abfragt, dafür muss dann natürlich der entsprechende Kontakt persistiert werden. Alles in Allem ist dann der Ansatz, drei Rules für drei Kontakte anzulegen der einfachste, denn auch Posting #5 ist da keine Lösung, denn es gilt die gleiche Einschränkung wie bei meinem Ansatz, sobald mehrere Kontakte geschlossen sind, kann keine eindeutige Aussage mehr getroffen werden.
            Allenfalls könnte received Command als Trigger ein Ansatz sein, da gibt es die Variable receivedCommand, und eventuell (ich hab grad keinen Zugriff auf den Designer, kann es also auch nicht nachschauen) gibt es da eine Eigenschaft, welches Item received hat.

            Ist halt eine Frage, wieviele Items das betrifft, ob sich der Aufwand lohnt, eine große Rule zu schreiben, oder ob nicht 3 kleine Rules ausreichen. Ich hab auch für jeden Thermostaten eine eigene Rule, obwohl der Code bis auf das betreffende Item jedesmal identisch ist, und das sind bei mir immerhin 9 Thermostaten - lästig, aber letztlich die einfachste Lösung.
            Zuletzt geändert von udo1toni; 12.03.2015, 14:36. Grund: Typos...

            Kommentar


              #7
              Hi,

              Zitat von napoleonmm83 Beitrag anzeigen
              Ich würde das wie folgt lösen.
              Code:
              rule "Trigger"
              when
              Item HM_C_A changed or
              Item HM_C_B changed or
              Item HM_C_C changed
              then
              if (HM_C_A.state== closed)
              {
              loginfo("Trigger", Kontakt HM_C_A wurde ausgelöst")
              }
              if (HM_C_B.state == closed)
              {
              logInfo( "Trigger", "Kontakt HM_C_B wurde ausgleöst")
              }
              if (HM_C_C.state == closed)
              {
              logInfo("Trigger", "Kontakt HM_C_C wurde ausgelöst")
              }
              end
              was natürlich nicht richtig funktionieren würde...
              Denk mal drüber nach, was passiert, wenn HM_C_A bereits geschlossen ist und HM_C_B auch noch geschlossen wird

              Kommentar


                #8
                Stimmt dann feuern Trigger im Log.

                Vielleicht so.

                Code:
                  
                 rule "Trigger"
                when Item HM_C_A changed or
                Item HM_C_B changed or
                Item HM_C_C changed
                then if (HM_C_A.state== closed  && Sperre_HMCA.state == OFF)
                {
                loginfo("Trigger", Kontakt HM_C_A wurde ausgelöst")
                senCommand(Sperre_HMCA, ON)
                }
                if (HM_C_B.state == closed && Sperre_HMCB.state == OFF)
                {
                logInfo( "Trigger", "Kontakt HM_C_B wurde ausgleöst")
                sendCommand(Sperre_HMCB, ON)
                }
                if (HM_C_C.state == closed && Sperr_HMCC.state == OFF)
                {
                logInfo("Trigger", "Kontakt HM_C_C wurde ausgelöst")
                sendCommand(SperreHMCC, ON)
                }
                if (HM_C_A.state == open)
                {
                sendCommand(Sperre_HMCA, OFF)
                }
                if (HM_C_B.state == open)
                {
                sendCommand(Sperre_HMCB, OFF)
                }
                if (HM_C_C.state == open)
                {
                sendCommand(Sperre_HMCC, OFF)
                }
                end

                Kommentar

                Lädt...
                X