Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Rule / Loops / Schleifen

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

    [Codebeispiel] - √ - Rule / Loops / Schleifen

    Hi Leute,
    da ich in diesem Forum schon einiges an Infos gefunden habe die mir sehr weitergeholfen haben, dachte ich mir das ich der Community auch mal was zurück gebe.

    Hier also eine Sache nach der ich schon länger gesucht habe, aber irgendwie nie im Netz eine Lösung gefunden habe. Vermutlich weil es einfach so einfach ist :-) (Java Programmier Basics)

    Es geht also um Schleifen bzw Loops in Regeln (Rules)

    Ihr habt bestimmt schon mal die Anforderung gehabt das etwas passieren soll, solange etwas anderes passiert.

    Zum Beispiel:

    Es Klingelt das Telefon. Nun hört ihr es aber nicht da die Musik so laut ist, ihr seit in der Garage oder im Garten. Ihr wollt aber optisch ein Signal bekommen das es klingelt.

    Regel:
    Wenn es Klingelt, schalte das Licht ein und aus bis es aufgehört hat zu klingeln.

    Das ganze sieht dann als Rule im openhab wie folgt aus:


    Code:
    rule Bei_Telefonanruf_Lichtsignal /* Name der Regel */
    	when 
    		Item Eingehender_Anruf received update ON /* Regel reift wenn das Item Eingehender_Anruf auf ON steht */
    	then 
    		if (STEHLEUCHTE_WOHNZIMMER.state == ON) /* Prüft erst mal ob das Licht vielleicht schon eingeschaltet ist. Wenn ja mache weiter. */
    			{
    			while (Eingehender_Anruf.state == ON) /* Hier beginnt die Schleife. Die Bedingung ist das der Status des Switch Items Eingehender_Anruf gleich ON ist */
    			{ 
    				sendCommand(STEHLEUCHTE_WOHNZIMMER, OFF) /* das gewuenste Licht ausschalten */
    				Thread::sleep(500) /* 500 Millisekunden warten bis es weitergeht */
    				sendCommand(STEHLEUCHTE_WOHNZIMMER, ON) /* das gewuenste Licht wieder einschalten */
    				Thread::sleep(500) /* 500 Millisekunden warten bis es weitergeht */
    			}
    		}
    		else /* Sollte das das Licht ausgeschaltet sein mache hier weiter */
    			{
    			while (Eingehender_Anruf.state == ON) /* Hier beginnt wieder die Schleife. Die Bedingung ist das der Status des Switch Items Eingehender_Anruf gleich ON ist */
    				{
    				sendCommand(STEHLEUCHTE_WOHNZIMMER, ON) /* das gewuenste Licht einschalten */
    				Thread::sleep(500) /* 500 Millisekunden warten bis es weitergeht */
    				sendCommand(STEHLEUCHTE_WOHNZIMMER, OFF) /* das gewuenste Licht ausschalten */
    				Thread::sleep(500) /* 500 Millisekunden warten bis es weitergeht */
    			}
    		}
    end
    Benötigte Items:
    Code:
    Switch	Eingehender_Anruf	"Es klingelt"	<in_call>	(GRP_TELEFON)	{ fritzbox="inbound" } 
    /* Syntax - Item Typ - Item Name - "Beschriftung" - <Icon bzw. Symbol> - (Gruppenzugehoerigkeit) - {openhab binding. Hier das Fritzbox binding}
    
    Switch STEHLEUCHTE_WOHNZIMMER	"Stehleuchte - Wohnen"	(GRP_RAUM_WOHNEN, GRP_BELEUCHTUNG; GRP_EG)	{ knx = "1/0/20+<1/3/20" }
    /* Syntax - Item Typ - Item Name - "Beschriftung" - <Icon bzw. Symbol> - (Gruppenzugehoerigkeit) - {openhab binding. Hier das KNX binding mit}
    Zusammenfassung:
    Erfolgt ein Anruf, greift die Regel.
    Zuerst wird dann geprüft ob das Licht Ein oder Ausgeschaltet ist. Nun wird im Wechsel geschaltet bis man abgenommen hat oder der Anrufer aufgibt ;-)
    Im Prinzip ist es ganz einfach - man muss halt nur die Syntax kennen ;-)

    Ich hoffe das hilft dem einem oder anderem weiter.
    Blöd gelöst? Bessere Lösung gefunden? Dann lasst es mich wissen!

    Grüße

    #2
    Wahrscheinlich macht es in openHAB keinen großen Unterschied, da jede Regel in einem eigenen Thread läuft. Aber Grundsätzlich ist eine Schleife mit einem sleep nicht so schön, da sie auch alle anderen Aktivitäten des Threads blockiert.

    Ich würde das ganze mit einem Timer lösen der sich beim Ablauf so lange selbst neu startet solange die Bedingung "Telefon klingelt" erfüllt ist. Aber auch da muss man aufpassen, manche Threadmodelle mögen so etwas auch nicht.

    Kommentar


      #3
      Zitat von Jockel Beitrag anzeigen
      Ich würde das ganze mit einem Timer lösen der sich beim Ablauf so lange selbst neu startet solange die Bedingung "Telefon klingelt" erfüllt ist. Aber auch da muss man aufpassen, manche Threadmodelle mögen so etwas auch nicht.
      Hi!

      Hast du dazu ein Codebeispiel?

      Gruß

      Kommentar


        #4
        Kein fertiges getestetes, aber im Prinzip folgendermaßen:

        Code:
        var Timer  BlinkTimer     = null
        
        when 
          Item Eingehender_Anruf received update ON 
        then 
        	if(BlinkTimer==null) {
                    BlinkTimer = createTimer(now.plusSeconds(1)) [|
        		sendCommand(STEHLEUCHTE_WOHNZIMMER, !STEHLEUCHTE_WOHNZIMMER.state)
        		if (Eingehender_Anruf.state == ON) {
        		    BlinkTimer.reschedule(now.plusSeconds(1))
        		}
                    ]
                } else {
        	    BlinkTimer.reschedule(now.plusSeconds(1))
        	}
        end
        Wie gesagt, ungetestet. Außerdem bin ich nicht sicher on die Negierung im Parameter des send Command funktioniert, ansonsten müsste da noch eine Abfrage hin.

        Wegen anderer Zeiten kannst Du einen Blick auf das Joda tIme API werfen: Klick Millisekunden wäre plusMillis(), fände ich persönlich aber zu nervös.

        Kommentar


          #5
          Klasse Beispiel, Jockel!

          @whopperg: schon ausprobiert?

          Gruß,

          Thomas E.-E.
          Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

          Kommentar


            #6
            Hi Thomas,

            Nein, bin ich leider noch nicht zu gekommen.
            Bei mir klappt das ganze mit der pause so ganz gut. Werde aber mal in einer freien Minute das ganze testen...

            Grüße

            Kommentar


              #7
              Ich habe eine Präsenz Rule gebaut die noch nicht komplet läuft.

              Es geht darum das wenn zwei Switch den Status OFF haben soll ein Script ausgeführt werden, wenn aber nur ein Switch auf OFF geht und der andere ON bleibt soll das script nicht ausgeführt werden.

              Der folgende Code funktioniert nur teilweise.

              das erste if und else funktioniert aber das zweite nicht.

              Code:
              rule "leaving home"
              
              when 
              
              Item PresenceMarcus_Phone changed to OFF or
              Item PresenceJen_Phone changed to OFF
              
              then
              
              if (PresenceJen_Phone.state == ON)
              logInfo("Ligths stay on")
              
              else
                sendCommand(Light_LR_Living_Sofa_hiden, OFF)
              
              if (PresenceMarcus_Phone.state == ON)
              logInfo("Ligths stay on" )
              
              else
                sendCommand(Light_LR_Living_Sofa_hiden, OFF)
              
              
              end

              Kommentar


                #8
                Die beiden Anwesenheiten müssen mit Oder verknüpft werden.
                So sollte es funktionieren:
                Code:
                rule "leaving home"
                when 
                Item PresenceMarcus_Phone changed to OFF or
                Item PresenceJen_Phone changed to OFF
                
                then
                if (PresenceJen_Phone.state == ON) || (PresenceMarcus_Phone.state == ON)
                  logInfo("Ligths stay on")
                else
                   sendCommand(Light_LR_Living_Sofa_hiden, OFF)
                end
                Holger

                Edit: oder beide auf OFF abfragen:
                Code:
                if (PresenceJen_Phone.state == OFF) && (PresenceMarcus_Phone.state == OFF)
                
                   sendCommand(Light_LR_Living_Sofa_hiden, OFF)

                Kommentar


                  #9
                  Danke Holger für deine hilfe aber leider funktioniert das nicht

                  Code:
                  rule "leaving home"
                  when 
                  Item PresenceMarcus_Phone changed to OFF or
                  Item PresenceJen_Phone changed to OFF
                  
                  then
                  if (PresenceJen_Phone.state == ON) || (PresenceMarcus_Phone.state == ON)
                    logInfo("Ligths stay on")
                  else
                     sendCommand(Light_LR_Living_Sofa_hiden, OFF)
                  end
                  Wenn "PresenceMarcus_Phone" den Status OFF hat bekomme ich im log folgenden fehler

                  Code:
                  09:43:18.413 ERROR o.o.c.s.ScriptExecutionThread[:50]- Error during the execution of rule 'leaving home': Ambiguous methods [protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateAssignment(org.eclipse.xtext.xbase.XAssignment,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBlockExpression(org.eclipse.xtext.xbase.XBlockExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBooleanLiteral(org.eclipse.xtext.xbase.XBooleanLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateCastedExpression(org.eclipse.xtext.xbase.XCastedExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateClosure(org.eclipse.xtext.xbase.XClosure,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateConstructorCall(org.eclipse.xtext.xbase.XConstructorCall,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected org.eclipse.xtext.xbase.interpreter.IEvaluationResult org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateDoWhileExpression(org.eclipse.xtext.xbase.XDoWhileExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateForLoopExpression(org.eclipse.xtext.xbase.XForLoopExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateIfExpression(org.eclipse.xtext.xbase.XIfExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateInstanceOf(org.eclipse.xtext.xbase.XInstanceOfExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateMemberFeatureCall(org.eclipse.xtext.xbase.XMemberFeatureCall,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateNullLiteral(org.eclipse.xtext.xbase.XNullLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateNumberLiteral(org.eclipse.xtext.xbase.XNumberLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateReturnExpression(org.eclipse.xtext.xbase.XReturnExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateStringLiteral(org.eclipse.xtext.xbase.XStringLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateSwitchExpression(org.eclipse.xtext.xbase.XSwitchExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateThrowExpression(org.eclipse.xtext.xbase.XThrowExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateTryCatchFinallyExpression(org.eclipse.xtext.xbase.XTryCatchFinallyExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateTypeLiteral(org.eclipse.xtext.xbase.XTypeLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateVariableDeclaration(org.eclipse.xtext.xbase.XVariableDeclaration,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateWhileExpression(org.eclipse.xtext.xbase.XWhileExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator)] for params [null, org.eclipse.xtext.xbase.interpreter.impl.DefaultEvaluationContext@fbdddee, org.eclipse.xtext.util.CancelIndicator$1@fb9f742]
                  Wenn PresenceJen_Phone den Staus OFF hat passiert folgendes

                  Code:
                  09:45:43.238 ERROR o.o.c.s.ScriptExecutionThread[:50]- Error during the execution of rule 'leaving home': The name '<XIfExpressionImpl> || <XBinaryOperationImplCustom>' cannot be resolved to an item or type.


                  Bei der abfrage beide auf OFF

                  Code:
                  if (PresenceJen_Phone.state == OFF) && (PresenceMarcus_Phone.state == OFF)
                  
                     sendCommand(Light_LR_Living_Sofa_hiden, OFF)
                  Erhalte ich bei OFF PresenceMarcus_Phone

                  Code:
                  09:46:54.981 ERROR o.o.c.s.ScriptExecutionThread[:50]- Error during the execution of rule 'leaving home': The name '<XIfExpressionImpl> && <XBinaryOperationImplCustom>' cannot be resolved to an item or type.
                  Und bie OFF PresenceJen_Phone bekomme ich das

                  Code:
                  09:49:35.426 ERROR o.o.c.s.ScriptExecutionThread[:50]- Error during the execution of rule 'leaving home': Ambiguous methods [protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateAssignment(org.eclipse.xtext.xbase.XAssignment,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBlockExpression(org.eclipse.xtext.xbase.XBlockExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBooleanLiteral(org.eclipse.xtext.xbase.XBooleanLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateCastedExpression(org.eclipse.xtext.xbase.XCastedExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateClosure(org.eclipse.xtext.xbase.XClosure,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateConstructorCall(org.eclipse.xtext.xbase.XConstructorCall,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected org.eclipse.xtext.xbase.interpreter.IEvaluationResult org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateDoWhileExpression(org.eclipse.xtext.xbase.XDoWhileExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateForLoopExpression(org.eclipse.xtext.xbase.XForLoopExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateIfExpression(org.eclipse.xtext.xbase.XIfExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateInstanceOf(org.eclipse.xtext.xbase.XInstanceOfExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateMemberFeatureCall(org.eclipse.xtext.xbase.XMemberFeatureCall,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateNullLiteral(org.eclipse.xtext.xbase.XNullLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateNumberLiteral(org.eclipse.xtext.xbase.XNumberLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateReturnExpression(org.eclipse.xtext.xbase.XReturnExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateStringLiteral(org.eclipse.xtext.xbase.XStringLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateSwitchExpression(org.eclipse.xtext.xbase.XSwitchExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateThrowExpression(org.eclipse.xtext.xbase.XThrowExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateTryCatchFinallyExpression(org.eclipse.xtext.xbase.XTryCatchFinallyExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateTypeLiteral(org.eclipse.xtext.xbase.XTypeLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateVariableDeclaration(org.eclipse.xtext.xbase.XVariableDeclaration,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateWhileExpression(org.eclipse.xtext.xbase.XWhileExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator)] for params [null, org.eclipse.xtext.xbase.interpreter.impl.DefaultEvaluationContext@4850377c, org.eclipse.xtext.util.CancelIndicator$1@fb9f742]

                  Kommentar


                    #10
                    Nur um sicherzugehen würde ich mal Klammern um die gesamte Bedingung und geschweifte um die auszuführenden Codeblöcke setzen.

                    Kommentar


                      #11
                      Ich habe den Fehler gefunden

                      Richtig ist

                      Code:
                       if (PresenceJen_Phone.state == OFF && PresenceMarcus_Phone.state == OFF)
                      und nicht

                      Code:
                       if (PresenceJen_Phone.state == OFF) && (PresenceMarcus_Phone.state == OFF)
                      Juhu, danke für deine hilfe.

                      Kommentar


                        #12
                        Die nächste challenge ist das Licht wieder einzuschalten wenn PresenceMarcus_Phone ist ON
                        aber nur wenn Light_LR_Living_Sofa_hiden OFF ist und die Zeit später ist alls
                        der String strSunset.

                        Beim strSunset wird die Zeit vom Sonnenuntergang angezeigt im Format 00:00:00.

                        Dieser Code funktioniert schon mit einer einfachen if Bedingung

                        Code:
                        rule "ariving home"
                        
                        when 
                         
                        Item PresenceMarcus_Phone changed to ON or
                        Item PresenceJen_Phone changed to ON
                        
                        
                        
                        then
                        
                        if (Light_LR_Living_Sofa_hiden.state == OFF)
                        callScript("arrivehome")
                        
                        end
                        Meine Idee war einfach

                        Code:
                        if (Light_LR_Living_Sofa_hiden.state == OFF && strSunset.state => now)
                        oder

                        Code:
                        if (Light_LR_Living_Sofa_hiden.state == OFF &&  Date => strSunset.status)
                        beides funktioniert nicht.

                        Kommentar


                          #13
                          Ich würde es vielleicht so machen, aber es gibt verschiedene Möglichkeiten.
                          Es kann sein das du strSunset.state auswerten musst, das hat sich mir auch nocht nicht ganz erschlossen.
                          Der String wird an den ":" aufgesplittet und in ein Array gelesen.
                          Diese Werte werden in Integer umgewandelt und mit der aktuellen Stunde/Minute verglichen.
                          Wenn größer oder gleich gibts ein dingdong , dort müsstest du also deine Lampe einschalten.

                          Holger

                          Code:
                          var Integer hour
                              var Integer minute
                          
                            //   var String strSunset = "16:45:56"
                              var String[] timearray
                               
                              timearray = (strSunset.toString).split(":")
                                
                              hour = new Integer (timearray.get(0))
                              minute = new Integer (timearray.get(1))
                              
                              if ((hour > now.getHourOfDay || ((hour == now.getHourOfDay) && (now.getMinuteOfHour >= minute))))
                              {
                                 logInfo("test","dingdong")
                              }

                          Kommentar


                            #14
                            Danke für deine Hilfe Holger.

                            DingDong kommt noch nicht im Log steh folgendes

                            Code:
                            Error during the execution of rule 'ariving home': For input string: "strSunset (Type=StringItem, State=17"
                            Gruss

                            Marcus

                            Kommentar


                              #15
                              wie ist denn strSunset definiert ?
                              Die Fehlermeldung ist auch nicht komplett, oder ?
                              Holger

                              Kommentar

                              Lädt...
                              X