Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Skript nur einmal am Tag ausführen und dann sperren

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Skript nur einmal am Tag ausführen und dann sperren

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

      @paul53:

      @bahnuhr:

      Hast du dir den if Befehl angeschaut. `
      Das Semikolon löschen hinter der if-Klammer !

         if ( isTimeInRange('12:12:00', '12:20:00') && (freigabe === true) ); // Trigger auslösen
      ```` `  
      

      @Bahnuhr: Du bist mit Deinem Post dazwischengerutscht, den hatte ich übersehen, sorry.

      Hab das Semikolon jetzt entfernt und den Vorschlag mit dem Datenpunkt eingebaut.

      Sieht jetzt so aus:

      ! ````
      var request = require ('request');
      var Url = "http://192.168.178.58:50000/track=gong.mp3";
      var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche
      ! var freigabe = "javascript.0.Freigabe_Morgenwetter";
      ! on({id: bwm, val: true}, function (obj) {
      if ( isTimeInRange('12:25:00', '12:30:00') && (freigabe === true) ) // Trigger auslösen
      {
      morgenwetter(); // Ansage
      setState (freigabe, false);
      log('Guten Morgen und Wetterbericht ausgegeben');
      }
      });

      function morgenwetter() {
      //Wochentag ermitteln
      var d = new Date ();
      var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
      var w = weekday[d.getDay()];

      ! //Tagesdatum ermitteln
      var t = d.getDate();
      ! //Monat ermitteln
      var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
      var m = month[d.getMonth()];
      ! //Jahr ermitteln
      var j = d.getFullYear()
      ! //Stunde ermitteln
      h = d.getHours()
      ! //Minute ermitteln
      mi = d.getMinutes()
      ! // Die Außentemperatur ist xx. Das Wetter heute ist xx
      // Einfache Temperaturansage mit SayIt.
      // Variante 1 mittels splitten der Temperatur, damit die Ansage nicht
      // "Es sind 18 Punkt 2 Grad " sagt.
      ! var Temperatursensor = getState("hm-rpc.0.MEQ1600895.1.TEMPERATURE"); /Temperatursensor Balkon/
      var temperatur = Temperatursensor.val.toString();
      var temp_array = [];
      ! var MaxTemperatur = getState("yr.0.forecast.day0.temperature_max"); /Forecast of temperature for today/
      var maxtemp = MaxTemperatur.val.toString();
      var maxtemp_array = [];
      ! var witterung = getState("yr.0.forecast.day0.text").val ; /Actual text/
      log('Wetter: ' + witterung);
      ! temp_array = temperatur.split(".");
      ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
      // Es wird dann nur "18" gelesen.
      if (!temp_array[1]) {
      temp_array[1] = "0";
      log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
      }
      ! maxtemp_array = maxtemp.split(".");
      ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
      // Es wird dann nur "18" gelesen.
      if (!maxtemp_array[1]) {
      maxtemp_array[1] = "0";
      log("Die Nach-Kommastelle in maxtemp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
      }
      var ansage = "Test";
      ! Url = "http://192.168.178.58:50000/track=gong.mp3|tts=" + ansage;
      request(Url);
      }
      ! // Flag für Sperre auf true zurücksetzen
      schedule("30 12 * * *", function() {
      freigabe = true;
      });

      
      Klappt noch nicht, vermutlich stimmt das mit dem setState für die Freigabe nicht??!!??
      1 Reply Last reply Reply Quote 0
      • bahnuhr
        bahnuhr Forum Testing Most Active last edited by

        So, Versuch es so:

        ! ````
        var Anzahl = getState('Java.....anzahl').val;
        var Zeit1 = isTimeInRange('12:12:00', '12:20:00');
        ! Function weiter() {
        Sprache ausgeben ......
        SetState('Java....anzahl', 1);
        ! }
        ! on({id: '......motion'}, function (obj) {
        if ( Anzahl === 0 && Zeit1 === true ) {
        Weiter();
        }
        });

        
        Kann sein dass noch ein Semikolon fehlt oder groß- Kleinschreibung.
        
        Ging auf dem iPad eben nicht so gut.
        
        Anzahl musst du vorher natürlich anlegen.
        
        Und noch Schedule nachts Anzahl auf 0
        
        Probierst aus.
        
        Mit freundlichen Grüßen
        
        Dieter
        1 Reply Last reply Reply Quote 0
        • paul53
          paul53 last edited by

          @Nordlicht:

          Klappt noch nicht, vermutlich stimmt das mit dem setState für die Freigabe nicht??!!?? `
          Richtig. Du hattest 2 Fehler in dem Ursprungsskript: Das Semikolon hinter der if-Klammer und setState().

          1 Reply Last reply Reply Quote 0
          • N
            Nordlicht last edited by

            Erneuter Test:

            ! ````
            var request = require ('request');
            var Url = "http://192.168.178.58:50000/track=gong.mp3";
            var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche
            var Zeit1 = isTimeInRange('13:12:00', '13:20:00');
            ! var freigabe = getState("javascript.0.Freigabe_Morgenwetter").val/Freigabe_Morgenwetter/;
            ! on({id: bwm, val: true}, function (obj) {
            if ( freigabe === 1 && Zeit1 === true ) // Trigger auslösen
            {
            morgenwetter(); // Ansage
            setState(freigabe, 0);
            log('Guten Morgen und Wetterbericht ausgegeben');
            }
            });

            function morgenwetter() {
            //Wochentag ermitteln
            var d = new Date ();
            var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
            var w = weekday[d.getDay()];

            ! //Tagesdatum ermitteln
            var t = d.getDate();
            ! //Monat ermitteln
            var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
            var m = month[d.getMonth()];
            ! //Jahr ermitteln
            var j = d.getFullYear()
            ! //Stunde ermitteln
            h = d.getHours()
            ! //Minute ermitteln
            mi = d.getMinutes()
            ! // Die Außentemperatur ist xx. Das Wetter heute ist xx
            // Einfache Temperaturansage mit SayIt.
            // Variante 1 mittels splitten der Temperatur, damit die Ansage nicht
            // "Es sind 18 Punkt 2 Grad " sagt.
            ! var Temperatursensor = getState("hm-rpc.0.MEQ1600895.1.TEMPERATURE"); /Temperatursensor Balkon/
            var temperatur = Temperatursensor.val.toString();
            var temp_array = [];
            ! var MaxTemperatur = getState("yr.0.forecast.day0.temperature_max"); /Forecast of temperature for today/
            var maxtemp = MaxTemperatur.val.toString();
            var maxtemp_array = [];
            ! var witterung = getState("yr.0.forecast.day0.text").val ; /Actual text/
            log('Wetter: ' + witterung);
            ! temp_array = temperatur.split(".");
            ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
            // Es wird dann nur "18" gelesen.
            if (!temp_array[1]) {
            temp_array[1] = "0";
            log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
            }
            ! maxtemp_array = maxtemp.split(".");
            ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
            // Es wird dann nur "18" gelesen.
            if (!maxtemp_array[1]) {
            maxtemp_array[1] = "0";
            log("Die Nach-Kommastelle in maxtemp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
            }
            var ansage = "Test";
            ! Url = "http://192.168.178.58:50000/track=gong.mp3|tts=" + ansage;
            request(Url);
            }
            ! // Flag für Sperre auf true zurücksetzen
            schedule("23 13 * * *", function() {
            setState(freigabe, 1);
            });

            
            Ansage wird ausgelöst. Wenn Zeitfenster geschlossen, wird die Ansage trotzdem gesprochen
            
            Der Wert 1 auf die 0 wird nicht gesetzt.
              ` > Das Semikolon hinter der if-Klammer und setState() `  
            Das Semikolon ist weg, den Fehler bei setState sehe ich leider nicht .
            1 Reply Last reply Reply Quote 0
            • paul53
              paul53 last edited by

              Wie schon in meinem ersten Post:

                    setState(freigabe, 0);
              

              ersetzen durch

                    freigabe = false;
              
              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 last edited by

                Inzwischen hast Du noch weitere Fehler eingebaut. Hier mal das erste Skript von Dir mit Korrekturen:

                ! ````
                var request = require ('request');
                var Url = "http://192.168.178.58:50000/track=gong.mp3";
                var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche
                ! var freigabe = true;
                ! on({id: bwm, val: true}, function (obj) {
                if ( isTimeInRange('10:00:00', '10:45:00') && freigabe) // Trigger auslösen
                {
                morgenwetter(); // Ansage
                freigabe = false;
                log('Guten Morgen und Wetterbericht ausgegeben');
                }
                });

                function morgenwetter() {
                    //Wochentag ermitteln
                    var d = new Date ();
                    var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
                    var w = weekday[d.getDay()];
                

                ! //Tagesdatum ermitteln
                var t = d.getDate();
                ! //Monat ermitteln
                var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
                var m = month[d.getMonth()];
                ! //Jahr ermitteln
                var j = d.getFullYear()
                ! //Stunde ermitteln
                h = d.getHours()
                ! //Minute ermitteln
                mi = d.getMinutes()
                ! // Die Außentemperatur ist xx. Das Wetter heute ist xx
                // Einfache Temperaturansage mit SayIt.
                // Variante 1 mittels splitten der Temperatur, damit die Ansage nicht
                // "Es sind 18 Punkt 2 Grad " sagt.
                ! var Temperatursensor = getState("hm-rpc.0.MEQ1600895.1.TEMPERATURE"); /Temperatursensor Balkon/
                var temperatur = Temperatursensor.val.toString();
                var temp_array = [];
                ! var MaxTemperatur = getState("yr.0.forecast.day0.temperature_max"); /Forecast of temperature for today/
                var maxtemp = MaxTemperatur.val.toString();
                var maxtemp_array = [];
                ! var witterung = getState("yr.0.forecast.day0.text").val ; /Actual text/
                log('Wetter: ' + witterung);
                ! temp_array = temperatur.split(".");
                ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
                // Es wird dann nur "18" gelesen.
                if (!temp_array[1]) {
                temp_array[1] = "0";
                log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
                }
                ! maxtemp_array = maxtemp.split(".");
                ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
                // Es wird dann nur "18" gelesen.
                if (!maxtemp_array[1]) {
                maxtemp_array[1] = "0";
                log("Die Nach-Kommastelle in maxtemp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
                }
                var ansage = "Einen schönen guten Morgen! Heute ist "
                + w + " der " + t + "te" + m + j
                + ", Es ist " + h + " Uhr und " + mi
                + " Minuten." + " Temperatur "
                + temp_array[0] + "," + temp_array[1]
                + " Grad. " + witterung + ". Maximal werden es heute. "
                + maxtemp_array[0] + "," + maxtemp_array[1] + " Grad. ";
                ! Url = "http://192.168.178.58:50000/track=4fachgong.mp3|tts=" + ansage;
                request(Url);
                }
                ! // Flag für Freigabe auf true zurücksetzen
                schedule("59 4 * * *", function() {
                freigabe = true;
                });

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

                  ...
                  var Zeit1 =  isTimeInRange('13:12:00', '13:20:00');
                  
                  var freigabe = getState("javascript.0.Freigabe_Morgenwetter").val/*Freigabe_Morgenwetter*/;
                  
                  on({id: bwm, val: true}, function (obj) {
                     if ( freigabe === 1 && Zeit1 === true ) // Trigger auslösen
                     ...
                  
                  

                  funktioniert so nicht, da so die Funktion isTimeInRange('13:12:00', '13:20:00') nur bei Skriptstart ausgeführt wird, also die aktuelle Zeit bei Bewegung nicht erfasst.

                  Weshalb plötzlich die Verwendung eines Datenpunktes für die Freigabe ??

                  Außerdem ist setState("javascript.0.Freigabe_Morgenwetter", true) falsch angewendet.

                  EDIT: Falls Du für Freigabe deshalb einen Datenpunkt verwenden willst, damit die Freigabe einen (Skript-)Neustart übersteht, dann muss es so erfolgen:

                  var request = require ('request');
                  var Url = "http://192.168.178.58:50000/track=gong.mp3";
                  var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche
                  var idFreigabe =  "javascript.0.Freigabe_Morgenwetter"; //Freigabe_Morgenwetter
                  
                  on({id: bwm, val: true}, function (obj) {  // Trigger auslösen
                     var freigabe = getState(idFreigabe).val;
                     if ( freigabe && isTimeInRange('13:12:00', '13:20:00')) 
                     {
                        morgenwetter();                   // Ansage
                        setState(idFreigabe, false);
                        log('Guten Morgen und Wetterbericht ausgegeben');
                     }   
                  });
                  
                  ...
                  
                  // DP Freigabe auf true zurücksetzen
                  schedule("23 13 * * *", function() {
                      setState(idFreigabe, true);
                  });
                  
                  1 Reply Last reply Reply Quote 0
                  • P
                    pix last edited by

                    Hallo Nordlicht,

                    wenn du isTimeInRange sparen willst oder tatsächlich ein Sperre haben möchtest (die du evtl sogar mit VIS zusätzlich ein/ausschalten kannst), geht auch die Nutzung der neuen Funktion startScript() und stopScript(). Die hat Bluefox neuerdings eingebaut.

                    Dann zwei Skripte

                    Skript 1, Name "Bewegungsmelder_freigeben"

                    schedule("20 12 * * *", startScript("Bewegung_erkennen", true)); // "freigeben", also Skript starten
                    schedule("30 12 * * *", startScript("Bewegung_erkennen", false)); // "sperren", Skript stoppen
                    
                    

                    Skript 2, Name "Bewegung_erkennen" (wie im Skript 1 verwendet)

                    function morgenwetter() {
                        // ...
                    }
                    
                    var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche
                    on({id: bwm, val: true}, function(obj) {
                        morgenwetter();  
                        setTimeout(function() {
                            stopScript();
                        }, 10 * 1000); // Stoppt sich selbst nach 10s
                    });
                    
                    

                    Skript 1 läuft immer und schaltet täglich um 12:20 Skript 2 auf aktiv und um 12:30 auf inaktiv (wie grün und rot im Skriptreiter)

                    Skript 2 prüft (nur wenn aktiv) auf Bewegungen. Wenn ja, wird morgenwetter() aufgerufen und dann um 10s verzögert das Skript wieder gestoppt.

                    Per VIS kannst du nun die Sperre ausschalten/das Skript einschalten, durch Nutzung eines ToggleWidgets oder SetValue-Widgets mit dem Datenpunkt "javascript.0.scriptEnabled.common.Bewegung_erkennen" (Pfad und Instanz natürlich anpassen)

                    Gruß

                    Pix

                    1 Reply Last reply Reply Quote 0
                    • N
                      Nordlicht last edited by

                      @paul53:

                      Inzwischen hast Du noch weitere Fehler eingebaut. Hier mal das erste Skript von Dir mit Korrekturen:

                      ! ````
                      var request = require ('request');
                      var Url = "http://192.168.178.58:50000/track=gong.mp3";
                      var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche
                      ! var freigabe = true;
                      ! on({id: bwm, val: true}, function (obj) {
                      if ( isTimeInRange('10:00:00', '10:45:00') && freigabe) // Trigger auslösen
                      {
                      morgenwetter(); // Ansage
                      freigabe = false;
                      log('Guten Morgen und Wetterbericht ausgegeben');
                      }
                      });

                      function morgenwetter() {
                          //Wochentag ermitteln
                          var d = new Date ();
                          var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
                          var w = weekday[d.getDay()];
                      

                      ! //Tagesdatum ermitteln
                      var t = d.getDate();
                      ! //Monat ermitteln
                      var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
                      var m = month[d.getMonth()];
                      ! //Jahr ermitteln
                      var j = d.getFullYear()
                      ! //Stunde ermitteln
                      h = d.getHours()
                      ! //Minute ermitteln
                      mi = d.getMinutes()
                      ! // Die Außentemperatur ist xx. Das Wetter heute ist xx
                      // Einfache Temperaturansage mit SayIt.
                      // Variante 1 mittels splitten der Temperatur, damit die Ansage nicht
                      // "Es sind 18 Punkt 2 Grad " sagt.
                      ! var Temperatursensor = getState("hm-rpc.0.MEQ1600895.1.TEMPERATURE"); /Temperatursensor Balkon/
                      var temperatur = Temperatursensor.val.toString();
                      var temp_array = [];
                      ! var MaxTemperatur = getState("yr.0.forecast.day0.temperature_max"); /Forecast of temperature for today/
                      var maxtemp = MaxTemperatur.val.toString();
                      var maxtemp_array = [];
                      ! var witterung = getState("yr.0.forecast.day0.text").val ; /Actual text/
                      log('Wetter: ' + witterung);
                      ! temp_array = temperatur.split(".");
                      ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
                      // Es wird dann nur "18" gelesen.
                      if (!temp_array[1]) {
                      temp_array[1] = "0";
                      log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
                      }
                      ! maxtemp_array = maxtemp.split(".");
                      ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
                      // Es wird dann nur "18" gelesen.
                      if (!maxtemp_array[1]) {
                      maxtemp_array[1] = "0";
                      log("Die Nach-Kommastelle in maxtemp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
                      }
                      var ansage = "Einen schönen guten Morgen! Heute ist "
                      + w + " der " + t + "te" + m + j
                      + ", Es ist " + h + " Uhr und " + mi
                      + " Minuten." + " Temperatur "
                      + temp_array[0] + "," + temp_array[1]
                      + " Grad. " + witterung + ". Maximal werden es heute. "
                      + maxtemp_array[0] + "," + maxtemp_array[1] + " Grad. ";
                      ! Url = "http://192.168.178.58:50000/track=4fachgong.mp3|tts=" + ansage;
                      request(Url);
                      }
                      ! // Flag für Freigabe auf true zurücksetzen
                      schedule("59 4 * * *", function() {
                      freigabe = true;
                      });
                      ```` `

                      Das liegt vielleicht auch daran, dass - so wie ich als Anfänger es sehe - zwei verschiedene Wege gehen. Der von Dir und jener von @bahnuhr unterscheiden sich was das setzen von "freigabe" angeht. Welcher Weg nun der bessere ist vermag ich nicht zu beurteilen.

                      Mit

                      freigabe = false;
                      

                      funktioniert es hier nicht, wieso und weshalb auch immer. Verwende ich stattdessen

                      setState("javascript.0.Freigabe_Morgenwetter", 1)
                      bzw.
                      setState("javascript.0.Freigabe_Morgenwetter", 0)
                      

                      wird zumindest der Status richtig gesetzt bzw. gelöscht.

                      Vorteil dieser Variante meines Erachtens, ich kann den aktuellen Status in den Objekten einsehen und ggf. manuell verändern.

                      Bei "freigabe=false" bzw. "freigabe=true" ist das nicht der Fall.

                      Nichts desto trotz passiert folgendes:

                      Ungeachtet der Freigabe und des Zeitfensters wird die Ansage bei jeder festgestellten Bewegung ausgelöst.

                      Ich glaube es ja schon langsam nicht mehr….. :shock:

                      Verwende ich den von Dir zuletzt korrigierten Skript verhält es sich übrigens ganz genauso.

                      1 Reply Last reply Reply Quote 0
                      • N
                        Nordlicht last edited by

                        @pix:

                        Hallo Nordlicht,

                        wenn du isTimeInRange sparen willst oder tatsächlich ein Sperre haben möchtest (die du evtl sogar mit VIS zusätzlich ein/ausschalten kannst), geht auch die Nutzung der neuen Funktion startScript() und stopScript(). Die hat Bluefox neuerdings eingebaut.

                        Gruß

                        Pix `

                        Hi Pix,

                        diese Funktion ist in jedem Fall interessant. Die merke ich mir für andere Projekte.

                        Hier ist sie nicht einsetzbar, der BWM muss immer aktiv bleiben, da er auch noch das Licht steuert.

                        Irgendwie wird man das hier schon noch gelöst bekommen.

                        Aber vielen Dank trotzdem!

                        Gruß

                        Thomas

                        1 Reply Last reply Reply Quote 0
                        • P
                          pix last edited by

                          Es ist nicht der Bewegunsmelder, der gesperrt wird, sondern nur dieses eine Skript.

                          Pix

                          1 Reply Last reply Reply Quote 0
                          • N
                            Nordlicht last edited by

                            @pix:

                            Es ist nicht der Bewegunsmelder, der gesperrt wird, sondern nur dieses eine Skript.

                            Pix `

                            Ok, dann war das ein Missverständnis.

                            Habe es mal so eingebaut.

                            Aber es wirft folgenden Fehler aus, egal wie das programm genannt wird:

                            15:32:50.584	[info]	javascript.1 Stop script script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben
                            15:32:50.587	[info]	javascript.0 Stop script script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben
                            15:32:50.609	[info]	javascript.0 Start javascript script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben
                            15:32:50.610	[error]	javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: Cannot start "script.js.javascript.0.scriptEnabled.TTS_Mediaplayer.Bewegung_erkennen", because not found
                            15:32:50.610	[error]	javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: schedule callback missing
                            15:32:50.610	[error]	javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: Cannot start "script.js.javascript.0.scriptEnabled.TTS_Mediaplayer.Bewegung_erkennen", because not found
                            15:32:50.610	[error]	javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: schedule callback missing
                            15:32:50.610	[info]	javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: registered 0 subscriptions and 0 schedules
                            
                            15:42:37.160	[info]	javascript.1 Stop script script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben
                            15:42:37.159	[info]	javascript.0 Stop script script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben
                            15:42:37.173	[info]	javascript.0 Start javascript script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben
                            15:42:37.174	[error]	javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: Cannot start "script.js.Bewegung_erkennen", because not found
                            15:42:37.174	[error]	javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: schedule callback missing
                            15:42:37.174	[error]	javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: Cannot start "script.js.Bewegung_erkennen", because not found
                            15:42:37.174	[error]	javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: schedule callback missing
                            15:42:37.174	[info]	javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: registered 0 subscriptions and 0 schedules
                            
                            1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 last edited by

                              @Nordlicht:

                              Ungeachtet der Freigabe und des Zeitfensters wird die Ansage bei jeder festgestellten Bewegung ausgelöst.

                              Ich glaube es ja schon langsam nicht mehr….. :shock:

                              Verwende ich den von Dir zuletzt korrigierten Skript verhält es sich übrigens ganz genauso. `
                              Habe das folgende Skript bei mir getestet und es funktioniert wie es soll:

                              var request = require ('request');
                              var Url = "http://192.168.178.58:50000/track=gong.mp3";
                              var bwm = "javascript.1.MOTION"; // Bewegungsmelder Küche
                              var idFreigabe =  "javascript.1.Freigabe_Morgenwetter"; //Freigabe_Morgenwetter
                              
                              on({id: bwm, val: true}, function (obj) {  // Trigger auslösen
                                 var freigabe = getState(idFreigabe).val;
                                 if ( freigabe && isTimeInRange('15:48:00', '16:00:00')) 
                                 {
                                    setState(idFreigabe, false);
                                    morgenwetter();                   // Ansage
                                    log('Guten Morgen und Wetterbericht ausgegeben');
                                 }   
                              });
                              
                              function morgenwetter() {
                                  log('Funktion morgenwetter ausgeführt');
                              }
                              
                              // DP Freigabe auf true zurücksetzen
                              schedule("23 13 * * *", function() {
                                  setState(idFreigabe, true);
                              });
                              
                              

                              Bei Wechsel von false auf true des DP "javascript.1.MOTION" erfolgen die beiden Logs und der DP "javascript.1.Freigabe_Morgenwetter" wird von true auf false gesetzt. Eine nochmalige Ausgabe der Logs bei erneutem Wechsel von false auf true (MOTION) erfolgt nicht.

                              1 Reply Last reply Reply Quote 0
                              • bahnuhr
                                bahnuhr Forum Testing Most Active last edited by

                                Nochmal

                                ! ````
                                ! function weiter() {
                                Sprache ausgeben ......
                                SetState('Java....anzahl', 1);
                                }
                                ! on({id: '......motion'}, function (obj) {
                                ! var Anzahl = getState('Java.....anzahl').val;
                                var Zeit1 = isTimeInRange('12:12:00', '12:20:00');
                                ! if ( Anzahl === 0 && Zeit1 === true ) {
                                Weiter();
                                }
                                });

                                
                                Paul hat recht. Die vars müssen zu on.
                                
                                Nordlicht, warum probierst du dies nicht einmal aus?????
                                
                                Deinen Sprachteile musst du doch nur oben bei weiter() einfügen.
                                
                                Mit freundlichen Grüßen
                                
                                Dieter
                                1 Reply Last reply Reply Quote 0
                                • N
                                  Nordlicht last edited by

                                  @bahnuhr:

                                  Nochmal `

                                  Ich probiere ja ständig aus was hier alles so beigetragen wird.
                                  > Paul hat recht. Die vars müssen zu on.
                                  Hier http://forum.iobroker.net/viewtopic.php?p=49661#p49661 war es halt anders dargestellt.

                                  Es ging mehrfach hin und her was die "Freigabe" betrifft. Als Neuling kann man hier schon schwer ins Schleudern kommen…. das ist keine böse Absicht.

                                  Ich gehe aber davon aus, dass es so richtig ist (freigabe

                                     if ( freigabe === true && isTimeInRange('16:26:00', '17:00:00')) 
                                  
                                  

                                  und nicht so
                                  > if ( freigabe && isTimeInRange('16:26:00', '17:00:00'))
                                  Oder?

                                  Hab es eben so wie genannt am laufen…. ich werde sehen ob das funzt.

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

                                    @Nordlicht:

                                    Hier http://forum.iobroker.net/viewtopic.php?p=49661#p49661 war es halt anders dargestellt. `
                                    Nein, ist es nicht. Die Funktion isTimeInRange('16:26:00', '17:00:00') wird innerhalb der if-Abfrage aufgerufen und nicht bei Skriptstart.
                                    @Nordlicht:

                                    Ich gehe aber davon aus, dass es so richtig ist

                                       if ( freigabe === true && isTimeInRange('16:26:00', '17:00:00'))
                                    

                                    und nicht so

                                        if ( freigabe && isTimeInRange('16:26:00', '17:00:00'))
                                    

                                    Oder? `
                                    Das ist beides im Ergebnis identisch.

                                    if(x)  // prüft auf x === true  bzw.  x !== 0  bzw.  x !== null
                                    if(!x)  // prüft auf x === false  bzw.  x === 0  bzw.  x === null
                                    

                                    Bei boolschen Werten wird ohnehin schon true oder false geliefert, bei Zahlen oder Objekten erfolgt eine implizite Typwandlung wie angegeben.

                                    1 Reply Last reply Reply Quote 0
                                    • N
                                      Nordlicht last edited by

                                      @paul53:

                                      @Nordlicht:

                                      Hier http://forum.iobroker.net/viewtopic.php?p=49661#p49661 war es halt anders dargestellt. Nein, ist es nicht. Die Funktion __isTimeInRange('16:26:00', '17:00:00')__ wird innerhalb der if-Abfrage aufgerufen und nicht bei Skriptstart.

                                      Das bezog sich darauf, dass hier die "vars" nicht bei on standen sowie @bahnuhr es erwähnte.

                                      Das klang eben so, als würde ich nicht das machen was hier vorgeschlagen wird. Und das ist nun mal nicht so.

                                      Ansonsten

                                      if(x)  // prüft auf x === true  bzw.  x !== 0  bzw.  x !== null
                                      if(!x)  // prüft auf x === false  bzw.  x === 0  bzw.  x === null
                                      

                                      das glaube ich Dir gerne, aber für Anfänger ist es ohnehin nicht einfach. Da darfst Du nicht damit kommen, dass dies identisch ist.

                                      Das Skript habe ich jetzt getestet, soweit eben möglich.

                                      ! ````
                                      var request = require ('request');
                                      var Url = "http://192.168.178.58:50000/track=gong.mp3";
                                      var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche
                                      var idFreigabe = "javascript.0.Freigabe_Morgenwetter"; //Freigabe_Morgenwetter
                                      ! on({id: bwm, val: true}, function (obj) { // Trigger auslösen
                                      var freigabe = getState(idFreigabe).val;
                                      if ( freigabe === true && isTimeInRange('05:00:00', '08:00:00'))
                                      {
                                      setState(idFreigabe, false);
                                      morgenwetter(); // Ansage
                                      log('Guten Morgen und Wetterbericht ausgegeben');
                                      }
                                      });
                                      ! function morgenwetter() {
                                      //Wochentag ermitteln
                                      var d = new Date ();
                                      var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
                                      var w = weekday[d.getDay()];
                                      ! //Tagesdatum ermitteln
                                      var t = d.getDate();
                                      ! //Monat ermitteln
                                      var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
                                      var m = month[d.getMonth()];
                                      ! //Jahr ermitteln
                                      var j = d.getFullYear()
                                      ! //Stunde ermitteln
                                      h = d.getHours()
                                      ! //Minute ermitteln
                                      mi = d.getMinutes()
                                      ! // Die Außentemperatur ist xx. Das Wetter heute ist xx
                                      // Einfache Temperaturansage mit SayIt.
                                      // Variante 1 mittels splitten der Temperatur, damit die Ansage nicht
                                      // "Es sind 18 Punkt 2 Grad " sagt.
                                      ! var Temperatursensor = getState("hm-rpc.0.MEQ1600895.1.TEMPERATURE"); /Temperatursensor Balkon/
                                      var temperatur = Temperatursensor.val.toString();
                                      var temp_array = [];
                                      ! var MaxTemperatur = getState("yr.0.forecast.day0.temperature_max"); /Forecast of temperature for today/
                                      var maxtemp = MaxTemperatur.val.toString();
                                      var maxtemp_array = [];
                                      ! var witterung = getState("yr.0.forecast.day0.text").val ; /Actual text/
                                      log('Wetter: ' + witterung);
                                      ! temp_array = temperatur.split(".");
                                      ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
                                      // Es wird dann nur "18" gelesen.
                                      if (!temp_array[1]) {
                                      temp_array[1] = "0";
                                      log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
                                      }
                                      ! maxtemp_array = maxtemp.split(".");
                                      ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
                                      // Es wird dann nur "18" gelesen.
                                      if (!maxtemp_array[1]) {
                                      maxtemp_array[1] = "0";
                                      log("Die Nach-Kommastelle in maxtemp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
                                      }
                                      var ansage = "Einen schönen guten Morgen! Heute ist "
                                      + w + " der " + t + "te" + m + j
                                      + ", Es ist " + h + " Uhr und " + mi
                                      + " Minuten." + " Temperatur "
                                      + temp_array[0] + "," + temp_array[1]
                                      + " Grad. " + witterung + ". Maximal werden es heute. "
                                      + maxtemp_array[0] + "," + maxtemp_array[1] + " Grad. ";
                                      ! Url = "http://192.168.178.58:50000/track=gong.mp3|tts=" + ansage;
                                      request(Url);
                                      log('Funktion morgenwetter ausgeführt');
                                      }
                                      ! // DP Freigabe auf true zurücksetzen
                                      schedule("59 4 * * *", function() {
                                      setState(idFreigabe, true);
                                      });

                                      Es scheint zu klappen, hundertprozentig weiß ich dass dann morgen.
                                      
                                      Mit
                                      

                                      if ( freigabe && isTimeInRange('05:00:00', '08:00:00'))

                                      hat es übrigens nicht ausgelöst. Weiß der Geier warum…..
                                      
                                      Nicht böse sein, aber Anfänger sehen eben oft den Wald vor lauter Bäumen nicht.
                                      
                                      Selbstverständlichkeiten für Fortgeschrittene finden da noch nicht den nötigen Platz.
                                      
                                      Danke für die Hilfe und ich werde morgen nochmals berichten ob es klappt.
                                      
                                      Thomas
                                      1 Reply Last reply Reply Quote 0
                                      • paul53
                                        paul53 last edited by

                                        @Nordlicht:

                                        das glaube ich Dir gerne, aber für Anfänger ist es ohnehin nicht einfach. Da darfst Du nicht damit kommen, dass dies identisch ist. `
                                        Da ich annehme, dass Du nicht alle Skripte selbst entwickelst, sondern auch in vorhandene Skripte schaust und diese vermutlich verstehen möchtest, wird Dir die Kenntnis dieses Zusammenhanges helfen. Ich würde z.B. niemals schreiben

                                        if(x === true)
                                        

                                        ,es sei denn, ich möchte gleichzeitig den Typ (boolean) testen.

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

                                          Übrigens kann die globale Funktion

                                          isTimeInRange('05:00:00', '08:00:00')
                                          

                                          ersetzt werden durch die vom JS-Adapter bereit gestellte Funktion

                                          compareTime(getDateObject('05:00'), getDateObject('08:00'), 'between')
                                          

                                          EDIT: Die Funktion compareTime() gibt es erst ab Version 3.0.10 des JS-Adapters.

                                          1 Reply Last reply Reply Quote 0
                                          • N
                                            Nordlicht last edited by

                                            @paul53:

                                            Übrigens kann die globale Funktion

                                            isTimeInRange('05:00:00', '08:00:00')
                                            

                                            ersetzt werden durch die vom JS-Adapter bereit gestellte Funktion

                                            compareTime(getDateObject('05:00'), getDateObject('08:00'), 'between')
                                            ```` `  
                                            

                                            Das ist es eben.

                                            Es fehlt ein Handbuch, das speziell solche grundlegenden Dinge (auch mit Praxisbeispielen) aufzeigt.

                                            ioBroker hat viele "Grundfunktionen" sag ich mal. Mag sein dass vieles hier im Forum steht, ist nur die Frage wo und wie man es suchen soll.

                                            Das soll jetzt kein Vorwurf sein, nur eine Feststellung. Ich bin sicher sehr vielen Anfängern wäre damit geholfen.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            805
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            7
                                            36
                                            4649
                                            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