Ankündigung

Einklappen
Keine Ankündigung bisher.

Threshold

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

    Threshold

    Hallo,

    wie ist der Parameter Threshold zu benutzen, bzw. wie wird am Ende die Logik getriggert?

    Aus der Doc sehe ich nur folgendes:
    • threshold: specify values to trigger depending logics only if the value transit the threshold. low:high to set a value for the lower and upper threshold, e.g. 21.4:25.0 which triggers the logic if the value exceeds 25.0 or fall below 21.4. Or simply a single value.
    Bedeutet dies wenn ich in der logics.conf watch_items anwende wird nur bei Unterschreiten / Überschreiten von low:high getriggert?
    Oder muss hierfür noch etwas weiteres konfiguriert werden?

    Danke!

    #2
    Hallo,

    1. ja.
    2. nein

    Bis bald

    Marcus

    Kommentar


      #3
      Hallo,

      habe mit diesem Beispiel jetzt auch experimentiert und folgendes Verhalten ermittelt.
      die logic wird nach dem obigen Beispiel bei jedem Wert unter 21.4 und bei jedem Wert über 25,0 getriggert.
      dafür finde ich leider keinen use-case. Meine Anforderung wäre, dass die logic beim Unterschreiten, bzw. Überschreiten einmal getriggert wird.
      wie könnte ich das erreichen ? use-case: bei 21,4 ausschalten und bei 25 wieder einschalten ( oder umgekehrt ).

      Gruß Wil

      Kommentar


        #4
        Hi,

        Beim Ein- und Ausschalten ist es recht einfach. Auch ohne threshold:

        Code:
        [Hysterese]
            type = bool
            eval = 0 if value <= 21.4 else 1 if value >= 25 else sh.Hysterese()
            eval_trigger = <item dass den Wert empfängt>
        Gruß, Waldemar

        OpenKNX www.openknx.de

        Kommentar


          #5
          danke, wo lernt man so etwas ?

          da bin ich mal gespannt.
          möchte damit meine WP steuern und den Turbo einschalten wenn die Sonne scheint und meine Solaranlage genügend Strom produziert.
          wenn ich dann mal schaffe den SMA Wechselrichter auszulesen, kann ich das optimieren.

          Kommentar


            #6
            Danke whe somit hast du mir das Testen gespart. War leider noch nicht dazu gekommen und war auch der Meinung dass Threshold nur einmal triggert.
            mumpf vielen Dank für das schöne Beispiel, werde das mal testen bei nächster Gelegenheit

            Kommentar


              #7
              Hallo,

              treshold triggert auch nur einmal die abhängigen Logiken. Das funktioniert bei mir genau so.

              Bitte komplettes Debuglog und Konfig des Items posten, wenn wir das weiter diskutieren wollen.

              Bis bald

              Marcus

              Kommentar


                #8
                Zitat von whe Beitrag anzeigen
                danke, wo lernt man so etwas ?
                ...eigentlich nirgendwo. Das ist reine Logik und ist schon fast natürliche "Sprache":

                "aus" wenn der Wert kleiner gleich 21.4 ist, "an" wenn der Wert größer gleich 25 ist und sonst den alten Wert behalten.

                Die Variable "value" ist in der Doku beschrieben und was "eval" macht, auch. Aber ein Forum ist ja dazu da, Tipps zu geben.

                Gruß, Waldemar
                OpenKNX www.openknx.de

                Kommentar


                  #9
                  Hi Waldemar,

                  net so bescheiden sein...
                  Ich denke Dein Eval ist schon eher speziell und ich würde Dich da schon als Godfather des Evals nennen.
                  Ich für meinen Teil habe mir eines deiner Beispielsyntax zentral notiert und verwende es nun universal. Ich weiß was es tut und wie ich es anwenden kann...und dann wird's dunkel
                  Aber wie Du schon geschrieben hast....dafür gibt's dann das Forum...

                  Cheers,
                  Oliver

                  Kommentar


                    #10
                    Danke für die Blumen... wobei ich schon kompliziertere eval's gesehen habe! Ich mach dann lieber mehrere Sub-Items mit einfacheren eval's und kombiniere die dann. Finde ich übersichtlicher! Und wenn es trotzdem kompliziert wird, nehme ich Autoblind.

                    Was so nicht in der Doku steht und ich durch ausprobieren festgestellt habe (und was mich am Anfang verwirrt hat, aber letztendlich sehr komfortabel ist): "value" trägt immer den Wert des triggernden Items und somit auch dessen Datentyp. Da man das eval immer im Kontext des Ziel-Items formuliert, neigt man dazu, dem "value" den Datentyp des Ziel-Items zu unterstellen. Im obigen Beispiel sieht man das ganz gut: Ziel-Item ist bool, "value" ist aber num! Am Anfang dachte ich immer, wenn der Typ von "value" nicht passt, kann ich den nicht verwenden, was natürlich Quatsch ist, da "value" im if-Statement typgerecht ausgewertet wird und das Ergebnis vom if-Statement zum Datentyp des Ziel-Items passen muss. Auf diese Weise ist man sehr flexibel! Das hat Marcus (ob bewusst oder nicht) sehr gut gemacht!

                    Gruß, Waldemar
                    OpenKNX www.openknx.de

                    Kommentar


                      #11
                      Hallo Waldemar,

                      darf ich Dich in dieser Sache noch um einen weiteren Tipp bitten.
                      ich benutze diesen Threshold um bei entspr. Sonneneinstrahlung die WP zu steuern.
                      leider stelle ich fest, dass auch bei größerem Threshold ( 50.000 - 80.000 ) die Logik manchmal dauernd an und ausschaltet ( bei wechselhaftem Wetter ).
                      bei der Wetterstation im KNX habe ich gesehen, dass man dort, z.B. für den Windalarm eine Verzögerung einstellen kann.
                      wie kann ich denn erreichen, dass z.B. der Wert 3min lang über 80.000 sein soll, bevor die Logik zuschlägt und dann auch wieder 3min unter 50.000 bleiben muss, bevor ausgeschaltet wird.

                      Gruß Wil

                      Kommentar


                        #12
                        im Item:
                        PHP-Code:
                        sqlite true 
                        setzen


                        sh.DEINITEM.db('min','3i') liefert den Minimalwert der letzten drei Minuten. Um Deine Frage zu beantworten:
                        in einer Logik
                        PHP-Code:
                        if sh.DEINITEM.db('min','3i') > 80000:
                              
                        sh.DEINANDERESITEM(TRUE)
                        if 
                        sh.DEINANDERESITEM() and sh.DEINITEM.db('max','3i') < 50000:
                              
                        sh.DEINANDERESITEM(FALSE
                        in eval:

                        PHP-Code:
                        eval = if sh.DEINITEM.db('min','3i') > 80000 else if sh.DEINITEM.db('max','3i') < 50000 
                        Wenn Du noch verhindern willst, dass der Wert vor drei Minuten wieder ausschaltet:

                        PHP-Code:
                        eval = if sh.DEINITEM.db('min','3i') > 80000 else if sh.DEINITEM.db('max','3i') < 50000 and sh.DEINANDERESITEM.db('on','3i') == 100 
                        ggf. macht es mehr Sinn mit dem Durchschnittswert der letzten drei Minuten zu arbeiten:

                        PHP-Code:
                        sh.DEINITEM.db('avg','3i'
                        Dokumentation dazu hier:
                        http://mknx.github.io/smarthome/plug...-start-end-now

                        Zuletzt geändert von Marcov; 28.03.2016, 21:32.

                        Kommentar


                          #13
                          vielen Dank,

                          die Funktion kenne ich; bin leider nicht darauf gekommen mein Problem damit zu lösen,
                          werde das versuchen heute noch umzusetzen.

                          vielen Dank Wil

                          Kommentar


                            #14
                            Habe es endlich mal umgesetzt.
                            mein item habe ich wie folgt angepasst:
                            PHP-Code:
                                    [[[Sonne]]]
                                        
                            name Helligkeit
                                        type 
                            num
                                        visu 
                            yes
                                        visu_acl 
                            rw
                                        sv_widget 
                            = {{ basic.float('item''item''lux') }}
                                        
                            sqlite yes
                                        sqlite 
                            init
                                        knx_dpt 
                            9
                                        knx_listen 
                            3/6/19
                                        
                            [[[[Hysterese]]]]
                                            
                            type bool
                                            cache 
                            on
                            #               eval = 0 if value < 50000 else 1 if value > 80000 else sh.Dach.Wetter.Sonne.Hysterese()
                                            
                            eval = if sh.Dach.Wetter.Sonne.db('avg','3i') < 50000 else if sh.Dach.Wetter.Sonne.db('avg','3i') > 80000 else sh.Dach.Wetter.Sonne.Hysterese()
                                            
                            eval_trigger Dach.Wetter.Sonne 
                            und die logic wie folgt angepasst:

                            PHP-Code:
                            # setze SGReady Eingang 1 wenn die Sonne scheint
                            # nur wenn SGReady aktiviert ist
                            #
                            if sh.Keller.Heizung.SGR.aktiv():
                                
                            logger.info("SGReady aktiv. Sonnenschein: " str(sh.Dach.Wetter.Sonne.db('avg','3i')) + " / " str(sh.Dach.Wetter.Sonne.Hysterese()) )
                                if 
                            sh.Dach.Wetter.Sonne.Hysterese():
                                    if 
                            not sh.Keller.Heizung.SGR.Eingang1():
                                        
                            sh.Keller.Heizung.SGR.Eingang1('true')
                                        
                            logger.info("SGReady  aktiviert")
                                else:
                                    if 
                            sh.Keller.Heizung.SGR.Eingang1():
                                        
                            sh.Keller.Heizung.SGR.Eingang1('false')
                                        
                            logger.info("SGReady  de-aktiviert"
                            nach dem Neustart erhielt ich dann folgende Meldungen im log:

                            PHP-Code:
                            2016-04-03 13:43:47 INFO     hello        Hello World!
                            2016-04-03 13:44:28 INFO     Main         Number of Threads8
                            2016
                            -04-03 13:44:28 INFO     Main         Stop Plugins
                            2016
                            -04-03 13:44:32 INFO     Main         SmartHome.py stopped
                            Init SmartHome
                            .py 1.0-45-g02cf972+
                            2016-04-03 13:44:36 INFO     Main         Start SmartHome.py 1.0-45-g02cf972+
                            2016-04-03 13:44:36 INFO     Main         Init Scheduler
                            2016
                            -04-03 13:44:36 INFO     Main         Init Plugins
                            2016
                            -04-03 13:45:00 INFO     Main         Init Items
                            2016
                            -04-03 13:45:09 INFO     Main         Start Plugins
                            2016
                            -04-03 13:45:09 INFO     Main         Start Logics
                            2016
                            -04-03 13:45:15 INFO     hello        Hello World!
                            2016-04-03 13:46:12 INFO     Scheduler    Adding worker threadTotal6
                            2016
                            -04-03 13:46:12 INFO     Scheduler    ThreadsDach.Wetter.Sonne.Hysterese5Main1sma1Scheduler1Thread-61
                            2016
                            -04-03 13:47:50 INFO     Scheduler    Adding worker threadTotal7
                            2016
                            -04-03 13:47:50 INFO     Scheduler    ThreadsThread-71Dach.Wetter.Sonne.Hysterese6Main1sma1Scheduler1
                            2016
                            -04-03 13:48:05 WARNING  Dach.Wetter.Sonne.Hysterese Item Dach.Wetter.Sonne.Hystereseproblem evaluating 0 if sh.Dach.Wetter.Sonne.db('avg','3i') < 50000 else if sh.Dach.Wetter.Sonne.db('avg','3i') > 80000 else sh.Dach.Wetter.Sonne.Hysterese(): unorderable typesNoneType() > int()
                            2016-04-03 13:48:09 WARNING  Dach.Wetter.Sonne.Hysterese Item Dach.Wetter.Sonne.Hystereseproblem evaluating 0 if sh.Dach.Wetter.Sonne.db('avg','3i') < 50000 else if sh.Dach.Wetter.Sonne.db('avg','3i') > 80000 else sh.Dach.Wetter.Sonne.Hysterese(): unorderable typesNoneType() > int()
                            2016-04-03 13:48:09 WARNING  Dach.Wetter.Sonne.Hysterese Item Dach.Wetter.Sonne.Hystereseproblem evaluating 0 if sh.Dach.Wetter.Sonne.db('avg','3i') < 50000 else if sh.Dach.Wetter.Sonne.db('avg','3i') > 80000 else sh.Dach.Wetter.Sonne.Hysterese(): unorderable typesNoneType() > int()
                            2016-04-03 13:48:17 WARNING  Dach.Wetter.Sonne.Hysterese Item Dach.Wetter.Sonne.Hystereseproblem evaluating 0 if sh.Dach.Wetter.Sonne.db('avg','3i') < 50000 else if sh.Dach.Wetter.Sonne.db('avg','3i') > 80000 else sh.Dach.Wetter.Sonne.Hysterese(): unorderable typesNoneType() > int()
                            2016-04-03 13:55:44 INFO     SGReady      SGReady aktivSonnenschein38583.37834207544 False
                            2016
                            -04-03 13:55:44 INFO     SGReady      SGReady  de-aktiviert 
                            die WARNINGs scheinen nur anfangs zu kommen; keine Ahnung, was das bedeutet. evtl. wenn keine Daten für die letzten 3 min vorliegen ?
                            Auch die Scheduler Meldungen habe ich noch nie gesehen.
                            Zuletzt geändert von whe; 03.04.2016, 13:31.

                            Kommentar


                              #15
                              Hi,

                              die Meldung sagt, dass Du versuchst, ein None mit einer Zahl zu vergleichen, None aber nicht geordnet ist und somit ein "Größer" nicht ermittelt werden kann.

                              Was passiert: Die DB-Abfrage findet keinen Wert in den letzten 3 Minuten und liefert ein None.

                              Gruß, Waldemar
                              OpenKNX www.openknx.de

                              Kommentar

                              Lädt...
                              X