Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. ioBroker Allgemein
  4. Tradfri: Lampen und Rollos mit HomeMatic Wandtaster steuern

NEWS

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    8
    1
    1.6k

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    10
    1
    673

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    1.2k

Tradfri: Lampen und Rollos mit HomeMatic Wandtaster steuern

Geplant Angeheftet Gesperrt Verschoben ioBroker Allgemein
19 Beiträge 5 Kommentatoren 1.5k Aufrufe 3 Beobachtet
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • D dtp

    Hallo,

    bei keinem meiner HMIP-Taster und Aktoren wird im hm-rpc-Adapter (Version 1.15.16) eine Tasterbetätigung angezeigt.

    2023-01-17_18h09_01.jpg

    Die entsprechenden Werte für die Kanäle 1 und 2 werden stets orange dargestellt. Wenn ich den Taster betätige, ändert sich aber der zugehörige RSSI-Wert.

    Ist das Problem bekannt?

    Ich nutze die Beta des js-controller V 4.0.24 mit Version 6.3.5 des admin-Adapters.

    EDIT: Mittlerweile habe ich das Problem dank der Mithilfe insb. von @paul53 und einigen weiteren Forumskollegen (siehe unten) lösen können. Um doppeltes Schreiben zu vermeiden, habe ich im HomeMatic-Forum einen kleinen Thread zu dem Projekt gestartet. Alles weitere dann dort (klick!)

    A Offline
    A Offline
    Ahnungsbefreit
    schrieb am zuletzt editiert von
    #3

    @dtp du brauchst ein Dummy Script auf der CCU, das Thema kam hier im Forum schon ein paar Mal vor. Ohne das bekommst Du die Tastendrücke nicht mit

    Wenn meine Antwort hilfreich war, dürft Ihr das gerne durch einen "Upvote" (der kleine "^" unten rechts) zum Ausdruck bringen.

    paul53P 1 Antwort Letzte Antwort
    0
    • A Ahnungsbefreit

      @dtp du brauchst ein Dummy Script auf der CCU, das Thema kam hier im Forum schon ein paar Mal vor. Ohne das bekommst Du die Tastendrücke nicht mit

      paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von
      #4

      @ahnungsbefreit sagte: Dummy Script auf der CCU

      Man das Senden von Tastenbetätigungen auch per Javascript aktivieren.

      // Dieses Skript einmal für jeden Taster-Kanal ausführen
      const inst = 'hm-rpc.0'; // Instanz anpassen
      const channel = 'XEQ1234567:1'; // Kanal-Adresse anpassen
       
      sendTo(inst, 'reportValueUsage', {ID: channel, paramType: 'PRESS_SHORT', params: 1}, res => {
          log(JSON.stringify(res));
      });
      

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB

      D 1 Antwort Letzte Antwort
      1
      • paul53P paul53

        @ahnungsbefreit sagte: Dummy Script auf der CCU

        Man das Senden von Tastenbetätigungen auch per Javascript aktivieren.

        // Dieses Skript einmal für jeden Taster-Kanal ausführen
        const inst = 'hm-rpc.0'; // Instanz anpassen
        const channel = 'XEQ1234567:1'; // Kanal-Adresse anpassen
         
        sendTo(inst, 'reportValueUsage', {ID: channel, paramType: 'PRESS_SHORT', params: 1}, res => {
            log(JSON.stringify(res));
        });
        
        D Offline
        D Offline
        dtp
        schrieb am zuletzt editiert von dtp
        #5

        @paul53 Ich habe das Skript mal ausgeführt und dann wird tatsächlich des zugehörige Objekt auf true gesetzt, wenn ich die Taste betätige. Allerdings nur ein Mal. Danach passiert nichts mehr. Verstehe leider nicht, was das Skript da nun macht.

        @Ahnungsbefreit Was soll das Dummyskript auf der CCU machen? Eine Systemvariable setzen, die ich dann hier abfrage?

        ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

        HomoranH 1 Antwort Letzte Antwort
        0
        • D dtp

          @paul53 Ich habe das Skript mal ausgeführt und dann wird tatsächlich des zugehörige Objekt auf true gesetzt, wenn ich die Taste betätige. Allerdings nur ein Mal. Danach passiert nichts mehr. Verstehe leider nicht, was das Skript da nun macht.

          @Ahnungsbefreit Was soll das Dummyskript auf der CCU machen? Eine Systemvariable setzen, die ich dann hier abfrage?

          HomoranH Nicht stören
          HomoranH Nicht stören
          Homoran
          Global Moderator Administrators
          schrieb am zuletzt editiert von
          #6

          @dtp Die Taster senden nur wenn es etwas an einen Empfänger zu senden gibt. ioBroker ist für die CCU nicht existent.
          Dies wird mit dem Dummy oder Pauls Skript geändert. Damit senden die Taster jetzt ihre Pakete an ioBroker.

          kein Support per PN! - Fragen im Forum stellen -
          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
          Das Forum freut sich über eine Spende. Benutzt dazu den Spendenbutton oben rechts. Danke!
          der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

          D 1 Antwort Letzte Antwort
          0
          • HomoranH Homoran

            @dtp Die Taster senden nur wenn es etwas an einen Empfänger zu senden gibt. ioBroker ist für die CCU nicht existent.
            Dies wird mit dem Dummy oder Pauls Skript geändert. Damit senden die Taster jetzt ihre Pakete an ioBroker.

            D Offline
            D Offline
            dtp
            schrieb am zuletzt editiert von
            #7

            @homoran Alles klar. Verstanden. Aber kann ich jetzt, nachdem ich @paul53s Skript ausgeführt habe, direkt den Datenpunkt als Trigger mit

            on("hm-rpc.1.00019F299738F8.1.PRESS_SHORT", function (obj){...}
            

            verwenden, oder geht das so nicht? Irgendwie habe ich da noch ein Verständnisproblem.

            ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

            HomoranH 1 Antwort Letzte Antwort
            0
            • D dtp

              @homoran Alles klar. Verstanden. Aber kann ich jetzt, nachdem ich @paul53s Skript ausgeführt habe, direkt den Datenpunkt als Trigger mit

              on("hm-rpc.1.00019F299738F8.1.PRESS_SHORT", function (obj){...}
              

              verwenden, oder geht das so nicht? Irgendwie habe ich da noch ein Verständnisproblem.

              HomoranH Nicht stören
              HomoranH Nicht stören
              Homoran
              Global Moderator Administrators
              schrieb am zuletzt editiert von
              #8

              @dtp sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:

              @homoran Alles klar. Verstanden. Aber kann ich jetzt, nachdem ich @paul53s Skript ausgeführt habe, direkt den Datenpunkt als Trigger mit

              on("hm-rpc.1.00019F299738F8.1.PRESS_SHORT", function (obj){...}
              

              verwenden, oder geht das so nicht? Irgendwie habe ich da noch ein Verständnisproblem.

              ich kann doch immer noch kein js :-(

              auf Aktualisierung, nicht auf Änderung!
              wie immer das mit js geht

              kein Support per PN! - Fragen im Forum stellen -
              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
              Das Forum freut sich über eine Spende. Benutzt dazu den Spendenbutton oben rechts. Danke!
              der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

              CodierknechtC 1 Antwort Letzte Antwort
              0
              • HomoranH Homoran

                @dtp sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:

                @homoran Alles klar. Verstanden. Aber kann ich jetzt, nachdem ich @paul53s Skript ausgeführt habe, direkt den Datenpunkt als Trigger mit

                on("hm-rpc.1.00019F299738F8.1.PRESS_SHORT", function (obj){...}
                

                verwenden, oder geht das so nicht? Irgendwie habe ich da noch ein Verständnisproblem.

                ich kann doch immer noch kein js :-(

                auf Aktualisierung, nicht auf Änderung!
                wie immer das mit js geht

                CodierknechtC Offline
                CodierknechtC Offline
                Codierknecht
                Developer Most Active
                schrieb am zuletzt editiert von
                #9

                @homoran sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:

                auf Aktualisierung, nicht auf Änderung!
                wie immer das mit js geht

                on({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT", change: "ne"}, async function (obj) {
                }
                

                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                HmIP|ZigBee|Tasmota|Unifi
                Zabbix Certified Specialist
                Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                1 Antwort Letzte Antwort
                0
                • HomoranH Nicht stören
                  HomoranH Nicht stören
                  Homoran
                  Global Moderator Administrators
                  schrieb am zuletzt editiert von
                  #10

                  @codierknecht sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:

                  @homoran sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:

                  auf Aktualisierung, nicht auf Änderung!
                  wie immer das mit js geht

                  on({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT", change: "ne"}, async function (obj) {
                  }
                  

                  sischer datt?
                  ist ne nicht not equal, also Änderung?

                  kein Support per PN! - Fragen im Forum stellen -
                  Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                  Das Forum freut sich über eine Spende. Benutzt dazu den Spendenbutton oben rechts. Danke!
                  der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                  D CodierknechtC 2 Antworten Letzte Antwort
                  0
                  • HomoranH Homoran

                    @codierknecht sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:

                    @homoran sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:

                    auf Aktualisierung, nicht auf Änderung!
                    wie immer das mit js geht

                    on({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT", change: "ne"}, async function (obj) {
                    }
                    

                    sischer datt?
                    ist ne nicht not equal, also Änderung?

                    D Offline
                    D Offline
                    dtp
                    schrieb am zuletzt editiert von dtp
                    #11

                    @homoran Korrekt "ne" ist not equal. Damit geht's nicht. Aber so hat's funktioniert, nachdem ich das Skript von @paul53 für PRESS_SHORT beider Kanäle ausgeführt habe.

                    on({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT"}, async function (obj) {
                      setState('tradfri.0.L-65547.lightbulb.brightness', 40);
                    });
                    
                    on({id: "hm-rpc.1.00019F299738F8.2.PRESS_SHORT"}, async function (obj) {
                      setState('tradfri.0.L-65547.lightbulb.brightness', 0);
                    });
                    

                    Danke euch. Da muss man erst mal drauf kommen.

                    Nun kann ich mir noch Gedanken über eine Umsetzung für die Dimmfunktion mit PRESS_LONG_START und PRESS_LONG_RELEASE machen.

                    ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

                    1 Antwort Letzte Antwort
                    0
                    • HomoranH Homoran

                      @codierknecht sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:

                      @homoran sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:

                      auf Aktualisierung, nicht auf Änderung!
                      wie immer das mit js geht

                      on({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT", change: "ne"}, async function (obj) {
                      }
                      

                      sischer datt?
                      ist ne nicht not equal, also Änderung?

                      CodierknechtC Offline
                      CodierknechtC Offline
                      Codierknecht
                      Developer Most Active
                      schrieb am zuletzt editiert von Codierknecht
                      #12

                      @homoran sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:

                      ist ne nicht not equal, also Änderung?

                      Natürlich - Du hast natürlich Recht.
                      Muss mal endlich die Tomaten von den Augen kratzen 👓 👓 🍅 🍅

                      Das hier wäre "Änderung":

                      on({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT", change: "any"}, async function (obj) {
                      }
                      

                      Wobei man in diesem Fall das change auch komplett weglassen kann. Also so wie @dtp es schon herausgefunden hat.

                      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                      Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                      HmIP|ZigBee|Tasmota|Unifi
                      Zabbix Certified Specialist
                      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                      D 1 Antwort Letzte Antwort
                      0
                      • CodierknechtC Codierknecht

                        @homoran sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:

                        ist ne nicht not equal, also Änderung?

                        Natürlich - Du hast natürlich Recht.
                        Muss mal endlich die Tomaten von den Augen kratzen 👓 👓 🍅 🍅

                        Das hier wäre "Änderung":

                        on({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT", change: "any"}, async function (obj) {
                        }
                        

                        Wobei man in diesem Fall das change auch komplett weglassen kann. Also so wie @dtp es schon herausgefunden hat.

                        D Offline
                        D Offline
                        dtp
                        schrieb am zuletzt editiert von dtp
                        #13

                        So, hier dann mal mein Skript zum Ein- und Ausschalten sowie Hoch- und Runterdimmen einer Tradfri-Leuchte mit einem HomeMatic-Taster.

                        var triggerID = "hm-rpc.1.00019F299738F8"; // ID des auslösenden Tasters
                        var channelUp = 1; // Kanal des auslösenden Tasters zum Hochschalten
                        var channelDown = 2; // Kanal des auslösenden Tasters zum Runterschalten
                        var loadID = "tradfri.0.L-65547.lightbulb.brightness"; // Datenpunkt des zu steuernden Verbrauchers
                        
                        var step = 5; // Schrittweite beim Dimmen in Prozent
                        var speed = 0.5; // Dauer einen einzelnen Dimmschrittes in Sekunden
                        var count = 0; // Zähler (sollte immer auf 0 initialisiert werden)
                        var IntervalId;
                        
                        // kurze Tasterbetätigung zum Einschalten
                        on({id: triggerID+"."+channelUp+".PRESS_SHORT"}, async function (obj) {
                          setState(loadID, 100);
                          count = 100 / step;
                        });
                        
                        // kurze Tasterbetätigung zum Ausschalten
                        on({id: triggerID+"."+channelDown+".PRESS_SHORT"}, async function (obj) {
                          setState(loadID, 0);
                          count = 0;
                        });
                        
                        // lange Tasterbetätigung zum Hochdimmen
                        on({id: triggerID+"."+channelUp+".PRESS_LONG_START"}, async function (obj) {
                          IntervalId = setInterval(function(){
                            count++;
                            log((count * step).toString());
                            setState(loadID, count * step);
                            if(count * step > 99) clearInterval(IntervalId);
                          }, speed * 1000);
                        });
                        on({id: triggerID+"."+channelUp+".PRESS_LONG_RELEASE"}, async function (obj) {
                          clearInterval(IntervalId); 
                        });
                        
                        // lange Tasterbetätigung zum Runterdimmen
                        on({id: triggerID+"."+channelDown+".PRESS_LONG_START"}, async function (obj) {
                          IntervalId = setInterval(function(){
                            count--;
                            log((count * step).toString());
                            setState(loadID, count * step);
                            if(count * step < 1) clearInterval(IntervalId);
                          }, speed * 1000);
                        });
                        on({id: triggerID+"."+channelDown+".PRESS_LONG_RELEASE"}, async function (obj) {
                          clearInterval(IntervalId); 
                        });
                        

                        Das Skript funktioniert im Prinzip auch für Rollos, allerdings fehlt da noch eine Funktion, um das Rollo bei einem kurzen Tastendruck wieder an der gewünschten Position durch einen erneuten kurzen Tastendruck stoppen zu können. Zudem muss man den Wert für "speed" und "step" an die Fahrzeit des Rollos anpassen. Bei meinen Rollos von Ikea hat sich z.B. ein Wert von 0,3 Sekunden mit einer Schrittweite von 1 als ganz gut erwiesen.

                        ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

                        D 1 Antwort Letzte Antwort
                        0
                        • D dtp

                          So, hier dann mal mein Skript zum Ein- und Ausschalten sowie Hoch- und Runterdimmen einer Tradfri-Leuchte mit einem HomeMatic-Taster.

                          var triggerID = "hm-rpc.1.00019F299738F8"; // ID des auslösenden Tasters
                          var channelUp = 1; // Kanal des auslösenden Tasters zum Hochschalten
                          var channelDown = 2; // Kanal des auslösenden Tasters zum Runterschalten
                          var loadID = "tradfri.0.L-65547.lightbulb.brightness"; // Datenpunkt des zu steuernden Verbrauchers
                          
                          var step = 5; // Schrittweite beim Dimmen in Prozent
                          var speed = 0.5; // Dauer einen einzelnen Dimmschrittes in Sekunden
                          var count = 0; // Zähler (sollte immer auf 0 initialisiert werden)
                          var IntervalId;
                          
                          // kurze Tasterbetätigung zum Einschalten
                          on({id: triggerID+"."+channelUp+".PRESS_SHORT"}, async function (obj) {
                            setState(loadID, 100);
                            count = 100 / step;
                          });
                          
                          // kurze Tasterbetätigung zum Ausschalten
                          on({id: triggerID+"."+channelDown+".PRESS_SHORT"}, async function (obj) {
                            setState(loadID, 0);
                            count = 0;
                          });
                          
                          // lange Tasterbetätigung zum Hochdimmen
                          on({id: triggerID+"."+channelUp+".PRESS_LONG_START"}, async function (obj) {
                            IntervalId = setInterval(function(){
                              count++;
                              log((count * step).toString());
                              setState(loadID, count * step);
                              if(count * step > 99) clearInterval(IntervalId);
                            }, speed * 1000);
                          });
                          on({id: triggerID+"."+channelUp+".PRESS_LONG_RELEASE"}, async function (obj) {
                            clearInterval(IntervalId); 
                          });
                          
                          // lange Tasterbetätigung zum Runterdimmen
                          on({id: triggerID+"."+channelDown+".PRESS_LONG_START"}, async function (obj) {
                            IntervalId = setInterval(function(){
                              count--;
                              log((count * step).toString());
                              setState(loadID, count * step);
                              if(count * step < 1) clearInterval(IntervalId);
                            }, speed * 1000);
                          });
                          on({id: triggerID+"."+channelDown+".PRESS_LONG_RELEASE"}, async function (obj) {
                            clearInterval(IntervalId); 
                          });
                          

                          Das Skript funktioniert im Prinzip auch für Rollos, allerdings fehlt da noch eine Funktion, um das Rollo bei einem kurzen Tastendruck wieder an der gewünschten Position durch einen erneuten kurzen Tastendruck stoppen zu können. Zudem muss man den Wert für "speed" und "step" an die Fahrzeit des Rollos anpassen. Bei meinen Rollos von Ikea hat sich z.B. ein Wert von 0,3 Sekunden mit einer Schrittweite von 1 als ganz gut erwiesen.

                          D Offline
                          D Offline
                          dtp
                          schrieb am zuletzt editiert von dtp
                          #14

                          Und nun habe ich auch eine Lösung für die Rollos gefunden. Das folgende Skript steuert mit einem HMIP-Wandtaster zwei Rollos gleichzeitig.

                          var triggerID = 'hm-rpc.1.000B5D8995CA16'; // ID des auslösenden Tasters
                          var channelUp = 5; // Kanal des auslösenden Tasters zum Hochfahren
                          var channelDown = 6; // Kanal des auslösenden Tasters zum Runterfahren
                          var loadID1 = "tradfri.0.B-65540"; // ID eines ersten zu steuernden Rollos
                          var loadID2 = "tradfri.0.B-65544"; // ID eines zweiten zu steuernden Rollos
                          
                          var step = 1; // Schrittweite für das Hoch- und Runterfahren in Prozent
                          var speed = 0.3; // Dauer eines einzelnen Schritts in Sekunden
                          var count = 0; // Zähler (sollte immer auf 0 initialisiert werden)
                          var IntervalId;
                          
                          // kurze Tasterbetätigung zum Hochfahren und Stoppen im Wechsel
                          on({id: triggerID+"."+channelUp+".PRESS_SHORT", change: "eq", val: true}, async function (obj) {
                            setState(loadID1+".blind.position", 100); setState(loadID2+".blind.position", 100);
                            count = 100 / step;
                            setState(triggerID+"."+channelUp+".PRESS_SHORT", false);
                          });
                          on({id: triggerID+"."+channelUp+".PRESS_SHORT", change: "ne", val: true}, async function (obj) {
                            setState(loadID1+".blind.stop", true); setState(loadID2+".blind.stop", true); 
                            count = getState(loadID1+".blind.position").val / step;
                          });
                          
                          // kurze Tasterbetätigung zum Runterfahren und Stoppen im Wechsel
                          on({id: triggerID+"."+channelDown+".PRESS_SHORT", change: "eq", val: true}, async function (obj) {
                            setState(loadID1+".blind.position", 0); setState(loadID2+".blind.position", 0);
                            count = 0;
                            setState(triggerID+"."+channelDown+".PRESS_SHORT", false);
                          });
                          on({id: triggerID+"."+channelDown+".PRESS_SHORT", change: "ne", val: true}, async function (obj) {
                            setState(loadID1+".blind.stop", true); setState(loadID2+".blind.stop", true); 
                            count = getState(loadID1+".blind.position").val / step;
                          });
                          
                          // lange Tasterbetätigung zum Hochfahren
                          on({id: triggerID+"."+channelUp+".PRESS_LONG_START"}, async function (obj) {
                            IntervalId = setInterval(function(){
                              count++;
                              log((count * step).toString());
                              setState(loadID1+".blind.position", count * step); 
                              setState(loadID2+".blind.position", count * step);
                              if(count * step > 99) clearInterval(IntervalId);
                            }, speed * 1000);
                          });
                          on({id: triggerID+"."+channelUp+".PRESS_LONG_RELEASE"}, async function (obj) {
                            clearInterval(IntervalId);
                          });
                          
                          // lange Tasterbetätigung zum Runterfahren
                          on({id: triggerID+"."+channelDown+".PRESS_LONG_START"}, async function (obj) {
                            IntervalId = setInterval(function(){
                              count--;
                              log((count * step).toString());
                              setState(loadID1+".blind.position", count * step); 
                              setState(loadID2+".blind.position", count * step);
                              if(count * step < 1) clearInterval(IntervalId);
                            }, speed * 1000);
                          });
                          on({id: triggerID+"."+channelDown+".PRESS_LONG_RELEASE"}, async function (obj) {
                            clearInterval(IntervalId); 
                          });
                          

                          Dabei ist es folgendermaßen über die zwei Tasterkanäle des HMIP-Wandtasters gelöst:

                          • Eine kurze Betätigung von Taste 1 fährt das Rollo hoch. Drückt man Taste 1 noch mal kurz, wird das Rollo gestoppt.
                          • Eine kurze Betätigung von Taste 2 fährt das Rollo runter. Drückt man Taste 2 noch mal kurz, wird das Rollo gestoppt.
                          • Eine lange Betätigung von Taste 1 fährt das Rollo so lange hoch bis man Taste 1 wieder loslässt.
                          • Eine lange Betätigung von Taste 2 fährt das Rollo so lange runter bis man Taste 2 wieder loslässt.

                          Zur richtigen Einstellung von "speed" misst man einfach die Dauer, die das Rollo für eine vollständige Fahrt benötigt und teilt die gemessene Zeit dann durch 100/"step". Beispiel: braucht das Rollo 30 Sekunden für eine vollständige Fahrt und hat man "step" = 1 gesetzt, so ergibt sich für "speed" ein Wert von 0.3. Ich empfehle, die Schrittweite

                          ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

                          D 1 Antwort Letzte Antwort
                          0
                          • D dtp

                            Und nun habe ich auch eine Lösung für die Rollos gefunden. Das folgende Skript steuert mit einem HMIP-Wandtaster zwei Rollos gleichzeitig.

                            var triggerID = 'hm-rpc.1.000B5D8995CA16'; // ID des auslösenden Tasters
                            var channelUp = 5; // Kanal des auslösenden Tasters zum Hochfahren
                            var channelDown = 6; // Kanal des auslösenden Tasters zum Runterfahren
                            var loadID1 = "tradfri.0.B-65540"; // ID eines ersten zu steuernden Rollos
                            var loadID2 = "tradfri.0.B-65544"; // ID eines zweiten zu steuernden Rollos
                            
                            var step = 1; // Schrittweite für das Hoch- und Runterfahren in Prozent
                            var speed = 0.3; // Dauer eines einzelnen Schritts in Sekunden
                            var count = 0; // Zähler (sollte immer auf 0 initialisiert werden)
                            var IntervalId;
                            
                            // kurze Tasterbetätigung zum Hochfahren und Stoppen im Wechsel
                            on({id: triggerID+"."+channelUp+".PRESS_SHORT", change: "eq", val: true}, async function (obj) {
                              setState(loadID1+".blind.position", 100); setState(loadID2+".blind.position", 100);
                              count = 100 / step;
                              setState(triggerID+"."+channelUp+".PRESS_SHORT", false);
                            });
                            on({id: triggerID+"."+channelUp+".PRESS_SHORT", change: "ne", val: true}, async function (obj) {
                              setState(loadID1+".blind.stop", true); setState(loadID2+".blind.stop", true); 
                              count = getState(loadID1+".blind.position").val / step;
                            });
                            
                            // kurze Tasterbetätigung zum Runterfahren und Stoppen im Wechsel
                            on({id: triggerID+"."+channelDown+".PRESS_SHORT", change: "eq", val: true}, async function (obj) {
                              setState(loadID1+".blind.position", 0); setState(loadID2+".blind.position", 0);
                              count = 0;
                              setState(triggerID+"."+channelDown+".PRESS_SHORT", false);
                            });
                            on({id: triggerID+"."+channelDown+".PRESS_SHORT", change: "ne", val: true}, async function (obj) {
                              setState(loadID1+".blind.stop", true); setState(loadID2+".blind.stop", true); 
                              count = getState(loadID1+".blind.position").val / step;
                            });
                            
                            // lange Tasterbetätigung zum Hochfahren
                            on({id: triggerID+"."+channelUp+".PRESS_LONG_START"}, async function (obj) {
                              IntervalId = setInterval(function(){
                                count++;
                                log((count * step).toString());
                                setState(loadID1+".blind.position", count * step); 
                                setState(loadID2+".blind.position", count * step);
                                if(count * step > 99) clearInterval(IntervalId);
                              }, speed * 1000);
                            });
                            on({id: triggerID+"."+channelUp+".PRESS_LONG_RELEASE"}, async function (obj) {
                              clearInterval(IntervalId);
                            });
                            
                            // lange Tasterbetätigung zum Runterfahren
                            on({id: triggerID+"."+channelDown+".PRESS_LONG_START"}, async function (obj) {
                              IntervalId = setInterval(function(){
                                count--;
                                log((count * step).toString());
                                setState(loadID1+".blind.position", count * step); 
                                setState(loadID2+".blind.position", count * step);
                                if(count * step < 1) clearInterval(IntervalId);
                              }, speed * 1000);
                            });
                            on({id: triggerID+"."+channelDown+".PRESS_LONG_RELEASE"}, async function (obj) {
                              clearInterval(IntervalId); 
                            });
                            

                            Dabei ist es folgendermaßen über die zwei Tasterkanäle des HMIP-Wandtasters gelöst:

                            • Eine kurze Betätigung von Taste 1 fährt das Rollo hoch. Drückt man Taste 1 noch mal kurz, wird das Rollo gestoppt.
                            • Eine kurze Betätigung von Taste 2 fährt das Rollo runter. Drückt man Taste 2 noch mal kurz, wird das Rollo gestoppt.
                            • Eine lange Betätigung von Taste 1 fährt das Rollo so lange hoch bis man Taste 1 wieder loslässt.
                            • Eine lange Betätigung von Taste 2 fährt das Rollo so lange runter bis man Taste 2 wieder loslässt.

                            Zur richtigen Einstellung von "speed" misst man einfach die Dauer, die das Rollo für eine vollständige Fahrt benötigt und teilt die gemessene Zeit dann durch 100/"step". Beispiel: braucht das Rollo 30 Sekunden für eine vollständige Fahrt und hat man "step" = 1 gesetzt, so ergibt sich für "speed" ein Wert von 0.3. Ich empfehle, die Schrittweite

                            D Offline
                            D Offline
                            dtp
                            schrieb am zuletzt editiert von
                            #15

                            Hallo,

                            ich musste feststellen, dass die Zeile

                            setState(triggerID+"."+channelUp+".PRESS_SHORT", false);
                            

                            zu einer Fehlermeldung führte:

                            2023-01-20_19h40_04.jpg

                            Das Skript funktioniert aber, weil der Datenpunkt trotzdem mit dem Wert "false" beschrieben wird. Er kann halt nur nicht an den Taster gesendet werden. Jetzt meine Frage. Kann man diese Fehlermeldung unterdrücken durch einen Zusatzparameter?

                            Wenn nicht, dann muss ich wohl mit einer Zusatzvariablen arbeiten.

                            ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

                            paul53P 1 Antwort Letzte Antwort
                            0
                            • D dtp

                              Hallo,

                              ich musste feststellen, dass die Zeile

                              setState(triggerID+"."+channelUp+".PRESS_SHORT", false);
                              

                              zu einer Fehlermeldung führte:

                              2023-01-20_19h40_04.jpg

                              Das Skript funktioniert aber, weil der Datenpunkt trotzdem mit dem Wert "false" beschrieben wird. Er kann halt nur nicht an den Taster gesendet werden. Jetzt meine Frage. Kann man diese Fehlermeldung unterdrücken durch einen Zusatzparameter?

                              Wenn nicht, dann muss ich wohl mit einer Zusatzvariablen arbeiten.

                              paul53P Offline
                              paul53P Offline
                              paul53
                              schrieb am zuletzt editiert von paul53
                              #16

                              @dtp sagte: Kann man diese Fehlermeldung unterdrücken durch einen Zusatzparameter?

                              Lass setState(...PRESS_SHORT, false) weg, denn HomeMatic-Taster haben immer den Wert true und sind nicht umsonst "read only". Bei Tastenbetätigung wird nur der Zeitstempel aktualisiert.

                              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                              Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB

                              D 1 Antwort Letzte Antwort
                              0
                              • paul53P paul53

                                @dtp sagte: Kann man diese Fehlermeldung unterdrücken durch einen Zusatzparameter?

                                Lass setState(...PRESS_SHORT, false) weg, denn HomeMatic-Taster haben immer den Wert true und sind nicht umsonst "read only". Bei Tastenbetätigung wird nur der Zeitstempel aktualisiert.

                                D Offline
                                D Offline
                                dtp
                                schrieb am zuletzt editiert von dtp
                                #17

                                @paul53 sagte in Ikea Lampen und Rollos mit HomeMatic Wandtaster steuern:

                                Lass setState(...PRESS_SHORT, false) weg

                                Das geht leider nicht so einfach, weil ich dann nicht mit einem kurzen Tastendruck zwischen einen Fahr- und Stoppbefehl toggeln kann. Aber ich habe es jetzt mit einer Hilfsvariablen gelöst.

                                //Skript zum Steuern eines nicht HM-Kompatiblen Beschattungsgeräts mittels HM-Tasterbetätigung
                                //Autor: dtp, Version: 1.0 
                                var triggerId = 'hm-rpc.1.000B5D8995CA16'; // ID des auslösenden Tasters
                                var channelUp = 5; // Kanal des auslösenden Tasters zum Hochfahren
                                var channelDown = 6; // Kanal des auslösenden Tasters zum Runterfahren
                                var blindsIdList = ['tradfri.0.B-65540','tradfri.0.B-65544']; // ID-Liste der zu steuernden Rollos
                                
                                var step = 1; // Schrittweite für das Hoch- und Runterfahren in Prozent
                                var speed = 0.3; // Dauer eines einzelnen Schritts in Sekunden
                                
                                var auxTriggerId = 'javascript.0.variables.blindsAuxLivingroom'; // Hilfsvariable für die kurze Tasterbetätigung
                                var auxTriggerName = 'Hilfsvariable Wohnzimmer Wandtaster Rollos'; // Name der Hilfsvariablen 
                                
                                //weitere zu deklariende Variablen
                                var IntervalId; var i; var count = 1;
                                
                                // Hilfsvariable für Taster anlegen 
                                if(!existsState(auxTriggerId)){
                                  createState(auxTriggerId, true, {name: auxTriggerName,  type: 'boolean', role: 'value'}, function () {}); 
                                } else{setState(auxTriggerId, true);}
                                
                                // kurze Tasterbetätigung zum Hochfahren und Stoppen im Wechsel
                                on({id: triggerId+"."+channelUp+".PRESS_SHORT"}, async function (obj) {
                                  if(getState(auxTriggerId).val){
                                    for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", 100);
                                    count = 100 / step;
                                    //log('go up');
                                    setState(auxTriggerId, false);
                                  }
                                  else{
                                    for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.stop", true);
                                    count = getState(blindsIdList[1]+".blind.position").val / step;
                                    //log('stopp');
                                    setState(auxTriggerId, true);
                                  }
                                });
                                
                                // kurze Tasterbetätigung zum Runterfahren und Stoppen im Wechsel
                                on({id: triggerId+"."+channelDown+".PRESS_SHORT"}, async function (obj) {
                                  if(getState(auxTriggerId).val){
                                    for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", 0);
                                    count = 0;
                                    //log('go down');
                                    setState(auxTriggerId, false);
                                  }
                                  else{
                                    for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.stop", true);
                                    count = getState(blindsIdList[1]+".blind.position").val / step;
                                    //log('stopp');
                                    setState(auxTriggerId, true);
                                  }
                                });
                                
                                // lange Tasterbetätigung zum Hochfahren
                                on({id: triggerId+"."+channelUp+".PRESS_LONG_START"}, async function (obj) {
                                  IntervalId = setInterval(function(){
                                    count++;
                                    //log((count * step).toString());
                                    for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", count * step);
                                    if(count * step > 99) clearInterval(IntervalId);
                                  }, speed * 1000);
                                });
                                on({id: triggerId+"."+channelUp+".PRESS_LONG_RELEASE"}, async function (obj) {
                                  clearInterval(IntervalId);
                                });
                                
                                // lange Tasterbetätigung zum Runterfahren
                                on({id: triggerId+"."+channelDown+".PRESS_LONG_START"}, async function (obj) {
                                  IntervalId = setInterval(function(){
                                    count--;
                                    //log((count * step).toString());
                                    for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", count * step);
                                    if(count * step < 1) clearInterval(IntervalId);
                                  }, speed * 1000);
                                });
                                on({id: triggerId+"."+channelDown+".PRESS_LONG_RELEASE"}, async function (obj) {
                                  clearInterval(IntervalId); 
                                });
                                

                                Nicht ganz so schön ist, dass bei langem Tastendruck die Rollos gelegentlich etwas ruckeln, wenn mehrere quasi als Gruppe angesteuert werden sollen. Mit einem einzigen Rollo läuft es dagegen smooth.

                                ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

                                D 1 Antwort Letzte Antwort
                                0
                                • D dtp

                                  @paul53 sagte in Ikea Lampen und Rollos mit HomeMatic Wandtaster steuern:

                                  Lass setState(...PRESS_SHORT, false) weg

                                  Das geht leider nicht so einfach, weil ich dann nicht mit einem kurzen Tastendruck zwischen einen Fahr- und Stoppbefehl toggeln kann. Aber ich habe es jetzt mit einer Hilfsvariablen gelöst.

                                  //Skript zum Steuern eines nicht HM-Kompatiblen Beschattungsgeräts mittels HM-Tasterbetätigung
                                  //Autor: dtp, Version: 1.0 
                                  var triggerId = 'hm-rpc.1.000B5D8995CA16'; // ID des auslösenden Tasters
                                  var channelUp = 5; // Kanal des auslösenden Tasters zum Hochfahren
                                  var channelDown = 6; // Kanal des auslösenden Tasters zum Runterfahren
                                  var blindsIdList = ['tradfri.0.B-65540','tradfri.0.B-65544']; // ID-Liste der zu steuernden Rollos
                                  
                                  var step = 1; // Schrittweite für das Hoch- und Runterfahren in Prozent
                                  var speed = 0.3; // Dauer eines einzelnen Schritts in Sekunden
                                  
                                  var auxTriggerId = 'javascript.0.variables.blindsAuxLivingroom'; // Hilfsvariable für die kurze Tasterbetätigung
                                  var auxTriggerName = 'Hilfsvariable Wohnzimmer Wandtaster Rollos'; // Name der Hilfsvariablen 
                                  
                                  //weitere zu deklariende Variablen
                                  var IntervalId; var i; var count = 1;
                                  
                                  // Hilfsvariable für Taster anlegen 
                                  if(!existsState(auxTriggerId)){
                                    createState(auxTriggerId, true, {name: auxTriggerName,  type: 'boolean', role: 'value'}, function () {}); 
                                  } else{setState(auxTriggerId, true);}
                                  
                                  // kurze Tasterbetätigung zum Hochfahren und Stoppen im Wechsel
                                  on({id: triggerId+"."+channelUp+".PRESS_SHORT"}, async function (obj) {
                                    if(getState(auxTriggerId).val){
                                      for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", 100);
                                      count = 100 / step;
                                      //log('go up');
                                      setState(auxTriggerId, false);
                                    }
                                    else{
                                      for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.stop", true);
                                      count = getState(blindsIdList[1]+".blind.position").val / step;
                                      //log('stopp');
                                      setState(auxTriggerId, true);
                                    }
                                  });
                                  
                                  // kurze Tasterbetätigung zum Runterfahren und Stoppen im Wechsel
                                  on({id: triggerId+"."+channelDown+".PRESS_SHORT"}, async function (obj) {
                                    if(getState(auxTriggerId).val){
                                      for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", 0);
                                      count = 0;
                                      //log('go down');
                                      setState(auxTriggerId, false);
                                    }
                                    else{
                                      for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.stop", true);
                                      count = getState(blindsIdList[1]+".blind.position").val / step;
                                      //log('stopp');
                                      setState(auxTriggerId, true);
                                    }
                                  });
                                  
                                  // lange Tasterbetätigung zum Hochfahren
                                  on({id: triggerId+"."+channelUp+".PRESS_LONG_START"}, async function (obj) {
                                    IntervalId = setInterval(function(){
                                      count++;
                                      //log((count * step).toString());
                                      for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", count * step);
                                      if(count * step > 99) clearInterval(IntervalId);
                                    }, speed * 1000);
                                  });
                                  on({id: triggerId+"."+channelUp+".PRESS_LONG_RELEASE"}, async function (obj) {
                                    clearInterval(IntervalId);
                                  });
                                  
                                  // lange Tasterbetätigung zum Runterfahren
                                  on({id: triggerId+"."+channelDown+".PRESS_LONG_START"}, async function (obj) {
                                    IntervalId = setInterval(function(){
                                      count--;
                                      //log((count * step).toString());
                                      for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", count * step);
                                      if(count * step < 1) clearInterval(IntervalId);
                                    }, speed * 1000);
                                  });
                                  on({id: triggerId+"."+channelDown+".PRESS_LONG_RELEASE"}, async function (obj) {
                                    clearInterval(IntervalId); 
                                  });
                                  

                                  Nicht ganz so schön ist, dass bei langem Tastendruck die Rollos gelegentlich etwas ruckeln, wenn mehrere quasi als Gruppe angesteuert werden sollen. Mit einem einzigen Rollo läuft es dagegen smooth.

                                  D Offline
                                  D Offline
                                  dtp
                                  schrieb am zuletzt editiert von
                                  #18

                                  Um doppeltes Schreiben zu vermeiden, habe ich im HomeMatic-Forum einen kleinen Thread zu dem Projekt gestartet. Alles weitere dann dort (klick!)

                                  ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

                                  D 1 Antwort Letzte Antwort
                                  0
                                  • D dtp

                                    Um doppeltes Schreiben zu vermeiden, habe ich im HomeMatic-Forum einen kleinen Thread zu dem Projekt gestartet. Alles weitere dann dort (klick!)

                                    D Offline
                                    D Offline
                                    dtp
                                    schrieb am zuletzt editiert von
                                    #19

                                    Jetzt ist mir in Verbindung mit den Skripten noch ein kleines Problem aufgefallen. Starte ich die entsprechende Instanz des hm-rpc-Adapters neu, dann werden alle Skripte getriggert. Sprich, die Leuchten gehen an und die Rollos fahren runter. Wie kann ich das vermeiden?

                                    ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

                                    1 Antwort Letzte Antwort
                                    0

                                    Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                                    Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

                                    Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                                    Registrieren Anmelden
                                    Antworten
                                    • In einem neuen Thema antworten
                                    Anmelden zum Antworten
                                    • Älteste zuerst
                                    • Neuste zuerst
                                    • Meiste Stimmen


                                    Support us

                                    ioBroker
                                    Community Adapters
                                    Donate
                                    FAQ Cloud / IOT
                                    HowTo: Node.js-Update
                                    HowTo: Backup/Restore
                                    Downloads
                                    BLOG

                                    378

                                    Online

                                    32.9k

                                    Benutzer

                                    83.0k

                                    Themen

                                    1.3m

                                    Beiträge
                                    Community
                                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                    ioBroker Community 2014-2025
                                    logo
                                    • Anmelden

                                    • Du hast noch kein Konto? Registrieren

                                    • Anmelden oder registrieren, um zu suchen
                                    • Erster Beitrag
                                      Letzter Beitrag
                                    0
                                    • Home
                                    • Aktuell
                                    • Tags
                                    • Ungelesen 0
                                    • Kategorien
                                    • Unreplied
                                    • Beliebt
                                    • GitHub
                                    • Docu
                                    • Hilfe