Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Taster press short or long mit blockly

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.1k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.8k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.1k

Taster press short or long mit blockly

Scheduled Pinned Locked Moved Skripten / Logik
39 Posts 5 Posters 8.1k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • AxelF1977A Offline
    AxelF1977A Offline
    AxelF1977
    wrote on last edited by
    #1

    Hallo liebe Community,

    ich habe hier 2 Enocean Taster. Eingebunden sind sie in ioBroker über den FHEM Adapter. Funktionieren tun sie gut mit meinen Osram Lightify Lampen, bei kurzem Testendruck. Ein/Aus funktioniert bestens.

    Nun sollen sie über einen langen Tastendruck hoch oder runterdimmer.

    Die Taster kennen von Haus aus keine short oder long Funktionen, diese möchte ich in ioBroker über die Zeit des gedrückten Tasters darstellen.

    Ich bekomme das aber nicht hin. Bisher habe ich auch keine Unterscheidung der Zustände (oben AO- unten AI) hinbekommen.

    Der Taster hat folgende Optionen

    ~~![](</s><URL url=)<link_text text="http://wp1000181.server-he.de/images/Bi ... 6824_n.jpg">http://wp1000181.server-he.de/images/Bilder/24177039_10215068120555355_871414523872716824_n.jpg</link_text>" />

    Nun war die Überlegung folgendes zu machen (und ich weiß nicht wie in blockly)

    Wenn

    ****state = A0 = button release <= 1sek short

    state = A0 = button release >= 1sek long****~~

    ASROCK Deskmini Intel I3 8100 16GB mit Proxmox VM ioBroker VM DIYHue| CCU piVCCU + FHEM auf Raspberry | Maria DB mit Grafana und Prometheus auf Tinker Board

    1 Reply Last reply
    0
    • Jey CeeJ Online
      Jey CeeJ Online
      Jey Cee
      Developer
      wrote on last edited by
      #2

      Ich kenne mich mit Blockly gar nicht aus, aber es gibt bestimmt die möglichkeit die Aktuelle Uhrzeit beim auslösen des Tasters in eine Variable zu schreiben.

      Und bei release machst du das gleiche. Wenn du dan Variable 1 von 2 abziehst hast du die Tastendruck Zeit.

      Gesendet von Unterwegs

      Persönlicher Support
      Spenden -> paypal.me/J3YC33

      1 Reply Last reply
      0
      • AxelF1977A Offline
        AxelF1977A Offline
        AxelF1977
        wrote on last edited by
        #3

        @Jey Cee:

        Ich kenne mich mit Blockly gar nicht aus, aber es gibt bestimmt die möglichkeit die Aktuelle Uhrzeit beim auslösen des Tasters in eine Variable zu schreiben.

        Und bei release machst du das gleiche. Wenn du dan Variable 1 von 2 abziehst hast du die Tastendruck Zeit. `

        Danke, gute Idee, mal sehen wie sich das in Blockly umsetzen lässt

        ASROCK Deskmini Intel I3 8100 16GB mit Proxmox VM ioBroker VM DIYHue| CCU piVCCU + FHEM auf Raspberry | Maria DB mit Grafana und Prometheus auf Tinker Board

        1 Reply Last reply
        0
        • paul53P Offline
          paul53P Offline
          paul53
          wrote on last edited by
          #4

          Wenn es nicht Blockly sein muss, könnte es so funktionieren (nicht getestet):

          const idButton = 'fhem.0.EnO_FEF9509A.buttons';
          const idSelect = 'fhem.0.EnO_FEF9509A.state';
          const idShort = 'javascript.0.EnO_FEF9509A.Press_Short';
          const idLong = 'javascript.0.EnO_FEF9509A.Press_Long';
          
          var timer = null;
          
          on(idButton, function(dp) {
             if(getState(idSelect).val == 'A0') {
                if(dp.state.val == 'pressed') {  // Taste wird gedrückt
                   timer = setTimeout(function() {
                      setState(idLong, true, true);
                      timer = null;
                    }, 1000);  // 1 s
                } else {  // Taste wird losgelassen
                   if(timer) {
                      clearTimeout(timer);
                      timer = null;
                      setState(idShort, true, true);
                   }   
                   else setState(idLong, false, true);
                }
             }
          });         
          
          

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

          1 Reply Last reply
          0
          • AlCalzoneA Offline
            AlCalzoneA Offline
            AlCalzone
            Developer
            wrote on last edited by
            #5

            Genau das hab ich schon mal umgesetzt. FHEM-EnOcean ist in Sachen Status etwas seltsam, weswegen Paul's Skript nicht funktionieren wird. Ein einfaches true/false bekommst du nicht. Da muss eine Kombination aus .buttons und Status "pressed"/"released" ausgewertet werden.

            Habe aktuell keinen Zugriff darauf da nicht zuhause, aber ich kann dir mein Skript später/morgen posten.

            Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

            1 Reply Last reply
            0
            • paul53P Offline
              paul53P Offline
              paul53
              wrote on last edited by paul53
              #6

              @AlCalzone:

              Ein einfaches true/false bekommst du nicht. Da muss eine Kombination aus .buttons und Status "pressed"/"released" ausgewertet werden.

              Habe es im Skript geändert und hoffe, dass es so passt ?

              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

              1 Reply Last reply
              0
              • AxelF1977A Offline
                AxelF1977A Offline
                AxelF1977
                wrote on last edited by
                #7

                @AlCalzone:

                Genau das hab ich schon mal umgesetzt. FHEM-EnOcean ist in Sachen Status etwas seltsam, weswegen Paul's Skript nicht funktionieren wird. Ein einfaches true/false bekommst du nicht. Da muss eine Kombination aus .buttons und Status "pressed"/"released" ausgewertet werden.

                Habe aktuell keinen Zugriff darauf da nicht zuhause, aber ich kann dir mein Skript später/morgen posten. `

                An dem Punkt waren wir gestern von den Überlegungen auch (Mein Bruder ist Programmierer). Danke. Über Dein Script würde ich mich freuen, dann können wir das mal analysiren und sehen wo unser Denkfehler war.

                Dimmst Du dann auch Lampen mit press_Long? Denn das ist ja dann das Interessante

                Vielen Dank erstmal

                @paul53:

                @AlCalzone:

                Ein einfaches true/false bekommst du nicht. Da muss eine Kombination aus .buttons und Status "pressed"/"released" ausgewertet werden. Habe es im Skript geändert und hoffe, dass es so passt ?

                Wir werden es uns ansehen, aber davon versteht mein Bruder mehr, er guckt mal drüber wenn er bei mir ist

                Vielen Dank erst mal!

                ASROCK Deskmini Intel I3 8100 16GB mit Proxmox VM ioBroker VM DIYHue| CCU piVCCU + FHEM auf Raspberry | Maria DB mit Grafana und Prometheus auf Tinker Board

                1 Reply Last reply
                0
                • AlCalzoneA Offline
                  AlCalzoneA Offline
                  AlCalzone
                  Developer
                  wrote on last edited by
                  #8

                  @AxelF1977:

                  Dimmst Du dann auch Lampen mit press_Long? Denn das ist ja dann das Interessante `

                  Jein. Das Skript kann es, wurde aber aus usability Gründen deaktiviert.

                  Gesendet von iPhone mit Tapatalk

                  Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                  1 Reply Last reply
                  0
                  • AxelF1977A Offline
                    AxelF1977A Offline
                    AxelF1977
                    wrote on last edited by
                    #9

                    @AlCalzone:

                    Jein. Das Skript kann es, wurde aber aus usability Gründen deaktiviert. `

                    Was ja jetzt viel bedeuten kann :mrgreen:

                    ASROCK Deskmini Intel I3 8100 16GB mit Proxmox VM ioBroker VM DIYHue| CCU piVCCU + FHEM auf Raspberry | Maria DB mit Grafana und Prometheus auf Tinker Board

                    1 Reply Last reply
                    0
                    • AlCalzoneA Offline
                      AlCalzoneA Offline
                      AlCalzone
                      Developer
                      wrote on last edited by
                      #10

                      Ok anders gesagt. Es funktioniert, wird aber nicht benutzt. Daher deaktiviert um Verwirrung zu vermeiden.

                      Gesendet von iPhone mit Tapatalk

                      Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                      1 Reply Last reply
                      0
                      • AxelF1977A Offline
                        AxelF1977A Offline
                        AxelF1977
                        wrote on last edited by
                        #11

                        @AlCalzone:

                        Ok anders gesagt. Es funktioniert, wird aber nicht benutzt. Daher deaktiviert um Verwirrung zu vermeiden. `

                        Ich bin sehr gespannt auf das Script! Freue mich wenn Du es teilst.

                        Vielen Dank!

                        ASROCK Deskmini Intel I3 8100 16GB mit Proxmox VM ioBroker VM DIYHue| CCU piVCCU + FHEM auf Raspberry | Maria DB mit Grafana und Prometheus auf Tinker Board

                        1 Reply Last reply
                        0
                        • AlCalzoneA Offline
                          AlCalzoneA Offline
                          AlCalzone
                          Developer
                          wrote on last edited by Jey Cee
                          #12

                          Hier kommt das Skript. Ist etwas umfangreicher, da es tatsächlich produktiv eingesetzt wird und mit möglichst wenig Konfiguration auskommen soll.

                          EnOcean-Schalter werden automatisch erkannt und daher nur über ihre Seriennummer angesprochen.

                          Ziel ist es, EnOcean-Schalter mit Aktoren verschiedener Hersteller zu verknüpfen. Dazu wird im config-Objekt definiert, welche Schalter ("ins") welche Aktoren ("outs") steuern. "+"/"-" gibt die Richtung an.

                          Die outs decken 3 Fälle ab:

                          1.: möglicherweise dimmbarer Aktor. info[0] startet mit "dimmer?" gefolgt vom State der die Dimmbarkeit angibt. info[1] und info[2] geben den minimalen/maximalen Wert an

                          2.: Nicht dimmbarer Aktor

                          3.: Definitiv dimmbarer Aktor. info[0] = "dimmer". info[1] und info[2] geben den minimalen/maximalen Wert an

                          Hinter DIMMER_STEPS gibst du an, in wie vielen Schritten gedimmt werden soll.

                          Hinter DIMMER_ENABLED gibst du an, ob die Dimmer-Funktion aktiv ist oder ob nur an/aus geschaltet wird.

                          Von den Zeilen danach bitte die Finger lassen.

                          Bei Problemen gerne fragen.

                          // Schaltwege definieren
                          const config = {
                          	ins: { //Schalter
                          		"FEF994B7": {
                          			"A0": ["out_id_1", "out_id_2", "+"],
                          			"AI": ["out_id_1", "out_id_3", "-"],
                          			"B0": ["out_id_2", "+"],
                          			"BI": ["out_id_2", "-"]
                          		}
                          	},
                          	outs: {
                          		"out_id_1": {
                          			state: "zwave.0.NODE2.SWITCH_MULTILEVEL.Level_1",
                          			info: ["dimmer?zwave.0.NODE2.CONFIGURATION.Dimmability_of_the_load", 0, 99]
                          		},
                          		"out_id_2": {
                          			state: "zwave.0.NODE18.SWITCH_BINARY.Switch_1",
                          			info: [false]
                          		},
                          		"out_id_3": {
                          			state: "zwave.0.NODE4.SWITCH_MULTILEVEL.Level_1",
                          			info: ["dimmer", 0, 99]
                          		}
                          	}
                          };
                          /** Anzahl der Intervalle, in denen gedimmt wird */
                          var DIMMER_STEPS = 5;
                          /** Ob die Dimmer-Funktion aktiv ist */
                          var DIMMER_ENABLED = false;
                          var dimmerThreads = {};
                          function dim(outName, direction) {
                          	if (!(outName in dimmerThreads))
                          		return;
                          	log("dim: " + outName + " " + direction);
                          	var out = config.outs[outName];
                          	var min = out.info[1];
                          	var max = out.info[2];
                          	var step = roundTo((max - min) / DIMMER_STEPS, 0);
                          	var thread = dimmerThreads[outName];
                          	var targetState = thread.currentValue + step * (direction === "+" ? 1 : -1);
                          	targetState = Math.min(max, Math.max(min, targetState));
                          	if (targetState === thread.currentValue) {
                          		// Ende des Wertebereichs, abbrechen
                          		log("Ende des Wertebereichs, stoppe " + outName, "debug");
                          		stopDimmer(outName);
                          		return;
                          	}
                          	else {
                          		thread.currentValue = targetState;
                          	}
                          	enqueueCommand(out.state, targetState);
                          }
                          function startDimmer(outName, direction) {
                          	var out = config.outs[outName];
                          	var startValue = getState(out.state).val;
                          	// Alte Thread stoppen
                          	if (outName in dimmerThreads) {
                          		stopDimmer(outName);
                          	}
                          	// Neuen Thread erstellen
                          	var dimmer = function () { return dim(outName, direction); };
                          	dimmerThreads[outName] = {
                          		timer: setInterval(dimmer, 1000),
                          		currentValue: startValue,
                          	};
                          	dimmer();
                          }
                          function stopDimmer(outName) {
                          	if (!(outName in dimmerThreads))
                          		return;
                          	var thread = dimmerThreads[outName];
                          	log("stopping dimmer " + outName, "debug");
                          	clearInterval(thread.timer);
                          	delete dimmerThreads[outName];
                          }
                          function switchPressed(dev, buttons, event, long) {
                          	var id = dev.id;
                          	// Gerät nicht definiert?
                          	if (!config.ins[id]) {
                          		log("Schalter nicht konfiguriert: " + id, "warn");
                          		return;
                          	}
                          	for (var _i = 0, buttons_1 = buttons; _i < buttons_1.length; _i++) {
                          		var btn = buttons_1[_i];
                          		// Auslesen, was getan werden soll
                          		var action = config.ins[id][btn];
                          		if (!action)
                          			continue;
                          		var n = action.length;
                          		for (var i = 0; i <= n - 2; i++) {
                          			var outName = action[i];
                          			var out = config.outs[outName];
                          			if (!out) {
                          				log("Schaltaktion nicht definiert: " + outName, "warn");
                          				continue;
                          			}
                          			var direction = action[n - 1];
                          			var isDimmer = /^dimmer/.test(out.info[0]);
                          			var bulbDimmable = true;
                          			if (/^dimmer\?/.test(out.info[0])) {
                          				var checkState = out.info[0].substring("dimmer?".length);
                          				// tslint:disable-next-line:triple-equals
                          				bulbDimmable = getState(checkState).val == 0; // "0" oder 0 möglich
                          			} else {
                          				bulbDimmable = false;
                          			}
                          			log(btn + " " + event + ": " + action[0] + " (dimmable: " + bulbDimmable + ") => " + direction, "debug");
                          			switch (event) {
                          				case "longPress":
                          					// Dimmer anschmeißen
                          					if (!DIMMER_ENABLED || !isDimmer || !bulbDimmable)
                          						continue;
                          					log("starting dimmer " + action[0], "debug");
                          					startDimmer(outName, direction);
                          					break;
                          				case "release":
                          					log("release: btn=" + btn + ", long=" + long, "debug");
                          					// (Dimmen beenden)
                          					stopDimmer(outName);
                          					if (!long || !bulbDimmable) {
                          						// Bei kurzem Knopfdruck Schaltvorgang ausführen
                          						log("switching " + (direction === "+" ? "on" : "off"), "debug");
                          						if (isDimmer) {
                          							// Dimmer auf Maximal-/Minimalwert setzen
                          							enqueueCommand(out.state, (direction === "+" ? out.info[2] : out.info[1]));
                          						}
                          						else {
                          							// Relais auf an/aus setzen
                          							enqueueCommand(out.state, (direction === "+" ? true : false));
                          						}
                          					}
                          			}
                          		}
                          	}
                          }
                          function roundTo(num, digits) {
                          	var exp = Math.pow(10, digits);
                          	return Math.round(num * exp) / exp;
                          }
                          var sendQueue = [];
                          var currentCommand = null;
                          var queueBusy = false;
                          function enqueueCommand(stateID, targetValue) {
                          	for (var i = 0; i < sendQueue.length; i++) {
                          		// remove all commands obsoleted by this one
                          		if (sendQueue[i].stateID === stateID) {
                          			log("removing obsolete command " + sendQueue[i].stateID + "=" + sendQueue[i].targetValue, "debug");
                          			sendQueue.splice(i, 1);
                          			i--;
                          		}
                          	}
                          	log("enqueuing command " + stateID + "=" + targetValue + " (LEN=>" + (sendQueue.length + 1) + ")", "debug");
                          	sendQueue.push({
                          		stateID: stateID,
                          		targetValue: targetValue,
                          		deadlockTimeout: null,
                          	});
                          	processCommands();
                          }
                          function finishCurrentCommand() {
                          	if (queueBusy && currentCommand != null) {
                          		log("finishing current command", "debug");
                          		clearTimeout(currentCommand.deadlockTimeout);
                          		currentCommand = null;
                          		queueBusy = false;
                          		setTimeout(processCommands, 0);
                          	}
                          }
                          function forgetCurrentCommand() {
                          	log("forgetting current command", "warn");
                          	// gets called after a while to avoid deadlocks
                          	currentCommand = null;
                          	queueBusy = false;
                          	setTimeout(processCommands, 0);
                          }
                          function processCommands() {
                          	log("processCommands: busy = " + queueBusy + ", length = " + sendQueue.length, "debug");
                          	// don't do anything if we're busy sending or no commands are queued
                          	if (queueBusy)
                          		return;
                          	while (sendQueue.length > 0) {
                          		// find out if the current command is neccessary
                          		currentCommand = sendQueue.shift();
                          		var currentState = getState(currentCommand.stateID);
                          		log("processCommands > " + currentCommand.stateID + "=>" + currentCommand.targetValue + ". current = " + currentState.val + ", ack = " + currentState.ack, "debug");
                          		if (currentState.ack && currentState.val === currentCommand.targetValue) {
                          			log("command unneccessary", "debug");
                          			// unnötiger Befehl, ignorieren
                          			continue;
                          		}
                          		// now we're busy
                          		log("sending", "debug");
                          		queueBusy = true;
                          		currentCommand.deadlockTimeout = setTimeout(forgetCurrentCommand, 10000);
                          		setState(currentCommand.stateID, currentCommand.targetValue);
                          		// stop looping until the command finishes or fails
                          		return;
                          	}
                          }
                          // Auf ack=true updates warten, um nicht gleichzeitig mehrere Befehle zu senden
                          var allStateIDs = Object.keys(config.outs).map(function (id) { return config.outs[id].state; });
                          on({ id: allStateIDs, ack: true }, function (obj) {
                          	if (currentCommand && currentCommand.stateID === obj.id) {
                          		// this was the ack we waited for
                          		log("received ack for current command. " + obj.id + " = " + obj.state.val, "debug");
                          		finishCurrentCommand();
                          	}
                          });
                          // ========================
                          // EnOcean-Implementation
                          // tslint:disable
                          var eeps = {
                          	"F6-02-01": "switch.2-channel",
                          	"F6-02-02": "switch.2-channel",
                          	"F6-02-03": "switch.2-channel",
                          	"F6-02-04": "switch.2-channel",
                          	"F6-03-01": "switch.4-channel",
                          	"F6-03-02": "switch.4-channel",
                          };
                          var enOceanDevice = (function () {
                          	function enOceanDevice(ioBrokerID) {
                          		var dev;
                          		this.ioBrokerID = ioBrokerID;
                          		dev = (getObject(ioBrokerID))["native"];
                          		this.id = dev.Internals.DEF;
                          		this.type = eeps[dev.Attributes.eep];
                          	}
                          	enOceanDevice.prototype.ioBrokerID = "";
                          	enOceanDevice.prototype.id = "";
                          	enOceanDevice.prototype.type = "";
                          	return enOceanDevice;
                          })();
                          var enOceanSwitch, bind = function (fn, me) { return function () { return fn.apply(me, arguments); }; };
                          enOceanSwitch = (function () {
                          	var longPressThreshold;
                          	function enOceanSwitch(device) {
                          		this.handlers = [];
                          		this.removeEventHandler = bind(this.removeEventHandler, this);
                          		this.addEventHandler = bind(this.addEventHandler, this);
                          		this.onButtonRelease = bind(this.onButtonRelease, this);
                          		this.onLongPress = bind(this.onLongPress, this);
                          		this.onChannelEvent = bind(this.onChannelEvent, this);
                          		this.onButtonPress = bind(this.onButtonPress, this);
                          		this.device = device;
                          		this.id = device.id;
                          		subscribe({
                          			id: this.device.ioBrokerID + ".buttons",
                          			val: "pressed",
                          		}, (function (_this) {
                          			return function (obj) {
                          				return _this.onButtonPress();
                          			};
                          		})(this));
                          		subscribe({
                          			id: new RegExp((this.device.ioBrokerID.replace('.', '\.')) + "\.state"),
                          			change: "any",
                          		}, (function (_this) {
                          			return function (obj) {
                          				return _this.onChannelEvent(obj.newState.val);
                          			};
                          		})(this));
                          		subscribe({
                          			id: this.device.ioBrokerID + ".buttons",
                          			val: "released",
                          		}, (function (_this) {
                          			return function (obj) {
                          				return _this.onButtonRelease();
                          			};
                          		})(this));
                          	}
                          	enOceanSwitch.prototype.id = null;
                          	enOceanSwitch.prototype.device = null;
                          	longPressThreshold = 500;
                          	enOceanSwitch.prototype.isLongPress = false;
                          	enOceanSwitch.prototype.releaseSent = false;
                          	enOceanSwitch.prototype.buttons = [];
                          	enOceanSwitch.prototype.pressTime = 0;
                          	enOceanSwitch.prototype.longPressUpdateTimeout = 0;
                          	enOceanSwitch.prototype.onButtonPress = function () {
                          		this.releaseSent = false;
                          		this.isLongPress = false;
                          		this.buttons = [];
                          		this.pressTime = Date.now();
                          		this.longPressUpdateTimeout = setTimeout(this.onLongPress, longPressThreshold);
                          		return null;
                          	};
                          	enOceanSwitch.prototype.onChannelEvent = function (btns) {
                          		for (var _i = 0, _a = btns.split(","); _i < _a.length; _i++) {
                          			var btn = _a[_i];
                          			btn = btn.match(/[A,B][0,I]/)[0];
                          			if (this.buttons.indexOf(btn) === -1)
                          				this.buttons.push(btn);
                          		}
                          		return null;
                          	};
                          	enOceanSwitch.prototype.onLongPress = function () {
                          		if (this.releaseSent) {
                          			return;
                          		}
                          		this.isLongPress = true;
                          		return this.handlers.forEach((function (_this) {
                          			return function (handler) {
                          				return handler(_this.device, _this.buttons, "longPress", true);
                          			};
                          		})(this));
                          	};
                          	enOceanSwitch.prototype.onButtonRelease = function () {
                          		this.longPressUpdateTimeout = clearTimeout(this.longPressUpdateTimeout);
                          		this.releaseSent = true;
                          		this.handlers.forEach((function (_this) {
                          			return function (handler) {
                          				return handler(_this.device, _this.buttons, "release", _this.isLongPress);
                          			};
                          		})(this));
                          		return null;
                          	};
                          	enOceanSwitch.prototype.handlers = [];
                          	enOceanSwitch.prototype.addEventHandler = function (func) {
                          		return this.handlers.push(func);
                          	};
                          	enOceanSwitch.prototype.removeEventHandler = function (func) {
                          		var index;
                          		index = this.handlers.indexOf(func);
                          		return this.handlers.splice(index, 1);
                          	};
                          	null;
                          	return enOceanSwitch;
                          })();
                          var enumEnOceanDevices;
                          enumEnOceanDevices = function () {
                          	var addDevice, deviceIDs;
                          	deviceIDs = [];
                          	addDevice = function (id, i) {
                          		var d, deviceID;
                          		deviceID = id.match(/^\w+\.\d+\.\w+/);
                          		if ((d = deviceID != null ? deviceID[0] : void 0)) {
                          			if ((deviceIDs.indexOf(d)) === -1) {
                          				return deviceIDs.push(d);
                          			}
                          		}
                          	};
                          	$("channel[state.id=fhem.0.EnO*]").each(addDevice);
                          	return deviceIDs.map(function (id) {
                          		return new enOceanDevice(id);
                          	});
                          };
                          // ===============================
                          // Geräte ermitteln
                          var devices = enumEnOceanDevices();
                          var switches = devices
                          	.filter(function (dev) { return dev.type.substr(0, 6) === "switch"; })
                          	.map(function (dev) { return new enOceanSwitch(dev); });
                          switches.forEach(function (sw) { return sw.addEventHandler(switchPressed); });
                          

                          Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                          1 Reply Last reply
                          0
                          • AxelF1977A Offline
                            AxelF1977A Offline
                            AxelF1977
                            wrote on last edited by
                            #13

                            @AlCalzone:

                            Hier kommt das Skript. Ist etwas umfangreicher, da es tatsächlich produktiv eingesetzt wird und mit möglichst wenig Konfiguration auskommen soll. `

                            Uff, das ist mal ne Hausnummer. Danke. Wir werden uns da reinarbeiten

                            Da ich in Deiner Signatur gesehen das der IKEA Trådfri Adapter von Dir ist, gehe ich mal davon aus, dass das Script mit dem System funktioniert. Werde jetzt von Osram Lightify zu IKEA Trådfri wechseln.

                            ASROCK Deskmini Intel I3 8100 16GB mit Proxmox VM ioBroker VM DIYHue| CCU piVCCU + FHEM auf Raspberry | Maria DB mit Grafana und Prometheus auf Tinker Board

                            1 Reply Last reply
                            0
                            • AlCalzoneA Offline
                              AlCalzoneA Offline
                              AlCalzone
                              Developer
                              wrote on last edited by
                              #14

                              Ja sollte auch mit TRÅDFRI funktionieren. Das wäre Fall 3: definitiv dimmbar mit brightness als state.

                              Gesendet von iPhone mit Tapatalk

                              Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                              1 Reply Last reply
                              0
                              • AxelF1977A Offline
                                AxelF1977A Offline
                                AxelF1977
                                wrote on last edited by
                                #15

                                Ich habe das Script jetzt ausgiebig getestet. Einmal mit Osram Lightify und noch mit IKEA TRÅDFRI.

                                Mit unterschiedlichen Ergebnissen aber einer Gemeinsamkeit. Gemeinsam haben beide: Stufenlos gedimmt werden kann nicht. Das liegt sicher an der Art der EnOcean Taster?

                                Osram dimmt hoch oder runter in dem die Birnen wirklich langsam heller oder dunkler werden. Bei TRÅDFRI wird die Birne direkt heller oder dunkler. Aber wie gesagt, in Echtzeit per Tastendruck lassen sich die Birnen nicht dimmen (wie es bei den IKEA Fernbedienungen funktioniert).

                                Gehen die EnOcean für stufenloses Dimmen, eher nicht, oder?

                                ASROCK Deskmini Intel I3 8100 16GB mit Proxmox VM ioBroker VM DIYHue| CCU piVCCU + FHEM auf Raspberry | Maria DB mit Grafana und Prometheus auf Tinker Board

                                1 Reply Last reply
                                0
                                • Jey CeeJ Online
                                  Jey CeeJ Online
                                  Jey Cee
                                  Developer
                                  wrote on last edited by
                                  #16

                                  Das hat keines Wegs mit den EnOcean Tastern zu tun.

                                  Die sind ja nicht direktverknüpft, sondern du wertest die Dauer des Drucks aus. Und während der Dauer des Drucks führst du deine Aktion aus.

                                  Das liegt wohl eher an der Reaktionszeit der Adapter oder Gateways.

                                  Gesendet von Unterwegs

                                  Persönlicher Support
                                  Spenden -> paypal.me/J3YC33

                                  1 Reply Last reply
                                  0
                                  • AxelF1977A Offline
                                    AxelF1977A Offline
                                    AxelF1977
                                    wrote on last edited by
                                    #17

                                    @Jey Cee:

                                    Das hat keines Wegs mit den EnOcean Tastern zu tun.

                                    Die sind ja nicht direktverknüpft, sondern du wertest die Dauer des Drucks aus. Und während der Dauer des Drucks führst du deine Aktion aus.

                                    Das liegt wohl eher an der Reaktionszeit der Adapter oder Gateways. `

                                    Die Überlegung war, da sie nicht Batterie betrieben sind und die Energie zum Schalten selber erzeugen, können sie an/aus. Die Druckdauer können sie übermitteln, stimmt.

                                    @AlCalzone dimmen Deine Lampen stufenlos mit den EnOcean Tastern, wenn genutzt?

                                    ASROCK Deskmini Intel I3 8100 16GB mit Proxmox VM ioBroker VM DIYHue| CCU piVCCU + FHEM auf Raspberry | Maria DB mit Grafana und Prometheus auf Tinker Board

                                    1 Reply Last reply
                                    0
                                    • AlCalzoneA Offline
                                      AlCalzoneA Offline
                                      AlCalzone
                                      Developer
                                      wrote on last edited by
                                      #18

                                      @AxelF1977:

                                      @AlCalzone dimmen Deine Lampen stufenlos mit den EnOcean Tastern, wenn genutzt? `
                                      Nein, in einer konfigurierbaren Anzahl an Stufen (siehe Kommentare im Quelltext). Das Skript war dafür gedacht, ZWave-Dimmer anzusteuern und die mögen es nicht, wenn man zu viele Befehle sendet.

                                      Für stufenloses Dimmen müsste man das Skript anpassen. Aktuell ist es so, dass die Taster-Objekte 3 Events senden:

                                      • "pressed" sofort

                                      • "longPress" nach 500ms (ebenfalls konfigurierbar)

                                      • "released" beim Loslassen.

                                      Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                                      1 Reply Last reply
                                      0
                                      • AxelF1977A Offline
                                        AxelF1977A Offline
                                        AxelF1977
                                        wrote on last edited by
                                        #19

                                        @AlCalzone: `
                                        Nein, in einer konfigurierbaren Anzahl an Stufen (siehe Kommentare im Quelltext). Das Skript war dafür gedacht, ZWave-Dimmer anzusteuern und die mögen es nicht, wenn man zu viele Befehle sendet.

                                        Für stufenloses Dimmen müsste man das Skript anpassen. Aktuell ist es so, dass die Taster-Objekte 3 Events senden:

                                        • "pressed" sofort

                                        • "longPress" nach 500ms (ebenfalls konfigurierbar)

                                        • "released" beim Loslassen.

                                        Danke für die Antwort. Ich werde mein Bruder mal drüber gucken lassen, evtl. hat er eine Lösung wie das Script anzupassen ist. Die Verzögerung zwischen Tastendruck und Schalten ist enorm, da sind teilweise mehrer Sekunden zwischen bei, zumindest bei TRÅDFRI. Osram ist da schneller

                                        ASROCK Deskmini Intel I3 8100 16GB mit Proxmox VM ioBroker VM DIYHue| CCU piVCCU + FHEM auf Raspberry | Maria DB mit Grafana und Prometheus auf Tinker Board

                                        1 Reply Last reply
                                        0
                                        • AxelF1977A Offline
                                          AxelF1977A Offline
                                          AxelF1977
                                          wrote on last edited by
                                          #20

                                          @AlCalzone:

                                          Nein, in einer konfigurierbaren Anzahl an Stufen (siehe Kommentare im Quelltext). Das Skript war dafür gedacht, ZWave-Dimmer anzusteuern und die mögen es nicht, wenn man zu viele Befehle sendet.

                                          Für stufenloses Dimmen müsste man das Skript anpassen. Aktuell ist es so, dass die Taster-Objekte 3 Events senden:

                                          • "pressed" sofort

                                          • "longPress" nach 500ms (ebenfalls konfigurierbar)

                                          • "released" beim Loslassen. `

                                          Danke für die Antwort. Ich werde mein Bruder mal drüber gucken lassen, evtl. hat er eine Lösung wie das Script anzupassen ist. Die Verzögerung zwischen Tastendruck und Schalten ist enorm, da sind teilweise mehrer Sekunden zwischen bei, zumindest bei TRÅDFRI. Osram ist da schneller

                                          ASROCK Deskmini Intel I3 8100 16GB mit Proxmox VM ioBroker VM DIYHue| CCU piVCCU + FHEM auf Raspberry | Maria DB mit Grafana und Prometheus auf Tinker Board

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          493

                                          Online

                                          32.4k

                                          Users

                                          81.4k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe