Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Hilfe beim Auslesen eines Wertes (iCal)

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Hilfe beim Auslesen eines Wertes (iCal)

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

      "feedback is breakfast for champions"

      Pix,

      melde Vollzug! Es klappt. Hier mein gesamtes Script zur Ansage über Sayit, mit

        • Datum
        • Uhrzeit
        • Au0entemperatur (kommt vom homeMatic Aussenthermostat
        • Wetterbedingungen (kommen über homeMatic Script von wunderground) und
        • der Geburtstagsansage
      `//  Script zur Ansage von
      //  Datum, Uhrzeit, Aussentemperatur, Wetterbedingungen und Geburtstagen
      //  erstellt von Pix (1000 Dank) und skorpil am 2.3.2016
      
      //sayyit adapter
      var idSayIt = "sayit.2.tts.text"  /*Text to speech*/;
      
      //Lautstärke einstellen
          var vol ="sayit.2.tts.volume";
          setState (vol,40);
      
      //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();
      
      //Wetter ermitteln
          var wetter = getState("hm-rega.0.29954").val;
          log('Wetter:   ' + wetter);
      
      // 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.LEQ0177463.1.TEMPERATURE").val; /*Temperatursensor:1.TEMPERATURE*/
      var temperatur = Temperatursensor.toString();
      
      log('Temp  ' + Temperatursensor);
      
      var temp_array = [];
      
      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.");
      }
      
      /* Kalenderevent auswerten
      
      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);
          }
      }
      
      var geburtstage = getState('javascript.0.Kalenderereignisse.heute').val;
      log(geburtstage);
      
      //Ansage
      setState (idSayIt, "Guten Morgen, heute ist " + w + " der " + t + "te " + m + j + ". Es ist" + h + "  Uhr und " + mi + "  Minuten." + "  Die Aussentemperatur beträgt " + temp_array[0] + "," + temp_array[1] + " Grad." + "  Wetter Bedingungen," + wetter +" ."+ " Heute haben Geburtstag: "+ geburtstage +" .");
      
      // bei Aktualisierung
      on ({id:'ical.0.events.Geburtstag', change: 'any'}, function(data) {
          pruefeKalender();
      });
      
      //bei Skriptstart
      pruefeKalender();</inhalt.length;>` 
      
      Ausgelöst wird es mittels einer HomeMatic Variablen. Bei Bedarf poste ich das Vorgehen gerne.
      
      PS:...und zum Feinschliff und als Kür bauen wir demnächst noch die Altersangabe mit ein... :D[/i][/i][/i]
      
      1 Reply Last reply Reply Quote 0
      • S
        skorpil last edited by

        …und das ware der Code mit Auslösen über eine Homematic Variable, die ihrerseits uber einen Bewegungsmelder einmal morgens (HomeMatic Programm) ausgelöst wird:

        [code// Test mit Variable;

        var SayVar = "hm-rega.0.38101";

        //Trigger

        on(SayVar, function (data) {

        // Definition

        var tts = "sayit.3.tts.text";

        var ist = getState(SayVar).val;

        // logs

        log('SayVar: ' + SayVar);

        log('TTS: ' + tts);

        log('ist: ' + ist);

        //Lautstärke einstellen

        var vol ="sayit.3.tts.volume";

        setState (vol,40);

        //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();

        //Wetter ermitteln

        var wetter = getState("hm-rega.0.29954").val;

        log('Wetter: ' + wetter);

        // 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.LEQ0177463.1.TEMPERATURE").val; /Temperatursensor:1.TEMPERATURE/

        var temperatur = Temperatursensor.toString();

        log('Temp ' + Temperatursensor);

        var temp_array = [];

        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.");

        }

        /* Kalenderevent auswerten

        sucht im iCal Adapter nach events (heute)

        auf Anfrage von Skorpil im Forum erstellt.

        http://forum.iobroker.de/viewtopic.php? … c38#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<br="">if ( (inhalt__.date.indexOf(heute) != -1) || (inhalt__.date.indexOf('Heute') != -1) ) { // Strings Datum oder relatives Datum (nicht nicht) gefunden

        var ereignis = inhalt__.event;

        ereignis = ereignis.replace(',',''); // Komma im Namen ersetzen

        var komma = (i>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);

        }

        }

        var geburtstage = getState('javascript.0.Kalenderereignisse.heute').val;

        log(geburtstage);

        if (data.newState.val === true) {

        setState (tts, "Guten Morgen, heute ist " + w + " der " + t + "te " + m + j + ". Es ist" + h + " Uhr und " + mi + " Minuten." + " Die Aussentemperatur beträgt " + temp_array[0] + "," + temp_array[1] + " Grad." + " Wetter Bedingungen," + wetter +" ." + " Heute haben Geburtstag: "+ geburtstage +" .");

        }

        });______</inhalt.length;>

        1 Reply Last reply Reply Quote 0
        • S
          skorpil last edited by

          Pix,

          HILFE. Etwas funktioniert nun doch noch nicht. Und zwar, wenn ich den Aufruf über eine Variable starte, bekommeich folgende Fehlermeldungen im Log:

          ` > ReferenceError: 2016-03-03 11:35:22 error at Socket.onevent (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:263:10)

          ReferenceError: 2016-03-03 11:35:22 error at Socket.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:131:20)

          ReferenceError: 2016-03-03 11:35:22 error at Socket.StatesInMemClient.client.on.connectionTimeout (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:45:30)

          ReferenceError: 2016-03-03 11:35:22 error at Object.that.states.States.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1969:80)

          ReferenceError: 2016-03-03 11:35:22 error at Object.utils.adapter.stateChange (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:215:17)

          ReferenceError: 2016-03-03 11:35:22 error at checkPatterns (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:524:17)

          ReferenceError: 2016-03-03 11:35:22 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:2415:17)

          ReferenceError: 2016-03-03 11:35:22 error at /opt/iobroker/node_modules/iobroker.javascript/javascript.js:528:48

          ReferenceError: 2016-03-03 11:35:22 error at Object.subs.callback (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1190:48)

          ReferenceError: 2016-03-03 11:35:22 error at Object. (script.js.Ansage_mit_Variable_kueche_mit_Geburtstag:146:19)

          ReferenceError: 2016-03-03 11:35:22 error idSayIt is not defined

          message 2016-03-03 11:35:22 error hm-rega.0.38101 [object Object] idSayIt is not defined

          javascript-0 2016-03-03 11:35:22 info script.js.Ansage_mit_Variable_kueche_mit_Geburtstag: Test Donnerstag

          javascript-0 2016-03-03 11:35:22 info script.js.Ansage_mit_Variable_kueche_mit_Geburtstag: Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.

          javascript-0 2016-03-03 11:35:22 info script.js.Ansage_mit_Variable_kueche_mit_Geburtstag: Temp 4

          javascript-0 2016-03-03 11:35:22 info script.js.Ansage_mit_Variable_kueche_mit_Geburtstag: Wetter: Wolkig

          javascript-0 2016-03-03 11:35:22 info script.js.Ansage_mit_Variable_kueche_mit_Geburtstag: ist: true

          javascript-0 2016-03-03 11:35:22 info script.js.Ansage_mit_Variable_kueche_mit_Geburtstag: TTS: sayit.3.tts.text `

          Der Script, mit dem ich arbeite ist dieses:

          `// Test mit Variable;
          
          var SayVar = "hm-rega.0.38101";
          
          //Trigger
              on(SayVar, function (data) {
          
              // Definition
              var tts = "sayit.3.tts.text";
              var ist = getState(SayVar).val;
          
          // logs
              log('SayVar:   ' + SayVar);
              log('TTS:   ' + tts);
              log('ist:   ' + ist);
          
          //Lautstärke einstellen
              var vol ="sayit.2.tts.volume";
              setState (vol,40);
          
          //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();
          
          //Wetter ermitteln
              var wetter = getState("hm-rega.0.29954").val;
              log('Wetter:   ' + wetter);
          
          // 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.LEQ0177463.1.TEMPERATURE").val; /*Temperatursensor:1.TEMPERATURE*/
          var temperatur = Temperatursensor.toString();
          
          log('Temp  ' + Temperatursensor);
          
          var temp_array = [];
          
          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.");
          }
          
          /* Kalenderevent auswerten
          
          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);
              }
          }
          
          var geburtstage = getState('javascript.0.Kalenderereignisse.heute').val;
          log(geburtstage);
          
               if (data.newState.val === true) {
                  setState (idSayIt, "Guten Morgen, heute ist " + w + " der " + t + "te " + m + j + ". Es ist" + h + "  Uhr und " + mi + "  Minuten." + "  Die Aussentemperatur beträgt " + temp_array[0] + "," + temp_array[1] + " Grad." + "  Wetter Bedingungen," + wetter +" ."+ " Heute haben Geburtstag: "+ geburtstage +" .");
              }
          
          });</inhalt.length;>`
          
          Was ist falsch? Ich weiß nicht, wo ich suchen soll....[/i][/i][/i]
          
          1 Reply Last reply Reply Quote 0
          • P
            pix last edited by

            Hallo,

            ich habe mal das ganze Skript bearbeitet. Du hattest einige Sachen durcheinandergebracht.

            Für die Übersicht habe ich jetzt jeden Teilbereich der angesagt wird (Wetterbedingunge von Rega, Temperatur von hm-rpc, Geburtstage aus Javascript und Datum aus diesem Skript) in eine eigene Funktion mit Rückgabe gepackt. Das ist eigentlich nicht immer nötig, hilft aber der Übersicht. In der Ansage wird dann die Funktion aufgerufen und der entsprechende Wert zurück an die Ansage übergeben (zB Wochentag oder Wetterbedingungen). Dann brauchst du die in der Triggerfunktion nicht weiter zu beachten.

            In diesem Skript ist besonders, dass die ermittelten Geburtstage in ein Objekt geschrieben werden ("javascript.0.Kalenderereignisse.heute") und hier im gleichen Skript aus diesem Objekt wieder ausgelesen werden (für die Ansage). Das ist eigentlich nicht nötig. Es macht sogar Sinn, die Geburtstagsgeschichte komplett in ein eigenes Skript zu packen und hier wirklich nur das Objekt auszulesen. Dann ist auch keine doppelte Datumsermittlung drin.

            Schau dir mal die Funktion ermitteleDatum() an. Die einzelnen Variablen werden gefüllt und dann im Befehl return mit "verständlichen" Namen als Objekt verknüpft. So kannst du unten in der Ansage einfach den richtigen Wert aus dem Objekt rauslösen (zB "wir haben das Jahr " + ermittleAnsagedatum().Jahr"). Bei der Temperatur war das auch nützlich. In diesem speziellen Fall hätte ich das etwas anders gelöst, denn bei glatt 18Grad sollte eigentlich nicht 18kommanull Grad angesagt werden. Man kann den fertigen Bergiff schon in der Funktion zusammenbauen und als ein String-Wert an die Ansage zurückgeben. Aber so geht es auch erst mal.

            Wenn nur ein Wert aus der Funktion zurückgegeben wird, brauchst du auch keine Objektstruktur (zB bei Wetterbedingungen).

            Zu dem Fehler im Log:

            idSayIt ist nicht deklariert. (setState (idSayIt, "Guten Morgen, heute ist ")

            Da bin ich auch noch nicht so sicher, wie du das alles meinst.

            Ich habe mal aufgeräumt und alle ID, als Variablen, die den Namen eines Objektes enthalten, oben an den Anfang des Skriptes gepackt. So kannst du die auch mal schneller austauschen. Da sollte dann später auch der auslösende Bewegungsmelder rein. Dabei ist mir aufgefallen, dass du 3! Sayit-Instanzen verwendest. Ist das richtig? Ich habe mal alles auf eine Instanz reduziert.

            Wie oben schon erwähnt, kann es sein, dass die Funktion pruefeKalender() auch per schedule noch gestartet werden muss.

            hier nun das neue Skript:

            ! ```
            `// 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;>`
            ! Bitte um Feedback
            ! Pix
            ! EDIT: Kleine kosmetische Korrekturen, die mit Sprachansagen zu tun haben, kann man dann später noch einbauen (heute ist Mittwoch der ~~[color]~~einste[/color] Juli zweitausendunsiebzehn) :lol: . Mach dich erstmal mit dem Javascript vertraut.[/i][/i][/i]

            1 Reply Last reply Reply Quote 0
            • S
              skorpil last edited by

              Pix,

              erstmal wiederum ein Riesen Danke. Ich werde das gleich testen.

              Doch voweg noch zwei Fragen:

              1. ich arbeite moemntan nur mit iobroker "Scripe" und "log" das ist irgendwie unkomfortabel. Zum Beispiel, wenn man zwei Scripte vergleichen oder einen Ausdruck suchen will. Kannst Du eine Enrwicklungsumgebung empfehlen?

              2. Ich hatte DIESES Script zur Ansage (OHNE Geburtstage) mit dem Tripper der homematic Systemvariablen "Sayit" erfolgreich laufen

              // Test mit Variable;
              
              var SayVar = "hm-rega.0.38101";
              
              //Trigger
                  on(SayVar, function (data) {
              
                  // Definition
                  var tts = "sayit.3.tts.text";
                  var ist = getState(SayVar).val;
              
              // logs
                  log('SayVar:   ' + SayVar);
                  log('TTS:   ' + tts);
                  log('ist:   ' + ist);
              
                  //Lautstärke einstellen
                      var vol ="sayit.3.tts.volume";
                      setState (vol,40);
              
                  //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();
              
                  //Wetter ermitteln
                      var wetter = getState("hm-rega.0.29954").val;
                      log('Wetter:   ' + wetter);
              
                  // splitten der Temperatur, damit die Ansage nicht "Es sind 18 Punkt 2 Grad " sagt.
              
                      var Temperatursensor = getState("hm-rpc.0.LEQ0177463.1.TEMPERATURE"); /*Temperatursensor:1.TEMPERATURE*/
                      var temperatur = Temperatursensor.val.toString();
                      var temp_array = [];
              
                      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.");
                        }
              
                   if (data.newState.val === true) {
                      setState (tts, "Guten Morgen, heute ist " + w + " der " + t + "te " + m + j + ". Es ist" + h + "  Uhr und " + mi + "  Minuten." + "  Die Aussentemperatur beträgt " + temp_array[0] + "," + temp_array[1] + " Grad." + "  Wetter Bedingungen," + wetter +" .");
              
                  }
              
              });
              

              Und dann habe ich "UNSER" Script eigentlich nur eingefügt

              `//sayyit adapter
              var idSayIt = "sayit.2.tts.text"  /*Text to speech*/;
              
              //Lautstärke einstellen
                  var vol ="sayit.2.tts.volume";
                  setState (vol,40);
              
              //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();
              
              //Wetter ermitteln
                  var wetter = getState("hm-rega.0.29954").val;
                  log('Wetter:   ' + wetter);
              
              // 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.LEQ0177463.1.TEMPERATURE").val; /*Temperatursensor:1.TEMPERATURE*/
              var temperatur = Temperatursensor.toString();
              
              log('Temp  ' + Temperatursensor);
              
              var temp_array = [];
              
              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.");
              }
              
              /* Kalenderevent auswerten
              
              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);
                  }
              }
              
              var geburtstage = getState('javascript.0.Kalenderereignisse.heute').val;
              log(geburtstage);
              
              //Ansage
              setState (idSayIt, "Guten Morgen, heute ist " + w + " der " + t + "te " + m + j + ". Es ist" + h + "  Uhr und " + mi + "  Minuten." + "  Die Aussentemperatur beträgt " + temp_array[0] + "," + temp_array[1] + " Grad." + "  Wetter Bedingungen," + wetter +" ."+ " Heute haben Geburtstag: "+ geburtstage +" .");
              
              // bei Aktualisierung
              on ({id:'ical.0.events.Geburtstag', change: 'any'}, function(data) {
                  pruefeKalender();
              });
              
              //bei Skriptstart
              pruefeKalender();</inhalt.length;>`
              
              Das brachte dann die Fehlermeldung. Aber Du hast mich auf eine Spur gebracht: es könnte mit den SayIt Adaptern zusammnehängen. Von denen habe ich insgesamt 4 in Betrieb, um unterschiedliche Sonos Geräte anzusteuern. Es sieht so aus, als wenn ich die Sayit Adapter verwechselt habe. Ich schaue mir das gleich noch einmal an. Eigentlich müßte es ja auch so laufen... Ich werde gleich berichten![/i][/i][/i]
              
              1 Reply Last reply Reply Quote 0
              • S
                skorpil last edited by

                So, lieber Pix,

                alle Tests habe ich durchgeführt. Ergebnis: meine Variante läuft (nachdem Du mich auf die Spur gebracht hast). Deine NICHT. Folgende Fehlermeldungen kommen bei Deiner Variante im Log:

                ` > ReferenceError: 2016-03-03 17:12:56 error at Socket.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:131:20)

                ReferenceError: 2016-03-03 17:12:56 error at Socket.StatesInMemClient.client.on.connectionTimeout (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:45:30)

                ReferenceError: 2016-03-03 17:12:56 error at Object.that.states.States.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1969:80)

                ReferenceError: 2016-03-03 17:12:56 error at Object.utils.adapter.stateChange (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:215:17)

                ReferenceError: 2016-03-03 17:12:56 error at checkPatterns (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:524:17)

                ReferenceError: 2016-03-03 17:12:56 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:2415:17)

                ReferenceError: 2016-03-03 17:12:56 error at /opt/iobroker/node_modules/iobroker.javascript/javascript.js:528:48

                ReferenceError: 2016-03-03 17:12:56 error at Object.subs.callback (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1190:48)

                ReferenceError: 2016-03-03 17:12:56 error at Object. (script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag:93:51)

                ReferenceError: 2016-03-03 17:12:56 error at ermitteleAnsagedatum (script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag:45:23)

                ReferenceError: 2016-03-03 17:12:56 error sekunde is not defined

                message 2016-03-03 17:12:56 error hm-rega.0.38101 [object Object] sekunde is not defined

                ReferenceError: 2016-03-03 17:12:26 error at Socket.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:131:20)

                ReferenceError: 2016-03-03 17:12:26 error at Socket.StatesInMemClient.client.on.connectionTimeout (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:45:30)

                ReferenceError: 2016-03-03 17:12:26 error at Object.that.states.States.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1969:80)

                ReferenceError: 2016-03-03 17:12:26 error at Object.utils.adapter.stateChange (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:215:17)

                ReferenceError: 2016-03-03 17:12:26 error at checkPatterns (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:524:17)

                ReferenceError: 2016-03-03 17:12:26 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:2415:17)

                ReferenceError: 2016-03-03 17:12:26 error at /opt/iobroker/node_modules/iobroker.javascript/javascript.js:528:48

                ReferenceError: 2016-03-03 17:12:26 error at Object.subs.callback (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1190:48)

                ReferenceError: 2016-03-03 17:12:26 error at Object. (script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag:93:51)

                ReferenceError: 2016-03-03 17:12:26 error at ermitteleAnsagedatum (script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag:45:23)

                ReferenceError: 2016-03-03 17:12:26 error sekunde is not defined `

                Bei MEINER Variante lag es a) an der falschen Zuordnung des Sayit Adapters (z.B. bei der Lautstärke Einstellung). Vor allem aber an der falschen If Bedingung. Jetzt steht da

                if (data.newState.val === true) {
                        setState (tts,
                

                und vorher war da

                setState (idSayIt
                

                also nicht korrekt definiert.

                Jetzt zu Deiner Optimierung. Hier weiß ich noch nicht, wo ich ansetzen soll, um die Fehler zu finden. Sekunde ist nicht definiert? Und ganz viele kryptische weitere Fehlermeldungen…

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

                  Hallo,
                  @skorpil:

                  Und dann habe ich "UNSER" Script eigentlich nur eingefügt `

                  du brauchst das Skript nicht einzufügen. Speichere es separat ab. Denn das Objekt, in dem die Geburtstage stehen, steht doch systemweit zur Verfügung. Ds kannst du auch in deinem alten Skript einlesen.

                  var geburtstag = getState('javascript.0.Kalernderereignis.heute').val;
                  
                  

                  Sorry, wenn deine homematic Systemvariable "Sayit" n Tripper hat. Ist da ansteckend? :lol:

                  @skorpil:

                  es könnte mit den SayIt Adaptern zusammnehängen. Von denen habe ich insgesamt 4 in Betrieb, ` Das ist recht ungewöhnlich, das hättest du ja mal vorher sagen können.

                  Nun zum Fehlerlog:

                  Das stimmt. Nimm mal die Zeile

                   'Sekunde'   : sekunde
                  

                  aus der Funktion ermitteleAnsagedatum heraus und lösche das Komma am Ende der Zeile davor.

                  @skorpil:

                  Und ganz viele kryptische weitere Fehlermeldungen… `
                  Wenn du die nicht postest, hilft es nicht

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

                    Ich brauche (noch) keine Entwicklungsumgebung. Bluefox Javascript Adapter ist super. Schau dir mal Version 2 an.

                    Gruß

                    Pix

                    1 Reply Last reply Reply Quote 0
                    • S
                      skorpil last edited by

                      Ich hatte die Fehlermeldungen gepostet:

                      ` > ReferenceError: 2016-03-03 17:12:56 error at Socket.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:131:20)

                      ReferenceError: 2016-03-03 17:12:56 error at Socket.StatesInMemClient.client.on.connectionTimeout (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:45:30)

                      ReferenceError: 2016-03-03 17:12:56 error at Object.that.states.States.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1969:80)

                      ReferenceError: 2016-03-03 17:12:56 error at Object.utils.adapter.stateChange (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:215:17)

                      ReferenceError: 2016-03-03 17:12:56 error at checkPatterns (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:524:17)

                      ReferenceError: 2016-03-03 17:12:56 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:2415:17)

                      ReferenceError: 2016-03-03 17:12:56 error at /opt/iobroker/node_modules/iobroker.javascript/javascript.js:528:48

                      ReferenceError: 2016-03-03 17:12:56 error at Object.subs.callback (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1190:48)

                      ReferenceError: 2016-03-03 17:12:56 error at Object. (script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag:93:51)

                      ReferenceError: 2016-03-03 17:12:56 error at ermitteleAnsagedatum (script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag:45:23)

                      ReferenceError: 2016-03-03 17:12:56 error sekunde is not defined

                      message 2016-03-03 17:12:56 error hm-rega.0.38101 [object Object] sekunde is not defined

                      ReferenceError: 2016-03-03 17:12:26 error at Socket.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:131:20)

                      ReferenceError: 2016-03-03 17:12:26 error at Socket.StatesInMemClient.client.on.connectionTimeout (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:45:30)

                      ReferenceError: 2016-03-03 17:12:26 error at Object.that.states.States.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1969:80)

                      ReferenceError: 2016-03-03 17:12:26 error at Object.utils.adapter.stateChange (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:215:17)

                      ReferenceError: 2016-03-03 17:12:26 error at checkPatterns (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:524:17)

                      ReferenceError: 2016-03-03 17:12:26 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:2415:17)

                      ReferenceError: 2016-03-03 17:12:26 error at /opt/iobroker/node_modules/iobroker.javascript/javascript.js:528:48

                      ReferenceError: 2016-03-03 17:12:26 error at Object.subs.callback (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1190:48)

                      ReferenceError: 2016-03-03 17:12:26 error at Object. (script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag:93:51)

                      ReferenceError: 2016-03-03 17:12:26 error at ermitteleAnsagedatum (script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag:45:23)

                      ReferenceError: 2016-03-03 17:12:26 error sekunde is not defined `

                      Werde das Thema mit dem Komma gleich mal korrigieren und neu testen.

                      Daß die Scripte systemweit zur Verfügung stehen und eingebunden werden können, wusste ich nicht. Großartig!

                      Mit dem Tripper stehe ich auf dem Schlauch. 😄 😄 hatte ich was von Tripper geschrieben. Falls ja, ich versichere, dieser Tripper ist nicht ansteckend.

                      Um das Komma in der Funktion ermitteleAndagedatum kümmere ich mich nach dem Abendessen…dann teste ich und melde mich.

                      Das mit den vier Sayit Adaptern: Grund ist, das jeder Adapter eine anderes Sonos Gerät anspricht. Damit kann ich dann unterschiedliche Ansagen in unterschiedlichen Räumen platzieren...

                      1 Reply Last reply Reply Quote 0
                      • S
                        skorpil last edited by

                        Abendessen fertig 😄

                        Nach der von Dir vorgeschlagenen Korrektur der "Sekunden" läuft das Script fein. Und zur zur Info hier das log:

                        ` > javascript.0 2016-03-03 20:09:58 info javascript.0 script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag: Trigger: false

                        javascript.0 2016-03-03 20:09:58 info javascript.0 script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag: heute keine Geburtstage

                        javascript.0 2016-03-03 20:09:58 info javascript.0 script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag: Wetter: Teils Wolkig

                        javascript.0 2016-03-03 20:09:58 info javascript.0 script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag: Temp 1.6

                        javascript.0 2016-03-03 20:09:58 info javascript.0 script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag: Temp 1.6

                        sonos.0 2016-03-03 20:09:46 info sonos.0 Restore state: volume - 40, mute: false, uri: x-file-cifs://192.168.0.76/musik/sound/2.mp3

                        sonos.0 2016-03-03 20:09:29 info sonos.0 Play on sonos[RINCON_000E5825101001400]: http://192.168.0.80:8082/state/sayit.2.tts.mp3, Volume: 40

                        sonos.0 2016-03-03 20:09:29 info sonos.0 try to control id sonos.0.root.192_168_0_32.tts with {"val":"40;http://192.168.0.80:8082/state/sayit.2. … :145667480

                        sayit.2 2016-03-03 20:09:29 info sayit.2 Copied file '/opt/iobroker/node_modules/iobroker.sayit/say.mp3' to '/opt/iobroker/cache/96e81de5ce2d7032bb64be832b9dcafd.mp3'

                        sayit.2 2016-03-03 20:09:29 info sayit.2 Set "sonos.0.root.192_168_0_32.tts: 40;http://192.168.0.80:8082/state/sayit.2.tts.mp3

                        sayit.2 2016-03-03 20:09:28 info sayit.2 saying: Guten Morgen, heute ist Donnerstag der 3te März 2016. Es ist20 Uhr und 9 Minuten. Die Aussentemperatur beträgt 1,6 Grad. Wetter Bedingungen,Teils Wolkig . Heute haben Geburtstag: heu

                        javascript.0 2016-03-03 20:09:28 info javascript.0 script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag: Trigger: true

                        javascript.0 2016-03-03 20:09:28 info javascript.0 script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag: heute keine Geburtstage

                        javascript.0 2016-03-03 20:09:28 info javascript.0 script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag: Wetter: Teils Wolkig

                        javascript.0 2016-03-03 20:09:28 info javascript.0 script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag: Temp 1.6

                        javascript.0 2016-03-03 20:09:28 info javascript.0 script.js.Pix_OPTIMIERT_Kueche_Ansage_mit_Variable_u__Geburtstag: Temp 1.6 `

                        Nochmals vielen, vielen Dank.

                        PS: Ab Samstag bin ich für eine Woche auf Geschäftsreise in den USA und ab 14.3. wieder da. Also nicht wundern, wenn ich mich nicht melde.

                        1 Reply Last reply Reply Quote 0
                        • S
                          skorpil last edited by

                          @pix:

                          Ich brauche (noch) keine Entwicklungsumgebung. Bluefox Javascript Adapter ist super. Schau dir mal Version 2 an.

                          Gruß

                          Pix `

                          Version 2? Ich habe aktuell die 1.2.0 laufen. Mein Problem ist z.B. das Fehlen einer Suchfunktion usw. Wo gibt es die Version 2.0??? Guthub?

                          PPS: habe sie gefunden. Aber wie lädt man die?

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

                            So:

                            http://forum.iobroker.com/viewtopic.php … 10&p=20277

                            oder im Admin Reiter "Adapter" links oben dere 3. Knopf "installieren aus eigener URL" dort

                            https://github.com/ioBroker/ioBroker.javascript/tarball/master
                            

                            reinkopieren und starten.

                            Gruß

                            Pix

                            1 Reply Last reply Reply Quote 0
                            • S
                              skorpil last edited by

                              Hallo Pix,

                              ich muss mich doch nochmal zu unserem Script melden. Es läuft zwar täglich durch, aber die Geburtstagsansage funktioniert nicht durchgehend. Jetzt hatte ich den Fall, dass Montag ein Name angesagt wurde, der sich dann täglich wiederholt. Also, Dienstag gab es keinen Geburtstag und der Name vom Montag wurde weiterhin angesagt. Auch am Mittwoch. Eigentlich hätte dann "niemand" gesagt werden müssen. Irgendwie habe ich das Gefühl, dass nicht immer neue Werte eingelesen werden, obwohl ich via iCal jede Nacht einmal mit "57 1 * * *" den Kalender abfrage. Hier nochmal das Script, das ich benutze

                              `// Test mit Variable;
                              // Besser ist es, gleich die VARIABLE SayIt hier abzufragen.
                              var idSayVar = "hm-rega.0.38101";
                              
                              // Definition Sayit für "3" = Kueche;
                              var idSayIt =            "sayit.3.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
                                  };
                              }
                              
                              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 = 'niemand'; // 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;>`
                              
                              Kannst Du mir helfen? Hast Du eine Idee, woran das liegen könnte?
                              
                              Liebe Grüße
                              
                              Bernd[/i][/i][/i]
                              
                              1 Reply Last reply Reply Quote 0
                              • P
                                pix last edited by

                                Hallo Bernd,

                                nur ganz kurz:

                                Klappt es denn, wenn du das Skript neu startest?

                                Dann könntest du die Funktion pruefeKalender jeden Tag eine/zwei Minuten nach dem Erneuern des Kalenders starten?

                                schedule("58,59 1 * * *", prufeKalender);
                                

                                Gruß

                                Pix

                                1 Reply Last reply Reply Quote 0
                                • S
                                  skorpil last edited by

                                  Lieber Pix,

                                  Danke für Deine rasche Antwort.

                                  Du scheinst da den richtigen Riecher zu haben. Gestern Abend habe ich das Skript manuell neu gestartet und dann kam heute auch die richtige Ansage.

                                  Ich werde Deinen Hinweis gerne prüfen. Meine Frage: wo müsste ich denn Deinen Code schedule unterbringen? Im Skript am Ende? Oder in einem neuen Skript? Du weißt, ich bin ja nicht so der Java Profi….

                                  Danke für die Hilfe,

                                  Bernd

                                  1 Reply Last reply Reply Quote 0
                                  • S
                                    skorpil last edited by

                                    Lieber Pix,

                                    nochmal ich. 😄

                                    Ich habe jetzt am Ende des Skripts, nach "bei Skriptstart" noch " jede Nacht um 02:00" ausführen" ergänzt. Ist das dort richtig? Oder gehört der schedule Ausdruck in ein gesondertes Java Skript?

                                    //bei Skriptstart
                                    pruefeKalender();
                                    
                                    //und jede Nacht um 02:00 ausführem
                                    schedule("0 2 * * *", pruefeKalender);
                                    

                                    Im log steht jetzt

                                    javascript-0 2016-11-24 16:49:33.953 info script.js.Pix_OPTIMIERT_(Kueche)__Ansage_mit_Variable_u__Geburtstag: registered 2 subscriptions and 2 schedules 
                                    javascript-0 2016-11-24 16:49:33.945 info script.js.Pix_OPTIMIERT_(Kueche)__Ansage_mit_Variable_u__Geburtstag: Geburtstage:  
                                    javascript-0 2016-11-24 16:49:33.828 info Start javascript script.js.Pix_OPTIMIERT_(Kueche)__Ansage_mit_Variable_u__Geburtstag 
                                    
                                    

                                    Was bedeutet "registered 2 subscriptions and 2 schedules"?

                                    Noch ein Hinweis resp. Frage: Du hast in Deinem schedule Ausdruck "58,59 1 * * *" also 58,59 angegeben. Was ist der Hintergrund?

                                    Und, Du hast "prufeKalender" gepostet. Ich denke, es sollte "pruefeKalender" heissen.

                                    Bitte noch einmal um kurzes feedback! Und ich werde morgen berichten, was passiert ist.

                                    Liebe Grüße,

                                    Bernd

                                    1 Reply Last reply Reply Quote 0
                                    • S
                                      skorpil last edited by

                                      Feedback:

                                      Mit der Ergänzung des schedule Befehl wie oben beschrieben, scheint es zu funktionieren. Offenbar muss die pruefeKalender Funktion nach vorliegen neuer Werte in iCal neu gestartet werden, um diese einzulesen.

                                      Ich werde das Verhalten weiter im "Regekbetrieb" 😄 beobachten und mich ggf. wieder melden.

                                      Danke für die Unterstützung.

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

                                        Hallo Bernd,

                                        wen dem wirklich so ist, dann kann man später im Skript den Start der Funktion an die Aktivierung des iCal Adapters koppeln. Denn natürlich kann man mit Javascript abfragen, wann und ob ein anderer Adapter gestartet wurde. Lass es mal ein paar (Geburts-)Tage so laufen, wie es gerade ist.

                                        Gruß

                                        Pix

                                        1 Reply Last reply Reply Quote 0
                                        • S
                                          skorpil last edited by

                                          Lieber "Guru" Pix 😄 ,

                                          Danke für den Tip. Wie Du sagst, ich schaue mir das jetzt im Regelbetrieb an.

                                          Aaaaaber, mich würde sehr interessieren, wie die das Programm aussähe, um den iCal abzufragen. Bin neugierig!

                                          Liebe Grüße

                                          Bernd

                                          1 Reply Last reply Reply Quote 0
                                          • E
                                            eagleye last edited by

                                            Hallo,

                                            ich würde gerne bei einer meiner ical Instanzen (ical.0) nur die heutigen Termine anzeigen lassen im VIS. Unabhängig ob es Müll oder Geburtstage sind, sondern einfach ALLE Termine die NUR am heutigen Tag anstehen. Habe insgesamt 4 ical Instanzen, die unterschiedliche Kalender anzeigen. Es geht aber um die ical.0 Instanz welche im Vis als "Termine heute" ausgegeben wird. Ich schaffe es nicht über den adapter nur den heutigen Tag dort anzuzeigen.

                                            In diesen Thread habe ich ähnlich Ansätze gefunden. Weiß aber nicht welche das richtige für mich wäre, da es hier zusätzlich um Geburtstag un Sayit geht, was ich nicht bräuchte.

                                            Kann mir jemand helfen?

                                            Danke im Voraus.
                                            5784_bildschirmfoto_2018-09-15_um_13.29.40.png

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            703
                                            Online

                                            31.7k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            4
                                            42
                                            6647
                                            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