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. [gelöst] Countdown Script umbauen

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.7k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    882

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

[gelöst] Countdown Script umbauen

Scheduled Pinned Locked Moved Skripten / Logik
15 Posts 6 Posters 4.2k Views
  • 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.
  • coyoteC Offline
    coyoteC Offline
    coyote
    Most Active
    wrote on last edited by
    #1

    Hi Leute,

    bin bei Homematic noch Anfänger, hatte vorher RWE.

    Hier im Forum habe ich schon viele Threads gefunden, die mir weitergeholfen haben. Nun zu meiner Frage:

    Ich habe einen Mess-Zwischenstecker an der Waschmaschine. Ich möchte gerne, wenn die Waschmaschine anfängt zu laufen einen Countdown in Vis haben, der sagen wir mal 2h30min runterzählt, damit ich zwischendurch sehen kann wie lange es noch dauert.

    Ich habe das Conutdown Script hier aus dem Forum mal getestet und funktioniert auch prima. Jetzt müsste ich das Script nur so umbauen, dass der Countdown anfängt zu laufen, wenn meine angelegte Systemvariable "Waschmaschine" auf "läuft" umschaltet.

    Leider kann ich kein Javascript, könnte mir vllt jemand helfen?

    Hier ist das Testscript von Bluefox:

    createState('countdown', 10);
    createState('afterCount', false);
    createState('countTrigger', false);
    function count() {
        setTimeout(function () {
            var timer = getState('countdown').val || 10;
            if (timer > 1) {
                setState('countTrigger', false);
                setState('countdown', timer - 1);
                count();
            } else {
                setState('countdown', 0);
                setState('afterCount', true);
            }
        }, 1000);
    }
    
    on('countTrigger', function (obj) {
        if (obj.newState.val === true || obj.newState.val === 'true' || obj.newState.val == 1) {
            setState('countdown', 10);
            setState('afterCount', false);
            count();
        }    
    });
    

    Hier sind ja auch noch 2 Button Widgets angelegt, die bräuchte ich dann natürlich nicht mehr.

    1 Reply Last reply
    0
    • P Offline
      P Offline
      pix
      wrote on last edited by
      #2

      Hallo coyote,

      ich bin nicht sicher, ob das Skript auch bei einer so langen Zeit von 150 Minuten funktioniert. Ich hatte schon Probleme mit 50 Sekunden, da sich die Funktion counter dabei 50x selbst verschachtelt. Aber vielleicht klappt es.

      Die Variable CountTrigger startet den Countdown (wie der Name schon sagt), wenn sie auf true geht. Du setzt sie auf true, wenn deine Homematic-Variable Waschmaschine auf läuft oder besser true geht.

      Also alles in ein Skript und dann

      createState('countdown', 9000);
      createState('afterCount', false);
      createState('countTrigger', false);
      function count() {
          setTimeout(function () {
              var timer = getState('countdown').val || 9000;
              if (timer > 1) {
                  setState('countTrigger', false);
                  setState('countdown', timer - 1);
                  count();
              } else {
                  setState('countdown', 0);
                  setState('afterCount', true);
              }
          }, 1000);
      }
      
      on('countTrigger', function (obj) {
          if (obj.newState.val === true || obj.newState.val === 'true' || obj.newState.val == 1) {
              setState('countdown', 9000); // 2h30min = 150min = 9000s
              setState('afterCount', false);
              count();
          }    
      });
      
      // Wenn Wama an, Counter starten
      on('hm-rega.0.Waschmaschine', function (obj) { // Homematic Variable
          if (obj.newState.val === true || obj.newState.val === 'true' || obj.newState.val === 'läuft' || obj.newState.val == 1) {
              setState('countTrigger', true);
          }    
      });
      
      

      Gruß

      Pix
      3574_screenshot.png

      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 Reply Last reply
      0
      • coyoteC Offline
        coyoteC Offline
        coyote
        Most Active
        wrote on last edited by
        #3

        Das funktioniert schon mal, danke dir Pix.

        Nun geht es weiter…

        Wie kann ich denn jetzt in Vis anstatt die 9000 Sekunden mir z.B 150min oder eben 2h30min anzeigen lassen.

        Dazu muss doch das Script geändert werden oder?

        Und wenn die Statusmeldung der Variable "Waschmaschine" = false ist würde ich gerne den Counter zurücksetzen.

        Sorry für die ganzen Fragen, aber das ist das erste Mal dass ich mit Javascript zu tun hab. Wird noch etwas dauern bis ich da durchblicke.

        1 Reply Last reply
        0
        • BluefoxB Offline
          BluefoxB Offline
          Bluefox
          wrote on last edited by
          #4

          @coyote:

          Hi Leute,

          bin bei Homematic noch Anfänger, hatte vorher RWE.

          Hier im Forum habe ich schon viele Threads gefunden, die mir weitergeholfen haben. Nun zu meiner Frage:

          Ich habe einen Mess-Zwischenstecker an der Waschmaschine. Ich möchte gerne, wenn die Waschmaschine anfängt zu laufen einen Countdown in Vis haben, der sagen wir mal 2h30min runterzählt, damit ich zwischendurch sehen kann wie lange es noch dauert.

          Ich habe das Conutdown Script hier aus dem Forum mal getestet und funktioniert auch prima. Jetzt müsste ich das Script nur so umbauen, dass der Countdown anfängt zu laufen, wenn meine angelegte Systemvariable "Waschmaschine" auf "läuft" umschaltet.

          Leider kann ich kein Javascript, könnte mir vllt jemand helfen?

          Hier ist das Testscript von Bluefox:

          createState('countdown', 10);
          createState('afterCount', false);
          createState('countTrigger', false);
          function count() {
              setTimeout(function () {
                  var timer = getState('countdown').val || 10;
                  if (timer > 1) {
                      setState('countTrigger', false);
                      setState('countdown', timer - 1);
                      count();
                  } else {
                      setState('countdown', 0);
                      setState('afterCount', true);
                  }
              }, 1000);
          }
          
          on('countTrigger', function (obj) {
              if (obj.newState.val === true || obj.newState.val === 'true' || obj.newState.val == 1) {
                  setState('countdown', 10);
                  setState('afterCount', false);
                  count();
              }    
          });
          

          Hier sind ja auch noch 2 Button Widgets angelegt, die bräuchte ich dann natürlich nicht mehr. `
          Komisch dass du mit 50 Sekunden Probleme gehabt hast. Eigentlich setTimeout unterbricht Call-Stack und fängt von vorne an.

          Man konnte das auch so lösen:

          createState('countdown', 9000);
          createState('afterCount', false);
          createState('countTrigger', false);
          var interval = null;
          
          function count() {
          	var timer = getState('countdown').val || 9000;
          	if (timer > 1) {
          		setState('countTrigger', false);
          		setState('countdown', timer - 1);
          	} else {
          		clearInterval(interval);
          		interval = null;
          		setState('countdown', 0);
          		setState('afterCount', true);
          	}
          }
          
          on('countTrigger', function (obj) {
              if (obj.newState.val === true || obj.newState.val === 'true' || obj.newState.val == 1) {
                  setState('countdown', 9000); // 2h30min = 150min = 9000s
                  setState('afterCount', false);
          		if (!interval) {		
          			count();
          			interval = setInterval(count, 1000);
          		}
              }    
          });
          
          // Wenn Wama an, Counter starten
          on('hm-rega.0.Waschmaschine', function (obj) { // Homematic Variable
              if (obj.newState.val === true || obj.newState.val === 'true' || obj.newState.val === 'läuft' || obj.newState.val == 1) {
                  setState('countTrigger', true);
              }    
          });
          
          
          1 Reply Last reply
          0
          • BluefoxB Offline
            BluefoxB Offline
            Bluefox
            wrote on last edited by
            #5

            @coyote:

            Das funktioniert schon mal, danke dir Pix.

            Nun geht es weiter…

            Wie kann ich denn jetzt in Vis anstatt die 9000 Sekunden mir z.B 150min oder eben 2h30min anzeigen lassen.

            Dazu muss doch das Script geändert werden oder?

            Und wenn die Statusmeldung der Variable "Waschmaschine" = false ist würde ich gerne den Counter zurücksetzen.

            Sorry für die ganzen Fragen, aber das ist das erste Mal dass ich mit Javascript zu tun hab. Wird noch etwas dauern bis ich da durchblicke. `

            var interval = null;
            var countdown = 9000;
            
            createState('countdown', seconds2text(countdown));
            createState('afterCount', false);
            createState('countTrigger', false);
            
            function seconds2text(seconds) {
            	var sec_num = parseInt(seconds, 10); // don't forget the second param
                var hours   = Math.floor(sec_num / 3600);
                var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
                var seconds = sec_num - (hours * 3600) - (minutes * 60);
            
            	var time;
            	if (hours > 0)
            		if (hours   < 10) {hours   = "0" + hours;}
            		if (minutes < 10) {minutes = "0" + minutes;}
            		if (seconds < 10) {seconds = "0" + seconds;}
            		time = hours + ' Stunden, ' + minutes + ' Minuten und ' + seconds + ' Sekunden';
            	} else 	if (minutes > 0)
            		if (minutes < 10) {minutes = "0" + minutes;}
            		if (seconds < 10) {seconds = "0" + seconds;}
            		time = minutes + ' Minuten und ' + seconds + ' Sekunden';
            	} else 
            		if (seconds < 10) {seconds = "0" + seconds;}
            		time = seconds + ' Sekunden';
            	}
            
                return time;
            }
            
            function count() {
            	// remove trigger
            	if (getState('countTrigger').val) {
            		setState('countTrigger', false);
            	}
            
            	if (countdown > 1) {
            		setState('countdown', seconds2text(--countdown));
            	} else {
            		clearInterval(interval);
            		interval = null;
            		setState('countdown', seconds2text(0));
            		setState('afterCount', true);
            	}
            }
            
            on('countTrigger', function (obj) {
                if (obj.newState.val === true || obj.newState.val === 'true' || obj.newState.val == 1) {
            		countdown = 9000;
                    setState('countdown', seconds2text(countdown)); // 2h30min = 150min = 9000s
                    setState('afterCount', false);
            		if (!interval) {		
            			count();
            			interval = setInterval(count, 1000);
            		}
                }    
            });
            
            // Wenn Wama an, Counter starten
            on('hm-rega.0.Waschmaschine', function (obj) { // Homematic Variable
                if (obj.newState.val === true || obj.newState.val === 'true' || obj.newState.val === 'läuft' || obj.newState.val == 1) {
                    setState('countTrigger', true);
                }    
            });
            

            Ohne Gewähr. :)

            1 Reply Last reply
            0
            • coyoteC Offline
              coyoteC Offline
              coyote
              Most Active
              wrote on last edited by
              #6

              Danke dir Bluefox, werde dein Script nachher mal testen.

              Was muss ich hier in VIs dann eintragen?

              536_unbenannt.png

              1 Reply Last reply
              0
              • BluefoxB Offline
                BluefoxB Offline
                Bluefox
                wrote on last edited by
                #7

                Was für ein Widget ist das?

                1 Reply Last reply
                0
                • HomoranH Do not disturb
                  HomoranH Do not disturb
                  Homoran
                  Global Moderator Administrators
                  wrote on last edited by
                  #8

                  Das hast du mal in einem thread gebastelt um einen Countdown darzustellen.

                  http://forum.iobroker.org/viewtopic.php … 5503#p5406

                  Ich hab es jedoch nicht ans laufen bekommen :(

                  Gruß

                  Rainer

                  kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                  Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                  der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                  1 Reply Last reply
                  0
                  • coyoteC Offline
                    coyoteC Offline
                    coyote
                    Most Active
                    wrote on last edited by
                    #9

                    Genau, das aus dem Thread.

                    @Homoran: Echt nicht? Bei mir läuft das Ding. Ich weiß eben jetzt nur nicht was ich dort eintragen muss um nicht die Sekunden, sondern die 2,5h zu sehen.

                    1 Reply Last reply
                    0
                    • BluefoxB Offline
                      BluefoxB Offline
                      Bluefox
                      wrote on last edited by
                      #10

                      Nimm einfach basic-string-val.

                      1 Reply Last reply
                      0
                      • coyoteC Offline
                        coyoteC Offline
                        coyote
                        Most Active
                        wrote on last edited by
                        #11

                        Läuft so leider nicht.

                        script.js.testscript compile failed: Syntax error: unexpected token else

                        1 Reply Last reply
                        0
                        • BluefoxB Offline
                          BluefoxB Offline
                          Bluefox
                          wrote on last edited by
                          #12

                          @coyote:

                          Läuft so leider nicht.

                          script.js.testscript compile failed: Syntax error: unexpected token else `
                          Da fehlten ein paar "{"

                          var interval = null;
                          var countdown = 9000;
                          
                          createState('countdown', seconds2text(countdown));
                          createState('afterCount', false);
                          createState('countTrigger', false);
                          
                          function seconds2text(_seconds) {
                              var sec_num = parseInt(_seconds, 10); // don't forget the second param
                              var hours   = Math.floor(sec_num / 3600);
                              var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
                              var seconds = sec_num - (hours * 3600) - (minutes * 60);
                          
                              var time;
                              if (hours > 0) {
                                  if (hours   < 10) {hours   = "0" + hours;}
                                  if (minutes < 10) {minutes = "0" + minutes;}
                                  if (seconds < 10) {seconds = "0" + seconds;}
                                  time = hours + ' Stunden, ' + minutes + ' Minuten und ' + seconds + ' Sekunden';
                              } else    if (minutes > 0) {
                                  if (minutes < 10) {minutes = "0" + minutes;}
                                  if (seconds < 10) {seconds = "0" + seconds;}
                                  time = minutes + ' Minuten und ' + seconds + ' Sekunden';
                              } else {
                                  if (seconds < 10) {seconds = "0" + seconds;}
                                  time = seconds + ' Sekunden';
                              }
                          
                              return time;
                          }
                          
                          function count() {
                              // remove trigger
                              if (getState('countTrigger').val) {
                                  setState('countTrigger', false);
                              }
                          
                              if (countdown > 1) {
                                  setState('countdown', seconds2text(--countdown));
                              } else {
                                  clearInterval(interval);
                                  interval = null;
                                  setState('countdown', seconds2text(0));
                                  setState('afterCount', true);
                              }
                          }
                          
                          on('countTrigger', function (obj) {
                              if (obj.newState.val === true || obj.newState.val === 'true' || obj.newState.val == 1) {
                                  countdown = 9000;
                                  setState('countdown', seconds2text(countdown)); // 2h30min = 150min = 9000s
                                  setState('afterCount', false);
                                  if (!interval) {
                                      count();
                                      interval = setInterval(count, 1000);
                                  }
                              }
                          });
                          
                          // Wenn Wama an, Counter starten
                          on('hm-rega.0.Waschmaschine', function (obj) { // Homematic Variable
                              if (obj.newState.val === true || obj.newState.val === 'true' || obj.newState.val === 'läuft' || obj.newState.val == 1) {
                                  setState('countTrigger', true);
                              }
                          });
                          
                          1 Reply Last reply
                          0
                          • coyoteC Offline
                            coyoteC Offline
                            coyote
                            Most Active
                            wrote on last edited by
                            #13

                            Ah ja, jetzt läuft es perfekt. Vielen Dank, Bluefox :mrgreen:

                            1 Reply Last reply
                            0
                            • K Offline
                              K Offline
                              klmf2
                              wrote on last edited by
                              #14

                              ist ja irgendwie schon älter, habe aber noch mal eine Frage.

                              Ich habe das Skript von Bluefox übernommen. Würde aber anstelle der 9000s gerne einen Wert aus einen Datenpunkt nehmen.

                              Den Datenpunkt habe ich bereits erstellt (Zahl), komme aber nicht weiter. Versucht habe ich schon:

                              on(idSchalter + 'countTrigger', function (obj) {
                                  if (obj.newState.val === true || obj.newState.val === 'true' || obj.newState.val == 1) {
                                      countdown = "javascript.0.Timer.TimerLena.Timerwert";
                                      setState(idSchalter + 'countdown', seconds2text(countdown)); // 2h30min = 150min = 9000s
                                      setState(idSchalter + 'afterCount', false);
                                      if (!interval) {
                                          count();
                                          interval = setInterval(count, 1000);
                              

                              oder

                                      countdown = 'javascript.0.Timer.TimerLena.Timerwert';
                              
                              

                              aber wenn ich den Counter dann beginne, wird der Countdown immer als 00s übernommen.

                              Mein Datenpunkt sieht aktuell wie folgt aus und hat den Wert 1800:

                              {
                                "from": "system.adapter.admin.0",
                                "ts": 1543496749271,
                                "common": {
                                  "name": "Timerwert",
                                  "role": "",
                                  "type": "number",
                                  "desc": "Manuell erzeugt",
                                  "unit": "",
                                  "min": 0,
                                  "def": 0,
                                  "read": true,
                                  "write": true
                                },
                                "native": {},
                                "acl": {
                                  "object": 1636,
                                  "owner": "system.user.admin",
                                  "ownerGroup": "system.group.administrator",
                                  "state": 1636
                                },
                                "_id": "javascript.0.Timer.TimerLena.Timerwert",
                                "type": "state"
                              }
                              

                              Wahrscheinlich liegt es am Syntax?!

                              Grüße, Sebastian

                              1 Reply Last reply
                              0
                              • jedoJ Offline
                                jedoJ Offline
                                jedo
                                wrote on last edited by
                                #15

                                @klmf2:

                                countdown = 'javascript.0.Timer.TimerLena.Timerwert';
                                   
                                ```` `  
                                

                                Versuche mal:

                                countdown = (getState('javascript.0.Timer.TimerLena.Timerwert').val);
                                

                                Viele Grüße,

                                Jens

                                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

                                681

                                Online

                                32.6k

                                Users

                                82.1k

                                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