Ankündigung

Einklappen
Keine Ankündigung bisher.

Item Verriegelung

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

    Item Verriegelung

    Kann mir jemand mal erklären, warum das hier so nicht so funktioniert wie ich es mir vorstelle?!
    Ich würde gerne mehrere Items gegeneinander verriegeln, d.h. ich setze 1 davon auf 1 , dann sollen die anderen auf 0 gehen, und das beliebig.
    Wollte damit die Hausstatus Items setzen.
    Code:
    [zustand]
    [[anwesend]]
    type = bool
    cycle = 600 = 1
    eval = or
    eval_trigger = anwesend.manuel | anwesend.kristin | anwesend.tablet | anwesend.smarttv | anwesend.licht_eg | anwesend.licht_og
    [[abwesend]]
    type = bool
    visu = yes
    visu_acl = rw
    eval = 0 if sh.zustand.anwesend() or sh.zustand.party() or sh.zustand.urlaub() or sh.zustand.putzen() or sh.zustand.nacht() else 1
    eval_trigger = zustand.anwesend | zustand.party | zustand.urlaub | zustand.putzen | zustand.nacht
    [[party]]
    type = bool
    visu = yes
    visu_acl = rw
    eval = 0 if sh.zustand.anwesend() or sh.zustand.abwesend() or sh.zustand.urlaub() or sh.zustand.putzen() or sh.zustand.nacht() else 1
    eval_trigger = zustand.anwesend | zustand.abwesend | zustand.urlaub | zustand.putzen | zustand.nacht
    .....
    Kann man es vielleicht einfach machen?

    #2
    Hi,

    so habe ich auch angefangen, es aber mittlerweile mit einer Statemachine (autoblind plugin) gelöst:
    https://knx-user-forum.de/forum/supp...04#post1012604

    Kommentar


      #3
      Ja wusdte das es sowas gibt, allerdings erscheint mir das etwas oversized fuer meine zwecke

      Kommentar


        #4
        Hi,

        ich könnte mir vorstelllen, dass hier schon mal ein Fehler ist

        Code:
        [zustand]
        [[anwesend]]
        type = bool
        cycle = 600 = 1
        Denn es macht doch keinen Sinn, die Anwesenheit alle 10 Minuten auf True zu setzen. Vielleicht besser:
        Code:
        cycle = 600 = 0
        Aber ich finde es auch kompliziert, weil da ein Item immer gleich das andere triggert. Ich habe eine Logik. In dem Moment, wo eine Anwesenheit erfasst wird (Präsenzmelder oder was auch immer), wird die Anwesenheit auf True gesetzt und ein Timer aktiviert, der das nach einer gewissen Zeit wieder revidiert.

        Kommentar


          #5
          du hast recht,

          werds mal ohne probieren , ich weiss auch grad nicht wie ich auf sowas komme

          Kommentar


            #6
            Ne, also in meiner Überlegung scheint etwas nicht zu stimmen.
            Hab die Zustände mit Buttons verknüpft, wenn ich einen drücke und das item auf true setze, sollte es normalerweise due anderen auf false setzen , macht er aber nicht

            Kommentar


              #7
              Ich habe es jetzt mal bei mir nachgestellt.

              Wenn [anwesend] == true gesetzt wird, dann kann kein anderer Zustand auf true geschaltet werden bzw. wird durch das eval sofort wieder auf false gesetzt. Das entspricht ja auch der If-Bedingung im Eval der anderen Items.

              Wenn [anwesend] == false gesetzt wird, dann wird das erste der anderen Items (bei mir [abwesend]) auf true gesetzt. Auch das entspricht der If-Bedingung in diesem Item. Will man jetzt [abwesend] wieder auf false setzen, funktioniert das nicht, denn es ist im Prinzip diesselbe Situation wie beim vorherigen Umschalten von [anwesend] == false: Alle Items sind false und damit wird wieder [abwesend] auf true gesetzt.

              Ist [abwesend] == true und man versucht, [party] == true zusetzen, setzt sich [party] wieder auf false, da ja [abwesend] == true ist.

              Ich glaube, eval wird nicht nur nach einem Trigger aufgerufen, sondern auch im Item selber, wenn es einen neuen Wert erhält. Somit kann das nicht funktionieren.

              Ich würde dir nach wie vor zu einer einfachen Logik raten. Die macht alles genau dann, wann Du es willst und so, wie Du es willst. Dieses Konstrukt hier ist doch echt sehr komplex.

              Grüße

              Kommentar


                #8
                hier noch ein Vorschlag für eine Logik, ist aber ungetestet:

                Code:
                if (trigger['source'] == 'zustand.anwesend' and sh.zustand.anwesend() == True):
                       sh.zustand.abwesend(0)
                       sh.zustand.party(0)
                       ...
                       exit()
                
                if (trigger['source'] == 'zustand.party' and sh.zustand.party() == True):
                       sh.zustand.anwesend(0)
                       sh.zustand.abwesend(0)
                       ...
                       exit()
                ...

                Kommentar


                  #9
                  wie würde ich dann in deinem beispiel die items mit der logic verknüpfen?

                  Kommentar


                    #10
                    Die Items definierst Du wie bisher unter /usr/local/smarthome/items/ in einer .conf-Datei, nur ohne eval und ohne eval-trigger.

                    Die Logik schreibst Du in eine Datei beliebigen Namens mit der Endung .py, also von mir aus anwesenheit.py und legst sie unter
                    /usr/local/smarthome/logics/ ab.

                    Dann verweist Du unter
                    /usr/local/smarthome/etc/logic.conf auf diese Datei. Hier kannst Du auch ein oder mehrere watch_item als Trigger definieren, also das, was bisher unter eval_trigger stand. Siehe auch das Wiki

                    https://github.com/smarthomeNG/smarthome/wiki/Logic


                    Jedes mal, wenn ein unter watch_item definiertes Item einen neuen Wert erhält, wird die Logic (die .py-Datei) dann aufgerufen. Soll die Logik auch aufgerufen werden, wenn dem Item derselbe Wert erneut zugewiesen wird, musst Du im Item enforce_updates = yes definieren.
                    Zuletzt geändert von arnix; 09.05.2017, 21:36.

                    Kommentar

                    Lädt...
                    X