Ankündigung

Einklappen
Keine Ankündigung bisher.

AutoBlind-Plugin-Special: Tipps und Tricks

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

    AutoBlind-Plugin-Special: Tipps und Tricks

    Hi,

    angeregt durch diesen Beitrag im Beschattungsthread wollte ich mal mit einem "How I did it" beginnen...

    Das Beispiel soll zeigen, wie man einen State-Shifter realisiert, also z.B. mit einem Schalter durch 4 Lampen durchschaltet, wobei bei jedem click die nächste Lampe an geht. Konzeptionell zeigt das, wie man von einem Zustand in den nächsten wechseln kann und die Zustände werden durch eine 1 auf einem "ToggleState"-Item weitergeschaltet.
    Grundidee: Bei einer 1 auf "NextState" wird im Autoblind ein State angesprungen, der einen Zustandsübergang repräsentiert. Dieser setzt einen "ShifterState" auf den nächsten Zustand und "NextState" wieder auf 0. Diese 0 führt dazu, das der nächste Zustand eigentlich angesprungen wird und all die set_* ausführt, die eigentlich geschaltet werden sollen.

    Hoffe, es hilft jemandem,
    Gruß, Waldemar

    Code:
            [Test]
                [[Decke]]
                    #wird vom Shifter geschaltet
                [[Spuele]]
                    #wird vom Shifter geschaltet
                [[Innen]]
                    #wird vom Shifter geschaltet
                [[Aussen]]
                    #wird vom Shifter geschaltet
                [[NextState]]
                    name = Input für Shifter, bei 1 geht es zum nächsten State
                    type = bool
                    visu_acl = rw
                    knx_dpt = 1
                    knx_cache = 5/0/27
                    knx_send = 5/0/27
                [[AutoBlind]]
                    [[[State]]]
                        [[[[ShifterState]]]]
                            type = num
                            name = Speichert den Shifter-State
                            cache = True
                        [[[[active]]]]
                            type = bool
                            value = True
                        [[[[stateId]]]]
                            type = str
                            cache = True
                            visu_acl = ro
                        [[[[stateName]]]]
                            type = str
                            cache = True
                            visu_acl = ro
                    [[[Rules]]]
                        autoblind_plugin = active
                        item_active = Test.AutoBlind.State.active
                        item_state_id = Test.AutoBlind.State.stateId
                        item_state_name = Test.AutoBlind.State.stateName
                        type = bool
                        item_State = Test.AutoBlind.State.ShifterState
                        item_Next = Test.NextState
                        item_Decke = Test.Decke
                        item_Aussen = Test.Aussen
                        item_Innen = Test.Innen
                        item_Spuele = Test.Spuele
                        eval_trigger = Test.NextState
                        [[[[Aus]]]]
                            name = Ausgeschaltet
                            type = foo
                            set_Decke = value:0
                            set_Aussen = value:0
                            set_Innen = value:0
                            set_Spuele = value:0
                            [[[[[enter]]]]]
                                value_State = 0
                                value_NextState = False
                        [[[[AusSpuele]]]]
                            name = Übergang Ausgeschaltet->Spuele
                            type = foo
                            set_NextState = value:0
                            set_State = value:1
                            [[[[[enter]]]]]
                                value_State = 0
                                value_NextState = True
                        [[[[Spuele]]]]
                            name = Spuele
                            type = foo
                            set_Decke = value:0
                            set_Aussen = value:0
                            set_Innen = value:0
                            set_Spuele = value:1
                            [[[[[enter]]]]]
                                value_State = 1
                                value_NextState = False
                        [[[[SpueleAussen]]]]
                            name = Übergang Spuele->Aussen
                            type = foo
                            set_NextState = value:0
                            set_State = value:2
                            [[[[[enter]]]]]
                                value_State = 1
                                value_NextState = True
                        [[[[Aussen]]]]
                            name = Aussen
                            type = foo
                            set_Decke = value:0
                            set_Aussen = value:1
                            set_Innen = value:0
                            set_Spuele = value:0
                            [[[[[enter]]]]]
                                value_State = 2
                                value_NextState = False
                        [[[[AussenInnen]]]]
                            name = Übergang Aussen->Innen
                            type = foo
                            set_NextState = value:0
                            set_State = value:3
                            [[[[[enter]]]]]
                                value_State = 2
                                value_NextState = True
                        [[[[Innen]]]]
                            name = Innen
                            type = foo
                            set_Decke = value:0
                            set_Aussen = value:0
                            set_Innen = value:1
                            set_Spuele = value:0
                            [[[[[enter]]]]]
                                value_State = 3
                                value_NextState = False
                        [[[[InnenDecke]]]]
                            name = Übergang Innen->Decke
                            type = foo
                            set_NextState = value:0
                            set_State = value:4
                            [[[[[enter]]]]]
                                value_State = 3
                                value_NextState = True
                        [[[[Decke]]]]
                            name = Decke
                            type = foo
                            set_Decke = value:1
                            set_Aussen = value:0
                            set_Innen = value:0
                            set_Spuele = value:0
                            [[[[[enter]]]]]
                                value_State = 4
                                value_NextState = False
                        [[[[DeckeAus]]]]
                            name = Übergang Decke->Ausgeschaltet
                            type = foo
                            set_NextState = value:0
                            set_State = value:0
                            [[[[[enter]]]]]
                                value_State = 4
                                value_NextState = True
    OpenKNX www.openknx.de

    #2
    cool sowas brauche ich zur Senderdurchschaltung für meine Squeezbox! Die kann ich jetzt dann mit 4 Tasten bedienen Lauter, Leiser, Ein und aus, und den Stationstasten.

    Kommentar


      #3
      Hi zusammen,

      mit dem aktuellen Stand des Plugins das geht noch ein wenig einfacher. Ein Trick dabei ist, ein Item gleichzeitig als Bedingung zu verwenden und aber auch je nach Status den Wert zu verändern:

      Code:
      [astest]
          [[state]]
              type = num
              value = 0
              # evtl. cachen
          
          [[plugin]]
              type = bool
              as_plugin = active
              as_item_state = astest.state
              [[[state_0]]]
                  as_set_state = value:1
                  # Weitere Aktionen in Zustand 0
                  [[[[enter]]]]
                      as_value_state = 0
              [[[state_1]]]
                  as_set_state = value:2
                  # Weitere Aktionen in Zustand 1
                  [[[[enter]]]]
                      as_value_state = 1            
              [[[state_2]]]
                  as_set_state = value:3
                  # Weitere Aktionen in Zustand 2
                  [[[[enter]]]]
                      as_value_state = 2            
              [[[state_3]]]
                  as_set_state = value:0
                  # Weitere Aktionen in Zustand 3
                  [[[[enter]]]]
                      as_value_state = 3
      Hier wird je nach Wert von "astest.state" ein entsprechender Zustand angesteuert. Als Aktion in diesem Zustand wird "astest.state" erhöht (bzw. beim letzten Zustand zurückgesetzt). In jedem Zustand können dann beliebige weitere Aktionen aufgenommen werden.
      Der Zustandsübergang wird jeweils durch das Senden eines Werts an "astest.plugin" ausgelöst.

      Grüße
      offline

      Kommentar


        #4
        Ich steuere mit dem Plugin jetzt auch die Raffstoren beim Fernsehen. Immer wenn der TV angeht und draussen eine gewissen Helligkeit herrscht, dann wird der eine Raffstore zu 80% runter gefahren, so dass die Sonne nicht mehr blendet.

        Damit kann man dann die Lüftung auch schön steuern, wenn zB der Dunstabzug länger als x min an ist wird der Boost-Modus der Lüftung angestellt...

        Finde das Plugin echt klasse!

        Hier mal meine TV Konfig:

        Code:
                        [[[[[autostate]]]]]
                            type = bool#
                            name = Autostatus Fernseher
                            eval_trigger = EG.wohnzimmer.steckdose.tv.strommessung
                            cycle = 60
                            as_plugin = active
                            as_lock_item = EG.wohnzimmer.steckdose.tv.auto_lock
                            as_suspend_item = EG.wohnzimmer.steckdose.tv.auto_suspend
                            as_suspend_time = 7200
                            as_suspend_watch =
                            as_laststate_item_id = EG.wohnzimmer.steckdose.tv.auto_laststate_id
                            as_laststate_item_name = EG.wohnzimmer.steckdose.tv.auto_laststate_name
                                
                            as_item_brightness = Raffstore.helligkeit
                            as_item_consumption = EG.wohnzimmer.steckdose.tv.strommessung
                            as_item_raffstore_height = EG.wohnzimmer.raffstore.schiebetuer_links.height
                            as_item_raffstore_height_value = EG.wohnzimmer.raffstore.schiebetuer_links.height_value
                            as_item_raffstore_lamella = EG.wohnzimmer.raffstore.schiebetuer_links.lamella
                            as_item_lock_raffstore = EG.wohnzimmer.raffstore.schiebetuer_links.auto_lock
                            [[[[[[tagsueber]]]]]]
                                name = TV tagsüber
                                as_set_lock_raffstore = true
                                as_set_raffstore_height = 80
                                as_set_raffstore_lamella = 80
                                [[[[[[[enter]]]]]]]
                                    as_min_brightness = 20000
                                    as_min_consumption = 50
                                    as_max_raffstore_height_value = 60
                                [[[[[[[leave]]]]]]]
                                    as_min_delay = 3600
                            [[[[[[aus]]]]]]
                                name = TV aus
                                as_set_lock_raffstore = false
                                [[[[[[[enter]]]]]]]
                                    as_max_consumption = 50
        Zuletzt geändert von hhhc; 26.07.2015, 12:51.
        ++ Der ultimative ETS Schnellkurs ++
        KNX und die ETS vom Profi lernen
        www.ets-schnellkurs.de

        Kommentar


          #5
          Hallo zusammen...
          ich möchte gerne mit dem AutoBlind-Plugin eine Pumpe schalten.
          Sie soll beim Überschreiten einer Temperatur einschalten und wenn wieder aus wenn eine gewisse Temperatur unterschritten wird.
          Ausserdem soll sie wenn die Pumpe 14 Tage nicht gelaufen ist kurz - 15 Sekunden - einschalten um ein festwerden zu verhinden.
          Hier mein Code:
          HTML-Code:
          [[[[umwaelzpumpe]]]]
                          name = Umwälzpumpe
                          type = bool
                          as_plugin = active
                          cycle = 86400
                          eval_trigger = EG.wohnen.umwaelzpumpe.an
                          as_laststate_item_id = EG.wohnen.umwaelzpumpe.auto_laststate_id
                          as_laststate_item_name = EG.wohnen.umwaelzpumpe.auto_laststate_name        
                          as_item_umwaelzpumpe_an = EG.wohnen.umwaelzpumpe.an
                          as_item_temperature = EG.wohnen.temperatur
                          [[[[[temperatur_erreicht]]]]]
                              as_set_umwaelzpumpe_an = 1
                              [[[[[[enter]]]]]]
                                  as_min_temperature = 75
                              [[[[[[leave]]]]]]
                                  as_max_temperature = 65
                 
                          [[[[[fest_werden_verhindern]]]]]
                              as_set_umwaelzpumpe_an = 1
                              [[[[[[enter]]]]]]
                                  as_agemin_umwaelzpumpe_an = 86400 * 14
                              [[[[[[leave]]]]]]
                                  as_agemin_umwaelzpumpe_an = 15
          
                          [[[[[auto_laststate_id]]]]]
                              type = str
                              visu_acl = r
                              cache = on
                          [[[[[auto_laststate_name]]]]]
                              type = str
                              visu_acl = r
                              cache = on
                          [[[[[an]]]]]
                              type = bool
                              knx_dpt = 1
                              knx_send = 6/1/1
                              knx_init = 6/0/1
                              visu_acl = rw
                              enforce_updates = on
          Kann mal bitte jemand drüber sehen ob dies so funktionieren kann?

          Danke schonmal
          cu Yfkt5A
          DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
          microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

          Kommentar


            #6
            Zitat von nEiMi Beitrag anzeigen
            eval_trigger = EG.wohnen.umwaelzpumpe.an
            Hi,

            ich würde nicht über das triggern, was ich schalte - das könnte zu loops führen. Ansonsten solltest Du Deine Pumpe auch mal abschalten.
            Deinen Status 'temperatur_erreicht' verstehe ich nicht:
            Die Pumpe springt an, wenn die Temp > 75 grad ist? Wohl eher wenn sie < 65 ist, oder? Ich weiß ja nicht, was die Pumpe machen soll... wirklich kühlen?

            Vielleicht schreibst Du nochmal, was Du erreichen willst, dann kann man eher sagen, ob das mit den Zuständen hinkommen kann.

            Gruß, Waldemar
            OpenKNX www.openknx.de

            Kommentar


              #7
              Erstmal danke für deine umgehende Antwort Waldemar...

              Es ist die Umwälzpumpe der Wassertasche meines Kaminofens, sie befördert das warme Wasser in den Pufferspeicher.
              Sie soll:
              -Einschalten wenn Temperatur >75°C
              -Ausschalten wenn Temperatur <65°C
              -alle ~14 Tage kurz -15s- mal anlaufen damit sie nicht fest wird(ist mir über den Sommer schonmal vorgekommen)

              Hier nun meine überarbeitete Version nach deinen Hinweisen:
              Code:
              [EG]
                  [[wohnen]]
                      [[[kaminofen]]]
                          [[[[umwaelzpumpe]]]]
                              name = Kaminofen Umwälzpumpe
                              type = bool
                              as_plugin = active
                              cycle = 86400
                              eval_trigger = [COLOR=#800000][B]EG.wohnen.temperatur.wassertasche[/B][/COLOR]
                              as_laststate_item_id = EG.wohnen.kaminofen.umwaelzpumpe.auto_laststate_id
                              as_laststate_item_name = EG.wohnen.kaminofen.umwaelzpumpe.auto_laststate_name        
                              as_item_umwaelzpumpe_an = EG.wohnen.kaminofen.umwaelzpumpe.an
                              as_item_temperature = EG.wohnen.temperatur.wassertasche
                              [[[[[temperatur_erreicht]]]]]
                                  name = "Wassertasche Temperatur erreicht"
                                  as_set_umwaelzpumpe_an = 1
                                  [[[[[[enter]]]]]]
                                      as_min_temperature = 75
                                  [[[[[[leave]]]]]]
                                      as_max_temperature = 65
                     
                              [[[[[fest_werden_verhindern]]]]]
                                  name = "Bewegungsfahrt Umwälzpumpe Kaminofen"
                                  as_set_umwaelzpumpe_an = 1
                                  [[[[[[enter]]]]]]
                                      as_agemin_umwaelzpumpe_an = 86400 * 14
                                  [[[[[[leave]]]]]]
                                      as_agemin_umwaelzpumpe_an = 15
                              [COLOR=#800000][B][[[[[aus]]]]]
                                  name = "Umwälzpumpe Kaminofen aus"
                                  as_set_umwaelzpumpe_an = 0[/B][/COLOR]
                              
              
                              [[[[[auto_laststate_id]]]]]
                                  type = str
                                  visu_acl = r
                                  cache = on
                              [[[[[auto_laststate_name]]]]]
                                  type = str
                                  visu_acl = r
                                  cache = on
                              [[[[[an]]]]]
                                  type = bool
                                  knx_dpt = 1
                                  knx_send = 6/1/1
                                  knx_init = 6/0/1
                                  visu_acl = rw
                                  enforce_updates = on
              cu Yfkt5A
              DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
              microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

              Kommentar


                #8
                Hi,

                sieht schon besser aus...

                Du musst die 86400 * 14 ausrechnen (autoblind kann zwar eine eval-syntax, aber nicht bei den conditions).
                Ansonsten sollte es gehen, soweit ich das sehen kann.

                Gruß, Waldemar

                OpenKNX www.openknx.de

                Kommentar


                  #9
                  Zitat von mumpf Beitrag anzeigen
                  Du musst die 86400 * 14 ausrechnen (autoblind kann zwar eine eval-syntax, aber nicht bei den conditions).
                  ... könnte man aber einbauen ...

                  Grüße
                  offline

                  Kommentar


                    #10
                    offline - das wäre super... würde ich mir nämlich zB für eine Hysterese wünschen. Enter-Condition wird über ein Item in der Visu definiert. Leave-condition soll dann zB 2 Grad weniger oder 5000 Lux weniger oder was auch immer sein. Wenn das wie viel weniger auch noch über ein Item definiert werden könnte, wäre das natürlich noch nobler

                    Kommentar


                      #11
                      Zitat von Onkelandy Beitrag anzeigen
                      offline - das wäre super... [...] Wenn das wie viel weniger auch noch über ein Item definiert werden könnte, wäre das natürlich noch nobler
                      Mal schauen, wie das Wetter morgen ist

                      Grüße
                      offline

                      Kommentar


                        #12
                        Hi zusammen!

                        Möchte hier auch noch einen kleinen Beitrag zum Thema "Tipps und Tricks" leisten.. Und zwar hab ich in Anlehnung an den multistate Button, den es in der SmartVISU 2.8 gibt, eine Art multistate.icon gebastelt.

                        Ziel ist jedenfalls, in der Visu immer den aktuellen Status der Jalousie zu sehen. Zusätzlich wollte ich mit einem Klick auf das Icon das Objekt sperren können - geht so also "alles in einem" und ist recht übersichtlich wie ich finde. In punkto Performance bin ich sehr zufrieden, ist mit den Icons/Buttons kaum langsamer als ohne.

                        So sieht es mit dem Quad Design aus. Screen Ost ist offensichtlich gesperrt, Screen Süd ist im Suspend Mode, da manuell betätigt, Screen West ist im normalen Autoblind-Mode. Je nach aktivem Status würde sich das AUTO-Icon aber noch ändern, zB in Sonne, Morgen, Abend, Nacht, etc. :

                        autoblind_multistate.JPG

                        Hier der Code:
                        Folgender Eintrag basiert auf dem Quad Design und muss für andere Designs entsprechend adaptiert werden. Ist bei mir widget_list.html.
                        Wichtig ist va. in der visu.autoblind-Liste die Namen zu ändern, diese entsprechen den Namen der Stati in Autoblind. Icon natürlich auch entsprechend anpassen
                        Code:
                        {% macro blind(id, txt, gad_move, gad_stop, gad_pos, gad_shift, gad_angle, auto, plot, gad_uzsu, min, max, step, mode) %}
                            {% import "basic.html" as basic %}
                            {% import "icon.html" as icon %}
                            {% import "widget_visu.html" as visu %}
                            {% import "widget_popup.html" as popup %}
                            <li data-icon="false">
                            <div class="nw_table">
                                <div class="text">{{ txt|e }}<!--, {{ basic.value(id~'_state0', auto~'.autostate_name') }} //--> </div>
                                <div class="no_border">
                                    <div class="nw_table">
                                        [... BLABLA ...]
                                        <div>
                                            {{ visu.autoblind(id~'_state', auto~'.autostate_name', auto~'.autostate_lock', [icon1~'fts_shutter_manual.png', icon1~'secur_locked.png', icon1~'scene_cinema.png', icon0~'fts_shutter_auto.png', icon0~'weather_sun.png', icon0~'weather_sunset.png', icon0~'weather_sunrise.png', icon0~'weather_moonset.png', icon0~'scene_x-mas.png', icon0~'fts_shutter_automatic.png', icon0~'scene_sleeping.png', icon1~'weather_wind.png'], ['Ausgesetzt', 'Gesperrt', 'Kino', 'Tag (statisch)', 'Sonnenstand', 'Abend', 'Morgen', 'Nacht', 'Nacht (Advent)', 'Hinaufgefahren', 'Schlafen', 'Wind']) }}    
                                        </div>
                                        [... BLABLA ...]
                                    </div>
                                </div>
                        
                            </div>
                            </li>
                        {% endmacro %}
                        In die widget_visu.html kommt dann das hier:
                        Code:
                        {% macro autoblind(id, gad, lock, icon, val, type)%}
                            <a id="{{ uid(page, id) }}" data-widget="visu.autoblind" data-item="{{ gad }}" lock-item="{{ lock }}"
                                data-vals="{{ implode(val) }}"  data-img="{{ implode(icon|deficon) }}" data-val-on="1" data-val-off="0" 
                                class="symbol" data-role="symbol" data-inline="true" data-iconpos="center" data-mode="{{ mode|default('or') }}" >
                                
                                <img class="icon" src="{{ icon[0]|deficon('control_on_off.svg') }}"/>
                            </a>
                        
                        {% endmacro %}
                        Damit das mit dem Button zum direkten Sperren funktioniert braucht es noch eine Änderung im widget.js bzw. besser visu.js im eigenen Designverzeichnis:
                        Code:
                        // ----- visu.autoblind ------------------------------------------------------
                        $(document).delegate('a[data-widget="visu.autoblind"]', {
                            'update': function (event, response) {
                                // get list of values and images
                                list_val = $(this).attr('data-vals').explode();
                                list_img = $(this).attr('data-img').explode();
                        
                                // get the index of the value received
                                idx = list_val.indexOf(response.toString());
                        
                                // update the image
                                $('#' + this.id + ' img').attr('src', list_img[idx]);
                                
                                $('#' + this.id).show();
                        
                                // memorise the index for next use
                                $(this).val(idx);
                            },
                        
                            'click': function (event, response) {
                                // console.log('Click');
                                // console.log(list_val[idx]);
                                // 'Ausgesetzt' habe ich als suspend-Name definiert. Die Idee dieser Abfrage war, dass ich aus dem Suspend Modus immer sofort direkt wieder in den Auto-Modus komme und nicht zuerst in den Lock-Modus. Prinzipiell könnte man hier noch andere Namen mit einem " || " hinzufügen, bei denen dann immer sofort in den Auto-Modus geschaltet wird. Möchte man von Suspend zuerst auf Lock und dann erst auf Auto stellen, kann man diese Bedingungsabfrage auch raus löschen.
                                if ((list_val[idx] == 'Ausgesetzt'))){
                                  io.write($(this).attr('lock-item'), $(this).attr('data-val-off'));
                                }
                                else {
                                  io.write($(this).attr('lock-item'), ($(this).val() == $(this).attr('data-val-on') ? $(this).attr('data-val-off') : $(this).attr('data-val-on')) );
                                }
                            }
                        });
                        Und hier noch das Einbinden in das jalousie.html File - auch anzupassen bei anderem Design:
                        Code:
                            {{ list.blind('osten_s1', 'Screen Ost', 'osten.s1.lz', 'osten.s1.kz', 'osten.s1.hoehe', 'osten.s1.kz', '', 'osten.s1', '', 'osten.s1.hoehe.zeitschalter', 0, 100) }}
                        Ist alles ein ziemlicher Hack, bin nicht so der Programmiermeister - vielleicht könnte man noch was optimieren.. bin um Hinweise froh

                        Kommentar


                          #13
                          Es ist Computerwetter ...

                          Ich habe ein eval für as_min_(Bedingung), as_max_(Bedingung) und as_value_(Bedingung) eingebaut und in den Zweig "feature-condition-eval" gepusht. Für die drei genannten Attribute kann man nun den Wert "eval: (Formel)" angeben. In Post #7 müsste es dementsprechend dann heißen
                          Code:
                          as_agemin_umwaelzpumpe_an = eval: 86400 * 14
                          Grüße
                          offline

                          Kommentar


                            #14
                            Thx! Und geht das auch mit nem Item, also "eval: autoblind.settings.wert * 2" ?

                            Kommentar


                              #15
                              Ohne es ausprobiert zu haben würde ich tippen, dass es mit
                              Code:
                                sh.itemname() * 2
                              geht, eben wie beim normalen eval. Gruß Waldemar
                              OpenKNX www.openknx.de

                              Kommentar

                              Lädt...
                              X