Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Hardware
    4. Hardware such hilfe (Taster "adapter" wie Shelly I3)

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Hardware such hilfe (Taster "adapter" wie Shelly I3)

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      Muchul @kubax last edited by

      @kubax
      Mal Aqara Taster in betracht gezogen?
      https://a.aliexpress.com/_uhwPek

      1 Reply Last reply Reply Quote 0
      • mickym
        mickym Most Active @kubax last edited by

        @kubax Ich habe gerade hier https://shelly-api-docs.shelly.cloud/gen1/#shelly-dimmer-1-2-mqtt und nein gibt keinen Datenpunkt für Release.

        Wie gesagt Tasmota müsste nicht alle ms neuen Status schicken, sondern nur Änderung. Das andere kann man software mässig implementieren. Ich kenn mich mit rules nicht aus, vielleicht geht das. Das Problem ist wohl eher, dass Du nur eine Nachricht bekommst für alle 3 Taster.

        K 1 Reply Last reply Reply Quote 0
        • K
          kubax @mickym last edited by kubax

          @mickym ja, das ist in der tat ein großes problem. Mit Rules kenn ich mich auch so gut wie gar nicht aus. Ich hab zwar welche angepasst, aber bin dann immer irgendwo gegen eine wand gelaufen.

          @Muchul ich hatte schon mehrere Taster gefunden, allerdings nirgendwo vernünftige informationen gefunden welche daten per zigbee weitergegeben würden. Wobei, wenn ich hier nen false -> true -> false event bekomme wenn ich den taster drücke, bzw. ein false -> true wenn ich gedrückt halt, ließe sich das ja dann im script abfangen. bisher hatte ich nur geschaut ob die taster single, double oder hold weiterleiten können.

          Edit: ah, ne, ich hatte das glaub ich schon probiert, und war daran gescheiter das ich in Javascript keinen timer für das checken des statuses hin bekommen habe. Sondern lediglich auf änderung des objekts reagiert habe.

          Im falle einer hold aktion würde aber kein weiteres event kommen.

          mickym M 2 Replies Last reply Reply Quote 0
          • mickym
            mickym Most Active @kubax last edited by mickym

            @kubax

            Edit: ah, ne, ich hatte das glaub ich schon probiert, und war daran gescheiter das ich in Javascript keinen timer für das checken des statuses hin bekommen habe. Sondern lediglich auf änderung des objekts reagiert habe.

            Im falle einer hold aktion würde aber kein weiteres event kommen.

            Wie gesagt ich arbeite mit NodeRed - im Falle der Taster ist gedrückt müsstest Du halt wahrscheinlich mit JS mit Timern solange Ereignisse erzeugen bis Taster wieder losgelassen wird. Du musst den Status nicht checken. Der Datenpunkt triggert ja selbst.

            Wie Du an meinem NodeRed Flow siehst - müsstest Du wahrscheinlich 2 Trigger auf den gleichen Datenpunkt setzen, wobei der eine Flow für den Tastendruck zuständig ist der andere halt für das Loslassen. Wie gesagt Du kannst ja die Logik an meinem Flow versuchen nachzuvollziehen.

            K 1 Reply Last reply Reply Quote 0
            • K
              kubax @mickym last edited by

              @mickym ich schau einfach jetzt am Wochenende nochmal ob ich den Shelly I3 so eingestellt bekomme das er zumindest vernünftig pro taster den true / false liefert..

              Ich brauch in Javascript nur einen trigger auf das event, den kann ich dann ja so gestalten das er bei true / false jeweils anders reagiert. Ich bin nicht so der Fan von "Programmierung" mit dem verknüpfen von Elementen wie bei NodeRed und Blockly, auch wenn es sicherlich einfacher ist.

              Vllt. so ne art Fetisch xD oder selbst Geißelung. Vor allem wenn man zwar in der lage ist zu programmieren (bin Fachinformatiker von Beruf) aber nicht so fest drin ist, das man ohne stundenlang googeln sowas wie Timer vernünftig hin bekommt 🙂

              Aber ich schau nochmal. Vllt. hatte ich mich auch nur verrant damit das ich es unbedingt in Tasmota über Rules lösen wollte.

              mickym 1 Reply Last reply Reply Quote 0
              • mickym
                mickym Most Active @kubax last edited by

                @kubax Na das ist doch alles - was ich als Alternative erreichen wollte. 😉

                Ich bin auch noch ein ITler aus alter Schule, aber bei mir hat es dann bei C++ aufgehört. JS geht zwar auch - nur bei den Timern, Promises und den Callbacks mit den Pfeilen hört es dann bei mir langsam auf.

                Node-Red finde ich deswegen so gut, weil sich die Logik schön darstellen lässt.

                Aber Du wirst ja sicher mal schauen, ob Du es hinbringst. Da Du eh nur einen Detached Switch suchst, ist ja nur die Frage wo die Software implementierst. Letztlich gibt es ja auch sicher genügend HW Gurus hier, mit den Du so einen Taster zusammenlöten kannst und mit den Du programmieren kannst, dass Dir die richtigen Nachrichten gesendet werden.

                1 Reply Last reply Reply Quote 1
                • M
                  Muchul @kubax last edited by Muchul

                  @kubax sagte in Hardware such hilfe (Taster "adapter" wie Shelly I3):

                  @Muchul ich hatte schon mehrere Taster gefunden, allerdings nirgendwo vernünftige informationen gefunden welche daten per zigbee weitergegeben würden. Wobei, wenn ich hier nen false -> true -> false event bekomme wenn ich den taster drücke, bzw. ein false -> true wenn ich gedrückt halt, ließe sich das ja dann im script abfangen. bisher hatte ich nur geschaut ob die taster single, double oder hold weiterleiten können.

                  Nur zur info:
                  Bei den Aqara Tastern hast du mehrere Datenpunkte die den Tastendruck mit True melden, nach dem loslassen gehen diese wieder auf false:

                  Lässt sich auch prima fürs Dimmen nutzen.
                  Übrigens: Die Batterie von dem Schalter unten ist seit über drei Jahren drin, also noch original.

                  Hier mal die Datenpunkte die ich bei dem Taste habe zur Ansicht:

                  4657d67b-1903-4cbe-a6cd-bccb24aa34db-image.png

                  1 Reply Last reply Reply Quote 0
                  • K
                    klassisch Most Active last edited by

                    Meine Tradfri Floalt steure ich auch mit den Aqara Opple 6-fach Tastern. Die Verkabelung auf "Dauserversorgung mit Wago 221 gebrückt und den Opple vor die Dose geschraubt. Sind zwar Batteriebetrieben, funktionieren aber gut und mit 6 Tasten, jeweils click, double, triple, long press hat man genügend Möglichkeiten. z.B.

                    • Toggle bei click auf eine Taste
                    • Long press zum Dimmen und Lichtfarbwahl
                    • double für Szenen
                    • tripple für Rolladen, auf, ab, presets

                    Mit den Original Ikea Ferbedienungen habe ich Problem. Beim Anlernen an den Adapter entsteht meist noch eine willkürliche Verknüpfung der FB mit irgendeiner Floalt.

                    1 Reply Last reply Reply Quote 0
                    • K
                      kubax last edited by kubax

                      Kurzes zwischenfazit.

                      Ich hatte meinen Anfang mit dem Script den ich weit vor diesem Post verfolgt hatte glaub ich zu früh verworfen.

                      Eure Motivation zu dem Thema hat glaub ich ein bisher ganz gut funktionierendes Script hervorgebracht. Im Moment fehlt mir eigentlich nur noch der Hold Modus. Das ist so aber glaub ich auch kein Problem mehr...

                      Hier mal der POC bis auf die Hold action.... Doof wenn man beim Programmieren auf einmal die Anouncer aus Unreal Tournament hört xD

                      // Objecttree for Shelly I3
                      const shelly_i3 = 'mqtt.0.stat.tasmota_243EBA';
                      // timeframe for multipress actions
                      const multipress_time = 300;
                      // Debug flag to increase verbosity
                      var DEBUG = false;
                      
                      var timer1 = null;
                      var timer2 = null;
                      var timer3 = null;
                      var timer1_count = 0;
                      var timer2_count = 0;
                      var timer3_count = 0;
                      
                      
                      
                      on({ id: shelly_i3 + '.SWITCH1', change: "any" }, async function (obj) {
                          if (!existsState('0_userdata.0.' + obj.id + '_timestamp')) {
                            createState('0_userdata.0.' + obj.id + '_timestamp', 0,{
                                    type: 'number',
                                }); 
                          }
                          if (!existsState('0_userdata.0.' + obj.id + '_multipress_count')) {
                            createState('0_userdata.0.' + obj.id + '_multipress_count', 0,{
                                    type: 'number',
                                }); 
                          }
                          if (!existsState('0_userdata.0.' + obj.id + '_hold')) {
                            createState('0_userdata.0.' + obj.id + '_hold', false,{
                                    type: 'boolean',
                                }); 
                          }
                          if (getState(obj.id).val == "1") {
                          setState('0_userdata.0.' + obj.id + '_timestamp', getState(obj.id).ts);
                          setState('0_userdata.0.' + obj.id + '_multipress_count',getState('0_userdata.0.' + obj.id + '_multipress_count').val + 1);
                          var diff = getState(obj.id).ts - getState('0_userdata.0.' + obj.id + '_timestamp').val;
                          clearInterval(timer1);
                          timer1_count = 0;
                          if (DEBUG == true) console.log('Switch1: Starte Timer...');
                          timer1 = setInterval(function() {
                                if (timer1_count != 0) {
                                    if (getState(obj.id).val == "1") {
                                        setState('0_userdata.0.' + obj.id + '_hold',true);
                                        switch (getState('0_userdata.0.' + obj.id + '_multipress_count').val) {
                                          case 1:
                                            if (DEBUG == true) console.log('Switch1: HOLD!!!!');
                                            break;
                                          case 2:
                                            if (DEBUG == true) console.log('Switch1: Double press HOLD!!!!');
                                            break;
                                          case 3:
                                            if (DEBUG == true) console.log('Switch1: Triple press HOLD!!!!');
                                            break;
                                          case 4:
                                            if (DEBUG == true) console.log('Switch1: MULTI press HOLD!!!!');
                                            break;
                                          case 5:
                                            if (DEBUG == true) console.log('Switch1: MO MO MO MO MONSTER PRESS HOLD!!!!');
                                            break;
                                          default:
                                            if (DEBUG == true) console.log('Switch1: pressed ' + getState('0_userdata.0.' + obj.id + '_multipress_count').val + ' times and held...');
                                            break;
                                        }
                                        setState('0_userdata.0.' + obj.id + '_multipress_count',0);
                                        clearInterval(timer1);
                                        return;
                                    }
                                  if (DEBUG == true) console.log('Switch1: ' + obj.id + ': ' + getState('0_userdata.0.' + obj.id + '_multipress_count').val)
                                  setState('0_userdata.0.' + obj.id + '_multipress_count',0);
                                  switch (getState('0_userdata.0.' + obj.id + '_multipress_count').val) {
                                    case 1:
                                      if (DEBUG == true) console.log('Switch1: Single press');
                                      break;
                                    case 2:
                                      if (DEBUG == true) console.log('Switch1: Double press');
                                      break;
                                    case 3:
                                      if (DEBUG == true) console.log('Switch1: Triple press');
                                      break;
                                    case 4:
                                      if (DEBUG == true) console.log('Switch1: MULTI press');
                                      break;
                                    case 5:
                                      if (DEBUG == true) console.log('Switch1: MO MO MO MO MONSTER PRESS!!!');
                                      break;
                                    default:
                                      if (DEBUG == true) console.log('Switch1: pressed ' + getState('0_userdata.0.' + obj.id + '_multipress_count').val + ' times...');
                                      break;
                                  }
                                  if (DEBUG == true) console.log('Switch1: Stoppe Timer...');
                                  clearInterval(timer1);
                                }
                                timer1_count++;
                              }, multipress_time / 2);
                          if (DEBUG == true) console.log('Switch1: Time between presses on ' + obj.id + ': ' + diff);
                      
                          } else {
                              if (getState('0_userdata.0.' + obj.id + '_hold').val == true) {
                                setState('0_userdata.0.' + obj.id + '_hold',false);
                                if (DEBUG == true) console.log('Switch1: Hold released...');
                              }
                          }
                      });
                      
                      on({ id: shelly_i3 + '.SWITCH2', change: "any" }, async function (obj) {
                          if (!existsState('0_userdata.0.' + obj.id + '_timestamp')) {
                            createState('0_userdata.0.' + obj.id + '_timestamp', 0,{
                                    type: 'number',
                                }); 
                          }
                          if (!existsState('0_userdata.0.' + obj.id + '_multipress_count')) {
                            createState('0_userdata.0.' + obj.id + '_multipress_count', 0,{
                                    type: 'number',
                                }); 
                          }
                          if (!existsState('0_userdata.0.' + obj.id + '_hold')) {
                            createState('0_userdata.0.' + obj.id + '_hold', false,{
                                    type: 'boolean',
                                }); 
                          }
                          if (getState(obj.id).val == "1") {
                          setState('0_userdata.0.' + obj.id + '_timestamp', getState(obj.id).ts);
                          setState('0_userdata.0.' + obj.id + '_multipress_count',getState('0_userdata.0.' + obj.id + '_multipress_count').val + 1);
                          var diff = getState(obj.id).ts - getState('0_userdata.0.' + obj.id + '_timestamp').val;
                          clearInterval(timer2);
                          timer2_count = 0;
                          if (DEBUG == true) console.log('Switch2: Starte Timer...');
                          timer2 = setInterval(function() {
                                if (timer2_count != 0) {
                                    if (getState(obj.id).val == "1") {
                                        setState('0_userdata.0.' + obj.id + '_hold',true);
                                        switch (getState('0_userdata.0.' + obj.id + '_multipress_count').val) {
                                          case 1:
                                            if (DEBUG == true) console.log('Switch2: HOLD!!!!');
                                            break;
                                          case 2:
                                            if (DEBUG == true) console.log('Switch2: Double press HOLD!!!!');
                                            break;
                                          case 3:
                                            if (DEBUG == true) console.log('Switch2: Triple press HOLD!!!!');
                                            break;
                                          case 4:
                                            if (DEBUG == true) console.log('Switch2: MULTI press HOLD!!!!');
                                            break;
                                          case 5:
                                            if (DEBUG == true) console.log('Switch2: MO MO MO MO MONSTER PRESS HOLD!!!!');
                                            break;
                                          default:
                                            if (DEBUG == true) console.log('Switch2: pressed ' + getState('0_userdata.0.' + obj.id + '_multipress_count').val + ' times and held...');
                                            break;
                                        }
                                        setState('0_userdata.0.' + obj.id + '_multipress_count',0);
                                        clearInterval(timer2);
                                        return;
                                    }
                                  if (DEBUG == true) console.log('Switch2: ' + obj.id + ': ' + getState('0_userdata.0.' + obj.id + '_multipress_count').val)
                                  setState('0_userdata.0.' + obj.id + '_multipress_count',0);
                                  switch (getState('0_userdata.0.' + obj.id + '_multipress_count').val) {
                                    case 1:
                                      if (DEBUG == true) console.log('Switch2: Single press');
                                      break;
                                    case 2:
                                      if (DEBUG == true) console.log('Switch2: Double press');
                                      break;
                                    case 3:
                                      if (DEBUG == true) console.log('Switch2: Triple press');
                                      break;
                                    case 4:
                                      if (DEBUG == true) console.log('Switch2: MULTI press');
                                      break;
                                    case 5:
                                      if (DEBUG == true) console.log('Switch2: MO MO MO MO MONSTER PRESS!!!');
                                      break;
                                    default:
                                      if (DEBUG == true) console.log('Switch2: pressed ' + getState('0_userdata.0.' + obj.id + '_multipress_count').val + ' times...');
                                      break;
                                  }
                                  if (DEBUG == true) console.log('Switch2: Stoppe Timer...');
                                  clearInterval(timer2);
                                }
                                timer2_count++;
                              }, multipress_time / 2);
                          if (DEBUG == true) console.log('Switch2: Time between presses on ' + obj.id + ': ' + diff);
                      
                          } else {
                              if (getState('0_userdata.0.' + obj.id + '_hold').val == true) {
                                setState('0_userdata.0.' + obj.id + '_hold',false);
                                if (DEBUG == true) console.log('Switch2: Hold released...');
                              }
                          }
                      });
                      
                      on({ id: shelly_i3 + '.SWITCH3', change: "any" }, async function (obj) {
                          if (!existsState('0_userdata.0.' + obj.id + '_timestamp')) {
                            createState('0_userdata.0.' + obj.id + '_timestamp', 0,{
                                    type: 'number',
                                }); 
                          }
                          if (!existsState('0_userdata.0.' + obj.id + '_multipress_count')) {
                            createState('0_userdata.0.' + obj.id + '_multipress_count', 0,{
                                    type: 'number',
                                }); 
                          }
                          if (!existsState('0_userdata.0.' + obj.id + '_hold')) {
                            createState('0_userdata.0.' + obj.id + '_hold', false,{
                                    type: 'boolean',
                                }); 
                          }
                          if (getState(obj.id).val == "1") {
                          setState('0_userdata.0.' + obj.id + '_timestamp', getState(obj.id).ts);
                          setState('0_userdata.0.' + obj.id + '_multipress_count',getState('0_userdata.0.' + obj.id + '_multipress_count').val + 1);
                          var diff = getState(obj.id).ts - getState('0_userdata.0.' + obj.id + '_timestamp').val;
                          clearInterval(timer3);
                          timer3_count = 0;
                          if (DEBUG == true) console.log('Switch3: Starte Timer...');
                          timer3 = setInterval(function() {
                                if (timer3_count != 0) {
                                    if (getState(obj.id).val == "1") {
                                        setState('0_userdata.0.' + obj.id + '_hold',true);
                                        switch (getState('0_userdata.0.' + obj.id + '_multipress_count').val) {
                                          case 1:
                                            if (DEBUG == true) console.log('Switch3: HOLD!!!!');
                                            break;
                                          case 2:
                                            if (DEBUG == true) console.log('Switch3: Double press HOLD!!!!');
                                            break;
                                          case 3:
                                            if (DEBUG == true) console.log('Switch3: Triple press HOLD!!!!');
                                            break;
                                          case 4:
                                            if (DEBUG == true) console.log('Switch3: MULTI press HOLD!!!!');
                                            break;
                                          case 5:
                                            if (DEBUG == true) console.log('Switch3: MO MO MO MO MONSTER PRESS HOLD!!!!');
                                            break;
                                          default:
                                            if (DEBUG == true) console.log('Switch3: pressed ' + getState('0_userdata.0.' + obj.id + '_multipress_count').val + ' times and held...');
                                            break;
                                        }
                                        setState('0_userdata.0.' + obj.id + '_multipress_count',0);
                                        clearInterval(timer3);
                                        return;
                                    }
                                  if (DEBUG == true) console.log('Switch3: ' + obj.id + ': ' + getState('0_userdata.0.' + obj.id + '_multipress_count').val)
                                  setState('0_userdata.0.' + obj.id + '_multipress_count',0);
                                  switch (getState('0_userdata.0.' + obj.id + '_multipress_count').val) {
                                    case 1:
                                      if (DEBUG == true) console.log('Switch3: Single press');
                                      break;
                                    case 2:
                                      if (DEBUG == true) console.log('Switch3: Double press');
                                      break;
                                    case 3:
                                      if (DEBUG == true) console.log('Switch3: Triple press');
                                      break;
                                    case 4:
                                      if (DEBUG == true) console.log('Switch3: MULTI press');
                                      break;
                                    case 5:
                                      if (DEBUG == true) console.log('Switch3: MO MO MO MO MONSTER PRESS!!!');
                                      break;
                                    default:
                                      if (DEBUG == true) console.log('Switch3: pressed ' + getState('0_userdata.0.' + obj.id + '_multipress_count').val + ' times...');
                                      break;
                                  }
                                  if (DEBUG == true) console.log('Switch3: Stoppe Timer...');
                                  clearInterval(timer3);
                                }
                                timer3_count++;
                              }, multipress_time / 2);
                          if (DEBUG == true) console.log('Switch3: Time between presses on ' + obj.id + ': ' + diff);
                      
                          } else {
                              if (getState('0_userdata.0.' + obj.id + '_hold').val == true) {
                                setState('0_userdata.0.' + obj.id + '_hold',false);
                                if (DEBUG == true) console.log('Switch3: Hold released...');
                              }
                          }
                      });
                      

                      EDIT: In der Zwischenzeit hab ich Hold (als kleines Gimmick noch double press + Hold usw. da ich schon mal dabei war) auch noch eingebaut.

                      Macht es sinn das ganze hier im Forum als Plug and Play Lösung anzubieten? Vllt. auch erweitert um States im 0_userdata die jeweilige Aktionen nur auf true setzen, damit man es mit anderen Skripten leichter auswerten kann?

                      Und ja, ich weiß eigentlich könnte ich das ganze noch in weitere Funktionen aufbrechen. Mir reicht es so aber, und die arbeit in schöneren code möchte ich mir (zumindest heute) nicht mehr machen...

                      1 Reply Last reply Reply Quote 0
                      • ?
                        A Former User @kubax last edited by A Former User

                        @kubax

                        zugegeben, habe jetzt nicht alles gelesen, aber irgendwo hakte es doch an der der Option Doppelklick, Longpress und Single zu unterscheiden oder?

                        Mit ESPEasy bekommst Du das per Standard geliefert z.B. per Mqtt
                        Single = 1
                        Doppelklick = 3
                        Longpress = 10/11
                        47bcff10-7e4e-47ee-b185-0471eef279cf-grafik.png

                        ESPEasy auf den i3 geflasht und du bekommst 3x diese Option per Mqtt-wert.

                        K 1 Reply Last reply Reply Quote 0
                        • K
                          kubax @Guest last edited by

                          @pete0815

                          Theoretisch gesehen würde das ja auch in Tasmota funktionieren.

                          Aber genau diese Funktion klappt nicht vernünftig beim I3 weil es scheinbar keine Unterscheidung der 3 Taster gibt. Das wird dann über eine Regel gelöst, die diese Funktion aushebelt.

                          Aber ESPeasy hatte ich nicht auf den plan, hatte nur nach ESPhome geschaut... Ich schau es mir mal an. Dann aber nur noch interessehalber. Hab es ja jetzt gelöst 🙂

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          756
                          Online

                          31.7k
                          Users

                          79.8k
                          Topics

                          1.3m
                          Posts

                          6
                          21
                          1403
                          Loading More Posts
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes
                          Reply
                          • Reply as topic
                          Log in to reply
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                          The ioBroker Community 2014-2023
                          logo