Ankündigung

Einklappen

ETS5 Sammelbestellung Vollversion

Infos unter: Link
Mehr anzeigen
Weniger anzeigen

EVAL gurus wanted ;)

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

    #61
    Zitat von Sisamiwe Beitrag anzeigen
    Ich möchte die Differenz zwischen einer Datetime in der Zukunft und dem jetzt in Sekunden haben und das als Dauer für einen autotimer nutzen.

    Die Anwendung wäre, die Heizung von jetzt (now) bis zum angegebenen Zeitung in den Standby (Betriebsart) zu schicken.

    Bislang habe ich das in einer Logik gemacht, frage mich aber, ob es nicht auch in einem eval gehen würde.
    Ich antworte mir mal selbst. ;o)

    Ja, es ist möglich, ein einem eval die Zeitdifferenz in Sekunden zwischen einem Datetime in der Zukunft und dem Datetime Jetzt zu errechnen, und zwar so:
    Code:
    int((datetime.datetime.strptime(sh.heizung.abwesenheit.enddatetime_autotimer(), '%Y-%m-%dT%H:%M:%S') - datetime.datetime.now()).total_seconds())
    Dabei wir dem Item "sh.heizung.abwesenheit.enddatetime_autotimer( )" per Visu ein Datetime im Isoformat zugewiesen. Von diesem Datetime wird das Datetime "Jetzt" subtrahiert und als Integerzahl in Sekunden ausgegeben.

    Vielleicht braucht es mal einer.

    Ach ja, was auch funktioniert und so nicht explizit in der Doku steht, ist dass man dem autotimer nicht nur über ein Hilfsitem die Dauer zuweisen kann, sondern auch den Wert, der nach Ablauf des Autotimers dem Item zugewiesen werden soll, per Hilfsitem festlegen.

    Das sieht dann bspw so aus:
    Code:
    heizung:
        abwesenheit:
            type: num
            autotimer: sh.heizung.abwesenheit.laufzeit_autotimer() = sh.heizung.abwesenheit.betriebsart_anwesenheit()
            
            laufzeit_autotimer:
                name: Dauer bis zur Deaktivierung in Sekunden
                type: num
                eval: int((datetime.datetime.strptime(sh.heizung.abwesenheit.enddatetime_autotimer(), '%Y-%m-%dT%H:%M:%S') - datetime.datetime.now()).total_seconds())
                eval_trigger: heizung.abwesenheit.enddatetime_autotimer
              
            enddatetime_autotimer:
                name: Datetime für Ende des Standby
                type: str
                visu_acl: rw
                cache: yes
                on_update:
                    - heizung.abwesenheit = sh.heizung.abwesenheit.betriebsart_abwesenheit()
                
            betriebsart_abwesenheit:
                type: num
                cache: yes
                initial_value: 1
                
            betriebsart_anwesenheit:
                name: x
                remark: ist eine Kopie der Betriebsart und wird per on_change mit geändert
                type: num
                cache: yes
                initial_value: 0
    Beste Grüße
    Michael

    Kommentar


      #62
      Zitat von mumpf Beitrag anzeigen
      da man in einem eval keinen Import machen kann.
      Das ist nicht richtig. Das hier:

      Code:
      boost_remaining_a:
          type: num
          eval: __import__('math').ceil(sh.ventilation.booster.logics.boost_duration()/60)
          eval_trigger = ventilation.booster.logics.boost_duration
      rechnet mir schon seit 2014 brav die verbleibenden "vollen" Minuten der KWL-Stoßlüftung aus.
      (Ja, ich weiß - math wird mittlerweile per default importiert - damals aber noch nicht, und ich hab's nie angepasst.)

      /tom

      Kommentar


        #63
        Zitat von Sisamiwe Beitrag anzeigen
        Ach ja, was auch funktioniert und so nicht explizit in der Doku steht, ist dass man dem autotimer nicht nur über ein Hilfsitem die Dauer zuweisen kann, sondern auch den Wert, der nach Ablauf des Autotimers dem Item zugewiesen werden soll, per Hilfsitem festlegen.
        Sollte gemäß Msinn eigentlich in der Doku stehen, siehe seinen letzten Kommentar zu diesem Issue.
        /tom

        Kommentar


          #64
          Steht auch in der Doku. Guckst Du hier.

          Im Wiki steht die Doku ja nicht mehr
          Zuletzt geändert von Msinn; 11.03.2020, 19:01.
          Viele Grüße
          Martin

          There is no cloud. It's only someone else's computer.

          Kommentar


            #65
            Zitat von Msinn Beitrag anzeigen
            Steht auch in der Doku. Guckst Du hier.
            Ich möchte nicht kleinlich sein, aber wo genau liest Du in der Doku von autotimer heraus, dass die Wertzuweisung auch über ein Item passieren kann?
            In der Doku steht:
            Code:
            item:
                autotimer: <dauer> = <wert>
            Der Wert für dauer kann auf folgende Weise angegeben werden:
            1. eine Zahl, die die Anzahl an Sekunden angibt
            2. eine Zahl gefolgt von m, gibt die Anzahl an Minuten an

            Es können aber sowohl <dauer> als auch <wert> über ein Item zugewiesen werden.

            Danke für die Klarstellung

            Kommentar


              #66
              Zitat von Sisamiwe Beitrag anzeigen
              Ich möchte nicht kleinlich sein, aber wo genau liest Du in der Doku von autotimer heraus, dass die Wertzuweisung auch über ein Item passieren kann?
              Du bist herzlich eingeladen mitzuarbweiten und die Doku zu verbessern.
              Viele Grüße
              Martin

              There is no cloud. It's only someone else's computer.

              Kommentar


                #67
                Zitat von Sisamiwe Beitrag anzeigen
                Ich möchte nicht kleinlich sein, aber wo genau liest Du in der Doku von autotimer heraus, dass die Wertzuweisung auch über ein Item passieren kann?
                Du zitierst die Doku doch selber:
                Zitat von Sisamiwe Beitrag anzeigen
                Es können aber sowohl <dauer> als auch<wert>über ein Item zugewiesen werden.
                Vielleicht verstehe ich Deine Frage nicht richtig, sonst würde ich sagen, die hast Du Dir selber beantwortet .

                Gruß, Waldemar

                Kommentar


                  #68
                  Guten Abend,

                  ich bin jetzt seit Stunden mit der Steckdose beschäftigt und bekomme es nicht hin.
                  Diese soll mit dem Spiegellicht mitgeschaltet werden, wenn 1 dann payload "ON" sonst payload "OFF"

                  Entferne ich die 2 eval Zeilen, kann ich über den Itembaum problemlos schalten, mit den Zeilen kann ich weder die Steckdose schalten, noch reagiert sie auf Änderungen des Lichts.

                  Code:
                  OG:
                      Kinderbad:
                          Spiegellicht:
                              EinAus:
                                  type: bool
                                  visu_acl: rw
                                  knx_dpt: 1
                                  knx_listen: 1/4/100
                                  knx_send: 1/1/100
                                  knx_init: 1/1/100
                          Steckdose:
                              type: str
                              mqtt_topic_out: zigbee2mqtt/0x086bd7fffe5f6a35/set/state
                              visu_acl: rw
                              eval: ON if sh.OG.Kinderbad.Spiegellicht.EinAus()=='true' else OFF
                              eval_trigger: OG.Kinderbad.Spiegellicht.EinAus
                  Danke
                  Johannes

                  Kommentar


                    #69
                    Schon mal 1 if bla()==1 else 0 probiert?
                    besser wäre noch das über on_update vom einaus item statt im eval zu machen. Dann kannst du jedenfalls unabhängig schalten

                    Kommentar


                      #70
                      Hi Johannes,

                      ich bin mir ziemlich sicher, dass im Log einige Fehlermeldungen stehen... Du hättest da reinschauen sollen.

                      Ich glaube, da muss folgendes stehen:
                      Code:
                      eval: 'ON' if sh.OG.Kinderbad.Spiegellicht.EinAus() else 'OFF'
                      Gruß, Waldemar

                      Kommentar


                        #71
                        Wenn Du eval nutzt, wird das Item per Formel gesetzt und nicht „per Itembaum“.

                        wenn Du nur zusätzlich schalten willst wenn das Spieleglich schaltet, solltest Du statt eval im Steckdosen Item zu nutzen, im Spiegel item ein on_change verwenden. Das setzt dann bei einer Veränderung des Spiegellichts das Steckdosen Item. Das Steckdosen Item bleibt aber unabhängig schaltbar.
                        Viele Grüße
                        Martin

                        There is no cloud. It's only someone else's computer.

                        Kommentar


                          #72
                          Danke für die raschen Antworten, es waren tatsächlich die Hochkommata.
                          Umbau auf das steurnde item habe ich auch schon versucht, eben auch hier ging es nicht wegend den Hochkommata.

                          Ich hatte ursprünglich Anführungszeichen (dachte, weil string), die hat aber der Parser reklamiert.

                          mumpf stimmt:
                          Code:
                          2020-11-18  00:04:37 WARNING  lib.item            Item OG.Kinderbad.Spiegellicht.EinAus: 'on_update' item-value='True' problem evaluating ON if value else OFF: name 'ON' is not defined
                          So funktioniert es nun:
                          Code:
                                  Spiegellicht:
                                      EinAus:
                                          type: bool
                                          visu_acl: rw
                                          knx_dpt: 1
                                          knx_listen: 1/4/100
                                          knx_send: 1/1/100
                                          knx_init: 1/1/100
                                          on_update: OG.Kinderbad.Steckdose = 'ON' if value else 'OFF'
                                  Steckdose:
                                      type: str
                                      mqtt_topic_out: zigbee2mqtt/0x086bd7fffe5f6a35/set/state
                                      visu_acl: rw
                                      enforce_updates: 'true'

                          Kommentar


                            #73
                            Du solltest evtl. on_change statt on_update verwenden (je nach gewünschtem Verhalten). Bei on_update wird die Steckdose auch geschaltet wenn sich der Spiegellicht Wert nicht ändert (z.B. Spiegellicht ist bereits an und über die GA 1/1/100 kommt ein eineutes EIN Signal). Falls die Steckdose nur geschaltet werden soll, wenn sich der Zustand des Spiegellichts ändert, wäre on_change angebracht.

                            Viele Grüße
                            Martin

                            There is no cloud. It's only someone else's computer.

                            Kommentar

                            Lädt...
                            X