Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage zu Rule

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

    Frage zu Rule

    Hallo zusammen!

    Ich komme bei einer Rule nicht weiter.

    Ich versuche derzeit, die Sonnenstandsteuerung der Rollläden umzusetzen.

    Meine Grundrule sieht so aus:


    rule "Sonne"

    when
    Item Sonne received update
    then
    if (Sonne.state==ON) {
    sendCommand(Jalousie_EG_Kueche_rechts, DOWN)
    }
    end

    rule "Sonne"

    when
    Item Sonne received update
    then
    if (Sonne.state==ON) {
    sendCommand(Jalousie_EG_Essplatz, DOWN)
    }
    end

    und so weiter...


    Ich habe einen Item Sonne gemacht und die Sitemap eingebunden. Das Ganze funktioniert auch. Nur meine Probleme fangen an, wie ich manchen Rollläden sagen soll, nicht ganz zuzugehen, sondern eine Position 75% anzufahren. Das ist in der Sitemap mit Mapping gelöst, funktioniert perfekt, ich kriege das aber nicht in die Rule.

    Auch sollte das ganze zeitlich steuerbar sein, also wenn man etwa in der Früh Regen hat und dann ab zehn den Schalter aktiviert, das eine Fenster noch zugehen, was es aber bei einem Aktivieren des Schalters etwa nach 13 Uhr nicht mehr sollte, es sollte also ein Zeitfenster programmiert werden.

    Ich denke, das Ganze geht mit "if", nur komme ich leider nicht dahinter, wie.


    Wie ich das zu einer bestimmten Uhrzeit wieder öffnen kann, das denke ich, weiß ich. Nur, wenn ich Sonne aktiv lasse, sich mit einer zusätzlich Rule nach Sonnenaufgang und -untergang die Rollläden öffnen und senken, geht das dann automatisch? Received Update ist ja dann nicht...

    So, ich hoffe, ich habe euch mit meinen Ideen nicht zu sehr zugemüllt und mich auch halbwegs verständlich ausgedrückt... ;-)

    Danke für die Hilfe!


    #2
    Hi

    also, gesetz den Fall, du hast alles sauber konfiguriert, dann kannst du ganz einfach deinen Rollo auf einen bestimmten Prozentwert (hier 70%) mit folgendem Kommando fahren:

    Rollo_EG_Wohnzimmer_Ost.sendCommand(70)


    Ich habe die Beschattung bei mir wie folgt gelöst:
    Wenn die Aussentemperatur VORMITTAGS bereits über 20°C steigt und zusätzlich die Sonne länger als 15 Minuten scheint (=> dann wird es wahrscheinlich tagsüber noch wesentlich wärmer), soll die Beschattung eingeleitet werden.

    Die Lösung findest du hier (funktioniert seit Jahren super bei mir):

    https://knx-user-forum.de/forum/supp...131#post945131

    Gruß,
    thoern
    Zuletzt geändert von thoern; 24.06.2017, 13:33.

    Kommentar


      #3
      Bemerkungen am Rande: Der Name einer Rule muss eineindeutig sein, das heißt, weder innerhalb eines Rulefiles noch über alle Rulefiles darf sich der Rulename wiederholen. Weiterhin wird received Update immer wieder auslösen, unabhängig vom Zustand des Items, ein Update genügt. Besser wäre für solche Dinge ein changed als Trigger, oder gar ein changed to ON, damit könnte man sich die nächste Abfrage sparen.
      Man sollte sich auch sehr genau überlegen, ob man den selben Trigger für mehrere Rules verwendet, die werden dann parallel konkurrierend zueinander gestartet. Das beudetet, dass eventuell mehrere Buszugriffe zur selben Zeit ausgelöst werden, das kann schnell negative Auswirkungen haben. Besser ist es, eine Rule zuschreiben, in der alles zusammengefasst ist, was bei einem bestimmten Trigger passieren soll, also z.B.
      Code:
      rule "Sonne"
      when
          Item Sonne changed
      then
          if (Sonne.state == ON) {
              Item1.sendCommand(50)
              Item2.sendCommand(30)
              Item3.sendCommand(75)
              Item4.sendCommand(OFF)
          }
          else if (Sonne.state == OFF && now.getHourOfDay > 9 && now.getHourOfDay < 21) {
              Item1.sendCommand(0)
              Item2.sendCommand(0)
              Item3.sendCommand(0)
              Item4.sendCommand(ON)
          }
      end
      Das lässt sich natürlich noch wesentlich eleganter lösen aber so als Idee sollte das Beispiel reichen.

      Kommentar


        #4
        Puh, irgendwie steige ich gerade aus. Das mit der gleichen Bezeichnung der Rule leuchtet mir ein, habe ich geändert.

        Nur mit der Anleitung von thoern bzw dem Link komme ich nicht klar. Auch das else if verstehe ich nicht, wegen Sonne.state==OFF.

        zB, Item1 soll bei Sonne.state==ON schließen, aber nur wenn es zwischen 8 und 12 ist. Danach soll er bei Sonne.state==ON nichts mehr tun (und mit einer 2. Rule sich öffnen, oder geht das mit einer?)
        Item2 soll überhaupt erst um 1600 Uhr sich schließen. Aber immer bei Sonne.state==ON

        Die Rule sieht aktuell so aus (wieder einmal danke, udo1toni):

        rule "Sonne"

        when
        Item Sonne changed
        then
        if (Sonne.state==ON) {
        Item1.sendCommand(DOWN)
        Item2.sendCommand(75)
        Item.sendCommand(75)
        usw...
        }
        end

        Wie gesagt, das mit dem else if verstehe ich nicht. Müßte nicht mit den weiteren Bedingungen immer state==ON verbunden sein?

        Kommentar


          #5
          Naja, ich hab natürlich nur unvollständige Informationen... Vielleicht habe ich nicht verstanden, wie Du Deine Items definiert hast. Ich ging davon aus, dass das Item Sonne für (zu) hohe Sonneneinstrahlung steht, der Zustand ON also bedeutet, dass die Läden auf Beschattungsposition fahren sollen, und OFF, dass die Läden wieder auffahren sollen.

          Wenn nur der State ON eine Rolle spielt, reicht es, die Rule mit
          Code:
          when
              Item Sonne changed to ON
          then
              Item1.sendCommand(75)
              ...
          end
          zu definieren.
          Zuletzt geändert von udo1toni; 23.06.2017, 22:37.

          Kommentar


            #6
            Achso, ja unter dem Punkt ist es völlig unvollständig... Ich wusste ja, was ich meine, darum hab ich mich nicht korrekt ausgedrückt...

            Mein Haus steht den ganzen Tag in der Sonne, darum sind verschiedene Jalousien gefordert, die sich zu einer gewissen Zeit mal öffnen, mal schließen, je nachdem, wo die Sonne gerade steht, das kann ich von der Uhrzeit her sagen, was wann passieren soll.

            Das Item Sonne ist im Endeffekt nur dazu da, die Rule zu aktivieren, indem in der Sitemap ein Switch ist. Wenn ich in die Arbeit fahre und es wird ein schöner Tag schalte ich es ein und es wird dann im Haus nicht zu heiss. Im Sommer, wenn es länger schön ist, würde ich die Rule gar nicht deaktivieren. An Regentagen oder in der kühleren Jahreszeit kann ich es übers Handy deaktivieren.

            Mein Helligkeitssensor ist leider unzuverlässig, er sendet oft mal gar nicht, darum würde ich es eben über den Switch "Sonne" lösen wollen.

            Kommentar


              #7
              Ah. Na, dann sollte eigentlich ein anderer Ansatz zielführender sein.

              Zum einen der Schalter Sonne. Ich habe seit dem Ableben meiner Wettterstation keinen vernünftigen Helligkeitssensor mehr (nur in den Bewegungsmeldern...), stattdessen greife ich auf die Vorhersage der Außentemperatur zurück. Ich schaue also über das Weather Binding, ob die vorhergesagte Maximaltemperatur über 23 °C liegt.
              Das passiert in einer Rule, die auf Zeit getriggert wird. Um 8:31Uhr löst Die Rule aus, falls dann die Temperaturbedingung erfüllt ist, fahren die Läden.
              Wenn die Läden gefahren sind, werden irgendwann Nachmittags die Läden wieder aufgefahren.
              Das ist sehr primitiv, funktioniert aber erstaunlich gut. In zwei Jahren hatte ich vielleicht 3 Tage, an denen ich die Läden wieder von Hand geöffnet habe und weitere 3 Tage, an denen ich die Beschattung manuell ausgelöst habe (beide Fälle hätten sich mit etwas Feinabstimmung leicht auf 0 reduzieren lassen, aber ich bin faul und es funktioniert...)

              Für eine gute Sonnenstandssteuerung bietet sich das Astro Binding an. Azimuth und Elevation der Sonne werden alle paar Minuten aktualisiert (wenn das Binding entsprechend konfiguriert ist). In der Rule, die bei Updates der entsprechenden Items triggert, muss dann nur überprüft werden, ob sich die Sonne in einem bestimmten Bereich befindet, dann werden die betreffenden Rollläden gefahren. In Kombination mit der vorhergesagten Außentemperatur kann man den Taster komplett weglassen.

              Kommentar


                #8
                Ich habe trotzdem mal meinen Ansatz weiterverfolgt, nur geht das nicht so richtig.

                Die Rule "Küche zu" soll von 8-13 Uhr aktiv sein, legt man also den Schalter "Sonne" um, soll es zugehen.

                Ist der Schalter vor 8 an, dann geht es, Punkt 8 schließt die Jalousie. Öffnet man dazwischen und de- und reaktiviert den Schalter, oder aktiviert den Schalter nach 8 tut sich nichts.


                rule "Sonne Küche zu"

                when
                Time cron "0 0 8-13 1/1 * ? *"
                then
                if (Sonne.state==ON) {
                Jalousie_EG_Kueche_rechts.sendCommand(DOWN)

                }
                end

                rule "Sonne Küche auf"

                when
                Time cron "0 1 13-18 1/1 * ? *"
                then
                if (Sonne.state==ON) {
                Jalousie_EG_Kueche_rechts.sendCommand(UP)

                }
                end

                Wo liegt hier der Fehler?

                Kommentar


                  #9
                  Erste Frage: was möchtest du mit dem 1/1 bezwecken?

                  Meiner Meinung nach müsste der Cronjob so aussehen, damit er mindestens m i n ü t l i c h aktiv wird:
                  Code:
                  Time cron "0 * 8-13 * * ?"
                  Gruß, thoern

                  Kommentar


                    #10
                    Naja, bezwecken will ich, dass es läuft. Ich habe mal Rules nach Anleitung mit dieser Konfiguration, wie du sie hast, gemacht, nur liefen die nicht. Ich habe daher mit cronmaker.com gearbeitet und der hat mir genau diese 1/1 (für jeden Tag) - Konfiguration ausgeworfen. Das in die Rule und die lief (und läuft noch immer) einwandfrei.

                    Mit deiner Konfiguration funktioniert es leider auch nicht.

                    LG

                    Kommentar


                      #11
                      Hi,

                      ich glaube, du hast nicht ganz verstanden, worauf ich hinaus will. Deine Regel mit

                      Code:
                      when
                      Time cron "0 1 13-18 1/1 * ? *"
                      then

                      wird nur jede Stunde ausgeführt. Und zwar nur um

                      13:01
                      14:01
                      ...
                      18:01

                      Dazwischen wird nichts passieren.
                      Wenn sich also dein "Sonne.state" von OFF auf ON ändert, musst du bis zu einer der Uhrzeiten (13:01, 14:01 ...) warten, bis sich die Jalousie bewegt.

                      Gruß
                      Zuletzt geändert von thoern; 24.06.2017, 13:33.

                      Kommentar


                        #12
                        Das leuchtet mir ein.
                        Die Regel sollte aber so sein, dass, wenn sich Sonne.state von OFF auf ON ändert, die Jalousie im Zeitfenster 13-18 Uhr sich öffnet.
                        Ist das der Fall wenn ich "1" durch "*" ersetze ("0 * 13-18 1/1 * ? *")?

                        Kommentar


                          #13
                          Ich würde das so machen:

                          Code:
                          Time cron "* * 13-18 * * ?"
                          Das sollte dann zumindest sekündlich feuern.

                          Trotzdem ist auch das nicht wirklich sinnvoll. Bei State=ON wird dann nämlich in sekündlichem Rhytmus ein sendCommand(DOWN) geschickt. Du solltest dir also noch irgendwie eine Merker-Variable setzen, anhand derer du erkennst, ob die Regel schon gefeuert wurde. (s. Variable TriggerAM in meinem verlinkten Beispiel.)

                          Also in etwa so (nicht gestestet):
                          Code:
                          var RuleFired = 0
                          
                          rule "Sonne Küche zu"
                          
                          when
                          Time cron "* * 13-18 * * ?"
                          then
                          if (Sonne.state==ON && RuleFired == 0) {
                               Jalousie_EG_Kueche_rechts.sendCommand(DOWN)
                               RuleFired = 1
                          }
                          end
                          RuleFired könntest du dann wieder mit einer zweiten Rule 0 setzen (z.B. nach 18:00 Uhr). Dann passt dass wieder für den nächsten Tag.

                          Gruß,
                          thoern



                          Kommentar


                            #14
                            Nur nochmal zum Verständnis: Der when-Teil einer Rule beschreibt den Trigger, der die Rule auslöst. Deine Rule wird also nur durch ein zeitliches Ereignis ausgelöst, nicht, wenn ein Schalter umgelegt wird!
                            Was Du möchtest, ist besser mit drei Rules zu lösen.
                            Die Rules lauten:
                            Code:
                            rule "Sonne Küche zu"
                            when
                                Time cron "0 0 8 * * ? *" //um 08:00 Uhr (das letzte Sternchen ist optional)
                            then
                                if (Sonne.state==ON) { //falls Sonne aktiv
                                    Jalousie_EG_Kueche_rechts.sendCommand(DOWN) //schließe Jalousie
                                }
                            end
                            
                            rule "Sonne Küche auf"
                            when
                                Time cron "0 1 18 * * ? *" // um 18:01 Uhr (das letzte Sternchen ist optional)
                            then
                                if (Sonne.state==ON) { //falls Sonne aktiv
                                    Jalousie_EG_Kueche_rechts.sendCommand(UP) //öffne Jalousie
                                }
                            end
                            
                            rule "Sonne aktiv/inaktiv"
                            when
                                Item Sonne changed //wenn das Item Sonne geändert wurde (also ON->OFF oder OFF->ON)
                            then
                                if (Sonne.state==ON && now.getHourOfDay > 7 && now.getHourOfDay < 13) { //falls Sonne aktiv und Uhrzeit zwischen 8 und 13 Uhr
                                    Jalousie_EG_Kueche_rechts.sendCommand(DOWN) //schließe Jalousie
                                }
                                if (Sonne.state==OFF && now.getHourOfDay > 12 && now.getHourOfDay < 18) { //falls Sonne inaktiv und Uhrzeit zwischen 13 und 18 Uhr
                                    Jalousie_EG_Kueche_rechts.sendCommand(UP) //öffne Jalousie
                                }
                            end
                            Die ersten beiden Rules übernehmen die Steuerung nach Zeit, falls Sonne außerhalb des Zeitfensters aktiviert wurde. Die Rules werden zu zwei genau definierten Zeitpunkten getriggert.

                            Die dritte Rule übernimmt die Steuerung, falls Sonne innerhalb des Zeitfensters geschaltet wird. Die Rule wird jedesmal getriggert, wenn das Item Sonne seinen Zustand ändert. Die Rule triggert auch, wenn Sonne noch nie geschaltet wurde und also vorher den Zustand undefiniert hat.
                            Zuletzt geändert von udo1toni; 24.06.2017, 15:53.

                            Kommentar


                              #15
                              Hallo!
                              Vielen Dank, es funktioniert so perfekt... :-)

                              Kommentar

                              Lädt...
                              X