Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Anfänger Frage zu Schleife mit Timeout/Interval

NEWS

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

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

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

Anfänger Frage zu Schleife mit Timeout/Interval

Scheduled Pinned Locked Moved Skripten / Logik
11 Posts 5 Posters 1.9k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P Offline
    P Offline
    ple
    wrote on last edited by
    #1

    Hallo zusammen,

    ich Hampel hier rum mit einer Schleife und einen Timeout oder Intervall. Komme da aber nicht so recht voran.

    Ich habe folgendes vor.

    Ich sende mir ein Bild, wenn es Klingel, 2 Taster gedrückt werden oder wenn der Bewegungsmelder was erkennt.

    Das Funktioniert auch soweit sehr gut, vielen Dank ans Forum.

    nun möchte ich jedoch, dass wenn der Bewegungsmelder true ist, er mir 5 mal das Bild sendet in 3 Sekunden Abstand.

    In Blockly habe ich mal in Wiederhole x mal ein Timeout reingenommen, aber das wird ignoriert.

    Irgendwie muss ich sowas haben.

    Wenn True dann Bild, Timeout 3s, i++ und wieder von vorne

    Wenn i = 5 dann löschen

    Leider weiß ich nur nicht wie es als JS aussehen muss :-(

    Danke für eure Hilfestellung.

    Mein Bisheriger Code

    ! // Telegram Bild senden ! var source_url = 'http://xxx.xxx.xxx.xxx/tmpfs/snap.jpg?usr=xxxx&pwd=xxxx', //Adresse der IpKamera dest_path = '/opt/iobroker/ipcam/'; var Trigger = "hm-rpc.0.NEQ1297058.1.MOTION"/*Garten_BW_Haustuer:1.MOTION*/; //Trigger var Nachricht = "Es hat an der Haustüre geklingelt"; // Nachricht, welche mit dem Bild gesendet wird ! var request = require('request'); var fs = require('fs'); ! // Bild an telegram schicken function sendImage (pfad) { sendTo('telegram.0', pfad); //log('Webcam Bild per telegram verschickt'); //sendTo("telegram.0", Nachricht); // <-- nach der Timeout funktion ausführen } ! // Bild speichern function saveImage() { request.get({url: source_url, encoding: 'binary'}, function (err, response, body) { fs.writeFile(dest_path + 'image2.jpg', body, 'binary', function(err) { ! if (err) { //log('Fehler beim Bild speichern: ' + err, 'warn'); } else { //log('Webcam Bild gespeichert'); sendImage(dest_path + 'image2.jpg'); } }); }); } ! //Trigger on({id: new RegExp('hm-rpc\\.0\\.NEQ0955393\\.1\\.PRESS_SHORT' + "|" + 'hm-rpc\\.0\\.MEQ1823113\\.4\\.PRESS_SHORT' + "|" + 'hm-rpc\\.0\\.MEQ1823216\\.2\\.PRESS_SHORT'), change: "any"}, function (obj) { saveImage(); }); // Bei Türöffnung und keiner ist zu Hause, dann Bild schicken on({id: "hm-rpc.0.NEQ0629079.1.STATE"/*Flur_FK_Haustür:1.STATE*/, val: true}, function () { if ("javascript.0.MyStates.anwesenheit"/*anwesenheit*/ === false) { saveImage(); } }); ! //Bei Bewegung Bild schicken, Schleife muss noch programmiert werden mit Abstand von 1 Sekunde und 5 Bilder oder so. on({id: "hm-rpc.0.NEQ1297058.1.MOTION"/*Garten_BW_Haustuer:1.MOTION*/, val: true}, function () { saveImage(); }); !

    Intel Nuc + Proxmox

    1 Reply Last reply
    0
    • D Offline
      D Offline
      dwm
      wrote on last edited by
      #2

      Im Prinzip so …

      for (var i=0; i<5; i++) {
          setTimeout(function(){ saveImage();},i*3000);
      }
      

      Klappt aber nur, wenn saveImage() in weniger als 3s fertig wird.

      1 Reply Last reply
      0
      • P Offline
        P Offline
        ple
        wrote on last edited by
        #3

        Muss jetzt los, teste ich heute abend mal.

        Auf der schnelle, warum "i" was der Interval ist, mal 3000? Denke die 3000 sind die ms?

        Gruß und Danke

        Intel Nuc + Proxmox

        1 Reply Last reply
        0
        • AlCalzoneA Offline
          AlCalzoneA Offline
          AlCalzone
          Developer
          wrote on last edited by
          #4

          @ple:

          Auf der schnelle, warum "i" was der Interval ist, mal 3000? Denke die 3000 sind die ms? `
          Du setzt damit gleichzeitig 5 Timeouts: 0, 3000, 6000, 9000 und 12000ms

          Ist im Prinzip das gleiche wie 5x nacheinander Timeouts zu setzen, aber ein bisschen einfacher in der Umsetzung.

          Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

          1 Reply Last reply
          0
          • blauholstenB Offline
            blauholstenB Offline
            blauholsten
            Developer
            wrote on last edited by
            #5

            @ple:

            Muss jetzt los, teste ich heute abend mal.

            Auf der schnelle, warum "i" was der Interval ist, mal 3000? Denke die 3000 sind die ms?

            Gruß und Danke `
            Die for Schleife, führt ihre Bedingungen solange aus bis diese nicht mehr zutrifft. In diesem Fall 5…dabei wird die Variable i immer um eins erhöht. In der Anweisung der for Schleife wird nun eine anonyme callback function angelegt, die dann i*3000ms, die saveimage() Funktion aufruft.....3s,6s,9s...usw.

            Entwickler vom: - Viessman Adapter
            - Alarm Adapter

            1 Reply Last reply
            0
            • P Offline
              P Offline
              ple
              wrote on last edited by
              #6

              wollte es gerade testen, aber der meckert irgendwie
              1241_bildschirmfoto_2017-08-25_um_11.05.56.png

              Intel Nuc + Proxmox

              1 Reply Last reply
              0
              • AlCalzoneA Offline
                AlCalzoneA Offline
                AlCalzone
                Developer
                wrote on last edited by
                #7

                @ple:

                wollte es gerade testen, aber der meckert irgendwie `
                Funktionen in einer Schleife können unerwartete Konsequenzen haben, was Parameter angeht. Man erwartet, dass die nacheinander mit dem jeweiligen Wert der Schleifenvariable erstellt werden, tatsächlich hat man nachher mehrere Kopien, die alle auf den letzten Wert referenzieren. Es gibt Konstrukte, wie man das verhindern kann, aber das ist hier Overkill.

                In deinem Fall, wäre das vollkommen ok. So gehts aber auch ohne Warnung:

                for (var i=0; i<5; i++) {
                    setTimeout(saveImage, i*3000);
                }
                

                Man beachte die fehlenden Klammern hinter saveImage => es wird nur die Funktionsreferenz übergeben, die später von setTimeout ausgeführt wird.

                Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                1 Reply Last reply
                0
                • paul53P Offline
                  paul53P Offline
                  paul53
                  wrote on last edited by
                  #8

                  Anstelle 5 Timer zu erzeugen, würde ich setInterval() zusammen mit einer Zählvariable verwenden. Etwa so:

                  var timer = null;
                  var count = 0;
                  
                  function counter() {
                      saveimage();
                      count--;
                      if(count === 0 && timer) clearInterval(timer);
                  }    
                  
                  on({id: "hm-rpc.0.NEQ0629079.1.STATE"/*Flur_FK_Haustür:1.STATE*/, val: true}, function () {
                      count = 5;
                      counter();
                      timer = setInterval(counter, 3000);
                  });
                  

                  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 Reply Last reply
                  0
                  • P Offline
                    P Offline
                    ple
                    wrote on last edited by
                    #9

                    Vielen Dank für eure Ideen,

                    Umgesetzt habe ich jetzt den Vorschlag von Paul 53, das kann ich nachvollziehen und wäre auch meine Richtung gewesen, wenn ich gewusst hätte wie der Syntax aussehen muss.

                    Hat auch den Vorteil, dass ich die Funktion abbrechen kann.

                    Das Beispiel kann ich auch auf andere Projekte umsetzen.

                    Die For Schleife von AlCalzone ist auch sehr interessant, kann ich dann auf andere Anwendungen anweisen. Vielen Dank.

                    Besteht da auch die Möglichkeit die erzeugten Timer irgendwie abzubrechen?

                    Gruß

                    Intel Nuc + Proxmox

                    1 Reply Last reply
                    0
                    • AlCalzoneA Offline
                      AlCalzoneA Offline
                      AlCalzone
                      Developer
                      wrote on last edited by
                      #10

                      @ple:

                      Besteht da auch die Möglichkeit die erzeugten Timer irgendwie abzubrechen? `
                      Da müsstest du alle Timer in ein Array packen und die dann zum Abbrechen nutzen:

                      var timers = [];
                      // Erstellen:
                      for (var i=0; i<5; i++) {
                      	timers.push(setTimeout(saveImage, i*3000));
                      }
                      
                      // abbrechen:
                      while (timers.length > 0) {
                      	clearTimeout(timers.pop());
                      }
                      
                      

                      Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                      1 Reply Last reply
                      0
                      • P Offline
                        P Offline
                        ple
                        wrote on last edited by
                        #11

                        @AlCalzone:

                        @ple:

                        Besteht da auch die Möglichkeit die erzeugten Timer irgendwie abzubrechen? `
                        Da müsstest du alle Timer in ein Array packen und die dann zum Abbrechen nutzen:

                        var timers = [];
                        // Erstellen:
                        for (var i=0; i<5; i++) {
                        	timers.push(setTimeout(saveImage, i*3000));
                        }
                        
                        // abbrechen:
                        while (timers.length > 0) {
                        	clearTimeout(timers.pop());
                        }
                        
                        ```` `  
                        

                        Eh, ja, guck ich mir nach dem Urlaub an ;-)

                        Danke

                        Intel Nuc + Proxmox

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        778

                        Online

                        32.4k

                        Users

                        81.6k

                        Topics

                        1.3m

                        Posts
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                        ioBroker Community 2014-2025
                        logo
                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Home
                        • Recent
                        • Tags
                        • Unread 0
                        • Categories
                        • Unreplied
                        • Popular
                        • GitHub
                        • Docu
                        • Hilfe