Ankündigung

Einklappen
Keine Ankündigung bisher.

Logik ausführen nach Zeit oberhalb von Wert x

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

    Logik ausführen nach Zeit oberhalb von Wert x

    Hallo,

    ich habe ein Problem, was ich aktuell nicht weiß wie ich es lösen könnte.
    Ich möchte gerne meine Beschattung bei einer bestimmten Windgeschwindigkeit aufstellen (ähnlich dem Windalarm der Wetterstation)

    Dazu möchte ich mir eine Logik einfügen:

    Wenn Windgeschwindigkeit größer 8m/s und für länger als z.B. 15s dann Beschattung auf Wert X

    Ich möchte diese Logik einsetzen und die Werte per Visu anpassen zu können, bis ich meine einstellungen gefunden habe,die ich dann fest in die Wetterstation einstellen kann.

    Über ein Tipp wäre ich dankbar.

    Gruß Manuel
    Zuletzt geändert von manu241; 27.04.2016, 20:04.

    #2
    Logik alle 15 Sekunden cyclen lassen, da wüsste ich nicht, wie man das mit der Visu einstellen sollte.

    In der Logik:

    if sh.WINDGESCHWINDIGKEITSITEM.db('min',sh.DAUERITEM) > sh.GRENZWERTITEM:
    sh.BESCHATTUNGSITEM(False)

    beim WINDGESCHWINDIGKEITSITEM sqlite = yes setzen

    das DAUERITEM muss ein string sein, in Deinem Fall '0.25i'
    http://mknx.github.io/smarthome/plug...ghlight=sqlite


    Kommentar


      #3
      Wo ist das Problem? Neues Item in der Visu anlegen, in dem per Textbox gepflegte Werte festgehalten werden. Die Logik läuft auf watch_item von der Wetterstation, prüft aber gegen den eingegebenen Wert...
      Bzgl Schwelle und Zeitdauer: man kann ja in einem Item den Letzten Timestamp speichern, wo die 8 m/s überschritten wurde. Und bei jeder Itemveränderung bzgl. Geschwindigkeit die Zeit ausrechenn. Vergleichswert (15sec, 30 sec etc) kann dann auch via Visu im seperaten Item landen...

      Kommentar


        #4
        Hallo,

        danke für eure Hilfe. Was mein Problem ist, dass ich möchte, dass die Logik erst ausgeführt wird, wenn der Wert (z.B. 8m/s) und einer Zeit (z.B.15s) überschritten wird.
        Wenn der Wert innerhalb der 15s wieder unterschritten wird, darf diese nicht ausgführt werden.

        Wenn ich das über cyclen löse, würde die Logik schlechtesten falle schon sofort ausgeführt, sobald die 8m/s überschritten wird. Es wird also nicht geprüft wie lange der Wert überschritten wird.

        Gruß Manuel
        Zuletzt geändert von manu241; 17.04.2016, 11:59.

        Kommentar


          #5
          Stichwort Hysterese. Hatten wir doch erst die Tage hier. Nun anstatt den statischen Teil von Waldemar die Zeit beim Autotimer in eine Variable packen und diese über SV terminieren.

          Kommentar


            #6
            Zitat von manu241 Beitrag anzeigen
            Hallo,

            danke für eure Hilfe. Was mein Problem ist, dass ich möchte, dass die Logik erst ausgeführt wird, wenn der Wert (z.B. 8m/s) und einer Zeit (z.B.15s) überschritten wird.
            Wenn der Wert innerhalb der 15s wieder unterschritten wird, darf diese nicht ausgführt werden.

            Wenn ich das über cyclen löse, würde die Logik schlechtesten falle schon sofort ausgeführt, sobald die 8m/s überschritten wird. Es wird also nicht geprüft wie lange der Wert überschritten wird.

            Gruß Manuel
            doch, siehe meinen post, ich frage ab, ob der Minimalwert der letzten 15s > 7.9 war und das tue ich alle 15 sekunden

            Kommentar


              #7
              Hallo,

              danke für eure Hilfe. Werde das mal so umsetzten und dann testen.

              Gruß und danke

              Kommentar


                #8
                Hi,

                auch wenn es wahrscheinlich zu spät ist, wollte ich mal zeigen, wie ich es machen würde:

                Code:
                [Test]
                    [[Ausgang]]
                        #Hier passiert das eigentlich wichtige:
                        #Der Ausgang wird nur true, wenn die Windgeschwindigkeit > 8 ist
                        #und das Zeitglied auf 0 steht. Das kann aber nur passieren, wenn
                        #das Zeitglied 15 Sekunden eingeschaltet war, die Windgeschwindigkeit
                        #somit min. 15 Sekunden ueber 8 war.
                        type = bool
                        name = Sperre
                        eval = (sh.Test.Ausgang.Eingang() > 8.0 and sh.Test.Ausgang.Zeitglied == 0)
                        eval_trigger = Test.Ausgang.Zeitglied
                        [[[Eingang]]]
                            #Der Eingang triggert die abhaengigen Logiken nur beim
                            #ueberschreiten bzw. unterschreiten des Grenzwertes von 8
                            type = num
                            name = Windgeschwindigkeit
                            threshold = 0.0:8.0
                        [[[Zeitglied]]]
                            #Das Zeitglied geht auf 1, wenn Windgeschwindigkeit > 8 ist
                            #es geht auf 0, wenn der Wind wieder langsamer wird oder
                            #nach 15 Sekunden
                            type = bool
                            name = Verzoegerung
                            autotimer = 15 = 0
                            eval = (sh.Test.Ausgang.Eingang > 8.0)
                            eval_trigger = Test.Ausgang.Eingang
                Ich hab das mal kommentiert. Man braucht hier kein sql, kein cycle - sollte somit sh.py weniger belasten. Ich halte es auch für übersichtlicher, aber das ist Geschmackssache. Ich habe das nicht ausprobiert, sollte aber so funktionieren.

                Gruß, Waldemar
                OpenKNX www.openknx.de

                Kommentar


                  #9
                  Hallo Waldemar,

                  zu spät ist es noch nicht :-). Ich bin gestern erst von der Dienstreise zurück gekommen.
                  Danke für deine Hilfe. Eine Frage habe ich noch dazu.

                  Ist es Möglich:

                  Code:
                  [Test]
                      [[Ausgang]]
                          #Hier passiert das eigentlich wichtige:
                          #Der Ausgang wird nur true, wenn die Windgeschwindigkeit > 8 ist
                          #und das Zeitglied auf 0 steht. Das kann aber nur passieren, wenn
                          #das Zeitglied 15 Sekunden eingeschaltet war, die Windgeschwindigkeit
                          #somit min. 15 Sekunden ueber 8 war.
                          type = bool
                          name = Sperre
                          eval = (sh.Test.Ausgang.Eingang() > 8.0 and sh.Test.Ausgang.Zeitglied == 0)
                          eval_trigger = Test.Ausgang.Zeitglied
                          [[[value1]]]
                              type = num
                              name = Wert
                          [[[Eingang]]]
                              #Der Eingang triggert die abhaengigen Logiken nur beim
                              #ueberschreiten bzw. unterschreiten des Grenzwertes von 8
                              type = num
                              name = Windgeschwindigkeit
                              threshold = 0.0:[B](sh.Test.Ausgang.value1)[/B]

                  Was bedeutet das 0.0 ? Bedeutet, dass es bei einer unterschreitung von ==8 geschaltet wird.
                  Wenn ich daraus 0.5 machen würde wäre es dann bei einem Wert von 8.5 und bzw 7.5?

                  Gruß Manuel
                  Zuletzt geändert von manu241; 26.04.2016, 10:32.

                  Kommentar


                    #10
                    Hi,

                    eine Bitte für die Zukunft: mach coding in ein entsprechendes CODE-Tag - so ist das nicht gut lesbar. Du hast ja glücklicherweise die Stelle fett hervorgehoben.

                    threshold ist in der Doku als Intervall beschrieben, ein Trigger wird nicht bei jeder Änderung, sondern beim verlassen der Grenzen getriggert. 0.0:8.0 heißt, dass Windgeschwindigkeiten von <0 oder >8 immer einen Trigger auslösen. Hat aber keine Auswirkung auf die Funktionalität der Logik (kannst Du auch weglassen), hat nur was damit zu tun wie oft in sh.py intern andere Items getriggert werden.

                    Was sh.Test.Ausgang.value1 sein soll, weiß ich nicht - aber ich vermute, dass Du den Grenzwert für die Windgeschwindigkeit variabel machen willst. Dann musst Du threshold weglassen und überall da, wo ich auf 8.0 abgefragt habe, entsprechend auf sh.Test.Ausgang.value1 abfragen (und das Item als num-Item anlegen). Wie man die 15 Sekunden variabel machen kann weiß ich nicht (außer durch Logik).

                    Gruß, Waldemar
                    OpenKNX www.openknx.de

                    Kommentar


                      #11
                      Hallo Waldemar,

                      ich bin gerade am testen. Habe aber noch ein paar Verständnisprobleme.
                      1) Ich denke in deinem Beispiel ist noch ein Fehler:
                      Code:
                       [[[Zeitglied]]]
                                  #Das Zeitglied geht auf 1, wenn Windgeschwindigkeit > 8 ist
                                  #es geht auf 0, wenn der Wind wieder langsamer wird oder
                                  #nach 15 Sekunden
                                  type = bool
                                  name = Verzoegerung
                                  autotimer = 15 = 0
                      [B]            eval = (sh.Test.Ausgang.Eingang > 8.0)[/B]
                                  eval_trigger = Test.Ausgang.Eingang
                      Müsste es da nicht eval = (sh.Test.Ausgang.Eingang() > 8.0) heißen?

                      2) Wenn die Wetterstation alle paar Sekunden den Wert (Eingang) sendet, kann das sein, dass sh.Test.Ausgang.Zeitglied somit nie False wird? Also die 15s immer wieder neu gestartet werden?

                      Gruß Manuel

                      Kommentar


                        #12
                        Hi Manuel,

                        wie schon geschrieben, ich hatte es nicht getestet... das mit den Klammern stimmt auf jeden fall! Die habe ich auch beim ersten eval ...Ausgang.Zeitglied() fehlen diese!
                        Und ja, Du hast natürlich recht, das mit dem immer wieder triggern ist ein Problem - deswegen hatte ich den threshold drin - der triggert ja nur, wenn die 8 überschritten wird. Da Du aber die 8 dynamisch haben willst, brauchst Du noch ein Hilfsitem, dass den threshold ersetzt. Ist genau so wie das Zeitglied definiert, nur ohne autotimer. Dieses Hilfsitem würde dann das Zeitglied triggern.

                        Hier nochmal das verbesserte Beispiel, mit echer Hysterese und (hoffentlich) korrekten evals:
                        Code:
                        [Test]
                            [[Ausgang]]
                                #Hier passiert das eigentlich wichtige:
                                #Der Ausgang wird nur true, wenn die Windgeschwindigkeit > 8 ist
                                #und das Zeitglied auf 0 steht. Das kann aber nur passieren, wenn
                                #das Zeitglied 15 Sekunden eingeschaltet war, die Windgeschwindigkeit
                                #somit min. 15 Sekunden ueber 8 war.
                                type = bool
                                name = Sperre
                                eval = sh.Test.Ausgang.Hysterese() and not sh.Test.Ausgang.Zeitglied()
                                eval_trigger = Test.Ausgang.Hysterese | Test.Ausgang.Zeitglied
                                [[[Eingang]]]
                                    type = num
                                    name = Windgeschwindigkeit
                                [[[Schwelle]]]
                                    #Schwelle fuer die Windgeschwindigkeit
                                    #kann von der Visu verändert werden, default ist 8.0
                                    type = num
                                    name = Schaltschwelle
                                    value = 8.0
                                    visu_acl = rw
                                [[[Hysterese]]]
                                    #Wertet die Schaltschwelle anhand einer Hysterese aus, wobei
                                    #Schwelle als Obergrenze und Schwelle - 0.5 als Untergrenze genommen wird
                                    type = bool
                                    name = Hysterese
                                    eval = 1 if sh.Test.Ausgang.Eingang() > sh.Test.Ausgang.Schwelle() else 0 if sh.Test.Ausgang.Eingang() < sh.Test.Ausgang.Schwelle() - 0.5 else sh.Test.Ausgang.Hysterese()
                                    eval_trigger = Test.Ausgang.Eingang | Test.Ausgang.Schwelle
                                [[[Zeitglied]]]
                                    #Das Zeitglied geht auf 1, wenn Hysterese 1 ist
                                    #es geht auf 0, wenn Hysterese 0 wird oder
                                    #nach 15 Sekunden
                                    type = bool
                                    name = Verzoegerung
                                    autotimer = 15 = 0
                                    eval = value
                                    eval_trigger = Test.Ausgang.Hysterese
                        OpenKNX www.openknx.de

                        Kommentar


                          #13
                          Hallo Waldemar,

                          super danke für deine Hilfe. Nun funktioniert es wie gewünscht. Besten Dank

                          Kommentar

                          Lädt...
                          X