Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Datenpunkt prüfen vor schalten

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Datenpunkt prüfen vor schalten

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

      Ich habe ein Datepunkt mit true, oder false. Ich möchte ihn aber nur schalten, wenn der Inhalt nicht schon dort gesetzt ist.

      Sprich true darf nur geschrieben werden, wenn es auf false steht.

      Habt jemand eine Idee, wie das am einfachsten geht? Muss glaube ich etwas mit if und getState und SetState sein.

      Codierknecht 1 Reply Last reply Reply Quote 0
      • Codierknecht
        Codierknecht Developer Most Active @Mitch last edited by

        @mitch
        Zeig doch bitte mal, was Du bisher schon hast.
        Davon hängt nämlich ab, wie man das am besten und einfachsten umsetzt.

        M 1 Reply Last reply Reply Quote 0
        • M
          Mitch @Codierknecht last edited by

          @codierknecht

                      if(getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
                          setState('0_userdata.0.tv.dp_sonoff', id)
                          setState(id + '.POWER', false);
                          setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber);
                          setState('0_userdata.0.tv.dp_room', roomid);
                          setState('alexa2.0.Echo-Devices.' + serialNumber + '.Commands.speak', 'Der Fernseher im Raum ' + roomname + ' wurde ausgeschaltet');
                          var today = new Date();
                          var bh_day = ("00" + today.getDate()).slice(-2);
                          var bh_mon = today.getMonth() + 1;
                          var bh_mon2 = ("00" + bh_mon).slice(-2);
                          var bh_year = ("0000" + today.getFullYear()).slice(-4);
                          var bh_hour = ("00" + today.getHours()).slice(-2);
                          var bh_min = ("00" + today.getMinutes()).slice(-2);
                          var bh_sec = ("00" + today.getSeconds()).slice(-2);
                          InfoMessage = "[" + bh_year + "/" + bh_mon2 + "/" + bh_day + "-" + bh_hour + ":" + bh_min + ":" + bh_sec + "]>" + "\n" +"Der Fernseher im Raum " + roomname + " wurde ausgeschaltet";
                          sendTo("telegram", "send", { text: InfoMessage });        
                      }
          

          Die Zeile 3 schaltet immer, auch wenn false schon gesetzt ist. Ich würde natürlich ein else anhängen und gleich per Alexa sagen, dass der Fernseher bereits an ist.

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

            @mitch sagte: Zeile 3 schaltet immer, auch wenn false schon gesetzt ist.

            Erweitere die Prüfung:

                        if(id != getState('0_userdata.0.tv.dp_sonoff').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
            

            Das erspart die Ausführung des ganzen Rests, wenn die gemerkte ID gleich der aktuellen ID ist.

            M 1 Reply Last reply Reply Quote 0
            • M
              Mitch @paul53 last edited by

              @paul53 sagte in Datenpunkt prüfen vor schalten:

              @mitch sagte: Zeile 3 schaltet immer, auch wenn false schon gesetzt ist.

              Erweitere die Prüfung:

                          if(id != getState('0_userdata.0.tv.dp_sonoff').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
              

              Das erspart die Ausführung des ganzen Rests, wenn die gemerkte ID gleich der aktuellen ID ist.

                  for(let id of members) {
                      if(id.startsWith('sonoff.')) {
                          if(id != getState(id + '.POWER').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
                              setState('0_userdata.0.tv.dp_sonoff', id)
                              setState(id + '.POWER', true);
                              setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber);
                              setState('0_userdata.0.tv.dp_room', roomid);    
                              setState('alexa2.0.Echo-Devices.' + serialNumber + '.Commands.speak', 'Der Fernseher im Raum ' + roomname + ' wurde angeschaltet');
                              var today = new Date();
                              var bh_day = ("00" + today.getDate()).slice(-2);
                              var bh_mon = today.getMonth() + 1;
                              var bh_mon2 = ("00" + bh_mon).slice(-2);
                              var bh_year = ("0000" + today.getFullYear()).slice(-4);
                              var bh_hour = ("00" + today.getHours()).slice(-2);
                              var bh_min = ("00" + today.getMinutes()).slice(-2);
                              var bh_sec = ("00" + today.getSeconds()).slice(-2);
                              InfoMessage = "[" + bh_year + "/" + bh_mon2 + "/" + bh_day + "-" + bh_hour + ":" + bh_min + ":" + bh_sec + "]>" + "\n" +"Der Fernseher im Raum " + roomname + " wurde angeschaltet";
                              sendTo("telegram", "send", { text: InfoMessage });    
                          }
                          else {
                              setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber);
                              setState('0_userdata.0.tv.dp_room', roomid);
                              setState('0_userdata.0.tv.dp_sonoff', "")
                          }    
                      }
                  }
              

              Ich habe die Zeile nochmal angepasst, da ja setState(id + '.POWER', true); die ausschlagebene Zeile ist. Habe natürlich das im True-Abschnitt und im alse-Abschnitt eingebaut.

              Leider quatscht Alexa und Telegram nicht. Muss ich also noch eine Unlogik drin haben.

              paul53 2 Replies Last reply Reply Quote 0
              • paul53
                paul53 @Mitch last edited by paul53

                @mitch sagte: Zeile nochmal angepasst, da ja setState(id + '.POWER', true);

                Die Anpassung ist falsch! Unter "0_userdata.0.tv.dp_sonoff" wird die übergebene ID gemerkt (Zeile 4), nicht in "0_userdata.0.tv.dp_sonoff.POWER", der einen booleschen Wert enthält.

                EDIT: Die ID ändert sich durch eine Schleife. Wozu dient dann Zeile 4, in der zuletzt nur die ID des letzten Datenpunktes der Schleife gemerkt wird?
                Dann ändere die Prüfung beim Einschalten:

                            if(getObject(id, 'functions').enumIds[0] == 'enum.functions.tv' && !getState(id + '.POWER').val) {
                

                und beim Ausschalten:

                            if(getObject(id, 'functions').enumIds[0] == 'enum.functions.tv' && getState(id + '.POWER').val) {
                

                Zeige besser mal das komplette Skript. Es scheint viele Ressourcen zu verbrauchen.

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

                  @mitch
                  Weshalb werden Ein- und Ausschalten getrennt behandelt. Sie unterscheiden sich nur im Wert für ".POWER" (false/true) und in einem kleinen Textbestandteil am Textende ("ausgeschaltet"/"angeschaltet").
                  Die Datums-/Uhrzeit-Bildung macht man auch nicht innerhalb einer Schleife, denn sie ändert sich während eines Trigger-Ereignisses nicht.

                  Vorschlag (Variable serialNumber überprüfen!):

                  on("0_userdata.0.tv.turn_on_off", function (dp) {
                      let aus_an = dp.state.val ? 'angeschaltet' : 'ausgeschaltet';
                      let serialNumber = getState("alexa2.0.History.serialNumber").val;
                      setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber);
                      let roomid = getObject('alexa2.0.Echo-Devices.' + serialNumber, 'rooms').enumIds[0];
                      setState('0_userdata.0.tv.dp_room', roomid);
                      let roomname = getObject('alexa2.0.Echo-Devices.' + serialNumber, 'rooms').enumNames[0];
                      if(typeof roomname == 'object') roomname = roomname.de;    
                  
                      var today = new Date();
                      var bh_day = ("00" + today.getDate()).slice(-2);
                      var bh_mon = today.getMonth() + 1;
                      var bh_mon2 = ("00" + bh_mon).slice(-2);
                      var bh_year = ("0000" + today.getFullYear()).slice(-4);
                      var bh_hour = ("00" + today.getHours()).slice(-2);
                      var bh_min = ("00" + today.getMinutes()).slice(-2);
                      var bh_sec = ("00" + today.getSeconds()).slice(-2);
                      let time = "[" + bh_year + "/" + bh_mon2 + "/" + bh_day + "-" + bh_hour + ":" + bh_min + ":" + bh_sec + "]>" + "\n" +"Der Fernseher im Raum " + roomname + " wurde ";
                  
                      let members = getObject(roomid).common.members;
                      for(let id of members) {
                          if(getObject(id, 'functions').enumIds[0] == 'enum.functions.tv' && dp.state.val != getState(id + '.POWER').val) {
                              setState(id + '.POWER', dp.state.val);
                              setState('alexa2.0.Echo-Devices.' + serialNumber + '.Commands.speak', 'Der Fernseher im Raum ' + roomname + ' wurde ' + aus_an);
                              sendTo("telegram", "send", {text: time + aus_an});    
                          }
                      }    
                  });
                  
                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  392
                  Online

                  31.9k
                  Users

                  80.2k
                  Topics

                  1.3m
                  Posts

                  javascript
                  3
                  7
                  292
                  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