Navigation

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

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Hilfe beim Auslesen eines Wertes (iCal)

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

      Hallo,

      es geht um Javascript, https://www.java.com/de/download/faq/java_javascript.xml.

      Wenn ich dich richtig verstehe, willst du prüfen, ob für das heutige Datum ein Eintrag vorhanden ist und diesen in eine Variable schreiben. Richtig? Bevor ich jetzt wild mit Befehlen wie substr, indexOf, slice, etc. rumwerfe, frage ich nochmal nach dem Zweck. Die Daten kommen ja schon aus dem Adapter und könnten vielleicht anders herausgefischt werden.

      Ich gehe davon aus, dass du einen Kalender mit Geburtstagsereignissen verschiedener Personen hast. Du kannst zum Beispiel, wenn du die Geburtstage von Armin (1.1.), Bert (1.3.) und Charly (1.6.) in den Kalender eingetragen hast (jeweils nur den Vornamen), im ical-Adapter-Setup drei Ereignisse anlegen. Jedes Ereignis trägt den Namen des Geburtstagskindes. Findet der Adapter im Kalender heute den Namen, schreibt er ein true in die entsprechende Variable. Also am 1.1. ist ical.0.events.Armin = true.

      Du kannst nun mit RegExp auf alle iCal Events einen Subscribe starten.

      Variante http://forum.iobroker.com/viewtopic.php?f=21&t=2251&p=19529&hilit=regexp&sid=21b64f4dd3ba861e66610f557db62438#p19529:

      on({id: /^ical.0.events.(Armin|Bert|Charly)$/, valNe: false}, function(obj) {
         ...
      });
      

      Variante 2 (mein Favorit):

      var Geburtstag = ''; 
      on({id: /^ical.0.events.*$/, val:true}, function(obj) { 
          Geburtstag = obj.common.name;
          log(Geburtstag);
      });
      
      

      Also: extra Kalender für Geburtstage anlegen und im iCal Adapter einlesen. Javascript erstellen und für die Weiterverarbeitung ggf. ein Objekt erstellen (createState), in das dann der Name des Geburtstagskindes geschrieben wird.

      Gruß,

      Pix

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

        Pix,

        Erstmal ein schnelles Danke. Ich teste morgen!

        Zur Frage, die Du gestellt hast: Ziel ist es, aus iCal resp. aus dem mit iCal ausgelesenen Kalender die HEUTIGEN Geburtstage (die ich im Kalender z.B mit "Geburtstag von PIX" stehen habe) via Sayit ansagen zu lassen.

        Die Ansagen mit Sayit habe ich laufen, aber eben mit Wetterdaten usw. Jetzt geht es "lediglich" darum, die Geburtstage aus dem Kalender auszulesen, damit ich sie dan weiterverarbeiten kann.

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

          Pix,

          habe Dein 2. Script jetzt 1:1 übertragen

          var Geburtstag = ''; 
          on({id: /^ical.0.events.*$/, val:true}, function(obj) { 
              Geburtstag = obj.common.name;
              log(Geburtstag);
          });
          

          und getestet: Das log meldet:

          ` > javascript-0 2016-02-28 13:09:02 info script.js.Test_für_Geburtstag: registered 1 subscription and 0 schedules

          javascript-0 2016-02-28 13:09:02 info Start javascript script.js.Test_für_Geburtstag `

          Das war es. Was ist falsch?

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

            @skorpil:

            Das war es. Was ist falsch? `
            Was soll falsch sein? Das ist doch keine Fehlermeldung. Controller meldet Skript läuft und wartet auf Änderung bei einer Subscription.

            Du musst schon einen neuen Termin im Kalender anlegen. Und dann den iCal Adapter neustarten, damit die Änderung aktiv wird.

            Als ich das getestet habe, sah das so aus:

            2016-02-27 19:52:57.561  - info: javascript.2 Start javascript script.js.AAA_Test_Kalenderevent
            2016-02-27 19:52:57.620  - info: javascript.2 script.js.AAA_Test_Kalenderevent: registered 1 subscription and 0 schedules
            2016-02-27 19:53:45.809  - info: ical.0 Event "ical.0.events.Test" created
            2016-02-27 19:54:24.862  - info: ical.0 Set events.Test to true
            2016-02-27 19:54:24.877  - info: javascript.2 script.js.AAA_Test_Kalenderevent: Test
            
            

            Pix

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

              Pix,

              ich habe keine Ahnung, warum Dein Script bei mir nicht funktioniert. Ich kann nur mutmassen. In der Variable "ical.0.data.table" steht bei mir momentan

              [{"date":"29.02.2016  ","event":"Geburtstag von Test Montag","_class":"ical_Geburtstage ical_today","_date":"2016-02-28T23:00:00.000Z","_end":"2016-02-29T23:00:00.000Z","_IDID":"f7e856cb-6dfd-4e2b-a27d-810c5556eda6","_allDay":false,"_rule":" ","_calName":"Geburtstage"},{"date":"01.03.2016  ","event":"Geburtstag von Test Dienstag","_class":"ical_Geburtstage ical_tomorrow","_date":"2016-02-29T23:00:00.000Z","_end":"2016-03-01T23:00:00.000Z","_IDID":"52270bbf-2005-46f3-96a5-894982866842","_allDay":false,"_rule":" ","_calName":"Geburtstage"},{"date":"01.03.2016  ","event":"Geburtstag von Roswitha","_class":"ical_Geburtstage ical_tomorrow","_date":"2016-02-29T23:00:00.000Z","_end":"2016-02-29T23:00:00.000Z","_IDID":"AAAAAK0wqoFtFwFHoWTOiDMq8uAHAMdg+pPlLJ1Hg99QMJoIqmEAAAAAAQ0AAMdg+pPlLJ1Hg99QMJoIqmEAAAAAmfEAAA==","_allDay":false,"_rule":" rrule ","_calName":"Geburtstage"}]
              

              Ich habe als events im ical Adapter als Events das Wort "Geburtstag" stehen. Und "aktiviert" und "anzeigen" stehen auf true. Muß das evtl. raus, weil dadurch Dein Script in der On Funktion immer auf "true" und nie auf "false" steht?

              Außerdem lasse ich den ical adapter mit "*/60 * * * *" stündlich aktualisieren

              Jedenfalls steht im log noch immer das gleiche wie gestern. Ich habe heute auch mal einen neuen Testermin in de Kalender geschrieben und vorschlagsgemäß den ical Adapter neu gestartet. Ergebnis: keine Änderung.

              In "ical.0.data.html" steht

              29.02.2016  Geburtstag von Test Montag
              01.03.2016  Geburtstag von Test Dienstag
              01.03.2016 Geburtstag von Roswitha 
              

              und das kann ich auch mit

              var Wert = "ical.0.data.html"/*HTML iCal html*/;
              
              var WerteVal = getState(Wert).val;
              
              

              auslesen.

              Irgendwo habe ich einen Denkfehler.

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

                Hallo skorpil,

                ich habe in den iCal Adapter Einstellungen ein Event "Test" angelegt und bei Optionen "aktiviert" und "anzeigen" angehakt. Der Event heißt also nur "Test", nicht "Test Geburtstag". Ich weiß nicht, ob das eine Rolle spielt. Wenn du gern "Geburtstag von Test" im Kalender eintragen möchtest, solltest du auch das Event genauso nennen, eben "Geburtstag von Test". Damit bist du auf der sicheren Seite.

                Gruß,

                Pix

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

                  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 Reply Last reply Reply Quote 0
                  • P
                    pix last edited by

                    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]

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

                      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 Reply Last reply Reply Quote 0
                      • P
                        pix last edited by

                        @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

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

                          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 Reply Last reply Reply Quote 0
                          • S
                            skorpil last edited by

                            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 Reply Last reply Reply Quote 0
                            • P
                              pix last edited by

                              @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

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

                                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 Reply Last reply Reply Quote 0
                                • S
                                  skorpil last edited by

                                  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 Reply Last reply Reply Quote 0
                                  • S
                                    skorpil last edited by

                                    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 Reply Last reply Reply Quote 0
                                    • P
                                      pix last edited by

                                      @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] _ `

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

                                        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" 😄 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 Reply Last reply Reply Quote 0
                                        • P
                                          pix last edited by

                                          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]
                                          
                                          1 Reply Last reply Reply Quote 0
                                          • S
                                            skorpil last edited by

                                            "feedback is breakfast for champions"

                                            Pix,

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

                                              • Datum
                                              • Uhrzeit
                                              • Au0entemperatur (kommt vom homeMatic Aussenthermostat
                                              • Wetterbedingungen (kommen über homeMatic Script von wunderground) und
                                              • der Geburtstagsansage
                                            `//  Script zur Ansage von
                                            //  Datum, Uhrzeit, Aussentemperatur, Wetterbedingungen und Geburtstagen
                                            //  erstellt von Pix (1000 Dank) und skorpil am 2.3.2016
                                            
                                            //sayyit adapter
                                            var idSayIt = "sayit.2.tts.text"  /*Text to speech*/;
                                            
                                            //Lautstärke einstellen
                                                var vol ="sayit.2.tts.volume";
                                                setState (vol,40);
                                            
                                            //Wochentag ermitteln
                                                var d = new Date ();
                                                var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
                                                var w = weekday[d.getDay()]; 
                                            
                                            //Tagesdatum ermitteln
                                                var t = d.getDate();
                                            
                                            //Monat ermitteln
                                                var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
                                                var m = month[d.getMonth()];
                                            
                                            //Jahr ermitteln
                                                var j = d.getFullYear();
                                            
                                            //Stunde ermitteln
                                                h = d.getHours();
                                            
                                            //Minute ermitteln
                                                mi = d.getMinutes();
                                            
                                            //Wetter ermitteln
                                                var wetter = getState("hm-rega.0.29954").val;
                                                log('Wetter:   ' + wetter);
                                            
                                            // Die Außentemperatur ist xx. Das Wetter heute ist xx
                                            // Einfache Temperaturansage mit SayIt.
                                            // Variante 1 mittels splitten der Temperatur, damit die Ansage nicht
                                            // "Es sind 18 Punkt 2 Grad " sagt.
                                            
                                            var Temperatursensor = getState("hm-rpc.0.LEQ0177463.1.TEMPERATURE").val; /*Temperatursensor:1.TEMPERATURE*/
                                            var temperatur = Temperatursensor.toString();
                                            
                                            log('Temp  ' + Temperatursensor);
                                            
                                            var temp_array = [];
                                            
                                            temp_array = temperatur.split(".");
                                            
                                            // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
                                            // Es wird dann nur "18" gelesen.
                                            if (!temp_array[1]) {
                                                temp_array[1] = "0";
                                                log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
                                            }
                                            
                                            /* Kalenderevent auswerten
                                            
                                            sucht im iCal Adapter nach events (heute)
                                            auf Anfrage von Skorpil im Forum erstellt.
                                            http://forum.iobroker.de/viewtopic.php?f=21&t=2347&p=20627&sid=524f9dda2f313d3cbb183941df61fc38#p20627
                                            
                                            27.02.2016 erstellt von Pix
                                            02.03.2016 Anpassung und Aufbereitung für Sprachausgabe
                                            */
                                            
                                            //Datum als String ermitteln;
                                            function ermitteleDatum() {
                                                var d= new Date();
                                            
                                                //Tagesdatum ermitteln
                                                    var day = new Array("00","01","02","03","04","05","06","07","06","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31");
                                                    var t = day[d.getDate().toString()];
                                            
                                                //Monat ermitteln
                                                    var month = new Array("01","02","03","04","05","06","07","08","09","10","11","12");
                                                    var m = month[d.getMonth().toString()];
                                            
                                                //Jahr ermitteln
                                                    var j = d.getFullYear().toString();
                                            
                                                var datum= t+"."+m+"."+j+" ";
                                                //log("datum:   " + datum);
                                                return (datum);
                                            }
                                            
                                            createState('Kalenderereignisse.heute', '', {
                                                name: 'Events von heute',
                                                type: 'string'
                                            });
                                            
                                            var idListe =  'Kalenderereignisse.heute';
                                            
                                            function pruefeKalender() {
                                                var inhalt = getState('ical.0.data.table').val;
                                                var heute = ermitteleDatum();
                                                try{
                                                    var ereignisse = JSON.stringify(inhalt, null, 2); // Ausgabe als String
                                                    //log(ereignisse);
                                                    var ereignisheute = '', // Liste (kommasepariert)
                                                        ereignisheute_zeilen = ''; // Liste (mit Zeilenumbruch, zB für Anzeige in VIS)
                                                    for(var i = 0; i <inhalt.length; i++)/{/alle/events/durchgehen/if/(/(inhalt[i].date.indexof(heute)/!="-1)" ||/(inhalt[i].date.indexof('heute')/)/strings/datum/oder/relatives/(nicht/nicht)/gefunden/var/ereignis="inhalt[i].event;" komma/im/namen/ersetzen="">0) ? ', ' : '';
                                                            ereignisheute = ereignisheute + komma + ereignis;
                                                            ereignisheute = ereignisheute.replace('Geburtstag von ', ''); // "Geburtstag von " löschen
                                                        } 
                                                    }
                                                    // Aufbereitung für die Ansage (falls vorhanden, wird letztes Komma durch und ersetzt)
                                                    var lastkomma = ereignisheute.lastIndexOf(','); // letztes Komma in der Reihe
                                                    if (lastkomma != -1) {
                                                       var vorn = ereignisheute.slice(0,lastkomma-1);
                                                       var hinten = ereignisheute.slice(lastkomma+1, ereignisheute.length);
                                                       ereignisheute = vorn + ' und' + hinten;
                                                    }
                                                    // Ende Aufbereitung für die Ansage
                                            
                                                    setState(idListe, ereignisheute);
                                                    log('Geburtstage: ' + ereignisheute);
                                                } catch (fehler_try) {
                                                    log('Fehler beim Kalenderevent einlesen ' + fehler_try);
                                                }
                                            }
                                            
                                            var geburtstage = getState('javascript.0.Kalenderereignisse.heute').val;
                                            log(geburtstage);
                                            
                                            //Ansage
                                            setState (idSayIt, "Guten Morgen, heute ist " + w + " der " + t + "te " + m + j + ". Es ist" + h + "  Uhr und " + mi + "  Minuten." + "  Die Aussentemperatur beträgt " + temp_array[0] + "," + temp_array[1] + " Grad." + "  Wetter Bedingungen," + wetter +" ."+ " Heute haben Geburtstag: "+ geburtstage +" .");
                                            
                                            // bei Aktualisierung
                                            on ({id:'ical.0.events.Geburtstag', change: 'any'}, function(data) {
                                                pruefeKalender();
                                            });
                                            
                                            //bei Skriptstart
                                            pruefeKalender();</inhalt.length;>` 
                                            
                                            Ausgelöst wird es mittels einer HomeMatic Variablen. Bei Bedarf poste ich das Vorgehen gerne.
                                            
                                            PS:...und zum Feinschliff und als Kür bauen wir demnächst noch die Altersangabe mit ein... :D[/i][/i][/i]
                                            
                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            850
                                            Online

                                            31.7k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            4
                                            42
                                            6647
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo