Ankündigung

Einklappen
Keine Ankündigung bisher.

Statusanzeige im Multitrigger

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

    Statusanzeige im Multitrigger

    Hallo zusammen,

    ich nutze derzeit den Multitrigger u.a. für das Setzen von Betriebsstati, d.h., es kann immer nur ein Status aktiv sein.
    Der Multitrigger sendet die Information beim Klicken auch brav auf den Bus, ich würde sie aber nun auch gerne anzeigen. Ist es möglich, dass der Multitrigger den aktuell gewählten Zustand anzeigt, dann hätte ich vermutlich falsch konfiguriert?
    Oder kann der Multitrigger nur die Information auf den Bus senden; er heißt ja schließlich Trigger und nicht Switch...

    Danke für die Erleuchtung

    Schöne Grüße
    Christian

    #2
    Das geht gegenwärtig nicht, hätte ich aber auch gerne. Machst Du einen Feature-Request?

    Gruss,

    der Jan
    KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

    Kommentar


      #3
      Das ist nicht die Aufgabe vom Multitrigger.
      Der ist gedacht als Abrufmöglichkeit von Szenen. Und da sendest Du zwar mal die Nummer die Du möchtest, aber der Zustand der Szene kann ja schnell und ohne Kenntnis verändert werden (z.B. wenn eines der Lichter nun auf einen anderen Wert gesetzt wird).
      => Fire&Forget, einen Zustand gibt es nicht.

      Das was Du willst würde jetzt per infotrigger gehen, oder eben einen Multiswitch brauchen (den es aber noch nicht gibt).
      (Alternativ: Multitrigger in Verbindung mit einem Info als Kompromiss)

      Hier sei nochmal jeder dazu eingeladen einen Multiswitch zu schreiben, den kann man wunderbar bei sich in structure_cutom.js entwickeln und auch behalten, bis er im SVN ist und bei einem späteren Release ausgerollt wird
      TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

      Kommentar


        #4
        Jan, Chris,

        danke für die Aufklärung, das hatte ich ja bereits vermutet. Ich schaue mir am Wochenende mal die Widgets an, vielleicht schaffe ich ja auf Basis des Multitriggers ein Multiswitch zu basteln. Ich bin allerdings, was JavaScript angeht, naja... blutigster Anfägner

        Schöne Grüße
        Christian

        Kommentar


          #5
          Widget läuft

          So,
          auf Basis des Multitriggers habe ich mich mal an dem JS versucht:

          Code:
          VisuDesign_Custom.prototype.addCreator('multiswitch', {
              create: function( page, path ) {
                var $p = $(page);
                var ret_val = $('<div class="widget clearfix switch" />');
                var labelElement = $p.find('label')[0];
                var label = labelElement ? '<div class="label">' + labelElement.textContent + '</div>' : '';
                var address = {};
                $p.find('address').each( function(){ 
                  var src = this.textContent;
                  var transform = this.getAttribute('transform');
                  var readonly  = this.getAttribute('readonly');
                  ga_list.push( src ) 
                  address[ '_' + src ] = [ transform, readonly=='true' ];
                });
                ret_val.append( label );
                var buttons = $('<div style="float:left"/>');
                var buttonCount = 0;
                if( $p.attr('button1label') )
                {
                  //buttonCount++;
                  var actor = '<div class="actor switchUnpressed ';
                  if ( $p.attr( 'align' ) ) 
                    actor += $p.attr( 'align' ); 
                  actor += '">';
                  
                  actor += '<div class="value">' + $p.attr('button1label') + '</div>';
                  actor += '</div>';
                  var $actor = $(actor).data( {
                    'address' : address,
                    'mapping' : $p.attr('mapping'),
                    'styling' : $p.attr('styling'),
                    'value'   : $p.attr('button1value'),
                    'align'   : $p.attr('align'),
                    'type'    : 'switch'
                  } ).bind( 'click', this.action );
                  for( var addr in address ) $actor.bind( addr, this.update );    
                  buttons.append( $actor );
                  if( 1 == (buttonCount++ % 2) ) buttons.append( $('<br/>') );
                }
                if( $p.attr('button2label') )
                {
                  var actor = '<div class="actor switchUnpressed ';
                  if ( $p.attr( 'align' ) ) 
                    actor += $p.attr( 'align' ); 
                  actor += '">';
                  actor += '<div class="value">' + $p.attr('button2label') + '</div>';
                  actor += '</div>';
                  var $actor = $(actor).data( {
                    'address' : address,
                    'mapping' : $p.attr('mapping'),
                    'styling' : $p.attr('styling'),
                    'value'   : $p.attr('button2value'),
                    'type'    : 'switch',
                    'align'   : $p.attr('align')
                  } ).bind( 'click', this.action );
                  for( var addr in address ) $actor.bind( addr, this.update );    
                  buttons.append( $actor );
                  if( 1 == (buttonCount++ % 2) ) buttons.append( $('<br/>') );
                }
                if( $p.attr('button3label') )
                {
                  var actor = '<div class="actor switchUnpressed ';
                  if ( $p.attr( 'align' ) ) 
                    actor += $p.attr( 'align' ); 
                  actor += '">';
                  actor += '<div class="value">' + $p.attr('button3label') + '</div>';
                  actor += '</div>';
                  var $actor = $(actor).data( {
                    'address' : address,
                    'mapping' : $p.attr('mapping'),
                    'styling' : $p.attr('styling'),
                    'value'   : $p.attr('button3value'),
                    'type'    : 'switch'
                  } ).bind( 'click', this.action );
                  for( var addr in address ) $actor.bind( addr, this.update );    
                  buttons.append( $actor );
                  if( 1 == buttonCount++ % 2 ) buttons.append( $('<br/>') );
                }
                if( $p.attr('button4label') )
                {
                  var actor = '<div class="actor switchUnpressed ';
                  if ( $p.attr( 'align' ) ) 
                    actor += $p.attr( 'align' ); 
                  actor += '">';
                  actor += '<div class="value">' + $p.attr('button4label') + '</div>';
                  actor += '</div>';
                  var $actor = $(actor).data( {
                    'address' : address,
                    'mapping' : $p.attr('mapping'),
                    'styling' : $p.attr('styling'),
                    'value'   : $p.attr('button4value'),
                    'type'    : 'switch',
                  } ).bind( 'click', this.action );
                  for( var addr in address ) $actor.bind( addr, this.update );    
                  buttons.append( $actor );
                  if( 1 == buttonCount++ % 2 ) buttons.append( $('<br/>') );
                }
                // for( var addr in address ) $actor.bind( addr, this.update );
                //            ret_val.append( label ).append( $actor );
                return ret_val.append( buttons );
              },
              update: function(e,d) { 
                var element = $(this);
                //var value = defaultUpdate( e, d, element );
                var thisTransform = element.data().address[ e.type ][0];
                var value = transformDecode( element.data().address[ e.type ][0], d );
                element.removeClass( value == element.data().value ? 'switchUnpressed' : 'switchPressed' );
                element.addClass(    value == element.data().value ? 'switchPressed' : 'switchUnpressed' );
              },
              action: function() {
                var data = $(this).data();
                for( var addr in data.address )
                {
                  if( data.address[addr][1] == true ) continue; // skip read only
                  visu.write( addr.substr(1), transformEncode( data.address[addr][0], data.value ) );
                }
              },
              attributes: {
                button1label:      { type: 'string'  , required: false },
                button1value:      { type: 'string'  , required: false },
                button2label:      { type: 'string'  , required: false },
                button2value:      { type: 'string'  , required: false },
                button3label:      { type: 'string'  , required: false },
                button3value:      { type: 'string'  , required: false },
                button4label:      { type: 'string'  , required: false },
                button4value:      { type: 'string'  , required: false },
                mapping:           { type: 'mapping' , required: false },
                styling:           { type: 'styling' , required: false },
                align:             { type: 'string'  , required: false }
              },
              elements: {
                label:             { type: 'string',    required: false, multi: false },
                address:           { type: 'address',   required: true, multi: true }
              },
              content:      false
            });
          Das scheint bei mir erstmal zu funktioniere, ich würde mich aber trotzdem freuen, wenn einer der Experten einen Kommentar abgibt. Die Modifikationen sind eigentlich nur eine Anpassung der update()-Funktion sowie Registrierung der update()-Funktion für jeden (!) der Buttons in der create()-Funktion.

          Um kurz mein Vorgehen für eventuelle Nachahmer zu dokumentieren:
          1. den Multitrigger in structure_pure.js auskommentiert und in structure_custom.js eingefügt
          2. Modifikationen im structure_custom.js gemacht
          3. Widget im structure_custom.js umbenannt, in visu_config.xml entsprechendes Elemt geändert und natürlich auch in visu_config.xsd die sämtliche Abschnitte basierend auf dem Mutitrigger ergänzt

          Schöne Grüße
          Christian

          Kommentar


            #6
            Zitat von chriss1980 Beitrag anzeigen
            Das scheint bei mir erstmal zu funktioniere, ich würde mich aber trotzdem freuen, wenn einer der Experten einen Kommentar abgibt. Die Modifikationen sind eigentlich nur eine Anpassung der update()-Funktion sowie Registrierung der update()-Funktion für jeden (!) der Buttons in der create()-Funktion.
            Sieht soweit ganz gut aus, hätte ich auch so gemacht. Die Frage ist, ob das wirklich als eigenes Widget Sinn macht, oder ob nicht etwas wie showstatus="true/false" als Attribut einfacher wäre, und dann "update" entsprechend angepasst wird. Das würde die "overall"-Codemenge vermutlich reduzieren und auch die Zahl an Widgets nicht ausufern lassen. Die Funktion ist ja doch sehr ähnlich.

            Ich bin allerdings immer noch der Meinung, dass das mit button1, button2, ... irgendwie Müll ist. Ich hatte beim Multitrigger schon vorgeschlagen so etwas wie

            Code:
            <multitrigger>
              <address ..... >.....</address>
              ...
              <button value="x">label1</button>
              <button value="x">label2</button>
              ...
            zu realisieren. das wäre m.E. auch für den JS-Code einfacher. Das einzige was dagegen spricht ist, dass der Editor damit nicht umgehen kann bzw konnte. Geht das jetzt oder kann man dem das einfach beibringen? Julian?
            KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

            Kommentar


              #7
              Zitat von JNK Beitrag anzeigen
              Sieht soweit ganz gut aus, hätte ich auch so gemacht. Die Frage ist, ob das wirklich als eigenes Widget Sinn macht, oder ob nicht etwas wie showstatus="true/false" als Attribut einfacher wäre, und dann "update" entsprechend angepasst wird.
              Ich habe nicht auf den Code geschaut (Pfui!), aber:
              Wenn der Unterschied zum Multitrigger sehr gering ist, dann ist die Lösung per Parameter sicher nicht verkehrt.
              Wenn dagegen das HTML gänzlich anders aufgebaut ist, wäre ich für neues Widget.
              Zitat von JNK Beitrag anzeigen
              Ich bin allerdings immer noch der Meinung, dass das mit button1, button2, ... irgendwie Müll ist.
              Ehrlich? Das Multi<...> ist an sich Müll. (Der Infotrigger auch)
              Es ist nur eine Zwischenlösung bis die Groups ordentlich funktionieren.

              Dann könnte man sich das problemlos aus den Basis-Widgets zusammenbauen. (Gerne auch als Template im Editor, wie bei den Includes schon angedacht).
              TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

              Kommentar


                #8
                Zitat von JNK Beitrag anzeigen
                Die Frage ist, ob das wirklich als eigenes Widget Sinn macht, oder ob nicht etwas wie showstatus="true/false" als Attribut einfacher wäre, und dann "update" entsprechend angepasst wird. Das würde die "overall"-Codemenge vermutlich reduzieren und auch die Zahl an Widgets nicht ausufern lassen. Die Funktion ist ja doch sehr ähnlich.
                Ja, das klingt sinnvoll. Auch daran kann ich mich gerne versuchen und dann einen entsprechenden Diff posten oder in einem Ticket ablegen.

                ABER... wie schaut das an der Stelle mit dem Editor aus? Müsste der auch entsprechend angepasst werden oder versteht der Editor das bei entsprechendem DTD automatisch?

                Kommentar


                  #9
                  Editor: Das sollte eigentlich so gehen.
                  KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

                  Kommentar


                    #10
                    Zitat von JNK Beitrag anzeigen
                    Editor: Das sollte eigentlich so gehen.
                    Tja, zumindest zeigt der Editor mein neues Multiswitch-Widget in der Drop-Down-Auswahl an. Das würde also schonmal funktionieren.
                    Ich habe dann im DTD einfach eine Zeile für das neue Attribut (jetzt im Multitrigger) einfügen wollen:

                    Code:
                    <xsd:complexType name="multitrigger">
                    ...
                        <xsd:attribute name="showstatus" type="xsd:boolean" use="required" />
                    ...
                    </xsd:complexType>
                    Das funktioniert aber leider nicht, d.h. der Editor zeigt kein neues Feld an. Weiter oben im XSD sind die Attribute nochmal separat definiert, auch das dortige hinzufügen hat nicht geholfen.

                    Übersehe ich etwas? Hat jemand Tipps?

                    Danke
                    Christian

                    Kommentar


                      #11
                      Zitat von chriss1980 Beitrag anzeigen
                      ]Das funktioniert aber leider nicht, d.h. der Editor zeigt kein neues Feld an. Weiter oben im XSD sind die Attribute nochmal separat definiert, auch das dortige hinzufügen hat nicht geholfen.
                      Der Editor schaut nicht auf das XSD, das dient nur der Überprüfung der XML-Syntax.

                      Wenn etwas im Editor nicht erscheint, dann muss in der structure_*.js nachgebessert werden.
                      TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

                      Kommentar


                        #12
                        Oh man, das war einfach *vordenkopfschlag*

                        Dann hier meine Änderungsvorschläge/Diffs zum aktuellen Trunk. Wenn genehmigt, committe ich das auch gerne.

                        Code:
                        Index: designs/structure_pure.js
                        ===================================================================
                        --- designs/structure_pure.js   (Revision 566)
                        +++ designs/structure_pure.js   (Arbeitskopie)
                        @@ -406,6 +406,7 @@
                             content:      false
                           });
                        
                        +
                           this.addCreator('toggle', {
                             create: function( page, path ) {
                               var $p = $(page);
                        @@ -505,6 +506,9 @@
                                   'align'   : $p.attr('align'),
                                   'type'    : 'switch'
                                 } ).bind( 'click', this.action );
                        +               if( $p.attr( 'showstatus' ) == 'true' ) {
                        +                       for( var addr in address ) $actor.bind( addr, this.update );
                        +               }
                                 buttons.append( $actor );
                                 if( 1 == (buttonCount++ % 2) ) buttons.append( $('<br/>') );
                               }
                        @@ -524,6 +528,9 @@
                                   'type'    : 'switch',
                                   'align'   : $p.attr('align')
                                 } ).bind( 'click', this.action );
                        +               if( $p.attr( 'showstatus' ) == 'true' ) {
                        +                       for( var addr in address ) $actor.bind( addr, this.update );
                        +               }
                                 buttons.append( $actor );
                                 if( 1 == (buttonCount++ % 2) ) buttons.append( $('<br/>') );
                               }
                        @@ -542,6 +549,9 @@
                                   'value'   : $p.attr('button3value'),
                                   'type'    : 'switch'
                                 } ).bind( 'click', this.action );
                        +               if( $p.attr( 'showstatus' ) == 'true' ) {
                        +                       for( var addr in address ) $actor.bind( addr, this.update );
                        +               }
                                 buttons.append( $actor );
                                 if( 1 == buttonCount++ % 2 ) buttons.append( $('<br/>') );
                               }
                        @@ -560,6 +570,9 @@
                                   'value'   : $p.attr('button4value'),
                                   'type'    : 'switch',
                                 } ).bind( 'click', this.action );
                        +               if( $p.attr( 'showstatus' ) == 'true' ) {
                        +                       for( var addr in address ) $actor.bind( addr, this.update );
                        +               }
                                 buttons.append( $actor );
                                 if( 1 == buttonCount++ % 2 ) buttons.append( $('<br/>') );
                               }
                        @@ -569,9 +582,11 @@
                             },
                             update: function(e,d) {
                               var element = $(this);
                        -      var value = defaultUpdate( e, d, element );
                        -      element.removeClass( value == 0 ? 'switchPressed' : 'switchUnpressed' );
                        -      element.addClass(    value == 0 ? 'switchUnpressed' : 'switchPressed' );
                        +      //var value = defaultUpdate( e, d, element );
                        +         var thisTransform = element.data().address[ e.type ][0];
                        +         var value = transformDecode( element.data().address[ e.type ][0], d );
                        +      element.removeClass( value == element.data().value ? 'switchUnpressed' : 'switchPressed' );
                        +      element.addClass(    value == element.data().value ? 'switchPressed' : 'switchUnpressed' );
                             },
                             action: function() {
                               var data = $(this).data();
                        @@ -592,7 +607,8 @@
                               button4value:      { type: 'string'  , required: false },
                               mapping:           { type: 'mapping' , required: false },
                               styling:           { type: 'styling' , required: false },
                        -      align:             { type: 'string'  , required: false }
                        +      align:             { type: 'string'  , required: false },
                        +         showstatus:        { type: 'list'   , required: true, list: {'true': "yes", 'false': "no"}   }
                             },
                             elements: {
                               label:             { type: 'string',    required: false, multi: false },
                        Code:
                        Index: visu_config.xsd
                        ===================================================================
                        --- visu_config.xsd     (Revision 566)
                        +++ visu_config.xsd     (Arbeitskopie)
                        @@ -63,9 +63,9 @@
                        
                         <xsd:attribute name="readonly" type="xsd:boolean" />
                         <xsd:attribute name="align" type="xsd:string" />
                        +<xsd:attribute name="showstatus" type="xsd:string" />
                        
                         <!-- complex elements -->
                        -
                         <xsd:element name="pages">
                             <xsd:complexType>
                                 <xsd:choice minOccurs="0" maxOccurs="unbounded">
                        @@ -304,6 +304,7 @@
                             </xsd:choice>
                             <xsd:attribute ref="mapping" use="optional" />
                             <xsd:attribute ref="styling" use="optional" />
                        +       <xsd:attribute name="showstatus" type="xsd:string" use="required" />
                             <xsd:attribute name="button1label" type="xsd:string" use="optional" />
                             <xsd:attribute name="button1value" type="xsd:string" use="optional" />
                             <xsd:attribute name="button2label" type="xsd:string" use="optional" />
                        Schöne Grüße
                        Christian

                        Kommentar


                          #13
                          Sieht soweit ganz gut aus. Zwei Sachen hätte ich trotzdem:

                          Du hast "showstatus" als "required", das ist nicht gut, weil es bisherige config bricht. Besser wäre, das optional zu lassen und (zweiter Punkt) am Anfang (ungetestet)

                          var showstatus = $p.attr("showstatus") || false;

                          einzufügen und dann in den späteren Abfragen nur

                          if (showstatus) { .... }

                          zu verwenden.

                          Das ist m.E. eleganter und führt gleichzeitig für alles bestehende die default-option "false" ein.


                          Gruss,

                          der Jan
                          KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

                          Kommentar


                            #14
                            Ich hab den Code nicht im Detail gegen den bestehenden geprüft, sieht aber erst mal vernünftig aus.

                            Was Du vor dem Checkin aber noch mal kontrollieren solltest ist die Einrückung. Die sieht mir laut Diff nicht immer ganz glücklich aus.

                            PS: Habe gerade den Kommentar vom Jan gesehen: sehe ich auch so.
                            TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

                            Kommentar


                              #15
                              Hallo Jan, Chris,

                              Zitat von JNK Beitrag anzeigen
                              Du hast "showstatus" als "required", das ist nicht gut, weil es bisherige config bricht. Besser wäre, das optional zu lassen und (zweiter Punkt) am Anfang (ungetestet)

                              var showstatus = $p.attr("showstatus") || false;

                              einzufügen und dann in den späteren Abfragen nur

                              if (showstatus) { .... }

                              zu verwenden.

                              Das ist m.E. eleganter und führt gleichzeitig für alles bestehende die default-option "false" ein.
                              okay, brechen der Config ist natürlich nicht schön und Dein Vorschlag sollte ja gut funktionieren. Ich pflege das noch ein.

                              Zitat von Chris M. Beitrag anzeigen
                              Was Du vor dem Checkin aber noch mal kontrollieren solltest ist die Einrückung. Die sieht mir laut Diff nicht immer ganz glücklich aus.
                              Weh o weh... da scheint doch irgendwas mit Tabs und Spaces gemischt zu sein. Ich prüfe das dann auch nochmal.

                              Danke für die Geduld und das Feedback!

                              Christian

                              Kommentar

                              Lädt...
                              X