Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Hilfe beim Auslesen eines Wertes (iCal)

NEWS

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

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

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.2k

Hilfe beim Auslesen eines Wertes (iCal)

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
42 Beiträge 4 Kommentatoren 7.2k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • S Offline
    S Offline
    skorpil
    schrieb am zuletzt editiert von
    #8

    Pix,

    danke. Irgendetwas scheint bei mir anders als bei Dir. Jedenfalls klappt es nicht. Im Log wird nichts Verwerbares angezeit - außer, was ich schon gepostet habe.

    Ich überlege allerdings, ob wir ggf. aneinander vorbei gesprochen und gedacht haben.

    Daher nochmal präzise meine Frage: Ich möchte mittels JavaScript ja NUR eine bereits im iobroker vorhandene Information in eine neue Variable auslesen. Diese Informationen stehen in "ical.0.data.table" bzw. in "ical.0.data.html". Denn die Inhalte dieser beiden Variablen werden ja stündlich automatisch über den ical Adapter aktualisiert.

    Mich interessiert auch nur die Information, die für "HEUTE" in den beiden o.g. ical Adapter Variablen steht.

    Lt. Gihub handelt es sich um (ich zitiere) "data.table = Javascript-Array mit Ereignisen"

    ` > [

    {

    'date' : 'Heute 17:00',

    'event' : 'Ereignis heute',

    '_class' : 'ical_calendar1 ical_today',

    '_date' : '2015-02-18T16:00:00.000Z',

    '_calName' : 'calendar1'

    }, {

    'date' : 'Morgen 19:15',

    'event' : 'Ereignis morgen',

    '_class' : 'ical_calendar1 ical_tomorrow',

    '_date' : '2015-02-19T18:15:00.000Z',

    '_calName' : 'calendar1'

    }, {

    'date' : '23.02.2015',

    'event' : 'Geburtstag',

    '_class' : 'ical_calendar1',

    '_date' : '2015-02-19T00:00:00.000Z',

    '_calName' : 'calendar1'

    }, {

    'date' : '23.02.2015 14:15',

    'event' : 'Müllabfuhr',

    '_class' : 'ical_calendar1 ',

    '_date' : '2015-02-23T13:15:00.000Z',

    '_calName' : 'calendar1'

    }

    ] `

    bzw. um "data.html = HTML Text Ereignisen"

    ` > Heute 17:00Ereignis heute

    Morgen 19:15Ereignis morgen

    23.02.2015 Geburtstag

    23.02.2015 14:15 Müllabfuhr `

    Wie sähe ein JavaScript aus, welches mir schlicht alle Events heute zweilenweise jeweils in ein neues Array oder eine neue Variable schreibt, die ich weiterverarbeiten kann. Im Beispiel aus dem Github

    > 'event' : 'Ereignis heute'

    Ich hoffe, ich konnte präzise genug formulieren..

    Danke für die Hilfe!

    1 Antwort Letzte Antwort
    0
    • P Offline
      P Offline
      pix
      schrieb am zuletzt editiert von
      #9

      Hallo,

      ich glaube, ich hab es verstanden.

      Das Objekt mit den Kalenderdaten wird ausgelesen, auf den String "Heute" geprüft und bei dessen Fund das passende Event in eine Liste geschrieben.

      ! ```
      createState('Kalenderereignisse.heute', '', { name: 'Events von heute', type: 'string' }); ! var idListe = 'Kalenderereignisse.heute'; ! function pruefeKalender() { var inhalt = getState('ical.0.data.table').val; try{ var ereignisse = JSON.stringify(inhalt, null, 2); // Ausgabe als String log(ereignisse); var ereignisheute = ''; for(var i = 0; i <inhalt.length; i++)/{/alle/events/durchgehen/if/(inhalt[i].date.indexof('heute')/!="-1)" string/(nicht/nicht)/gefunden/ereignisheute="ereignisheute" +/inhalt[i].event/'\n';/}/setstate(idliste,/ereignisheute);/catch/(fehler_try)/log('fehler/beim/kalenderevent/einlesen/'/fehler_try);/log('liste:/getstate(idliste).val);/bei/aktualisierung/on/({id:/idkalender,/change:/'any'},/function(data)/pruefekalender();/});/skriptstart/pruefekalender();<e=""></inhalt.length;>
      ! Probier mal,
      ! Gruß
      ! Pix[/i][/i]

      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 Antwort Letzte Antwort
      0
      • S Offline
        S Offline
        skorpil
        schrieb am zuletzt editiert von
        #10

        Hallo Pix,

        habe gerade getestet. Erst kam eine Fehlermeldung, weil im JavaScript wg. "id: idKalender" stand. Das habe ich dann ersetzt durch "ical.0.events.Geburtstag'". Jetzt läuft das Script durch. (Das Scrpt heißt derweil bei mir "Pix" :) :) :) )

        das log meldet:
        ` > javascript-0 2016-03-01 12:18:51 info script.js.Pix: registered 1 subscription and 0 schedules

        javascript-0 2016-03-01 12:18:51 info script.js.Pix: Liste:

        javascript-0 2016-03-01 12:18:51 info ]

        javascript-0 2016-03-01 12:18:51 info }

        javascript-0 2016-03-01 12:18:51 info "_calName": "Geburtstage"

        javascript-0 2016-03-01 12:18:51 info "_rule": " rrule ",

        javascript-0 2016-03-01 12:18:51 info "_allDay": false,

        javascript-0 2016-03-01 12:18:51 info "_IDID": "AAAAAK0wqoFtFwFHoWTOiDMq8uAHAMdg+pPlLJ1Hg99QMJoIqmEAAAAAAQ0AAMdg+pPlLJ1Hg99QMJoIqmEAAAAAmfMAAA==",

        javascript-0 2016-03-01 12:18:51 info "_end": "2016-03-01T23:00:00.000Z",

        javascript-0 2016-03-01 12:18:51 info "_date": "2016-03-01T23:00:00.000Z",

        javascript-0 2016-03-01 12:18:51 info "_class": "ical_Geburtstage ical_tomorrow",

        javascript-0 2016-03-01 12:18:51 info "event": "Geburtstag von XXXXXXXX",

        javascript-0 2016-03-01 12:18:51 info "date": "02.03.2016 ",

        javascript-0 2016-03-01 12:18:51 info {

        javascript-0 2016-03-01 12:18:51 info },

        javascript-0 2016-03-01 12:18:51 info "_calName": "Geburtstage"

        javascript-0 2016-03-01 12:18:51 info "_rule": " rrule ",

        javascript-0 2016-03-01 12:18:51 info "_allDay": false,

        javascript-0 2016-03-01 12:18:51 info "_IDID": "AAAAAK0wqoFtFwFHoWTOiDMq8uAHAMdg+pPlLJ1Hg99QMJoIqmEAAAAAAQ0AAMdg+pPlLJ1Hg99QMJoIqmEAAAAAmfYAAA==",

        javascript-0 2016-03-01 12:18:51 info "_end": "2016-03-01T23:00:00.000Z",

        javascript-0 2016-03-01 12:18:51 info "_date": "2016-03-01T23:00:00.000Z",

        javascript-0 2016-03-01 12:18:51 info "_class": "ical_Geburtstage ical_tomorrow",

        javascript-0 2016-03-01 12:18:51 info "event": "Geburtstag von XXXXXXXX",

        javascript-0 2016-03-01 12:18:51 info "date": "02.03.2016 ",

        javascript-0 2016-03-01 12:18:51 info {

        javascript-0 2016-03-01 12:18:51 info },

        javascript-0 2016-03-01 12:18:51 info "_calName": "Geburtstage"

        javascript-0 2016-03-01 12:18:51 info "_rule": " rrule ",

        javascript-0 2016-03-01 12:18:51 info "_allDay": false,

        javascript-0 2016-03-01 12:18:51 info "_IDID": "AAAAAK0wqoFtFwFHoWTOiDMq8uAHAMdg+pPlLJ1Hg99QMJoIqmEAAAAAAQ0AAMdg+pPlLJ1Hg99QMJoIqmEAAAAAmfEAAA==",

        javascript-0 2016-03-01 12:18:51 info "_end": "2016-02-29T23:00:00.000Z",

        javascript-0 2016-03-01 12:18:51 info "_date": "2016-02-29T23:00:00.000Z",

        javascript-0 2016-03-01 12:18:51 info "_class": "ical_Geburtstage ical_today",

        javascript-0 2016-03-01 12:18:51 info "event": "Geburtstag von XXXXXXXX",

        javascript-0 2016-03-01 12:18:51 info "date": "01.03.2016 ",

        javascript-0 2016-03-01 12:18:51 info {

        javascript-0 2016-03-01 12:18:51 info },

        javascript-0 2016-03-01 12:18:51 info "_calName": "Geburtstage"

        javascript-0 2016-03-01 12:18:51 info "_rule": " ",

        javascript-0 2016-03-01 12:18:51 info "_allDay": false,

        javascript-0 2016-03-01 12:18:51 info "_IDID": "52270bbf-2005-46f3-96a5-894982866842",

        javascript-0 2016-03-01 12:18:51 info "_end": "2016-03-01T23:00:00.000Z",

        javascript-0 2016-03-01 12:18:51 info "_date": "2016-02-29T23:00:00.000Z",

        javascript-0 2016-03-01 12:18:51 info "_class": "ical_Geburtstage ical_today",

        javascript-0 2016-03-01 12:18:51 info "event": "Geburtstag von Test Dienstag",

        javascript-0 2016-03-01 12:18:51 info "date": "01.03.2016 ",

        javascript-0 2016-03-01 12:18:51 info {

        javascript-0 2016-03-01 12:18:51 info script.js.Pix: [

        javascript-0 2016-03-01 12:18:51 info Start javascript script.js.Pix `

        Frage: in welcher Variablen stehen jetzt die Ereignisse heute?

        1 Antwort Letzte Antwort
        0
        • P Offline
          P Offline
          pix
          schrieb am zuletzt editiert von
          #11

          @skorpil:

          Erst kam eine Fehlermeldung, weil im JavaScript wg. "id: idKalender" stand. Das habe ich dann ersetzt durch "ical.0.events.Geburtstag'". Jetzt läuft das Script durch. (Das Scrpt heißt derweil bei mir "Pix" :) :) :) )

          …

          Frage: in welcher Variablen stehen jetzt die Ereignisse heute? `
          Freut mich, dass es klappt. Und tut mir leid, wegen der nicht deklarierten "idKalender"…

          Die Ergebnisse stehen in "javascript.0.Kalenderereignisse.heute". (Erste Zeile Skript)

          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 Antwort Letzte Antwort
          0
          • S Offline
            S Offline
            skorpil
            schrieb am zuletzt editiert von
            #12

            Pix,

            1000 Dank, das hätte ich alleine nie auf die Kette bekommen! Gibt es eigentlich irgendwo ein gutes Java Tutorial?

            Noch eine Frage: wenn es an einem Tag mehrere Geburtstage gibt, wie kann ich die dann separieren?

            1 Antwort Letzte Antwort
            0
            • S Offline
              S Offline
              skorpil
              schrieb am zuletzt editiert von
              #13

              Pix,

              1000 Dank, das hätte ich alleine nie auf die Kette bekommen!

              Kann ich mich irgendwie erkenntlich zeigen?

              Gibt es eigentlich irgendwo ein gutes Java Tutorial?

              Noch eine Frage: wenn es an einem Tag mehrere Geburtstage gibt, wie kann ich die dann separieren?
              16508_iobroker.2019-02-07.log

              1 Antwort Letzte Antwort
              0
              • P Offline
                P Offline
                pix
                schrieb am zuletzt editiert von
                #14

                @skorpil:

                Pix,

                1000 Dank, das hätte ich alleine nie auf die Kette bekommen! ` Dafür ist das Forum ja da.
                @skorpil:

                Kann ich mich irgendwie erkenntlich zeigen? ` Ja, in dem du anderen hilfst, die Fragen im Forum stellen.
                @skorpil:

                Gibt es eigentlich irgendwo ein gutes Java Tutorial? ` Hier geht es https://www.java.com/de/download/faq/java_javascript.xml, sondern um Javascript. Ich schlage immer hier nach:

                http://www.w3schools.com/js/default.asp

                https://wiki.selfhtml.org/wiki/Schnell-Index/JavaScript
                @skorpil:

                Noch eine Frage: wenn es an einem Tag mehrere Geburtstage gibt, wie kann ich die dann separieren? `
                @skorpil:

                Wie sähe ein JavaScript aus, welches mir schlicht alle Events heute zweilenweise jeweils in ein neues Array oder eine neue Variable schreibt, die ich weiterverarbeiten kann. `
                Mehrere Einträge werden, wie gewünscht, zeilenweise (untereinander) in die Variable geschrieben (mit Zeilenumbruch).

                Es macht keinen Sinn, für jeden Geburtstag eine Variable anzulegen. An einem Tag sind es drei Variablen, am nächsten keine. Man müsste die ungenutzten Variable löschen, das ist sehr holprig.

                Du hast noch nicht gesagt, was du mit "weiterverarbeiten" meinst. Soll der Name per Sayit angesagt werden?

                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 Antwort Letzte Antwort
                0
                • S Offline
                  S Offline
                  skorpil
                  schrieb am zuletzt editiert von
                  #15

                  Pix,

                  Jawohl, du hast recht, ich möchte mir die Geburtstage in Sayit morgens ansagen lassen.

                  Ich werde mein fertiges Script dann auch hier posten, damit alle davon profitieren.

                  Ich finde das schon sehr außergewöhnlich, dass du das mit dem Forum so siehst. Ich werde selbstverständlich ebenfalls helfen wo immer ich kann. Das habe ich auch bereits im Chromatik Forum gemacht.

                  Auf jedenfall noch einmal ein dickes Dankeschön.

                  Liebe Grüße

                  Bernd

                  1 Antwort Letzte Antwort
                  0
                  • S Offline
                    S Offline
                    skorpil
                    schrieb am zuletzt editiert von
                    #16

                    Pix,

                    irgend etwas stimmt noch nicht.

                    log('Liste: ' + getState(idListe).val);
                    

                    Hier wird im Log ausgegeben

                    > javascript-0 2016-03-01 20:12:15 info script.js.Pix: Liste:

                    Die Liste ist also leer. Obwohl etwas drinstehen sollte. Denn "var ereignisse" hat ja Werte.

                    Haben wir vergessen idListe zu definieren?

                    Schaust Du bitte noch mal?

                    Danke!

                    1 Antwort Letzte Antwort
                    0
                    • S Offline
                      S Offline
                      skorpil
                      schrieb am zuletzt editiert von
                      #17

                      Pix,

                      Ich glaube, ich habe den Fehler identifiziert:

                      ` > if (inhalt__.date.indexOf('Heute') != -1) { // String (nicht nicht) gefunden__ __'Heute' wird als Datum nicht erkannt. Er kennt das Wort heute nicht, nur ein Datum der Form TT.mm.jjjj

                      Wie müsste das angepasst werden?

                      Gruß

                      Bernd__ `

                      1 Antwort Letzte Antwort
                      0
                      • P Offline
                        P Offline
                        pix
                        schrieb am zuletzt editiert von
                        #18

                        @skorpil:

                        Pix,

                        Ich glaube, ich habe den Fehler identifiziert:

                        ` > if (inhalt__.date.indexOf('Heute') != -1) { // String (nicht nicht) gefunden__ __'Heute' wird als Datum nicht erkannt. Er kennt das Wort heute nicht, nur ein Datum der Form TT.mm.jjjj

                        Wie müsste das angepasst werden?

                        Gruß

                        Bernd_ ich kann Dir versichern, dass "er" das Wort "Heute" erkennt. Es ist vielleicht nicht vorgekommen, aber "er" erkennt es. Du hast dir oben gewünscht, dass alle Termin von HEUTE ausgegeben werden sollen. Du hast nichts vom Datum gesagt. Dazu musst du das heutige Datum erst in eine Variable packen und dann am besten mit formatDate anpassen.

                        @pix:

                        ! `createState('Kalenderereignisse.heute', '', { name: 'Events von heute', type: 'string' }); ! var idListe = 'Kalenderereignisse.heute'; ! function pruefeKalender() { var inhalt = getState('ical.0.data.table').val; try{ var ereignisse = JSON.stringify(inhalt, null, 2); // Ausgabe als String log(ereignisse); var ereignisheute = ''; for(var i = 0; i <inhalt.length; i++)/{/alle/events/durchgehen/if/(inhalt[i].date.indexof('heute')/!="-1)" string/(nicht/nicht)/gefunden/ereignisheute="ereignisheute" +/inhalt[i].event/'\n';/}/setstate(idliste,/ereignisheute);/catch/(fehler_try)/log('fehler/beim/kalenderevent/einlesen/'/fehler_try);/log('liste:/getstate(idliste).val);/bei/aktualisierung/on/({id:/idkalender,/change:/'any'},/function(data)/pruefekalender();/});/skriptstart/pruefekalender();<e=""></inhalt.length;>` ~~[quote]~~Die Liste ist also leer. Obwohl etwas drinstehen sollte. Denn "var ereignisse" hat ja Werte. ! Haben wir vergessen idListe zu definieren? ` ` Nee, haben wir nicht. ! Was gibt denn das Log aus?[/i][/i] _ `

                        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 Antwort Letzte Antwort
                        0
                        • S Offline
                          S Offline
                          skorpil
                          schrieb am zuletzt editiert von
                          #19

                          Lieber Pix,

                          wie man sieht: "Kommunikation ist ein schweres Geschäft". Naturlich hattest Du recht als Du sagtest, ich hätte gewünscht, den Termin von "heute" ausgeben zu lassen. Aber das meinte ich nicht wortwörtlich, sondern stets bezogen auf das Datum des jeweiligen Tages, also"heute" :D Sorry, wenn ich mich da nicht klar ausgedrückt habe.

                          > Dazu musst du das heutige Datum erst in eine Variable packen und dann am besten mit formatDate anpassen.

                          Damit habe ich mich sehr schwer getan, weil ich "formatDate" in den Tutorials nicht gefunden habe. Mein "Workaround" mit folgendem Script, das ich vor Deines geschriebe habe, funktioniert nun:

                          //Datum als String ermitteln;
                          
                              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();
                          
                              datum= t+"."+m+"."+j+" ";
                              //log("datum:   " + datum);
                          
                          

                          Ist vielleicht umständing, klappt aber. Die einzelnen Blöcke der Ausgabe sehen ja so aus:

                          ` > javascript-0 2016-03-01 12:18:51 info },

                          javascript-0 2016-03-01 12:18:51 info "_calName": "Geburtstage"

                          javascript-0 2016-03-01 12:18:51 info "_rule": " rrule ",

                          javascript-0 2016-03-01 12:18:51 info "_allDay": false,

                          javascript-0 2016-03-01 12:18:51 info "_IDID": "AAAAAK0wqoFtFwFHoWTOiDMq8uAHAMdg+pPlLJ1Hg99QMJoIqmEAAAAAAQ0AAMdg+pPlLJ1Hg99QMJoIqmEAAAAAmfEAAA==",

                          javascript-0 2016-03-01 12:18:51 info "_end": "2016-02-29T23:00:00.000Z",

                          javascript-0 2016-03-01 12:18:51 info "_date": "2016-02-29T23:00:00.000Z",

                          javascript-0 2016-03-01 12:18:51 info "_class": "ical_Geburtstage ical_today",

                          javascript-0 2016-03-01 12:18:51 info "event": "Geburtstag von XXXXXXXX",

                          javascript-0 2016-03-01 12:18:51 info "date": "01.03.2016 ",

                          javascript-0 2016-03-01 12:18:51 info { `

                          Und in "date" steht am Ende auch noch ein Leerzeichen…

                          Das ganze Script nun hier:

                          `//Datum als String ermitteln;
                          
                              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();
                          
                              datum= t+"."+m+"."+j+" ";
                              //log("datum:   " + datum);
                          
                          createState('Kalenderereignisse.heute', '', {
                              name: 'Events von heute',
                              type: 'string'
                          });
                          
                          var idListe = 'Kalenderereignisse.heute';
                          
                          function pruefeKalender() {
                              var inhalt = getState('ical.0.data.table').val;
                              try{
                                  var ereignisse = JSON.stringify(inhalt, null, 2); // Ausgabe als String
                                  //log(ereignisse);
                                  var ereignisheute = '';
                                  for(var i = 0; i <inhalt.length; i++)/{/alle/events/durchgehen/if/(inhalt[i].date.indexof(datum)/!="-1)" string/(nicht/nicht)/gefunden/ereignisheute="ereignisheute" +/inhalt[i].event/'\n';/}/setstate(idliste,/ereignisheute);/catch/(fehler_try)/log('fehler/beim/kalenderevent/einlesen/'/fehler_try);/log('liste:/getstate(idliste).val);/bei/aktualisierung/on/({id:'ical.0.events.geburtstag',/change:/'any'},/function(data)/pruefekalender();/});/skriptstart/pruefekalender();<e=""></inhalt.length;>`
                          
                          Jetzt habe ich noch folgendes Problem. Die Ansage bei Sayit soll nachher lauten "Heute haben Geburtstag: Peter Müller, Klaus Meyer und Johann Müller". Im Kalender steht aber immer "Geburtstag von Peter Müller", "Geburtstag von Klaus Meyer" usw. 
                          
                          Folglich muß ich "Geburtstag von" auch noch aus der Variablen eliminieren, bevor ich sie ansagen lasse. 
                          
                          In einen früheren Post hast Du geschrieben  ` ~~[quote]~~Die Ergebnisse stehen in "javascript.0.Kalenderereignisse.heute". (Erste Zeile Skript)
                           `  ` 
                          
                          Ich benötige für die Ansage in Sayit aber eher eine Variable wie " var variable = ??????". Oder, wenn ich die Anzahl der Geburtstgskinder Heute kenne, einen array z.b. mit "var geburtstag= new Array("Peter Müller,"Klaus Meyer")"
                          
                          Faziot: zwei Aufgaben noch  :D 
                          
                          a) "Geburtstag von" weg, und
                          
                          b) die variable, die ich von sayit ansagen lassen kann[/i][/i]
                          
                          1 Antwort Letzte Antwort
                          0
                          • P Offline
                            P Offline
                            pix
                            schrieb am zuletzt editiert von
                            #20

                            Hallo,

                            ich finde, du hast dir die Datumsfunktion super selbst zusammengebaut. Sie ist ungewöhnlich, aber funktioniert. Sehr gut, die lassen wir so. Trotzdem: formatDate ist https://github.com/iobroker/ioBroker.javascript/blob/master/README.md#example

                            Jetzt musste deinen Code nur in eine Funktion, damit das Datum auch bei jeder Prüfung ermittelt wird und nicht nur einmalig zum Skriptstart.

                            Das Ergebnis steht im Objekt

                            'javascript.0.Kalenderereignisse.heute' mit dem Inhalt

                            <size size="85">Peter Müller</size>

                            <size size="85">Peter Müller und Klaus Meyer</size>

                            <size size="85">Peter Müller, Klaus Meyer und Hans Bauer</size>

                            Du wirst sicher ein anderes Skript haben, welches nun die Geburtstage vorlesen soll. Da bindest du das dort so ein:

                            var geburtstage = getState('javascript.0.Kalenderereignisse.heute').val;
                            var ansage = (geburtstage.length > 1) ? 'Heute haben Geburtstag: ' + geburtstage : 'Heute keine Geburtstage';
                            

                            Im Skript gibt es die Zeile, in der das Event-Datum mit dem heutigen Datum verglichen wird. Wenn sie identisch sind, wird fortgesetzt. Du kannst an der Stelle auch noch eine UND Verknüpfung ein bauen, die auch den String "Geburtstag" abfragt. Dann werden nur heutige Geburtstage ausgegeben. Das erlaubt es dir, auch andere Ereignisse in den Kalender zu schreiben. Wenn der Kalender aber eh nur Geburtstage liefern soll, brauchst du das nicht. Sonst ersetze einfach diese Zeile

                            `if ( (inhalt[i].date.indexOf(heute) != -1) || (inhalt[i].date.indexOf('Heute') != -1) ) {`gegen diese
                            `~~[code]~~if ( ( (inhalt[i].date.indexOf(heute) != -1) || (inhalt[i].date.indexOf('Heute') != -1) ) && (inhalt[i].event.indexOf('Geburtstag'))  ) {` 
                            Ausserdem wird zusätzlich dennoch der String "Heute" verglichen. Denn in den iCal Adapter Einstellungen kann man ein relatives Datum einstellen (Heute, Morgen, ...). So ist das hier auch für andere nutzbar (zum Beispiel für mich .-D)
                            
                            Schließlich wird die Aufzählung für die Ansage aufbereitet. Den Teil kann man aber weglassen.
                            
                            Skript:
                            
                            >! ~~[spoiler]~~`~~[code]~~/* 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);
                                }
                            }
                            >! // bei Aktualisierung
                            on ({id:'ical.0.events.Geburtstag', change: 'any'}, function(data) {
                                pruefeKalender();
                            });
                            >! //bei Skriptstart
                            pruefeKalender();</inhalt.length;>`
                            Freu mich auf Feedback.
                            
                            Pix
                            
                            PS: Mir ist aufgefallen, dass eine Änderung des Kalenderinhaltes das Skript nicht zuverlässig startet. Also möglicherweise eine Schedulefunktion zum Start einbauen (reicht ja einmal täglich um Mitternacht).
                            
                            EDIT: Ich habe noch eine Sicherung eingebaut. Sollte der Name ein Komma beinhalten ('Andi, Prinz von Arabien' oder 'Frau Müller, die Frau vom Chef'), käme die Aufbereitung durcheinander. Deshalb werden jetzt Komma im Event/Namen gelöscht.[/i][/i][/i][/code][/spoiler][/i][/i][/i][/code][/i][/i]
                            

                            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 Antwort Letzte Antwort
                            0
                            • S Offline
                              S Offline
                              skorpil
                              schrieb am zuletzt editiert von
                              #21

                              "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 Antwort Letzte Antwort
                              0
                              • S Offline
                                S Offline
                                skorpil
                                schrieb am zuletzt editiert von
                                #22

                                …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 Antwort Letzte Antwort
                                0
                                • S Offline
                                  S Offline
                                  skorpil
                                  schrieb am zuletzt editiert von
                                  #23

                                  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 Antwort Letzte Antwort
                                  0
                                  • P Offline
                                    P Offline
                                    pix
                                    schrieb am zuletzt editiert von
                                    #24

                                    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]

                                    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 Antwort Letzte Antwort
                                    0
                                    • S Offline
                                      S Offline
                                      skorpil
                                      schrieb am zuletzt editiert von
                                      #25

                                      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 Antwort Letzte Antwort
                                      0
                                      • S Offline
                                        S Offline
                                        skorpil
                                        schrieb am zuletzt editiert von
                                        #26

                                        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 Antwort Letzte Antwort
                                        0
                                        • P Offline
                                          P Offline
                                          pix
                                          schrieb am zuletzt editiert von
                                          #27

                                          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

                                          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 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          807

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe