Zitat von iwan
Beitrag anzeigen
Ankündigung
Einklappen
Keine Ankündigung bisher.
Rolladen
Einklappen
X
-
Ich habe das ganze noch etwas anpassen müssen.
Die Android Tablets haben die doofe Angewohnheit nach dem touchstart gleich einen mousedown und moudeup zu "senden"...
Das habe ich nun noch abgefangen.
Hier der Code:
Code:VisuDesign_Custom.prototype.addCreator('shutter', { create: function( element, path, flavour, type ) { var $e = $(element); var layout = $e.children('layout')[0]; var style = layout ? 'style="' + extractLayout( layout, type ) + '"' : ''; var ret_val = $('<div class="widget clearfix infotrigger" ' + style + '/>'); ret_val.setWidgetLayout($e); ret_val.append( extractLabel( $e.find('label')[0] ) ); // handle addresses var address = makeAddressList($e, function( src, transform, mode, variant ) { return [ variant != 'button', variant == 'button' ]; } ); var downtime; var timeout; var clicktype = ""; var lastevent; // create buttons + info var buttons = $('<div style="float:left;"/>'); var buttonCount = 2; var actordown = '<div class="actor shutterUnpressed downlabel" ' if ( $e.attr( 'align' ) ) actorinfo += 'style="text-align: '+$e.attr( 'align' )+'" '; actordown += '>'; actordown += '<div class="value">' + ($e.attr('downlabel') ? $e.attr('downlabel') : '-') + '</div>'; actordown += '</div>'; var $actordown = $(actordown).data( { 'address' : address, 'mapping' : $e.attr('mapping'), 'styling' : $e.attr('styling'), 'value' : $e.attr('downvalue') || 0, 'align' : $e.attr('align'), 'change' : $e.attr('change') || 'relative', 'min' : parseFloat($e.attr('min')) || 0, 'max' : parseFloat($e.attr('max')) || 255, 'type' : 'switch', 'shortaddr': $e.attr('shortaddr'), 'shorttime': $e.attr('shorttime') } ).bind('action', this.action).bind( 'mousedown touchstart', this.mousedown).bind( 'mouseup touchend', this.mouseup ).bind( 'mouseout',this.mouseout ); var actorup = '<div class="actor shutterUnpressed uplabel" ' if ( $e.attr( 'align' ) ) actorinfo += 'style="text-align: '+$e.attr( 'align' )+'" '; actorup += '>'; actorup += '<div class="value">' + ($e.attr('uplabel') ? $e.attr('uplabel') : '+') + '</div>'; actorup += '</div>'; var $actorup = $(actorup).data( { 'address' : address, 'mapping' : $e.attr('mapping'), 'styling' : $e.attr('styling'), 'value' : $e.attr('upvalue') || 1, 'align' : $e.attr('align'), 'change' : $e.attr('change') || 'relative', 'min' : parseFloat($e.attr('min')) || 0, 'max' : parseFloat($e.attr('max')) || 255, 'type' : 'switch', 'shortaddr': $e.attr('shortaddr'), 'shorttime': $e.attr('shorttime') } ).bind('action', this.action).bind( 'mousedown touchstart', this.mousedown).bind( 'mouseup touchend', this.mouseup ).bind( 'mouseout',this.mouseout ); var actorinfo = '<div class="actor switchInvisible " '; if ( $e.attr( 'align' ) ) actorinfo += 'style="text-align: '+$e.attr( 'align' )+'" '; actorinfo += '" ><div class="value"></div></div>'; var $actorinfo = $(actorinfo).data({ 'address' : address, 'format' : $e.attr('format'), 'mapping' : $e.attr('mapping'), 'styling' : $e.attr('styling'), 'align' : $e.attr('align'), }); for( var addr in address ) { if( !address[addr][2] ) // if NOT relative $actorinfo.bind( addr, this.update ); } if ( $e.attr('infoposition' )==1 ) { buttons.append( $actordown ); buttons.append( $actorinfo ); buttons.append( $actorup ); } else if ( $e.attr('infoposition' )==2 ) { buttons.append( $actordown ); buttons.append( $actorup ); buttons.append( $actorinfo ); } else { buttons.append( $actorinfo ); buttons.append( $actordown ); buttons.append( $actorup ); } ret_val.append( buttons ); return ret_val; }, update: function(e,d) { var element = $(this); var value = defaultUpdate( e, d, element ); element.addClass('shutterInvisible'); }, action: function() { var data = $(this).data(); var value = data.value; var relative = ( data.change != 'absolute' ); if( !relative ) { value = parseFloat($(this).parent().find('.shutterInvisible').data('basicvalue')); value = value + parseFloat(data.value); if (value < data.min ) value = data.min; if( value > data.max ) value = data.max; } for( addr in data.address ) { if( !(data.address[addr][1] & 2) ) continue; // skip when write flag not set if( data.address[addr][2] != relative ) continue; // skip when address mode doesn't fit action mode if (clicktype == "short" && data.shortaddr.indexOf(addr.substr(1)) != -1){ //alert(addr.substr(1) + " is in shortaddr, clicktyoe: " + clicktype); visu.write( addr.substr(1), transformEncode( data.address[addr][0], value ) ); } else if (clicktype == "long" && data.shortaddr.indexOf(addr.substr(1)) == -1){ //alert(addr.substr(1)+ " is NOT in shortaddr, clicktyoe: " + clicktype); visu.write( addr.substr(1), transformEncode( data.address[addr][0], value ) ); } } }, mousedown: function(event) { if(typeof lastevent === 'undefined'){ lastevent = ""; }; if(typeof lasteventhist === 'undefined'){ lasteventhist = ""; }; if(lastevent !== 'touchstart'){ lastevent = event.type; var element = $(this); element.removeClass('shutterUnpressed').addClass('shutterPressed'); downtime = new Date().getTime(); clicktype = "long"; timeout=setTimeout(function(){element.trigger('action');},element.data().shorttime); } }, mouseup: function(event) { if(lastevent !== 'touchstart'){ var element = $(this); element.removeClass('shutterPressed').addClass('shutterUnpressed'); clearTimeout(timeout) if ((new Date().getTime()-downtime) < element.data().shorttime){ clicktype = "short"; element.trigger('action'); } } lastevent = event.type; }, mouseout: function() { var element = $(this); element.removeClass('shutterPressed').addClass('shutterUnpressed'); clearTimeout(timeout); }, attributes: { uplabel: { type: 'string' , required: false }, upvalue: { type: 'string' , required: false }, downlabel: { type: 'string' , required: false }, downvalue: { type: 'string' , required: false }, mapping: { type: 'mapping', required: false }, styling: { type: 'styling', required: false }, align: { type: 'string' , required: false }, infoposition: { type: 'list' , required: true , list: {0: 'Info/Down/Up', 1: 'Down/Info/Up', 2: 'Down/Up/Info'} }, format: { type: 'string' , required: false }, change: { type: 'list' , required: false, list: {'relative': 'Send relative/delta values', 'absolute': 'Send absolute values'} }, min: { type: 'numeric', required: false }, max: { type: 'numeric', required: false }, colspan: { type: 'numeric', required: false }, rowspan: { type: 'numeric', required: false }, shortaddr: { type: 'string', required: false }, shorttime: { type: 'numeric', required: false } }, elements: { layout: { type: 'layout' , required: false, multi: false }, label: { type: 'string' , required: false, multi: false }, address: { type: 'address', required: true , multi: true , options: {variant: ['', 'isbutton']} } }, content: false });
Kommentar
-
Ich habe das so wie auf der angehängten Grafik zu sehen gelöst. Die vier Zwischenpositionen reichen für mich völlig aus und es lässt sich ohne große Erklärungen bedienen.
Der Code dazu:
[WICHTIG]Das ist die SVN-Version... so wie dargestellt geht das in der aktuellen Version nicht mit dem Editor[/WICHTIG]
Code:<mapping name="Auf_Ab"> <entry value="0"><icon name="steuer_auf"/> Auf</entry> <entry value="1"><icon name="steuer_ab"/> Ab</entry> </mapping> <mapping name="Stop"> <entry value="1"><icon name="audio_stop"/> Stop</entry> </mapping> <mapping name="Positionen"> <entry value="20">20%</entry> <entry value="40">40%</entry> <entry value="60">60%</entry> <entry value="80">80%</entry> </mapping> [...] <group> <layout colspan="5" /> <text> <layout colspan="1" /> Jalousien: </text> <trigger value="0" mapping="Auf_Ab"> <layout colspan="1" /> <address transform="DPT:1.008" type="">......</address> </trigger> <trigger value="1" mapping="Stop"> <layout colspan="1" /> <address transform="DPT:1.008" type="">......</address> </trigger> <trigger value="1" mapping="Auf_Ab"> <layout colspan="1" /> <address transform="DPT:1.008" type="">......</address> </trigger> </group> <group> <layout colspan="7" /> <text> <layout colspan="1" /> Position: </text> <trigger value="20" mapping="Positionen"> <layout colspan="1" /> <address transform="DPT:5.001" type="">......</address> </trigger> <trigger value="40" mapping="Positionen"> <layout colspan="1" /> <address transform="DPT:5.001" type="">......</address> </trigger> <trigger value="60" mapping="Positionen"> <layout colspan="1" /> <address transform="DPT:5.001" type="">......</address> </trigger> <trigger value="80" mapping="Positionen"> <layout colspan="1" /> <address transform="DPT:5.001" type="">......</address> </trigger> </group>
Angehängte Dateien
Kommentar
-
Hallo,
ich habe es so gelöst:
Gruß ManuelAngehängte Dateien
Kommentar
-
und ich habe das so gemacht (Achtung SVN -Version)
Wenn man einen der vordefinierten Knöpfe betätigt, wird das in dem Slider mit angezeigt. Der Slider ist also nicht nur benutzbar, für die Stufenlose verstellung sondern gibt auch die aktuelle position der Rollade an.
Viel SpaßAngehängte Dateien
Kommentar
-
Hier der Code für die Rolladen wie gewünscht
PHP-Code:<group name="Jalousien">
<layout colspan="12" />
<group nowidget="true">
<layout colspan="12" />
<slide min="0" max="100" step="10" format="%d%%">
<layout colspan="6" />
<label><icon name="fts_rollo" />Seitenfenster</label>
<address transform="DPT:5.001" mode="readwrite" variant="">0/7/4</address>
</slide>
<trigger value="0" mapping="Positionen">
<layout colspan="1.5" />
<address transform="DPT:5.001" type="">0/7/3</address>
</trigger>
<trigger value="40" mapping="Positionen">
<layout colspan="1.5" />
<address transform="DPT:5.001" type="">0/7/3</address>
</trigger>
<trigger value="80" mapping="Positionen">
<layout colspan="1.5" />
<address transform="DPT:5.001" type="">0/7/3</address>
</trigger>
<trigger value="100" mapping="Positionen">
<layout colspan="1.5" />
<address transform="DPT:5.001" type="">0/7/3</address>
</trigger>
</group>
Kommentar
-
https://knx-user-forum.de/cometvisu/...r-steuern.html
=> Schau in der Demo-Config, da gibt's ein Beispiel dazu
Kommentar
-
Danke Chris,
das Problem war das "SVN-Update". Ich habe da glaub ordnertechnisch was falsch gehabt.
In der Demo-Config hatte ich als erstes geguckt, jedoch war das wohl noch eine veraltete Datei. Nach dem ich den ganzen SVN-Order gelöscht und neu gezogen haben, ist der Eintrag auch in der Demo-Config zu finden.
Danke
Gruß
Florian
Kommentar
-
Danke an alle ich hab es auch hinbekommen :-)
Kleiner Schönheitsfehler. Die Prozentwerte passen bei mir nicht, also 50% ist eher 70% etc.
Ich habe jetzt mal mit den Nachlaufzeiten gespielt, also Zeit für Runter und Rauf um 2 Sekunden verringert, Nachlaufzeit von 2% auf 10%. Jetzt passt es wenn ich im Status offen bin. Leider aber nicht im Status geschlossen. Also von geschlossen auf 50%, landet er wieder bei 70% ca.
Passt das bei euch und habt ihr da ein paar Tipps zu Einstellen?
Aktor ist von MDT
Kommentar
-
Zitat von mfd Beitrag anzeigenAuf-Ab Tasten sind mit kurzem und langem Tastendruck für Lamellenverstellung und Fahrt belegt.
Welche Widgets/Plugins/Controls unterstützen denn diese Funktionalität?
Danke,
Micha
Kommentar
Kommentar