Ankündigung

Einklappen
Keine Ankündigung bisher.

openhab2 + harmony hub + Einschaltszene

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

    #16
    Stimmt... Da bin ich auf den Namen reingefallen (OH1 Binding hat einen ziemlich anderen Namen als das OH2 Binding). Kommt davon...

    Kommentar


      #17
      Hi Jungs,

      ich muss das Thema noch einmal kurz aufgreifen....

      mein Bestreben ist es zusätzlich zur Einschaltszene "Fernsehen" (über Harmony Hub) auch noch die KNX Rollos in Position fahren zu lassen.

      kann ich das über eine "rule" lösen oder muss ich dazu eine 2te rule mit dem gleichen Befehl hinzufügen?


      die Einschaltszene " Fernsehen" funkt ja bereits:

      item:
      HTML-Code:
      String harmony_hub_tv         "TVgucken" (gHarmony) { channel="harmonyhub:hub:MediaHarmonyHub:currentActivity" }
      Switch harmony_hub_tv_act "Fernseher" (gHarmony) [ "Switchable" ]
      rule:
      HTML-Code:
      rule "Fernseher an/aus"
      when
          Item harmony_hub_tv_act received command
      then
          switch(receivedCommand) {
                  case ON :  harmony_hub_tv.sendCommand("TVgucken")
                  case OFF : harmony_hub_tv.sendCommand("PowerOff")
          }
      
      end


      jetzt möchte ich noch zu diesem Befehl hinzugeben, dass meine Rollos z.B.:70% runterfahren wenn der Befehl "Fernsehen" gesprochen wird.

      meine Rollos werden wie folgt gesteuert:
      HTML-Code:
      Rollershutter     RolloWohnen_site      "Rollladen Wohnen1 [%d %%]"         (gRollo)    { knx="4/0/2,4/1/16,4/4/1+<4/5/1" }
      Switch            RolloWohnen           "Rollladen Wohnen"                                    [ "Lighting" ]


      kann ich dann gleich in der bestehenden rule die Rollos miteinbauen oder muss ich dazu eine gesonderte rule machen wo ich mit dem gleichen Befehl "Fernsehen ein" die Rollos zusätzlich steuere?

      z.B.: so..

      HTML-Code:
      rule "Fernseher an/aus + Rollos runter"
      when
          Item harmony_hub_tv_act received command
      then
          switch(receivedCommand) {
                  case ON :  RolloWohnen_site.sendCommand(Down)
                  case OFF : RolloWohnen_site.sendCommand(UP)
          }
      
      end
      oder muss ich hier anders an die Sache herangehen?



      und um den ganzen noch eines drauf zu setzen.....

      wenn die Rollos 100% Runter (also geschlossen sind) sollen diese nichts machen. z.B.: bei mir fahren die Rollos automatisch am Abend runter und da möchte ich dann nicht wenn "Fernseher EIN oder AUS" gesagt wird dass sich die Rollos noch bewegen.

      machbar so etwas?

      Kommentar


        #18
        Es sollte reichen, die rule zu ergänzen. Wie fahren die Läden automatisch? Hast Du dafür shcon eine Rule, oder läuft das rein auf knx-Ebene?
        Wichtig ist erstmal, dass Du Dir merkst, ob die Läden automatisch geschlossen wurden. Falls also der Steuerbefehl z.B. von einer Schaltuhr in knx kommt, musst Du den Steuerausgang auch in openHAB als Switch Item anlegen, damit Du den Zustand hast. Falls Du die Läden ohnehin über openHAB steuerst, kannst Du natürlich einfach ein ungebundenes Item verwenden, um Dir den Zustand zu merken. Dann geht's in der Rule so:
        Code:
        rule "Fernseher an/aus"
        when
           Item harmony_hub_tv_act received command
        then
           switch(receivedCommand) {
               case ON : {
                   harmony_hub_tv.sendCommand("TVgucken")
                   if ((RolloWohnen_site.state as DecimalType).intValue != 100)
                       RolloWohnen_site.sendCommand(DOWN)
                }
               case OFF : {
                   harmony_hub_tv.sendCommand("PowerOff")
                   if (meinAutoItem.state!=ON)
                       RolloWohnen_site.sendCommand(UP)
                }
            }  end
        Die Idee ist also, beim Starten zu prüfen, ob der Laden geschlossen ist, wenn nicht, wird er geschlossen.
        Wenn der Fernseher dagegen ausgeschaltet wird, wird geprüft, ob der Laden eigentlich offen sein sollte und entsprechend eventuell geöffnet.

        Das Ganze lässt sich natürlich noch verfeinern, vielleicht wurde der Laden ja ursprünglich von der Beschattungsposition verfahren, dann sollte diese angefahren werden, aber vielleicht nur, wenn sich die Lichtverhältnisse nicht inzwischen geändert haben.

        Es kann auch sein (je nach Fernsehgewohnheiten ) dass Du in der Rule einen Merker setzen musst, den Du wiederum beim automatischen Öffnen der Läden abfragen musst, damit die Läden nicht automatisch auffahren, obwohl Du doch gerade noch fern siehst.

        EDIT: Strenggenommen ist das erste if unnötig, der Laden soll auf jeden Fall zugefahren werden. Wenn er schon zu ist, sollte er nicht zucken, da bereits in der Endlage.
        Zuletzt geändert von udo1toni; 26.07.2017, 13:48. Grund: Typo in Rule korrigiert.

        Kommentar


          #19
          udo1toni
          danke...den Ansatz werde ich mal ausprobieren.


          Ja, für die Rollo's habe ich bereits rules und tun auch das was sie solllen (AUF/AB...fahre 50%, usw...).....auch für die Rollo Wohnen. (hatte ich vergessen anzuführen)

          HTML-Code:
          rule "RolloWohnen"
          when
          Item RolloWohnen received command
          then
          switch(receivedCommand)
          {
          case ON : RolloWohnen_site.sendCommand(UP)
          case OFF : RolloWohnen_site.sendCommand(DOWN)
          }
          end
          der Steuerbefehl kommt von meiner Visu....aber ich glaube die brauche ich hierfür eigentlich nicht miteinbeziehen, denn diese hat natürlich immer PRIO1.
          D.h.: wenn zum bestimmten Zeitpunkt zum runterfahren ist, soll es auch so sein u. bleiben! Egal ob ich die Einschaltzene Aktiviere EIN od. AUSschalte.


          ich glaube ich muss mich nochmal mit den ganzen "if, else, etc..." beschäftigen.....ich kapier das einfach nicht wann was und vor allem wie anzuwenden ist....

          Kommentar


            #20
            Zitat von MrWichtig Beitrag anzeigen
            der Steuerbefehl kommt von meiner Visu....aber ich glaube die brauche ich hierfür eigentlich nicht miteinbeziehen, denn diese hat natürlich immer PRIO1.
            D.h.: wenn zum bestimmten Zeitpunkt zum runterfahren ist, soll es auch so sein u. bleiben! Egal ob ich die Einschaltzene Aktiviere EIN od. AUSschalte.
            Wenn sie immer PRIO1 hätte, dürftest Du die Läden nicht verfahren, wenn der Fernseher eingeschaltet wird Und der Punkt ist auch nicht das Zufahren, sondern das Auffahren der Läden. In dem Moment, wo Du fernsiehst, möchtest Du, dass die Läden geschlossen werden, unabhängig von der Tageszeit -> die Rule fährt die Läden zu. Wenn Du mit Fernsehen aufhörst, muss openHAB prüfen, ob die Läden nun offen oder geschlossen sein sollen, weil jetzt die Priorität nicht mehr beim Fernsehen liegt. Umgekehrt muss die Rule zum Öffnen der Läden prüfen, ob RolloWohnen geöffnet werden darf, denn falls der Fernseher aktiv ist, wäre das unerwünscht. Entsprechendes gilt eben für die Verschattung auch.
            ich glaube ich muss mich nochmal mit den ganzen "if, else, etc..." beschäftigen.....ich kapier das einfach nicht wann was und vor allem wie anzuwenden ist....
            if() ist einfach eine Bedingung. Wenn man eine Entscheidung aufgrund weiterer Zustände treffen will, kann man das mit if(bedingung). Wenn bedingung wahr ist, wird der Befehl hinter if() ausgeführt, ansonsten nicht. Falls man ein entweder oder haben will, gibt es noch den optionalen Befehl else, der Befehl hinter else wird nur ausgeführt, falls das vorangehende if() unwahr war.
            switch () case funktioniert ja ähnlich, hier gibt es aber nur einen Parameter, der dafür verschiedene Werte annehmen kann. Bei if() gibt es nur zwei Zustände, dafür kann man mit boolscher Algebra ziemlich komplexe Bedingungen erstellen.

            Kommentar


              #21
              udo1toni

              also ich habe die von erstellte Regel jetzt einmal 1:1 übernommen.

              prinzipiell geht da gar nichts jetzt... und im Designer werden mir bei dieser Regel ungültige Syntax angezeigt. Siehe Screenshot



              weiters nehme ich an bei dem Punkt "meinAutoItem" (in deiner Regel benannt) meinst Du die GA von der Zeitsteuerung der Rollos? und dafür muss aich auch vorher eine eigene Regel anlegen?

              ​​​​​​​
              Angehängte Dateien

              Kommentar


                #22
                Stimmt, da fehlt eine zweite öffnende Klammer, die Zeile muss korrekt heißen:
                Code:
                if ((RolloWohnen_site.state as DecimalType).intValue != 100)
                meinAutoItem wäre halt die Information, ob der Laden zeitgesteuert offen oder geschlossen sein soll.
                Wenn Du die Zeitsteuerung momentan über eine GA auf knx-Seite machst, musst Du das Item mit der GA verknüpfen.
                Wenn Du die Zeitsteuerung über openHAB erledigst, musst Du das Item mit in die Zeitsteuerung einbinden.

                Kommentar


                  #23
                  ah..was so eine Klammer bewirkt

                  funkt...und ich habe jetzt glaube auch den if-Befehl verstanden und gleich eine 2.te Rollo mitlaufen lassen. :-)

                  bin auch gedanklich noch einmal das "Fernseher aus" durchgegangen und eigentlich reicht mir hier NUR das ausschalten der Mediateile und die Rollos sollen in dem Zustand verbleiben bis ich diese extra mit einem Befehl rauf od. runter lasse...Deshalb habe ich die "meinAutoItem Rule" weggelassen.

                  eine Frage noch zu der Szene:

                  die Rollos sollen nur zu 70% runtergehen bei der Szene.....jetzt bin ich davon ausgegangen der Wert "intValue != 100" ist dafür zuständig?!

                  habe den mal auf 50 geändert aber da fahren sie trotzdem 100% runter....muss ich den Wert noch gesondert wo festlegen? und wenn ja was bedeuten die 100?






                  HTML-Code:
                  rule "Fernseher an/aus"
                  when
                     Item harmony_hub_tv_act received command
                  then
                     switch(receivedCommand) {
                         case ON : {
                             harmony_hub_tv.sendCommand("TVgucken")
                             if ((RolloWohnen_site.state as DecimalType).intValue != 100)
                                 RolloWohnen_site.sendCommand(DOWN)
                  
                          if ((RolloEckeSued_site.state as DecimalType).intValue != 100)
                                 RolloEckeSued_site.sendCommand(DOWN)
                          }
                  
                         case OFF : {
                             harmony_hub_tv.sendCommand("PowerOff")
                  
                          }
                      }  end

                  Kommentar


                    #24
                    Das .intValue != 100 bedeutet, die Rollos stehen nicht auf 100 (% geschlossen). Die Abfrage wäre also dann < 70, falls das Rollo schon geschlossen ist, soll es ja nicht auffahren, wenn Du fernsehen willst.
                    Und dann solltest Du versuchen, ob die Läden die Absolutposition anfahren können, also RolloWohnen_site.sendCommand(70). Falls das nicht geht, wird es schnell ziemlich aufwändig (nötige Fahrzeit von der aktuellen Position berechnen, Rollo verfahren, rechtzeitig abstoppen)

                    Nur nochmal zur Erläuterung der Einzelteile der if-Anweisung if ((RolloWohnen_site.state as DecimalType).intValue < 70):

                    Code:
                                if() -> wenn die Bedingung in den Klammern erfüllt ist, führe die nächste Anweisung aus, ansonsten überspringe sie.
                    RolloWohnen_site -> das Item, welches untersucht werden soll.
                              .state -> nimm den Status des Items.
                      as DecimalType -> betrachte den vorhergehenden Wert als Dezimalwert
                      (...).intValue -> wandle den Wert in der Klammer in einen Integerwert (das geht, weil die Klammer ein Wert vom Type Decimal ist)
                             a < b -> a ist kleiner b
                                 100 -> der Zahlenwert 100
                    Die ganze Zeile heißt also: Betrrachte den Status des Items RolloWohnen_site als Dezimalwert, wandle ihn in ein Integer, falls der Werte kleiner 70 ist, führe die nächste Anweisung aus.
                    Die Abfrage ist also recht einfach zu verstehen. Die größten Probleme sind immer, wie man einen Wert korrekt in einen bestimmten Typ wandelt, damit die beiden Werte korrekt miteinander verglichen werden können.
                    Zum Beispiel könnte man durchaus einen Status als String betrachten. Dann müsste der Vergleichswert natürlich auch ein String sein, also z.B.:
                    meinItem.state.toString == "50". Allerdings kann man so nur vergleichen, ob ein Zahlenwert identisch ist oder nicht, man kann aber nicht prüfen, ob der Zahlenwert kleiner oder größer ist.

                    Kommentar


                      #25
                      danke nochmal für die ausführliche Info u. Beschreibung!

                      ich werde das ausprobieren.... ;-)

                      lg

                      Kommentar


                        #26
                        ich habe jetzt einmal wie von Dir vorgeschlagen versucht die Absolute Position anzufahren....

                        hier sehe ich aber im Log dass der Befehl gar nicht gemeldet wird und somit im Log nicht aufscheint.

                        habe ich in der Regel noch einen Fehler (Klammer, etc..) ?

                        HTML-Code:
                        rule "Fernseher an/aus"
                        when
                           Item harmony_hub_tv_act received command
                        then
                           switch(receivedCommand) {
                               case ON : harmony_hub_tv.sendCommand("TVgucken")
                               case ON : RolloWohnen_site.sendCommand(70)
                               case ON : RolloEckeSued_site.sendCommand(70)
                        
                               case OFF : {
                                   harmony_hub_tv.sendCommand("PowerOff")
                        
                                }
                            }  end

                        Kommentar


                          #27
                          Definitiv ja. Du musst Dich schon an die korrekte Schreibweise halten

                          Code:
                           rule "Fernseher an/aus"
                          when
                             Item harmony_hub_tv_act received command
                          then
                             switch(receivedCommand) {
                                 case ON : {
                                     harmony_hub_tv.sendCommand("TVgucken")
                                     RolloWohnen_site.sendCommand(70)
                                     RolloEckeSued_site.sendCommand(70)
                                 }
                                 case OFF : {
                                     harmony_hub_tv.sendCommand("PowerOff")
                                 }
                             }
                          end
                          EDIT: und eigentlich:
                          Code:
                           rule "Fernseher an/aus"
                          when
                             Item harmony_hub_tv_act received command
                          then
                             switch(receivedCommand) {
                                 case ON : {
                                     harmony_hub_tv.sendCommand("TVgucken")
                          [COLOR=#FF0000]           if((RolloWohnen_site.state as DecimalType).intValue < 70)[/COLOR]
                                         RolloWohnen_site.sendCommand(70)
                          [COLOR=#FF0000]           if((RolloEckeSued_site.state as DecimalType).intValue < 70)[/COLOR]
                                         RolloEckeSued_site.sendCommand(70)
                                 }
                                 case OFF : {
                                     harmony_hub_tv.sendCommand("PowerOff")
                                 }
                             }
                          end
                          Zuletzt geändert von udo1toni; 28.07.2017, 12:33.

                          Kommentar


                            #28
                            die Szene mit den Rollos hat "mit richtiger Schreibweise wohlgemerkt" vor 2 Tagen funktioniert. Rollos sind automatisch mitgeschalten worden.

                            heute habe ich es wieder ausprobiert und die Rollos werden nicht mehr angefahren?! gibt es dafür eine Erklärung?

                            TV-Szene....also alles was Harmony ist schaltet normal ein/aus.

                            im events.log sehe ich es auch dass die Rollos kein Kommando mehr bekommen.
                            HTML-Code:
                            2017-07-30 09:35:49.222 [ItemCommandEvent          ] - Item 'harmony_hub_tv_act' received command ON
                            2017-07-30 09:35:49.261 [ItemStateChangedEvent     ] - harmony_hub_tv changed from PowerOff to TVgucken
                            2017-07-30 09:35:49.477 [ItemCommandEvent          ] - Item 'harmony_hub_tv' received command TVgucken
                            2017-07-30 09:35:58.040 [ItemStateChangedEvent     ] - harmony_hub_ps3 changed from PowerOff to TVgucken
                            woran kann das liegen?


                            hier das events.log bis vor 2 Tagen wo es funktioniert hat mit der Rule:
                            HTML-Code:
                            2017-07-28 13:55:50.081 [ItemCommandEvent          ] - Item 'harmony_hub_tv_act' received command ON
                            2017-07-28 13:55:53.076 [ItemCommandEvent          ] - Item 'harmony_hub_tv' received command TVgucken
                            2017-07-28 13:55:53.081 [ItemStateChangedEvent     ] - harmony_hub_tv changed from PowerOff to TVgucken
                            2017-07-28 13:55:53.275 [ItemCommandEvent          ] - Item 'RolloWohnen_site' received command 70
                            2017-07-28 13:55:53.282 [ItemCommandEvent          ] - Item 'RolloEckeSued_site' received command 70
                            2017-07-28 13:56:01.852 [ItemStateChangedEvent     ] - harmony_hub_ps3 changed from PowerOff to TVgucken
                            2017-07-28 13:56:14.381 [ItemStateChangedEvent     ] - RolloEckeSued_site changed from 0 to 70
                            2017-07-28 13:56:21.341 [ItemStateChangedEvent     ] - RolloWohnen_site changed from 0 to 70
                            Verbindung zum KNX passt und meine anderen KNX Geräte lassen sich auch steuern.


                            im openhab.log ist mir jetzt folgender Error noch aufgefallen:
                            HTML-Code:
                            2017-07-30 11:06:33.139 [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'Fernseher an/aus': org.eclipse.smarthome.core.library.types.DecimalType
                            2017-07-30 11:12:32.731 [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'Fernseher an/aus': org.eclipse.smarthome.core.library.types.DecimalType
                            es scheint was mit dem Dezimalwert zu tun zu haben.....aber warum es dann schon mal funktioniert hat wundert mich?!
                            Zuletzt geändert von MrWichtig; 30.07.2017, 10:17.

                            Kommentar


                              #29
                              Hast Du die Abfrage mit drin, oder nicht? Falls ja, könnte es sein, dass der Status leer ist, dann müsste eigentlich eine Fehlermeldung kommen, jedenfalls könnte die Abfrage dann natürlich nicht mehr wahr sein, so dass die Rollos nicht verfahren werden. Um das auszuschließen könntest Du folgendes ergänzen:
                              Code:
                              if((!(RolloWohnen_site.state instanceof DecimalType) || RolloWohnen_site.state as DecimalType).intValue < 70)
                              In der anderen Zeile ebenso. Es empfielt sich, ein paar log-Zeilen einzubauen, 1. Vor dem if()
                              Code:
                              logInfo("TV_an_aus","RolloWohnen_site.state: {}",RolloWohnen_site.state)
                              und am Besten im if(), da es dort dann mehr als eine Anweisung ist, müsstest Du jeweils noch die geschweiften Klammern { } ergänzen. also komplett:
                              Code:
                              logInfo("TV_an_aus","RolloWohnen_site.state: {}",RolloWohnen_site.state)
                              if((!(RolloWohnen_site.state instanceof DecimalType) || RolloWohnen_site.state as DecimalType).intValue < 70) {
                                  logInfo("TV_an_aus","RolloWohnen_site verfahren auf 70%%")
                                  RolloWohnen_site.sendCommand(70)
                              }
                              Das Ganze entsprechend auch für das zweite Rollo. Dann kannst Du im Log nachvollziehen, ob die Anweisungen ausgeführt werden (vielleicht bricht die gesamte if-Anweisung mit einer Fehlermeldung ab, dann müsste man sie halt anders formulieren, um zum Ziel zu kommen...)

                              Kommentar


                                #30
                                habe ich die Rule so richtig umgebaut als das ganze? im Designer zeigt es mir wieder Fehler an...?siehe Screenshot

                                HTML-Code:
                                rule "Fernseher an/aus"
                                when
                                   Item harmony_hub_tv_act received command
                                then
                                   switch(receivedCommand) {
                                       case ON : {
                                           harmony_hub_tv.sendCommand("TVgucken")
                                           if((RolloWohnen_site.state as DecimalType).intValue < 70)
                                               RolloWohnen_site.sendCommand(70)
                                logInfo("TV_an_aus","RolloWohnen_site.state: {}",RolloWohnen_site.state)
                                if((!(RolloWohnen_site.state instanceof DecimalType) || RolloWohnen_site.state as DecimalType).intValue < 70) {
                                    logInfo("TV_an_aus","RolloWohnen_site verfahren auf 70%%")
                                    RolloWohnen_site.sendCommand(70)
                                }
                                           if((RolloEckeSued_site.state as DecimalType).intValue < 70)
                                               RolloEckeSued_site.sendCommand(70)
                                logInfo("TV_an_aus","RolloWohnen_site.state: {}",RolloWohnen_site.state)
                                if((!(RolloEckeSued_site.state instanceof DecimalType) || RolloEckeSued_site.state as DecimalType).intValue < 70) {
                                    logInfo("TV_an_aus","RolloWohnen_site verfahren auf 70%%")
                                    RolloEckeSued_site.sendCommand(70)
                                }
                                       }
                                       case OFF : {
                                           harmony_hub_tv.sendCommand("PowerOff")
                                       }
                                   }
                                end


                                in welchem Log sollte ich dann mehr Infos stehen haben? events.log oder openhab.log?
                                Angehängte Dateien

                                Kommentar

                                Lädt...
                                X