Navigation

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

    NEWS

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Wir empfehlen: Node.js 22.x

    [gelöst]Einschalten mit Nachlauf

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

      Hallo,

      versuche es so. Ist nur im Forum zusammengetippt, was nicht gerade meine Stärke ist. Aber ich hoffe, ich habe alles richtig gemacht

      
      // Danke an paul53 für die Korrektur zum Timer
      
      // Generelle Einstellungen
      
      var debug = true;				// log Ausgaben ein-/ ausschalten
      
      var instanz = "javascript.0.";		// kann angepasst werden
      var pfad = "homematic.nachlauf.";	// kann angepasst werden
      
      var idAktor = XXXXXXXXXXXXXXXXXX ; // hier den Pfad zu deinem zu schaltenden Aktor eintragen (z.B. "hm-rpc.1.000000000ABC.4.STATE")
      
      // States anlegen
      
      createState(instanz + pfad + "schalter", false , {
        read: true, 
        write: true, 
        name: "Schalter für zu schaltenden Aktor", 
        type: "boolean", 
        def: false
      });
      
      createState(instanz + pfad + "dauer", 6 , {                 
          name: 'Einschaltdauer',
          type: 'number',
          min:  '1',
          max:  '24',
          desc: 'Dauer des Einschaltens zwischen 1 und 24 Std'
      });
      
      var idSchalter = instanz + pfad + "schalter";
      var idDauer = instanz + pfad + "dauer";
      
      var timer = null;
      
      // TRIGGER
      
      on(idSchalter, function(dp) {
      
      	if (dp.state.val) {
      		setState(idAktor, true);
      		var ontime = getState(idDauer).val * 3600000;  // Dauer in Stunden mal 3600 Sekunden mal 1000 Milisekunden
      		timer = setTimeout( fAusschalten, ontime);
      		}
      	else {
      	 clearTimeout(timer);
      	 fAusschalten();
      	 }	
      });
      
      // Ausschalt-Funktion
      
      function fAusschalten(){
      		setState(idAktor, false);
      		timer = null;
      		}
      
      

      In Vis baust du dann einen Schalter ein zum ein bzw ausschalten und daneben etwas, mit dem du die Dauer an den erzeugten Datenpunkt übergibst. Das kann quasi alles sein, ein Schieberegler oder radio buttons mit vordefinierten Werten…

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

        @tempestas:

        		timer = getState(idDauer).val * 60 * 1000;  // Dauer in Stunden mal 60 Minuten mal 1000 Milisekunden
        		setTimeout( fAusschalten, timer);
        		}
        	else {
        	 clearTimeout(timer);
        	 timer = null;
        	 }	
        ```` `  
        

        Das funktioniert so nicht, denn die Variable timer ist ein Timer-Objekt und keine Zeit. Korrektur:

           var ontime = getState(idDauer).val * 3600000;  // Dauer in Stunden mal 3600 Sekunden mal 1000 Milisekunden
           timer = setTimeout(fAusschalten, ontime);
           } else {
              clearTimeout(timer);
              timer = null;
           }
        
        1 Reply Last reply Reply Quote 0
        • T
          tempestas last edited by

          grml 🙂

          irgendwann lerne ich das noch. danke für die Korrektur; ich übernehme sie gleich mal oben ins Skript

          1 Reply Last reply Reply Quote 0
          • T
            thomasSC last edited by

            Vielen Dank hat funktioniert!!

            1 Reply Last reply Reply Quote 0
            • T
              tempestas last edited by

              Dann setze bitte im ersten Posting das Topic auf [gelöst].

              Danke

              1 Reply Last reply Reply Quote 0
              • T
                thomasSC last edited by

                muss jetzt doch nochmal nachhaken. habe das script jetzt nochmal getestet. ich kann einschalten mit "nachlaufe" zwischen 1 und 24 h . nur ich kann nicht vorzeitig abbrechen wenn ich den Schalter wieder auf aus stelle. Ich hätte war eine Idee mit "und-oder" Geschichten aber ich kann kein javascript 🙂 maximal blocky.

                1 Reply Last reply Reply Quote 0
                • D
                  DeepCore last edited by

                  Da es sich bei der Frage um Homematic handelt, gibt es noch einen anderen Weg:

                  setState('hm-rpc.0.xEQxxxxxxx.1.ON_TIME', 300, function() {
                      setStateDelayed("hm-rpc.0.xEQxxxxxxx.1.STATE", true, 100);
                  });
                  

                  Als erstes wird die Einschaltdauer in Sekunden übermittelt, und im Callback dann der Aktor eingeschaltet.

                  Hat den Vorteil, dass sich der Aktor auch abschaltet wenn nach dem Einschalten kein Funkkontakt mehr bestehen würde.

                  1 Reply Last reply Reply Quote 0
                  • T
                    tempestas last edited by

                    Setze bitte bei der else Anweisung statt des "timer = null" ein fAusschalten (); ein

                    Habs oben angepasst

                    1 Reply Last reply Reply Quote 0
                    • T
                      thomasSC last edited by

                      Jetzt ists perfekt, danke.

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

                        Hallo,

                        jetzt habe auch mal eine Frage zum obigen Script. ich möchte gerne 2 Aktoren schalten.

                        Reicht es wenn ich die Zeile

                        "var idAktor = XXXXXXXXXXXXXXXXXX ;"

                        kopiere und darunter in einer neuen Zeile einfüge.

                        also z.B.:

                        var idAktor = "hm-rpc.0.OEQ0098506.2.STATE"/Poolpumpe.STATE/ ;

                        var idAktor = "hm-rpc.0.OEQ0098506.3.STATE"/Clorinator.STATE/ ;

                        Oder wie muss ich da vorgehen. Ich hatte es in der Kombination versucht doch nur die untere Zeile wird "geschaltet".

                        Über ein wenig Hilfe wäre ich dankbar.

                        1 Reply Last reply Reply Quote 0
                        • R
                          ReverZ last edited by

                          Ist zwar schon länger her aber falls jemand hier mal drüber stolpert:

                          Klar wird nur der zweite Aktor geschaltet - du überschriebst ja auch die Variable mit dem zweiten Statement:

                          var idAktor = "hm-rpc.0.OEQ0098506.2.STATE"/Poolpumpe.STATE/ ;

                          var idAktor = "hm-rpc.0.OEQ0098506.3.STATE"/Clorinator.STATE/ ;

                          Du musst dem zweiten Aktor dann schon eine eigene Variable spendieren:

                          var idAktor1 = "hm-rpc.0.OEQ0098506.2.STATE"/Poolpumpe.STATE/ ;

                          var idAktor2 = "hm-rpc.0.OEQ0098506.3.STATE"/Clorinator.STATE/ ;

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          450
                          Online

                          32.1k
                          Users

                          80.7k
                          Topics

                          1.3m
                          Posts

                          6
                          12
                          1948
                          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