Ankündigung

Einklappen
Keine Ankündigung bisher.

Rules und received command

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

    Rules und received command

    Aloha,

    nach meine Umstieg auf openHAB, derzeit Version 1.6.1, bin ich jetzt fleißig dabei alle möglichen Rules zu programmieren. Bei einer Sache scheitere ich allerdings.

    Ich möchte eine Regel erstellen, die nach einer bestimmten Zeit das Ausschalten bestimmter Lichter triggert. Jetzt möchte ich natürlich redundanten Code vermeiden und nicht für jede einzelne Lampe eine Regel anlegen.

    Daher dachte ich dieser Code würde funktionieren, aber ich bekomme jedes Mal eine Exception "ambigious method...blabla".

    So sieht der Code aus. Die Regel wird für mehrere Lampen ausgelöst und dann möchte ich die Eine Lampe identifizeren:

    Code:
    // NICK LICHT
    		if(Licht_Nick received command == ON) {
    			if(nickTimer != null) nickTimer.cancel
    			logWarn("FILE","+++Kinder Licht Nick aus triggered in "+outDelay+" mintues...")
    			nickTimer = createTimer(now.plusMinutes(outDelay)) [|
    				Licht_Nick.sendCommand(OFF)
    			]
    		} else if(Licht_Nick received command == OFF) {
    			if(nickTimer != null) nickTimer.cancel
    		}
    Funktioniert das so? Falls nein hat jemand eine Idee?
    Danke

    #2
    Hm, ohne jetzt tiefer reinzuschauen : fehlen da nicht Klammern ?

    Code:
    if(nickTimer != null) nickTimer.cancel[B][COLOR="Magenta"]()[/COLOR][/B]
    Schließlich ist das ein Methodenraufruf und kein Attribut. Ich gebe zu dass ich beide Schreibweisen in den Sample-Rules finde und in in der Xbase Syntax nicht so bewandert bin aber es ist erst mal eine Idee.

    Kommentar


      #3
      Hi Reddick,

      nein die Klammern musst du nicht setzen. Es funktioniert auch mit anderen Rules.

      In der demo.rules z.B. ist es genauso:
      Code:
      rule "Timer Demo"
      when
      	Item Light_GF_Corridor_Ceiling received command
      then
      	if(receivedCommand==ON) {
      		if(timer==null) {
      			// first ON command, so create a timer to turn the light off again
      			timer = createTimer(now.plusSeconds(10)) [|
      				sendCommand(Light_GF_Corridor_Ceiling, OFF)
      			]
      		} else {
      			// subsequent ON command, so reschedule the existing timer
      			timer.reschedule(now.plusSeconds(10))
      		}
      	} else if(receivedCommand==OFF) {
      		// remove any previously scheduled timer
      		if(timer!=null) {
      			timer.cancel
      			timer = null
      		}	
      	}
      end

      Kommentar


        #4
        Hi pheno,

        Code:
        if(receivedCommand==ON)
        ist ja auch was ganz anderes als:
        Code:
        if(Licht_Nick received command == ON)
        1. Lichtnick hat da nichts drin zu suchen oder muss eine eigene Bedingung sein.
        2. receivedcommand wird zusammengeschrieben

        Kommentar


          #5
          Eine Rule hat diese Struktur:

          Code:
          rule <rulename> 
          when
              ......
          then
              ......
          end
          So musst du das aufbauen!

          Gruß,
          thoern

          Kommentar


            #6
            Aloha,

            vielen Dank für die zahlreichen Rückmeldungen

            Ich weiß, dass diese Zeile nicht funktioniert:
            Code:
            if(Licht_Nick received command == ON)
            Aber ich möchte gerne Lichter mit einem Timer ausschalten nur möchte ich nicht für jede einzelne Lampe einen eigene Regel schreiben! Es muss doch eine Möglichkeit geben innerhalb der Regel herauszufinden welche Lampe das Kommando gesendet hat oder etwa nicht???

            Danke, Manolo

            Kommentar


              #7
              Hallo,

              ich möchte wissen, ob ich dein Problem richtig verstanden habe.

              Du willst jedes Licht unabhängig von den anderen schalten.
              Dass bedeutet, wenn du ein Licht einschaltest, soll auch nur das eine an und nach einer gewissen Zeit ausgehen. Das bedeuete, du willst auch pro Licht (Schalter) einen Timer, den du mit einer Regel für alle Lichter - damit du die Zeilen ersparst - je nach gedrückten Schalter aktivierst.

              Du brauchst also die Möglichkeit, in einer Regel (mit vielen or-verknüpften received commands) herauszufinden, welcher Aktor die Regel getriggert hat.

              Liebe Grüße

              Kommentar


                #8
                Hi Paundl,

                genau so.
                Ich möchte eine Regel erstellen und damit mehrere Lichter per Timer ausschalten. Mit der normalen Regel und dem receivedCommand, kann ich ja immer nur generell abfragen ob überhaupt ein Item sich ändert, aber ich weiß nicht welches genau.
                Danke, Manolo

                Kommentar


                  #9
                  Hilft dir die "Mutter aller Licht-aus Regeln" weiter?

                  https://groups.google.com/forum/#!to...ab/H3qNaca-A1M

                  Kommentar


                    #10
                    Wow.....bin beeindruckt
                    Ich schaue mir die Regel einmal an, aber grundsätzlich ist es dann so, dass ich mir via HashMap die Status selber aufschreibe, um sie dann später zu vergleichen. Ist das korrekt?
                    Vielen Dank hlat

                    Kommentar


                      #11
                      Zitat von pheno Beitrag anzeigen
                      Mit der normalen Regel und dem receivedCommand, kann ich ja immer nur generell abfragen ob überhaupt ein Item sich ändert, aber ich weiß nicht welches genau.
                      Danke, Manolo
                      Genau andersrum wird ein Schuh draus
                      Du kannst nur Regeln definieren, die auf ganz bestimmte Items reagieren (ob nun ReceivedCommand oder Update). Damit weißt Du auch immer, welches Item ein Kommando empfangen hat (nämlich das, welches die Rule getriggert hat).

                      Deshalb ist unser aller Herzenswunsch, nämlich eine allgemeine Regel, die dann je Item das gleiche macht, momentan nicht realisierbar. Leider lassen sich Scripte auch nur mit Umwegen mit Variablen versehen, so dass auch hier kein Ausweg besteht.

                      Eventuell könntest Du mit einer Group arbeiten, also alle Items, für die die Regel gelten soll, kommen in eine Group, dann kannst Du diese Group mit einem forEach durchlaufen, um nachzuschauen, ob sich Werte geändert haben. Allerdings müsstest Du dann den Zustand aller Items dieser Group extra merken, die Rule müsste dann auch mit einem Riesenheader auf die Änderung jedes zugehörigen Items reagieren (Regeln lassen sich meines Wissens nicht gut mit GroupItems triggern) , unterm Strich dürfte die Generalisierung der Rule mehr Arbeit und Platz beanspruchen, als für jedes Item eine kleine Rule anzulegen (Die musst Du ja nur kopieren und den Itemnamen ändern)

                      Kommentar

                      Lädt...
                      X