Ankündigung

Einklappen
Keine Ankündigung bisher.

Verständnisproblem mit eval und eval_trigger

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

    Verständnisproblem mit eval und eval_trigger

    Hallo zusammen,

    ich habe vermutlich ein ganz banales Verständnisproblem mit eval und eval_trigger, mir fällt aber irgendwie keine korrekte Vorgehensweise ein.
    Ich würde gerne mein Nacht_Tag item entweder über den Bus manuell oder automatisch über env.location.day, aber nur bei Übergang von Tag auf Nacht setzen.
    Hierzu müsste ich wohl im Item den Trigger abfangen, um zu entscheiden ob das item über Eval getriggert wurde, oder ein manueller Eingriff erfolgt ist.

    Ich gehe in dem Fall davon aus, dass die Property last_update_by schon vor Ausführung von eval aktuallisiert ist und ein Trigger über eval_trigger erst dann erfolgt, wenn der neue Wert des Caller Items schon geschrieben ist. Mit dem eval Syntax Prüfer komme ich an der Stelle nicht weiter. Der sagt name 'value' is not defined.

    Stimmen meine Annahmen? Was mache ich falsch?

    Code:
    Status:
      Nacht_Tag:
        type: bool
        visu_acl: rw
        knx_dpt: 1
        knx_send: 0/2/10
        knx_cache: 0/2/10
        knx_listen: 0/2/11
        cache: 'True'
        eval: value if not sh..self.property.last_update_by == "EVAL:env.location.day" else 0 if not sh.env.location.day() else None
        eval_trigger: env.location.day
    Danke für die Hilfe. Grüße Thomas

    #2
    Hi,

    ich bin mir beim yaml immer nicht ganz sicher, aber ich würde den ganzen eval-Ausdruck in Hochkommata (') setzen, der Ausdruck an sich sieht nämlich gut aus. Deswegen vermute ich, dass es die yaml-Syntax ist.

    Aber Du hast noch ein logisches Problem im Ausdruck, oder? Wenn Dein Item auf 0 gesetzt wurde durch "not day()" und Du dann manuell (über GA) auf 1 setzen willst, passiert folgendes:
    • value = 1
    • updated_by steht auf ...day(), wird also übersprungen
    • day() ist immer noch 0 (Nacht), damit wird die 0 hinter dem ersten else genommen.
    => Nachts kannst Du nicht manuell auf Tag schalten.

    Ich arbeite in solchen Fällen immer mit Hilfsitems. Von der Idee her:

    Code:
    Status:
        Nacht_Tag:
            <hier Dein bisheriges Item bis auf>
            eval: value
            eval_trigger: .NachtTagHelper
            NachtTagHelper:
                type: bool
                enforce_updates: true
                eval_trigger: env.location.day
                eval: 0 if not sh.env.location.day() else none
    Jetzt kann Dein Hauptitem normal manuelle Bedienung und das Automatisierungsitem schaltet zusätzlich, ohne die manuelle Funktion zu behindern.

    Gruß, Waldemar


    Kommentar


      #3
      Hi Waldemar,

      die Hochkommata helfen nicht. Mit dem Logikfehler hast du natürlich recht.

      Helfer Item funktioniert so perferkt. Hinweis: None muss groß sei, sonst kommt ein Fehler.

      Was mich mal so ganz grundsätzlich noch interessieren würde - Wo ist für dich der Punkt erreicht an dem du von Helfer Items auf eine Logik wechselst?

      Kommentar


        #4
        Zitat von firefox Beitrag anzeigen
        Hinweis: None muss groß sei, sonst kommt ein Fehler.
        Sorry, hatte das einfach so runter getippt, nicht ausprobiert. Syntaxfehler sind immer inclusive

        Zitat von firefox Beitrag anzeigen
        Wo ist für dich der Punkt erreicht an dem du von Helfer Items auf eine Logik wechselst?
        Ich persönlich versuche die meisten Sachen über Items/Hilfsitems zu lösen. Logiken nutze ich immer, wenn ich auf externe (nicht-KNX) Daten zugreifen will. Oder wenn ich generisch irgendwelche Funktionen lösen will (ich hab z.B. eine Logik, die bei einem gesetzten knx_send0-Attribut immer nur 0 beim Item weiterleitet, aber keine 1), also bei komplexeren Aufgaben.

        Das macht aber jeder anders. Manche sagen, eine Logik ist übersichtlicher, andere finden Items klarer. Mach das, was Dir besser liegt.

        Viele Grüße,
        Waldemar

        Kommentar


          #5
          Logiken kannst Du während der Laufzeit ändern und neu laden ohne SmartHomeNG neu starten zu müssen, wenn Du Items änderst, mußt Du durchstarten.
          Mit dem executor Plugin kannst Du einiges an Logikcode ausprobieren ohne eine Logik zu starten oder zu ändern.

          Kommentar

          Lädt...
          X