Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

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

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [gelöst] setState wiederholen, falls "nicht erfolgreich" (Zigbee Lampe schalten, ack)

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.1k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    929

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

[gelöst] setState wiederholen, falls "nicht erfolgreich" (Zigbee Lampe schalten, ack)

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
6 Beiträge 3 Kommentatoren 795 Aufrufe 5 Watching
  • Ä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.
  • H Offline
    H Offline
    haiperf
    schrieb am zuletzt editiert von haiperf
    #1

    Hallo zusammen,
    ich habe eine Tradfri Fernbedienung und eine Tradfri RGB LED Lampe, die ich über den Zigbee Adapter in den ioBroker eingebunden habe. Die Schaltlogik realisiere ich über ein JavaScript.
    Nun habe ich das Problem, dass die Kommandos von der Fernbedienung zwar immer bei ioBroker ankommen und die entsprechenden Funktionen im Script ausgeführt werden, aber leider die Tradfri Lampe nicht immer alles zuverlässig umsetzt wie kommandiert, vermutlich wegen einer nicht ganz einwandfreien Verbindung zum cc2531 Stick. Wenn das Schalten nicht funktioniert, kann ich das feststellen, da der Acknowlege ausbleibt. Ich würde es dann gerne ein paar mal erneut versuchen, bis es erfolgreich war. Ich weiß leider nur nicht so recht, wie man das geschickt macht. Manchmal klappt es, wenn ich einfach erneut setState aufrufe, manchmal aber auch nicht sofort.

    on({id: "zigbee.0.xxx.toggle", change: "gt"}, function (obj) {
        if (getState('zigbee.0.yyy.state').val === true) { 
            setState('zigbee.0.yyy.state', false);
    
            if(getState('zigbee.0.yyy.state').ack === false) {
                console.log("no ack");
                
                 //??? 
                //setState('zigbee.0.yyy.state', false);
                //getState('zigbee.0.yyy.state').ack;
            }
         }
    });
    

    Gibt es da eine elegante Methode? Oder gibt es da sogar einen noch ganz anderen Weg?
    Danke!

    paul53P 1 Antwort Letzte Antwort
    0
    • H haiperf

      Hallo zusammen,
      ich habe eine Tradfri Fernbedienung und eine Tradfri RGB LED Lampe, die ich über den Zigbee Adapter in den ioBroker eingebunden habe. Die Schaltlogik realisiere ich über ein JavaScript.
      Nun habe ich das Problem, dass die Kommandos von der Fernbedienung zwar immer bei ioBroker ankommen und die entsprechenden Funktionen im Script ausgeführt werden, aber leider die Tradfri Lampe nicht immer alles zuverlässig umsetzt wie kommandiert, vermutlich wegen einer nicht ganz einwandfreien Verbindung zum cc2531 Stick. Wenn das Schalten nicht funktioniert, kann ich das feststellen, da der Acknowlege ausbleibt. Ich würde es dann gerne ein paar mal erneut versuchen, bis es erfolgreich war. Ich weiß leider nur nicht so recht, wie man das geschickt macht. Manchmal klappt es, wenn ich einfach erneut setState aufrufe, manchmal aber auch nicht sofort.

      on({id: "zigbee.0.xxx.toggle", change: "gt"}, function (obj) {
          if (getState('zigbee.0.yyy.state').val === true) { 
              setState('zigbee.0.yyy.state', false);
      
              if(getState('zigbee.0.yyy.state').ack === false) {
                  console.log("no ack");
                  
                   //??? 
                  //setState('zigbee.0.yyy.state', false);
                  //getState('zigbee.0.yyy.state').ack;
              }
           }
      });
      

      Gibt es da eine elegante Methode? Oder gibt es da sogar einen noch ganz anderen Weg?
      Danke!

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

      @haiperf sagte:

      da der Acknowlege ausbleibt. Ich würde es dann gerne ein paar mal erneut versuchen, bis es erfolgreich war.

      Dann sollte die Wiederholung mit zeitlichem Abstand erfolgen (Intervall). Ein Trigger auf den Datenpunkt mit ack: true muss das Intervall beenden. Allerdings sollte es es auch durch einen Zähler beendet werden, damit nicht ewig gesendet wird, wenn das Acknowlege ausbleibt.

      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 Antwort Letzte Antwort
      0
      • H Offline
        H Offline
        haiperf
        schrieb am zuletzt editiert von
        #3

        Super, das war ein guter Hinweis. Danke.

        Habe mir nun folgende Funktion gebastelt, es scheint bislang zu funktionieren:

        function setStateAck(objId, value) {
            var repeatCount = 1;
            var repeatInterval = setInterval(function() { 
                // alle 200 Millisekunden ausführen
        
                //console.log("try " + repeatCount); 
                setState(objId, value);
                
                repeatCount++;
                if(getState(objId).ack === true || repeatCount > 10) {
                    clearInterval(repeatInterval);
                }
            }, 200);
        } 
        

        Vielleicht kann das ja jemand so oder so ähnlich auch mal gebrauchen.

        Habe es jetzt zwar ohne Trigger umgesetzt, aber ich denke, das sollte so genau so gut gehen, oder?

        paul53P D 2 Antworten Letzte Antwort
        0
        • H Offline
          H Offline
          haiperf
          schrieb am zuletzt editiert von
          #4

          Und dazu noch:

          function setStateDelayedAck(objId, value, delay) {
              setTimeout(function() { setStateAck(objId,value); }, delay);
          }
          

          In der Log Ausgabe kann ich sehen, dass teilweise bis zu 6 Versuche benötigt werden, aber bislang funktioniert es so immer.

          1 Antwort Letzte Antwort
          0
          • H haiperf

            Super, das war ein guter Hinweis. Danke.

            Habe mir nun folgende Funktion gebastelt, es scheint bislang zu funktionieren:

            function setStateAck(objId, value) {
                var repeatCount = 1;
                var repeatInterval = setInterval(function() { 
                    // alle 200 Millisekunden ausführen
            
                    //console.log("try " + repeatCount); 
                    setState(objId, value);
                    
                    repeatCount++;
                    if(getState(objId).ack === true || repeatCount > 10) {
                        clearInterval(repeatInterval);
                    }
                }, 200);
            } 
            

            Vielleicht kann das ja jemand so oder so ähnlich auch mal gebrauchen.

            Habe es jetzt zwar ohne Trigger umgesetzt, aber ich denke, das sollte so genau so gut gehen, oder?

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

            @haiperf sagte:

            das sollte so genau so gut gehen, oder?

            Ja.

            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 Antwort Letzte Antwort
            0
            • H haiperf

              Super, das war ein guter Hinweis. Danke.

              Habe mir nun folgende Funktion gebastelt, es scheint bislang zu funktionieren:

              function setStateAck(objId, value) {
                  var repeatCount = 1;
                  var repeatInterval = setInterval(function() { 
                      // alle 200 Millisekunden ausführen
              
                      //console.log("try " + repeatCount); 
                      setState(objId, value);
                      
                      repeatCount++;
                      if(getState(objId).ack === true || repeatCount > 10) {
                          clearInterval(repeatInterval);
                      }
                  }, 200);
              } 
              

              Vielleicht kann das ja jemand so oder so ähnlich auch mal gebrauchen.

              Habe es jetzt zwar ohne Trigger umgesetzt, aber ich denke, das sollte so genau so gut gehen, oder?

              D Offline
              D Offline
              darkiop
              Most Active
              schrieb am zuletzt editiert von
              #6

              @haiperf Danke dafür, denke das kann ich auch gebrauchen :)

              Proxmox-ioBroker-Redis-HA Doku: https://forum.iobroker.net/topic/47478/dokumentation-einer-proxmox-iobroker-redis-ha-umgebung

              1 Antwort Letzte Antwort
              0
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              737

              Online

              32.6k

              Benutzer

              82.2k

              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