Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Datenpunkt aktualisieren ohne aktion

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] Datenpunkt aktualisieren ohne aktion

    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      doctorultra last edited by

      Hallo,

      ich möchte gern wissen, wie ich einen Datenpunkt/ Zustand verändern kann ohne das ein Script reagiert, welcher diesen Zustand überwachen soll?

      1 Reply Last reply Reply Quote 0
      • apollon77
        apollon77 last edited by

        Erstmal gar nicht - bzw nur über tricks.

        Dur könntest ein zweites State (oder eine Variable wenn es das gleiche Skript ist) haben der sich merkt das dein Skript einmalig die Änderung ignorieren soll und das im Trigger prüfen.

        1 Reply Last reply Reply Quote 0
        • paul53
          paul53 last edited by

          @doctorultra:

          wie ich einen Datenpunkt/ Zustand verändern kann ohne das ein Script reagiert, welcher diesen Zustand überwachen soll? `
          Welcher Zustand soll verändert werden ?

          Aus welchem Grund soll das überwachende Script nicht reagieren ?

          1 Reply Last reply Reply Quote 0
          • D
            doctorultra last edited by

            Ich habe einen Schalter gebaut, auf den ein Script reagieren soll. An- und ausschalten eines Receivers.

            Nur wenn der Receiver manuell angeschaltet wird, dann steht der Schalter natürlich immer noch auf aus.

            Deshalb habe ich mir ein Abfrage per parser gebaut um den Status des Receivers abzufragen .

            Meine Frage, ich würde gern aller 5 Sekunden den Schalter aktualisieren mit den tatsächlichen Status ohne etwas auszulösen.

            Ich hoffe ich konnte es verständlich rüber bringen?

            1 Reply Last reply Reply Quote 0
            • paul53
              paul53 last edited by

              @doctorultra:

              …ein Abfrage per parser gebaut um den Status des Receivers abzufragen .

              Meine Frage, ich würde gern aller 5 Sekunden den Schalter aktualisieren mit den tatsächlichen Status ohne etwas auszulösen. `
              Du meinst sicherlich, dass der Receiver alle 5 s abgefragt wird ?

              Den Schalter muss man nur setzen, wenn dessen Zustand nicht dem des Receivers entspricht. Um den Ein-Befehl nicht zu senden, wenn der Receiver manuell eingeschaltet wurde, schickt man eine Bestätigung mit.

              setState(idSwi, true, true); // Receiver läuft (manuell), Schalteranzeige wird angepasst
              setState(idSwi, true);  // Receiver wird über Schalter eingeschaltet
              
              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 last edited by

                Beispielscript:

                const idSwi = '...'; // Datenpunkt-ID des Schalters
                const idRcv = '...'; // Datenpunkt-ID des Receivers (vom Parser)
                
                var swi = getState(idSwi).val;
                
                on({id: idSwi, ack: true}, function(dp) {
                   swi = dp.state.val;
                }
                
                on(idRcv, function(dp) { // Triggert bei Wertänderung
                   if(dp.state.val != swi) setState(idSwi, dp.state.val, true); // Wertänderung des Schalters ohne zu senden
                });
                

                EDIT: Der tatsächliche Schalterzustand entspricht bei dieser Version nicht dem Wert im Datenpunkt. Besser ist es, es wird an den Schalter gesendet, falls es nicht eine unerwünschte Reaktion auslöst:

                   if(dp.state.val != swi) setState(idSwi, dp.state.val); // Senden des manuellen Receiver-Zustands an den Schalter
                
                
                1 Reply Last reply Reply Quote 0
                • D
                  doctorultra last edited by

                  Das funktioniert nicht, wenn ich den Schalter aktualisiere reagiert der andere Script immer drauf?

                  Script für check des Datenpunktes

                  var Intervall;
                  
                  Intervall = setInterval(function () {
                    if (getState("parser.0.Dreambox_Standby").val == ('' + getState("javascript.0.myStates.Dreambox8000_switch").val)) {
                      if (getState("parser.0.Dreambox_Standby").val == 'true') {
                        setState("javascript.0.myStates.Dreambox8000_switch"/*Dreambox8000_switch*/, false, true);
                      } else {
                        setState("javascript.0.myStates.Dreambox8000_switch"/*Dreambox8000_switch*/, true, true);
                      }
                    }
                  }, 3000);
                  

                  Logik für anschalten

                  on({id: "javascript.0.myStates.Dreambox8000_switch"/*Dreambox8000_switch*/, change: "any"}, function (obj) {
                    var value = obj.state.val;
                    var oldValue = obj.oldState.val;
                    if (getState("parser.0.Dreambox_Standby").val == 'true') {
                      try {
                        require("request")('http://192.168.10.21/web/powerstate?newstate=4').on("error", function (e) {console.error(e);});
                      } catch (e) { console.error(e); }
                    } else {
                      try {
                        require("request")('http://192.168.10.21/web/powerstate?newstate=5').on("error", function (e) {console.error(e);});
                      } catch (e) { console.error(e); }
                    }
                  });
                  
                  1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 last edited by

                    Beide Funktionen (Reaktion auf Parser / Reaktion auf Schalter) sollten in ein gemeinsames Script, um eine gemeinsame Variable (Ist-Zustand Receiver) verwenden zu können. Die zyklische Abfrage des Parser-Datenpunktes ist unnötig, da der Parser-Adapter die zyklische Abfrage vornimmt (zu jedem Datenpunkt einstellbar). Versuche es mal mit folgendem Script:

                    const idSwi = "javascript.0.myStates.Dreambox8000_switch"; // Datenpunkt-ID des Schalters
                    const idStandby = "parser.0.Dreambox_Standby"; // Datenpunkt-ID Standby (vom Parser)
                    const urlOn = 'http://192.168.10.21/web/powerstate?newstate=4';
                    const urlOff = 'http://192.168.10.21/web/powerstate?newstate=5';
                    const request = require("request");
                    
                    var rcv = true;  // Receiver ist Ein
                    if(getState(idStandby).val == 'true') rcv = false;
                    setState(idSwi, rcv, true);  // Scriptstart
                    
                    on(idStandby, function(dp) { // Triggert bei Wertänderung Standby
                       if(dp.state.val == 'true') rcv = false;
                       else rcv = true;
                       setState(idSwi, rcv, true);
                    });
                    
                    on(idSwi, function(dp) {
                       if(dp.state.val != rcv) {  // Soll ungleich Ist
                          if(dp.state.val) {  // Soll: Ein
                             try {
                                 request(urlOn).on("error", function (e) {console.error(e);});
                             } catch (e) { console.error(e); }
                          } else {  // Soll: Aus
                             try {
                                 request(urlOff).on("error", function (e) {console.error(e);});
                             } catch (e) { console.error(e); }
                          }
                       }
                    });
                    
                    

                    Entscheidend ist die Abfrage Sollzustand != Istzustand,

                       if(dp.state.val != rcv) {  // Soll ungleich Ist
                    
                    

                    die verhindert, dass eine Aktion erfolgt, wenn Sollzustand == Istzustand, also der Trigger die Folge von setState(idSwi, rcv, true) ist.

                    1 Reply Last reply Reply Quote 0
                    • D
                      doctorultra last edited by

                      Super hat funktioniert, aber noch eine kurze Frage

                      was bedeutet das dp in function ist, damit das Object gemeint?

                      function(dp)

                      1 Reply Last reply Reply Quote 0
                      • modmax
                        modmax last edited by

                        Genau so ist es:

                        Manche schreiben "function(obj)", andere "function(dp)".

                        Ist nur die Benamselung einer variable oder objekts … die an die Funktion als Parameter übergeben wird.

                        1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 last edited by

                          @doctorultra:

                          was bedeutet das dp in function ist, damit das Object gemeint? `
                          Ja, das ist das Datenpunkt-Objekt, das mit dem Namen dp an die Funktion übergeben wird. Datenpunkte unterscheiden sich von anderen Objekten, da sie zusätzlich noch einen Zustand (state und oldState) enthalten.
                          @doctorultra:

                          Super hat funktioniert `
                          Dann markiere bitte das Thema als gelöst (im Betreff des ersten Beitrags).

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          1.0k
                          Online

                          31.7k
                          Users

                          79.7k
                          Topics

                          1.3m
                          Posts

                          4
                          11
                          1911
                          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