Navigation

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

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] Countdown Script umbauen

    This topic has been deleted. Only users with topic management privileges can see it.
    • coyote
      coyote Most Active last edited by

      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 Reply Quote 0
      • P
        pix last edited by

        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

        1 Reply Last reply Reply Quote 0
        • coyote
          coyote Most Active last edited by

          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 Reply Quote 0
          • Bluefox
            Bluefox last edited by

            @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 Reply Quote 0
            • Bluefox
              Bluefox last edited by

              @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 Reply Quote 0
              • coyote
                coyote Most Active last edited by

                Danke dir Bluefox, werde dein Script nachher mal testen.

                Was muss ich hier in VIs dann eintragen?

                536_unbenannt.png

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

                  Was für ein Widget ist das?

                  1 Reply Last reply Reply Quote 0
                  • Homoran
                    Homoran Global Moderator Administrators last edited by

                    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

                    1 Reply Last reply Reply Quote 0
                    • coyote
                      coyote Most Active last edited by

                      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 Reply Quote 0
                      • Bluefox
                        Bluefox last edited by

                        Nimm einfach basic-string-val.

                        1 Reply Last reply Reply Quote 0
                        • coyote
                          coyote Most Active last edited by

                          Läuft so leider nicht.

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

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

                            @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 Reply Quote 0
                            • coyote
                              coyote Most Active last edited by

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

                              1 Reply Last reply Reply Quote 0
                              • K
                                klmf2 last edited by

                                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 Reply Quote 0
                                • jedo
                                  jedo last edited by

                                  @klmf2:

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

                                  Versuche mal:

                                  countdown = (getState('javascript.0.Timer.TimerLena.Timerwert').val);
                                  
                                  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

                                  6
                                  15
                                  3828
                                  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