Ankündigung

Einklappen
Keine Ankündigung bisher.

eval und eval_trigger

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

    eval und eval_trigger

    Hallo Leute,
    kann mir mal wieder jemand auf die Sprünge helfen?

    Ich habe für jedes Fenster ein Item, um den Zustand festzustellen:

    Code:
    [Kueche]
        [[Fenster]]
            [[[Spuele]]]
                type = num
                enocean_rx_id = xyz
                enocean_rx_eep = F6_10_00
                enocean_rx_key = STATUS
                cache = yes
                enforce_updates = yes
                knx_dpt = 5001
                knx_send = 3/4/20
    und nun ein zentrales Item gebaut, dass mir sagen soll, ob irgendwo ein Fenster offen ist, oder alle zu sind:

    Code:
    [Zentral]
        [[Anwesenheit]]
            type = bool
            knx_dpt = 1
            knx_send = 11/4/0
            knx_init = 11/4/0
            enforce_updates = true
    
        [[Fenster]]
            type = bool
            eval = or
            eval_trigger = *.Fenster.*
            knx_dpt = 1
            knx_send = 11/4/1
            knx_init = 11/4/1
            enforce_updates = true
    Wenn ich nun ein Fenster aufmache, klappt das auch:

    2016-09-26 15:14:56 INFO item enocean Item Arbeiten.Fenster.Strasse = 1 via EnOcean xyz None -- item.py:__update:374
    2016-09-26 15:14:56 DEBUG scheduler enocean Triggering Zentral.Fenster - by: EnOcean source: xyz dest: None value: {'value': 1, 'source': 'Arbeiten.Fenster -- scheduler.py:trigger:165
    2016-09-26 15:14:56 INFO item Zentral.Fenster Item Zentral.Fenster = True via Eval Arbeiten.Fenster.Strasse None -- item.py:__update:374
    Mach ich das Fenster aber wieder zu (und alle anderen sind auch zu), klappt es nicht mehr (Zentral.Fenster wird nicht auf false gesetzt):

    2016-09-26 15:15:03 INFO item enocean Item Arbeiten.Fenster.Strasse = 0 via EnOcean xyz None -- item.py:__update:374
    2016-09-26 15:15:03 DEBUG scheduler enocean Triggering Zentral.Fenster - by: EnOcean source: xyz dest: None value: {'value': 0, 'source': 'Arbeiten.Fenster -- scheduler.py:trigger:165
    2016-09-26 15:15:03 INFO item Zentral.Fenster Item Zentral.Fenster: evaluating sh.Kueche.Fenster.Spuele() or sh.Kueche.Fenster.Essplatz.Links() or sh.Kueche.Fenster.Essplatz.Rechts() or sh.Kueche.Fenster.Essplatz() or sh.Bad.Fenster.Strasse() or sh.Arbeiten.Fenster.Strasse() or sh.Schlafen.Fenster.Garten() or sh.Hauswirtschaft.Fenster.Garten() or sh.Wohnen.Fenster.Garten.Links() or sh.Wohnen.Fenster.Garten.Mitte() or sh.Wohnen.Fenster.Garten.Rechts() or sh.Wohnen.Fenster.Garten() or sh.Wohnen.Fenster.Terasse() or sh.Wohnen.Fenster.Empore.Links() or sh.Wohnen.Fenster.Empore.Rechts() or sh.Wohnen.Fenster.Empore() returns None -- item.py:__run_eval:345

    #2
    Hi,

    es steht in Deiner Meldung: <die vielen Items mit or verbunden> returns None. Irgendein Item kann nicht als bool evaluiert werden.

    Wenn ich mir Deine Item-Definition ansehe (Spuele), dann ist die ein num und kein bool. Ich habe keine Ahnung, wie das generisch zu bool konvertiert wird bzw. ob das nicht irgendwo ein None ergibt. Rein logisch gesehen sollte so ein "Massen-OR" nur auf bool-Items definiert werden - alleine schon um Fehler zu vermeiden.

    Gruß, Waldemar

    Kommentar


      #3
      Hallo Waldemar,

      hmm. Den type num muss ich nehmen, weil mir die Fenstergriffe 0, 1 oder 2 melden können (Zu, Offen, Gekippt) und ich das unterscheide . Ich könnte mir jetzt nur vorstellen, dass bei der Massenabfrage der Wert nicht geliefert wird. Die Fenstergriffe liefern ja nur beim Bewegen einmalig den neuen Zustand. Deswegen schreibe ich die in den Cache rein. Damit müsste jeder Wert > 0 ein true und ein Wert 0 ein false liefern.

      Viele Grüße
      Andi

      Kommentar


        #4
        Hi,

        auch ich würde annehmen, dass eine 0 zu false und ungleich 0 zu true evaluiert werden. Aber ich weiß nicht, ob es wirklich so ist. Ich würde an Deiner Stelle:
        1. Alle Items, die am or beteiligt sind, im CLI anschauen. Wenn irgendein Item keinen Wert hat, weißt Du den Grund
        2. Bei den num-Items mal ein value = 0 spendieren, dann sind diese nie undefiniert
        3. Wenn alles nicht hilft, mir noch ein bool-Item pro num-Item bauen, dass eval = <num-Item> != 0 macht.
        Gruß, Waldemar

        Kommentar


          #5
          1. Alle Items sind mit 0 belegt.
          2. Ändert leider nichts.

          Ich werde jetzt erst mal den eval_trigger auf einzelne Fenster loslassen.

          Kommentar


            #6
            Ich weiß jetzt woran es liegt - er iteriert über die Items falsch:

            Code:
            [Wohnen]
                [[Fenster]]
                    [[[Garten]]]
                        [[[[Links]]]]
                            type = num
                            value = 0
                            enocean_rx_id =
                            enocean_rx_eep = F6_10_00
                            enocean_rx_key = STATUS
                            visu_acl = rw
                            cache = True
                            enforce_updates = yes
                            knx_dpt = 5001
                            knx_send = 3/4/70
            
                        [[[[Mitte]]]]
                            type = num
                            value = 0
                            enocean_rx_id =
                            enocean_rx_eep = F6_10_00
                            enocean_rx_key = STATUS
                            visu_acl = rw
                            cache = True
                            enforce_updates = yes
                            knx_dpt = 5001
                            knx_send = 3/4/71
            
                        [[[[Rechts]]]]
                            type = num
                            value = 0
                            enocean_rx_id =
                            enocean_rx_eep = F6_10_00
                            enocean_rx_key = STATUS
                            visu_acl = rw
                            cache = True
                            enforce_updates = yes
                            knx_dpt = 5001
                            knx_send = 3/4/72
            Da fragt er z.B. auch Wohnen.Fenster.Garten ab, das ja kein echtes Item ist, sondern nur der Strukturierung dient.

            Kommentar


              #7
              Zitat von awknx Beitrag anzeigen
              Ich weiß jetzt woran es liegt - er iteriert über die Items falsch:
              Da fragt er z.B. auch Wohnen.Fenster.Garten ab, das ja kein echtes Item ist, sondern nur der Strukturierung dient.
              Hi,

              Deine Aussage finde ich ja Krass, Deine Regel heißt ja

              Code:
              eval_trigger = *.Fenster.*
              Natürlich wird da auch Wohnen.Fenster.Garten ausgewertet, da ist nichts falsch daran, wenn sh.py genau das macht, was Du sagst.

              Gruß, Waldemar

              Kommentar


                #8
                Hallo Waldemar,

                so war das jetzt nicht gemeint - falsch meinte ich in dem Sinne, dass ich das Verhalten so nicht erwartet hätte. Vom rein formalen Coding muss ich dir recht geben, da könnte das Parsing nur anders ablaufen, wenn es einen Marker gibt, der klar macht, was ein Item sein soll und was nur der Strukturierung dienen soll. Ich habe jetzt auf die Platzhalter verzichtet und alle betroffenen Items aufgelistet, damit geht es dann.

                Viele Grüße
                Andi

                Kommentar


                  #9
                  Vergib doch einfach ein Attribut "Fenster" den einzelnen Fenstern die du selektieren willst und selektiere darüber das wäre dann eindeutig.
                  VG
                  Jürgen

                  Kommentar


                    #10
                    Kannst du mir da ein kurzes Beispiel geben?

                    [item]
                    Fenster = blabla


                    eval_trigger = ?

                    Kommentar


                      #11
                      Hi,

                      Beispiel:
                      Code:
                      eval_trigger = *:Fenster
                      Meint: Alle Items, die das Attribut "Fenster" enthalten.

                      Oder etwas expliziter:
                      Code:
                      eval_trigger = *.Fenster.*:Fenster
                      Meint: Alle Items, die Fenster im Pfad haben und das Attribut Fenster enthalten.
                      Der Wert vom Attribut Fenster ist hier egal. Es kommt auf die Existenz an (der von Dir erwähnte Marker)

                      Gruß,
                      Waldemar
                      Zuletzt geändert von bmx; 27.09.2016, 14:04.

                      Kommentar


                        #12
                        Verstanden - merci :-))

                        Kommentar

                        Lädt...
                        X