Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Gelöst] Verständnisfrage Datenpunkt für setTimeout nutzen?

    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

    [Gelöst] Verständnisfrage Datenpunkt für setTimeout nutzen?

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

      Guten Moorgen!

      Ich baue gerade an meiner Bewässerungssteuerung und da ich gern alles so dynamisch wie möglich gestalten möchte bin ich auf eine Situation gestossen wo ich mal ne Grundsatzfrage habe:

      In dem Projekt gibt es arg viele Devices die jeweils eigene Timer nutzen. Ich kann diese natürlich als Array definieren aber scheinbar funktioniert das auch wenn ich das als jeweiligen Datenpunkt (Integer) zuweise.

      Schön das es funktioniert doch bin ich mir nicht sicher ob das ein legitimer Weg ist. Gibt es da Gründe die dagegen sprechen?

      Malc

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

        Best practice ist es die timeout ids in dem Skript Lokal vorzuhalten zb in einem array oder Objekt wo sie gesetzt werden.

        Die Werte in States zu persistieren mach wenig Sinn weil wenn das Skript beendet wird oder js Adapter neu gestartet wird sind die ids weg und ungültig. Im Notfall verweisen sie auf andere Timeouts. …

        Gesendet vom Handy ...

        1 Reply Last reply Reply Quote 0
        • M
          malc last edited by

          @apollon77:

          Best practice ist es die timeout ids in dem Skript Lokal vorzuhalten zb in einem array oder Objekt wo sie gesetzt werden. `

          Das macht Sinn!

          In Meinem Beispiel hätte ich erwartet das beim 2. Aufruf "StartTimer(0, false);" der Bereich "log("CLEAR " + Device[id][0]);" aufgerufen wird da ich beim ersten Aufruf den Timer dem Array Device[1][1] zugeordnet habe. Das geschieht aber nicht. Vermutlich habe ich da noch nen Hänger. Ich bin noch nicht so fit in Javascript, habe ich da was übersehen?

          Ich muss da mal mehr über die Gültigkeitsbereiche von Javascript lesen 🙂

          Malc

          var Device = [];
          Device[0]           = ['Device1',  null, 0];
          Device[1]           = ['Device2',  null, 0];
          
          StartTimer(0, true);
          StartTimer(0, false);
          
          function StartTimer(id, on) {
          
              var d = Device[id][0];
              var t = Device[id][1];
          
              var Duration = 2;
          
              if (on) {
              	 log("Start TImer für  " +d );
          
                  t = setTimeout(function (){                                                                             
                      log("Expired  " + d );
                      clearTimeout(t);
                      t = null;
                  }, Duration * 5 * 1000); 
          
              } else {
                  log("OFF  " + d);
                  if(t) {
                      log("CLEAR " + d);
                      clearTimeout(t);
                  }
              } 
          
          

          Edit:

          Wenn ich var t = Device[id][1]; (war nur wegen der Lesbarkeit) weglasse und direkt auf das Arrayelement gehe klappt es.

          Die Deklaration var t = De… ist wohl kein Zeiger, da scheint es doch im Javascript Eigenarten zu geben.

          var Device = [];
          Device[0]           = ['Device1',  null, 0];
          Device[1]           = ['Device2',  null, 0];
          Device[2]           = ['Device3',  null, 0];
          
          StartTimer(0, true);
          StartTimer(0, false);
          
          function StartTimer(id, on) {
          
              // log(Device[id][0]);
          
              //var t = Device[id][1];
              //var t = x;
              var Duration = 2;
          
              if (on) {
                  Device[id][1] = setTimeout(function (){                                                                             
                      log("Expired  " + Device[id][0]);
                      clearTimeout(Device[id][1]);
                      Device[id][1] = null;
                  }, Duration * 5 * 1000); 
          
              } else {
                  log("OFF  " + Device[id][0]);
                  if(Device[id][1]) {
                      log("CLEAR " + Device[id][0]);
                      clearTimeout(Device[id][1]);
                  }
              } 
          
          }
          
          
          1 Reply Last reply Reply Quote 0
          • First post
            Last post

          Support us

          ioBroker
          Community Adapters
          Donate

          705
          Online

          31.7k
          Users

          79.9k
          Topics

          1.3m
          Posts

          2
          3
          241
          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