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

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. SetState() mit Acknowledge?

NEWS

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

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

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

SetState() mit Acknowledge?

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
12 Beiträge 5 Kommentatoren 16.5k Aufrufe
  • Ä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.
  • ruhr70R Offline
    ruhr70R Offline
    ruhr70
    schrieb am zuletzt editiert von
    #1

    Eine Verständnisfrage.

            // Set acknowledged value
            setState('counter', 1 + getState('counter'), true/*ack*/);
    
            // Or to set unacknowledged command
            setState('adapter.0.device.channel.actor', true);
    
    

    Wann nutze ich ein setState() mit Acknowledge und wann ohne?

    Adapter: Fritzbox, Unify Circuit
    Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

    1 Antwort Letzte Antwort
    0
    • BluefoxB Offline
      BluefoxB Offline
      Bluefox
      schrieb am zuletzt editiert von
      #2

      @ruhr70:

      Eine Verständnisfrage.

              // Set acknowledged value
              setState('counter', 1 + getState('counter'), true/*ack*/);
      
              // Or to set unacknowledged command
              setState('adapter.0.device.channel.actor', true);
      
      

      Wann nutze ich ein setState() mit Acknowledge und wann ohne? `
      Wenn von aus dieser Beschreibung nicht klar wird:

      https://github.com/ioBroker/ioBroker/wi … d-statuses

      Frage, ich versuche zu konkretisieren.

      1 Antwort Letzte Antwort
      0
      • ruhr70R Offline
        ruhr70R Offline
        ruhr70
        schrieb am zuletzt editiert von
        #3

        OK, die Doku… hätte man lesen können ;-)

        Danke für den Hinweis.

        Habe es trotzdem nicht ganz begriffen. :(

        • ein Änderung über VIS oder Script erfolgt mit false

        • wurde die Änderung physikalisch durchgeführt (Schalter hat gegriffen), wird automatisch auf true geändert. Man weiss, dass die Änderung durchgeführt wurde

        • Wird direkt ein Schalter physikalisch betätigt, wird auch ack = true gesetzt

        Soweit richtig?

        Aber warum kann ich denn dann einen Wert mit true setzen?

        Adapter: Fritzbox, Unify Circuit
        Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

        1 Antwort Letzte Antwort
        0
        • BluefoxB Offline
          BluefoxB Offline
          Bluefox
          schrieb am zuletzt editiert von
          #4

          @ruhr70:

          • ein Änderung über VIS oder Script erfolgt mit false

          @ruhr70:

          • wurde die Änderung physikalisch durchgeführt (Schalter hat gegriffen), wird automatisch auf true geändert. Man weiss, dass die Änderung durchgeführt wurde
            • Wird direkt ein Schalter physikalisch betätigt, wird auch ack = true gesetzt

          Soweit richtig? `

          @ruhr70:

          Aber warum kann ich denn dann einen Wert mit true setzen? `

          :D

          :lol: `

          1 Antwort Letzte Antwort
          0
          • ruhr70R Offline
            ruhr70R Offline
            ruhr70
            schrieb am zuletzt editiert von
            #5

            Danke für Deine Geduld.

            Das sind die Momente, wo ich an meinen Verstand zweifeln könnte ;-)

            @Bluefox:

            @ruhr70:

            • ein Änderung über VIS oder Script erfolgt mit false

            ack

            ack

            @Bluefox:

            @ruhr70:

            • wurde die Änderung physikalisch durchgeführt (Schalter hat gegriffen), wird automatisch auf true geändert. Man weiss, dass die Änderung durchgeführt wurde
              • Wird direkt ein Schalter physikalisch betätigt, wird auch ack = true gesetzt

            Soweit richtig? Ja

            ack

            :-)

            @Bluefox:

            @ruhr70:

            Aber warum kann ich denn dann einen Wert mit true setzen? Weil setState(value, true) und setState(value, false) das ist einfach - Wert schreiben.

            @Bluefox:

            Mit true oder false sagst du ob du es setzen(false-Kommando) oder berichten(true-Zustand) machen willst. `

            ack

            ack

            setState('javascript.0.testObject', true, true/*ack*/);
            

            @Bluefox:

            Bei mir hat es auch eine Weile gebraucht :D , `

            :?

            Adapter: Fritzbox, Unify Circuit
            Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

            1 Antwort Letzte Antwort
            0
            • P Offline
              P Offline
              pix
              schrieb am zuletzt editiert von
              #6

              Hallo,

              ich habe das auch noch nicht verstanden, aber evtl einen Anwendungsfall:

              Ich nutze die Homematic Wandtaster, um Szenen zu starten. Der Tastendruck wird im JavaScript abgefragt und schaltet dann mehrere Lichter und den Fernseher. In VIS habe ich eine Taste (Ctrl State Widget), die das gleiche machen soll. Dazu habe ich als Objekt ID den Datenpunkt des physikalischen Homematic-Wandtasters angegeben und schreibe da "true" rein (steht vorher schon auf "true"). Das funktioniert aber nicht immer richtig. Der Gedanke: Vis "drückt" Homematic Taster, Homematic Taster startet Javascript, Javascript startet Szene.

              Jetzt frage ich im Javascript zusätzlich noch ab, ob der Datenpunkt des Wandtasters vielleicht per VIS gesetzt wurde. Dann geht es.

              // Szene wird aus VIS/Web-Adapter gestartet
              subscribe( {
                  id: idWZTasterIIRechtsOben,
                  change:'any',
                  from : 'system.adapter.web.0'
              }, function (obj) {
                  log('Wohnzimmer Taster II - Taste rechts oben per VIS gedrückt');
                  tv_szene();
              }); 
              

              Meinst du so etwas?

              Gruß

              Pix

              ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

              1 Antwort Letzte Antwort
              0
              • ruhr70R Offline
                ruhr70R Offline
                ruhr70
                schrieb am zuletzt editiert von
                #7

                Danke pix, Du hast mich jetzt noch mehr verwirrt ;-)

                Erst einmal danke, dass ich schon wieder was gelernt habe. Ein from: hatte ich gar nicht auf dem Radar.

                Die neue Frage, die Du für mich aufgemacht hast, ist nun, ob das from: im Hintergrund mit dem ack arbeitet.

                Bei der Frage:

                ` > Was ist der Grund, warum ich einen Wert, wie z.B. in einem Javascript Objekt, mit ack true setze?

                Was ist der Anwendungsfall?

                Wann macht ein:

                setState('javascript.0.testObject', true, true/*ack*/);
                

                Sinn? `

                bringt mich das leider nicht weiter vom Verständnis.

                Adapter: Fritzbox, Unify Circuit
                Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

                1 Antwort Letzte Antwort
                0
                • BluefoxB Offline
                  BluefoxB Offline
                  Bluefox
                  schrieb am zuletzt editiert von
                  #8

                  @ruhr70:

                  So, und das ist für mich immer noch nicht klar.

                  • ack nicht angegeben = ack : false? d.h. nur setzen? `
                    setState(id, value, false) ist das gleiche wie setState(id, value)

                  @ruhr70:

                  • wenn ich ack auf true setze, dann wird doch trotzdem gesetzt, nur direkt mit Quittung (wofür?)? `
                    Man muss ack nicht als Quittung, sonder als Richtung betrachten. True - normalerweise vom Gerät zu ioBroker. False-vom ioBroker zum Gerät.

                  @ruhr70:

                  Und da ist für mich die Frage (sorry, wenn das ein bisschen konfus geschrieben war):

                  Was ist der Grund, warum ich einen Wert, wie z.B. in einem Javascript Objekt, mit ack true setze?

                  Was ist der Anwendungsfall? `
                  Weil du im JS z.B. Wetterdienst (oder FritzBox) abfragen kannst. Da steuerst du nichts. Da berichtest du nur den Zustand.

                  @ruhr70:

                  Wann macht ein:

                  setState('javascript.0.testObject', true, true/*ack*/);
                  

                  Sinn?

                  (ich habe extra nicht nur testObject geschrieben). `
                  Kehren wir zurück zu Wetterdienst oder Aktien-Kurse von Yahoo. Wenn ich Aktienkurs gelesen habe, das ist schon vom Gerät (in dem Fall vom Dienst) und ich setzte das als Zustand. Das steuert nichts und keine hört auf diesen Datenpunkt um Dienst "Kurs" zu steuern. Dafür aber, wenn ich künstlich (und nicht nur per Timer) die Kurse lesen will dann erzeuge ich einen Objekt kurseTriggern und höre auf dieser Variable mit ack=false.

                  createState('kursApple', 0);
                  createState('kursTrigger', false);
                  
                  var request = require('request');
                  
                  function kursLesen () {
                      request('http://finance.yahoo.com/d/quotes.csv?s=AAPL&f=snat1', function (err, state, body){
                          if (body) {
                  		    var parts = body.split(',');
                  			setState('kursApple', parts[2], true); // Setzte aktuellen Kurs als Zustand
                  			setState('kursTrigger', false, true);    // Berichte, dass trigger ist abgearbeitet
                  		}
                  
                  	});	
                  }
                  
                  // Lese jeder Stunde
                  schedule('0 * * * *', function () {
                      kursLesen();
                  });
                  
                  // Fall es sofort gewolt ist ein Kurs zu haben
                  on('javascript.0.kursTrigger', function (obj) {
                      // Falls ein Kommando und trigger ist true (was eigentlich überflüssig ist). Es kann kein Kommando mit false kommen
                      if (!obj.newState.ack && obj.newState.val) {
                         kursLesen(); // Kurs sofort lesen
                      }
                  });
                  
                  kursLesen();
                  

                  Man kann auch die Variable kursApple dafür benutzen und so abwicklen

                  createState('kursApple', {val: 0, ack: true});
                  
                  var request = require('request');
                  
                  function kursLesen () {
                      request('http://finance.yahoo.com/d/quotes.csv?s=AAPL&f=snat1', function (err, state, body){
                          if (body) {
                  		    var parts = body.split(',');
                  			setState('kursApple', parts[2], true); // Setzte aktuellen Kurs als Zustand
                  		}
                  
                  	});	
                  }
                  
                  // Lese jeder Stunde
                  schedule('0 * * * *', function () {
                      kursLesen();
                  });
                  
                  // Fall es sofort gewolt ist ein Kurs zu haben
                  on('javascript.0.kursApple', function (obj) {
                      // Falls ein Kommando und trigger ist true (was eigentlich überflüssig ist). Es kann kein Kommando mit false kommen
                      if (!obj.newState.ack) {
                         kursLesen(); // Kurs sofort lesen
                      }
                  });
                  
                  kursLesen();
                  
                  1 Antwort Letzte Antwort
                  0
                  • ruhr70R Offline
                    ruhr70R Offline
                    ruhr70
                    schrieb am zuletzt editiert von
                    #9

                    Hi Bluefox,

                    zwischendurch mal eine kurze Rückmeldung.

                    Vielen herzlichen Dank für Deine ausführliche Erklärung!!

                    Ich kämpfe noch mit dem ersten Codebeispiel, wollte mich aber auf jeden Fall schon einmal bedanken!

                    Wenn ich es jetzt nicht begreife…

                    VG,

                    Michael

                    Adapter: Fritzbox, Unify Circuit
                    Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

                    1 Antwort Letzte Antwort
                    0
                    • ruhr70R Offline
                      ruhr70R Offline
                      ruhr70
                      schrieb am zuletzt editiert von
                      #10

                      @pix:

                      Hallo,

                      ich habe das auch noch nicht verstanden, aber evtl einen Anwendungsfall:

                      Ich nutze die Homematic Wandtaster, um Szenen zu starten. Der Tastendruck wird im JavaScript abgefragt und schaltet dann mehrere Lichter und den Fernseher. In VIS habe ich eine Taste (Ctrl State Widget), die das gleiche machen soll. Dazu habe ich als Objekt ID den Datenpunkt des physikalischen Homematic-Wandtasters angegeben und schreibe da "true" rein (steht vorher schon auf "true"). Das funktioniert aber nicht immer richtig. Der Gedanke: Vis "drückt" Homematic Taster, Homematic Taster startet Javascript, Javascript startet Szene.

                      Jetzt frage ich im Javascript zusätzlich noch ab, ob der Datenpunkt des Wandtasters vielleicht per VIS gesetzt wurde. Dann geht es.

                      // Szene wird aus VIS/Web-Adapter gestartet
                      subscribe( {
                          id: idWZTasterIIRechtsOben,
                          change:'any',
                          from : 'system.adapter.web.0'
                      }, function (obj) {
                          log('Wohnzimmer Taster II - Taste rechts oben per VIS gedrückt');
                          tv_szene();
                      }); 
                      

                      Meinst du so etwas?

                      Gruß

                      Pix `

                      Hi Pix,

                      danke für das Beispiel. Jetzt hatte ich das gleiche Problem, was ich nur mit Deinem Beispiel lösen konnte ;-)

                      Gruß

                      Michael

                      Adapter: Fritzbox, Unify Circuit
                      Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

                      1 Antwort Letzte Antwort
                      0
                      • MicM Offline
                        MicM Offline
                        Mic
                        Developer
                        schrieb am zuletzt editiert von
                        #11

                        Sorry, dass ich diesen alten Thread hoch hole, aber war für mich hoch aktuell :)

                        Hier wurde auch so was besprochen: https://forum.iobroker.net/viewtopic.php?t=12686

                        Ich wollte auch Datenpunkte aktualisieren, ohne dass eine Aktion ausgeführt wird.

                        Hier nun eine Lösung:

                        1. Zum setzen des Datenpunktes ohne Aktion das ACK auf true setzen, z.B.
                        setState('Hier.der.Datenpunkt', 'mach was', true /*ACK*/);
                        
                        1. Im "on - Subscribe" des Ziel-Datenpunktes dann folgendes:
                        on({id: 'Hier.der.Datenpunkt', change: 'any'}, function (obj) {
                            if (obj.state.ack === false) {
                                // Hier der Code, der aber nur ausgeführt wird, falls aktiv im VIS etc. ausgeführt. ACK ist da standardmäßig immer false.
                            }
                        });
                        

                        Das heißt, es wird hier mit "(obj.state.ack === false)" abgefragt, ob Acknowledge mit "true" übergeben wird und dann hier das Script nicht ausgeführt. Normalerweise ist ACK immer false, also z.B. per Button im VIS, per setState(), etc.

                        Dadurch kann also ein Datenpunkt aktualisiert werden, ohne dass über das "on - Subscribe" tatsächlich was ausgeführt wird.

                        Super hilfreich, um Endlosschleifen zu vermeiden, etc.

                        Wahrscheinlich ein alter Hut für viele, aber für mich so super hilfreich… Daher teile ich das hier im Forum.

                        1 Antwort Letzte Antwort
                        0
                        • modmaxM Offline
                          modmaxM Offline
                          modmax
                          schrieb am zuletzt editiert von
                          #12

                          Die if-Abfrage im on-Trigger kann man auch noch vermeiden, wenn man denn nur die eine if-Abfrage auf ack=false drin hat:

                          on({id: 'Hier.der.Datenpunkt', change: 'any', ack:false}, function (obj) {
                              // Hier der Code, der aber nur ausgeführt wird, falls aktiv im VIS etc. ausgeführt. ACK ist da standardmäßig immer false.
                          });
                          
                          

                          MfG Markus

                          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

                          300

                          Online

                          32.4k

                          Benutzer

                          81.4k

                          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