Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. ioBroker Allgemein
  4. [gelöst] SayIt -> Audioausgabe verzögert nach 30-40 Sekunden

NEWS

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    6
    1
    247

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    9
    1
    238

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    898

[gelöst] SayIt -> Audioausgabe verzögert nach 30-40 Sekunden

Scheduled Pinned Locked Moved ioBroker Allgemein
11 Posts 3 Posters 1.4k 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.
  • P Offline
    P Offline
    pix
    wrote on last edited by
    #2

    Hallo,

    wenn ich da richtig verstehe, setzt ein Homematic-Programm eine Variable auf true, sobald der Bewegungsmelder anspringt. Korrekt? Die Aktualisierung des Status der Variable nach ioBroker kann schon mal länger dauern. Sinnvoller ist es, die Logik in ioBroker zu steuern:

    zB alle Bewegungsmelder im Raum Flur:

    $('channel[state.id=*.MOTION](rooms=Flur)').on(function (obj) {
        if (obj.state.val) { // Wenn Bewegung erkannt
            // hier die Aktion rein
        } // Ende Bewegung erkannt
    });
    
    

    oder ein bestimmter Bewegungsmelder:

    on({ id:"hm-rpc.0.KEQ123456.1.MOTION", val: true}, function(obj) {
        // hier die Aktion bei Auslösung des Melders
    });
    
    

    In der Aktion setzt du dann Sayit. Das sollte schneller gehen, als auf die Synchronisierung der HM-Variable zu warten.

    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
    • P Offline
      P Offline
      PrinzEisenherz1
      wrote on last edited by
      #3

      Hi Pix!

      Das trifft sich ja gut! Das Script das ich verwende ist eh von Dir fg

      `// Test mit Variable;
      // Besser ist es, gleich den Bewegungsmelder hier abzufragen.
      var idSayVar = "hm-rega.0.38101";
      
      // Definition
      var idSayIt =            "sayit.0.tts.text";
      var lautstaerke = 40;
      
      // Quellen
      var idWetter =           "hm-rega.0.29954";
      var idTemperatursensor = "hm-rpc.0.LEQ0177463.1.TEMPERATURE"; /*Temperatursensor:1.TEMPERATURE*/
      var idGeburtstage =      "javascript.0.Kalenderereignisse.heute";
      
      function ermitteleAnsagedatum () {
          //Wochentag ermitteln
          var d = new Date ();
          var w = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
          var wochentag = w[d.getDay()]; 
      
          //Tagesdatum ermitteln
          var tag = d.getDate();
      
          //Monat ermitteln
          var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
          var monat = month[d.getMonth()];
      
          //Jahr ermitteln
          var jahr = d.getFullYear();
      
          //Stunde ermitteln
          var stunde = d.getHours();
      
          //Minute ermitteln
          var minute = d.getMinutes();
      
          return { // zurückgeben
              'Jahr'      : jahr,
              'Monat'     : monat,
              'Tag'       : tag,
              'Wochentag' : wochentag,
              'Stunde'    : stunde,
              'Minute'    : minute,
              'Sekunde'   : sekunde
          };
      }
      
      function ermitteleWetter () { // Wetterbedingungen
          var wetterdaten = getState(idWetter).val;
          log('Wetter: ' + wetterdaten);
          return(wetterdaten);
      }
      
      function ermitteleAnsageTemperatur () {
          // 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(idTemperatursensor).val;
          var temp_string = temperatursensor.toString();
          log('Temp  ' + temp_string);
          var temp_array = [];
          temp_array = temp_string.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.");
          }
          return{
              'Ganzzahl'      : temp_array[0],
              'Nachkommazahl' : temp_array[1]
          };
      }
      
      function ermitteleGeburtstage () {
          var geburtstage = getState(idGeburtstage).val;
          if (geburtstage.length < 2) { // wenn der Inhalt des Objektes "idGeburtstage" weniger als 2 Zeichen lang ist (also praktisch leer), dann ...
              geburtstage = 'heute keine Geburtstage'; // oder "niemand", "keiner"
          }
          log(geburtstage);
          return (geburtstage);
      }
      
      // ################################### 
      // Trigger für Ansage
      on(idSayVar, function (data) {
      
          var ansagetext = "Guten Morgen, heute ist " + ermitteleAnsagedatum().Wochentag + " der " + ermitteleAnsagedatum().Tag + "te " + ermitteleAnsagedatum().Monat + ' ' + ermitteleAnsagedatum().Jahr 
                  + ". Es ist" + ermitteleAnsagedatum().Stunde + "  Uhr und " + ermitteleAnsagedatum().Minute + "  Minuten." 
                  + " Die Aussentemperatur beträgt " + ermitteleAnsageTemperatur().Ganzzahl + "," + ermitteleAnsageTemperatur().Nachkommazahl + " Grad." 
                  + " Wetter Bedingungen," + ermitteleWetter() +" ."
                  + " Heute haben Geburtstag: "+ ermitteleGeburtstage() +" .";
      
          log('Trigger: ' + data.state.val);
          if (data.state.val === true) {
              setState(idSayIt, lautstaerke + ";" + ansagetext);  // hier also ("40;Guten Morgen ...")
          }
      });
      
      /* Kalenderevent auswerten ----> nur Geburtstage
      
      sucht im iCal Adapter nach events (heute)
      auf Anfrage von Skorpil im Forum erstellt.
      http://forum.iobroker.de/viewtopic.php?f=21&t=2347&p=20627&sid=524f9dda2f313d3cbb183941df61fc38#p20627
      
      27.02.2016 erstellt von Pix
      02.03.2016 Anpassung und Aufbereitung für Sprachausgabe
      */
      
      //Datum als String ermitteln;
      function ermitteleDatum() {
          var d= new Date();
      
          //Tagesdatum ermitteln
              var day = new Array("00","01","02","03","04","05","06","07","06","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31");
              var t = day[d.getDate().toString()];
      
          //Monat ermitteln
              var month = new Array("01","02","03","04","05","06","07","08","09","10","11","12");
              var m = month[d.getMonth().toString()];
      
          //Jahr ermitteln
              var j = d.getFullYear().toString();
      
          var datum= t+"."+m+"."+j+" ";
          //log("datum:   " + datum);
          return (datum);
      }
      
      createState('Kalenderereignisse.heute', '', {
          name: 'Events von heute',
          type: 'string'
      });
      
      var idListe =  'Kalenderereignisse.heute';
      
      function pruefeKalender() {
          var inhalt = getState('ical.0.data.table').val;
          var heute = ermitteleDatum();
          try{
              var ereignisse = JSON.stringify(inhalt, null, 2); // Ausgabe als String
              //log(ereignisse);
              var ereignisheute = '', // Liste (kommasepariert)
                  ereignisheute_zeilen = ''; // Liste (mit Zeilenumbruch, zB für Anzeige in VIS)
              for(var i = 0; i <inhalt.length; i++)/{/alle/events/durchgehen/if/(/(inhalt[i].date.indexof(heute)/!="-1)" ||/(inhalt[i].date.indexof('heute')/)/strings/datum/oder/relatives/(nicht/nicht)/gefunden/var/ereignis="inhalt[i].event;" komma/im/namen/ersetzen="">0) ? ', ' : '';
                      ereignisheute = ereignisheute + komma + ereignis;
                      ereignisheute = ereignisheute.replace('Geburtstag von ', ''); // "Geburtstag von " löschen
                  } 
              }
              // Aufbereitung für die Ansage (falls vorhanden, wird letztes Komma durch und ersetzt)
              var lastkomma = ereignisheute.lastIndexOf(','); // letztes Komma in der Reihe
              if (lastkomma != -1) {
                 var vorn = ereignisheute.slice(0,lastkomma-1);
                 var hinten = ereignisheute.slice(lastkomma+1, ereignisheute.length);
                 ereignisheute = vorn + ' und' + hinten;
              }
              // Ende Aufbereitung für die Ansage
      
              setState(idListe, ereignisheute);
              log('Geburtstage: ' + ereignisheute);
          } catch (fehler_try) {
              log('Fehler beim Kalenderevent einlesen ' + fehler_try);
          }
      }
      
      // bei Aktualisierung des Kalenders
      on ({id:'ical.0.events.Geburtstag', change: 'any'}, function(data) {
          pruefeKalender();
      });
      
      //bei Skriptstart
      pruefeKalender();</inhalt.length;>` 
      
      Ich hab jetzt bloß auf die schnelle Dein Originalscript eingefügt weil ich gerade unterwegs bin!
      
      Danke für Deinen Tipp! Klingt logisch! Dauert ja auch lange wenn sich der Status z.B. eines Fensterkontaktes ändert bis es auf VIS angezeigt wird!
      
      Könntest Du mir vielleicht nur noch kurz sagen wo ich das am besten in Deinem Script einbinde?
      
      Danke schon mal!
      
      Johnny[/i][/i][/i]
      

      Intel-NUC mit ProxMox: ioBroker,SQL, logging Strom- Gas- u. Wasserzähler;10Zoll Tab im Flur für VIS; weiteres: Homematic CCU2, Homeduino, Kameras, selbstgebaute Wetterstation;

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

        Hallo Johnny,

        ich erinnere mich.

        Ist ganz einfach: oben in der 3. Zeile statt var idSayVar = "hm-rega.0.38101"; einfach

        var idSayVar = "hm-rpc.0.IDBEwegungsmelder.1.MOTION";
        
        ````eintragen. Dann sollte es laufen. Weiter unten im Code steht die Überwachung __on (idSayVar)__. Den Kommentaren im Code entnehme ich, dass das Problem mit dem Bewegungsmelder wohl schon damals bestand.
        ~~@PrinzEisenherz1:~~ 
        
        > Dauert ja auch lange wenn sich der Status z.B. eines Fensterkontaktes ändert bis es auf VIS angezeigt wird! `  
        Genau, selbes Problem. Bitte den TFK direkt in Javascript abfragen und nicht die Homematic-Variable. Rega wird nicht schnell genug synchronisiert.
        
        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
        • P Offline
          P Offline
          PrinzEisenherz1
          wrote on last edited by
          #5

          Danke Pix!

          Jetzt gibt's aber noch n kleines Problem und zwar würde ja das Script bei jeder Bewegungserkennung auslösen, richtig?

          Über die HM hatte ich es über ein Programm so gesteuert das wenn im Zeitraum 06:20 bis 06:45 und von 07:30-08:30 eine Bewegung erkannt wird dann wird eine Variable auf true gesetzt und das Script dadurch nur einmal ausgelöst. Um 06:50 und um 08:40 hab ich dann die Variable wieder auf false gesetzt.

          Wie kann ich das in dem Script lösen?

          Johnny

          Intel-NUC mit ProxMox: ioBroker,SQL, logging Strom- Gas- u. Wasserzähler;10Zoll Tab im Flur für VIS; weiteres: Homematic CCU2, Homeduino, Kameras, selbstgebaute Wetterstation;

          1 Reply Last reply
          0
          • ruhr70R Offline
            ruhr70R Offline
            ruhr70
            wrote on last edited by
            #6

            schau mal hier:

            http://forum.iobroker.net/viewtopic.php … ange#p8484

            Adapter: Fritzbox, Unify Circuit
            Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

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

              Hallo Johnny,

              lege ein neues Script an. Es nutzt die Funktion isTimeInRange. http://forum.iobroker.net/viewtopic.php?f=21&t=1072

              // isTimeInRange
              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;
              }
              // isTimeInRange ENDE
              
              createState('Sayit.Trigger', false, {
                  name: 'Sayit-Ansage bei Bewegung steuern',
                  type: 'boolean'
              });
              createState('Sayit.Zeitsteuerung', false, {
                  name: 'Sayit-Ansage nur innerhalb Zeitfenster schalten',
                  type: 'boolean'
              });
              
              var idBewegung = "hm-rpc.0.IDBEwegungsmelder.1.MOTION",
                  idTrigger = 'Sayit.Trigger';
              
              on({id: idBewegung, val: true}, function (obj) {
                 if ( isTimeInRange('06:20:00', '06:45:00') || isTimeInRange('07:30:00', '08:30:00') ) setState(idTrigger, true); // Trigger auslösen
              });
              
              // Zurücksetzen vom Trigger
              schedule("50 6 * * *", function () {
                  setState(idTrigger, false);
              });
              schedule("40 8 * * *", function () {
                  setState(idTrigger, false);
              });
              
              

              Im anderen Skript mit der Ansage setzt du dann oben bei idSayVar = 'javascript.0.Sayit.Trigger' ein.

              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
              • P Offline
                P Offline
                PrinzEisenherz1
                wrote on last edited by
                #8

                Pix, Du bist mein persönlicher Held des heutigen Tages!

                Perfekt!

                Tausend Dank!

                Gruß

                Johnny

                Intel-NUC mit ProxMox: ioBroker,SQL, logging Strom- Gas- u. Wasserzähler;10Zoll Tab im Flur für VIS; weiteres: Homematic CCU2, Homeduino, Kameras, selbstgebaute Wetterstation;

                1 Reply Last reply
                0
                • P Offline
                  P Offline
                  PrinzEisenherz1
                  wrote on last edited by
                  #9

                  Hi Pix! Ich hab da doch nochmal ne Frage bezgl dem Geburtstags-/SayIt-Skript von Dir!

                  Wo setzt Du da einen Schedule damit die Aktualisierung des Kalenders reibungslos läuft!

                  Bei mir läuft es noch so wie in Deinem Ursprungsscript ohne Schedule und jetzt aktualisiert das Script die Kalenderabfrage bzgl Geburtstage nicht!

                  Johnny

                  Intel-NUC mit ProxMox: ioBroker,SQL, logging Strom- Gas- u. Wasserzähler;10Zoll Tab im Flur für VIS; weiteres: Homematic CCU2, Homeduino, Kameras, selbstgebaute Wetterstation;

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

                    Hallo,@PrinzEisenherz1:

                    Hi Pix! Ich hab da doch nochmal ne Frage bezgl dem Geburtstags-/SayIt-Skript von Dir!

                    Wo setzt Du da einen Schedule damit die Aktualisierung des Kalenders reibungslos läuft!

                    Bei mir läuft es noch so wie in Deinem Ursprungsscript ohne Schedule und jetzt aktualisiert das Script die Kalenderabfrage bzgl Geburtstage nicht!

                    Johnny `
                    scheib es einfach unten drunter, also unter//bei Skriptstart pruefeKalender();scheibst du noch den schedule````
                    //zu einer bestimmten Uhrzeit, hier beispielsweise zwei Minuten nach Mitternacht (also am besten, einmal zu Beginn des Tages, aber kurz nachdem iCal gemäß der iCal-Einstellungen aktualisiert hat)
                    schedule("2 0 * * *", pruefeKalender);

                    
                    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
                    • P Offline
                      P Offline
                      PrinzEisenherz1
                      wrote on last edited by
                      #11

                      Super! Dankeschön Pix!

                      Wünsche dir noch n schönes Wochenende!

                      Gruß Johnny

                      Intel-NUC mit ProxMox: ioBroker,SQL, logging Strom- Gas- u. Wasserzähler;10Zoll Tab im Flur für VIS; weiteres: Homematic CCU2, Homeduino, Kameras, selbstgebaute Wetterstation;

                      1 Reply Last reply
                      0

                      Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                      Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                      With your input, this post could be even better 💗

                      Register Login
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      Support us

                      ioBroker
                      Community Adapters
                      Donate
                      FAQ Cloud / IOT
                      HowTo: Node.js-Update
                      HowTo: Backup/Restore
                      Downloads
                      BLOG

                      540

                      Online

                      32.8k

                      Users

                      82.8k

                      Topics

                      1.3m

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

                      • Don't have an account? Register

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