Skip to content
  • 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
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Skript nur einmal am Tag ausführen und dann sperren

NEWS

  • Wartung am 15.11. – Forum ab 22:00 Uhr nicht erreichbar
    BluefoxB
    Bluefox
    12
    2
    280

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

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

Skript nur einmal am Tag ausführen und dann sperren

Skript nur einmal am Tag ausführen und dann sperren

Scheduled Pinned Locked Moved Skripten / Logik
36 Posts 7 Posters 5.3k 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.
  • N Offline
    N Offline
    Nordlicht
    wrote on last edited by
    #1

    Hallo,

    ich habe hier mit einem Verständnisproblem zu kämpfen.

    Nachfolgendes Skript soll

    • einmal am Tag

    • in bestimmten Zeitfenster

    ausgeführt und dann für den Rest des Tages "geblockt" werden. Die Wiederaktivierung erfolgt per Schedule.

    Auslöser ist ein Bewegungsmelder.

    Die einzelnen Funktionen habe ich hier im Forum gefunden und entsprechend zusammengesetzt.

    ! ````
    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 sperre = true;
    ! on({id: bwm, val: true}, function (obj) {
    if ( isTimeInRange('10:00:00', '10:45:00') && (sperre === true) ); // Trigger auslösen

    {
    	morgenwetter();                   // Ansage
    	setState(sperre, 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 Sperre auf true zurücksetzen
    schedule("59 4 * * *", function() {
    sperre = true;
    });

    
    ****<u>Problem:</u>****
    
    Das Skript wird bei Bewegung ausgeführt.
    
    Allerdings auch außerhalb des Zeitfensters (isTimeinRange ist als globales Skript hinterlegt).
    
    Zudem erfolgt die Sprachausgabe nicht nur einmal, sondern bei jeden "true" des BWM aufs Neue.
    
    Wie muss eine solche Sperre nach einmaliger Ausführung aussehen und wie muss diese eingebaut werden?
    
    Alles was ich bisher versucht habe schlug leider fehl.
    
    Vielen Dank.
    
    Gruß
    
    Thomas
    1 Reply Last reply
    0
    • paul53P Offline
      paul53P Offline
      paul53
      wrote on last edited by
      #2

      Du hast setState() auf eine Skriptvariable angewendet. Richtig:

      on({id: bwm, val: true}, function (obj) {
         if ( isTimeInRange('10:00:00', '10:45:00') && (sperre === true) )  // Trigger auslösen
         {
            morgenwetter();                   // Ansage
            sperre = false;
            log('Guten Morgen und Wetterbericht ausgegeben');
         }   
      });
      
      

      Die Bezeichnung 'sperre' ist verwirrend, da genau das Gegenteil bewirkt wird (Freigabe).

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      1 Reply Last reply
      0
      • bahnuhrB Online
        bahnuhrB Online
        bahnuhr
        Forum Testing Most Active
        wrote on last edited by
        #3

        Ist dein if Befehl bei on richtig ?

        Müsste nicht richtig sein:

        If (…) {

        .....

        }

        Du hast:

        If (...);

        {

        ...

        }

        Ist doch was anderes!

        Zur Anzahl der Ansage:

        Mache eine neue Variable bei dem Reiter Objekte, z.B. "JavaScript.0.Ansage_anzahl"

        Diese Variable setzt du um Mitternacht auf 0

        Und dann fragst du per if ab ob die Variable > 0 ist, wenn ja keine Ansage; wenn 0 dann Ansage und Variable,auf 1 setzen.

        Mit freundlichen Grüßen

        Dieter


        Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
        Danke.
        gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
        ScreenToGif :https://www.screentogif.com/downloads.html

        1 Reply Last reply
        0
        • N Offline
          N Offline
          Nordlicht
          wrote on last edited by
          #4

          @paul53:

          Die Bezeichnung 'sperre' ist verwirrend, da genau das Gegenteil bewirkt wird (Freigabe). `

          Hab das mit der "Sperre" jetzt in Freigabe umbenannt. Das Skript sieht nun wie folgt 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 = true;
          ! on({id: bwm, val: true}, function (obj) {
          if ( isTimeInRange('12:12:00', '12:20:00') && (freigabe === true) ); // 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 Sperre auf true zurücksetzen
          schedule("58 4 * * *", function() {
          freigabe = true;
          });

          
          Allerdings löst er wieder außerhalb des Zeitfensters aus….
          
          Wie bereits erwähnt, die TimeInRange Funktion ist als Skript im Ordner "global".
          
          >! ````
          function currentDate() {
              var d = new Date();
              return new Date(d.getFullYear(), d.getMonth(), d.getDate());
          }
          function addTime(strTime) {
              var time = strTime.split(':');
              var d = currentDate();
              d.setHours(time[0]);
              d.setMinutes(time[1]);
              d.setSeconds(time[2]);
              return d;
          }
          function isTimeInRange(strLower, strUpper) {
              var now = new Date();
              var lower = addTime(strLower);
              var upper = addTime(strUpper);
              var inRange = false;
              if (upper > lower) {
                  // opens and closes in same day
                  inRange = (now >= lower && now <= upper) ? true : false;
              } else {
                  // closes in the following day
                  inRange = (now >= upper && now <= lower) ? false : true;
              }
              return inRange;
          }
          

          Das mit der "Sperre" klappte beim eben durchgeführten Test leider auch noch nicht. Bei einer weiteren Bewegung wurde die Ansage wieder erneut ausgelöst.

          1 Reply Last reply
          0
          • bahnuhrB Online
            bahnuhrB Online
            bahnuhr
            Forum Testing Most Active
            wrote on last edited by
            #5

            Hast du dir den if Befehl angeschaut.

            Nicht verstanden?


            Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
            Danke.
            gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
            ScreenToGif :https://www.screentogif.com/downloads.html

            1 Reply Last reply
            0
            • bahnuhrB Online
              bahnuhrB Online
              bahnuhr
              Forum Testing Most Active
              wrote on last edited by
              #6

              Und das mit der Variablen

              Anzahl


              Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
              Danke.
              gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
              ScreenToGif :https://www.screentogif.com/downloads.html

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

                @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
                

                Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                1 Reply Last reply
                0
                • N Offline
                  N Offline
                  Nordlicht
                  wrote on last edited by
                  #8

                  @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
                  0
                  • bahnuhrB Online
                    bahnuhrB Online
                    bahnuhr
                    Forum Testing Most Active
                    wrote on last edited by
                    #9

                    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

                    Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                    Danke.
                    gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                    ScreenToGif :https://www.screentogif.com/downloads.html

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

                      @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().

                      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                      1 Reply Last reply
                      0
                      • N Offline
                        N Offline
                        Nordlicht
                        wrote on last edited by
                        #11

                        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
                        0
                        • paul53P Offline
                          paul53P Offline
                          paul53
                          wrote on last edited by
                          #12

                          Wie schon in meinem ersten Post:

                                setState(freigabe, 0);
                          

                          ersetzen durch

                                freigabe = false;
                          

                          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

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

                            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;
                            });

                            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                            1 Reply Last reply
                            0
                            • paul53P Offline
                              paul53P Offline
                              paul53
                              wrote on last edited by
                              #14
                              ...
                              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);
                              });
                              

                              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

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

                                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

                                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
                                • N Offline
                                  N Offline
                                  Nordlicht
                                  wrote on last edited by
                                  #16

                                  @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
                                  0
                                  • N Offline
                                    N Offline
                                    Nordlicht
                                    wrote on last edited by
                                    #17

                                    @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
                                    0
                                    • P Offline
                                      P Offline
                                      pix
                                      wrote on last edited by
                                      #18

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

                                      Pix

                                      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
                                      • N Offline
                                        N Offline
                                        Nordlicht
                                        wrote on last edited by
                                        #19

                                        @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
                                        0
                                        • paul53P Offline
                                          paul53P Offline
                                          paul53
                                          wrote on last edited by
                                          #20

                                          @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.

                                          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

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


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          214

                                          Online

                                          32.4k

                                          Users

                                          81.3k

                                          Topics

                                          1.3m

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

                                          • Don't have an account? Register

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