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.3k

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

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

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
    #31

    @pix:

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

    Gruß

    Pix `

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

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

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

      So:

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

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

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

      reinkopieren und starten.

      Gruß

      Pix

      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
        #33

        Hallo Pix,

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

        `// Test mit Variable;
        // Besser ist es, gleich die VARIABLE SayIt hier abzufragen.
        var idSayVar = "hm-rega.0.38101";
        
        // Definition Sayit für "3" = Kueche;
        var idSayIt =            "sayit.3.tts.text";
        var lautstaerke = 40;
        
        // Quellen
        var idWetter =           "hm-rega.0.29954";
        var idTemperatursensor = "hm-rpc.0.LEQ0177463.1.TEMPERATURE"; /*Temperatursensor:1.TEMPERATURE*/
        var idGeburtstage =      "javascript.0.Kalenderereignisse.heute";
        
        function ermitteleAnsagedatum () {
            //Wochentag ermitteln
            var d = new Date ();
            var w = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
            var wochentag = w[d.getDay()]; 
        
            //Tagesdatum ermitteln
            var tag = d.getDate();
        
            //Monat ermitteln
            var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
            var monat = month[d.getMonth()];
        
            //Jahr ermitteln
            var jahr = d.getFullYear();
        
            //Stunde ermitteln
            var stunde = d.getHours();
        
            //Minute ermitteln
            var minute = d.getMinutes();
        
            return { // zurückgeben
                'Jahr'      : jahr,
                'Monat'     : monat,
                'Tag'       : tag,
                'Wochentag' : wochentag,
                'Stunde'    : stunde,
                'Minute'    : minute
            };
        }
        
        function ermitteleWetter () { // Wetterbedingungen
            var wetterdaten = getState(idWetter).val;
            log('Wetter: ' + wetterdaten);
            return(wetterdaten);
        }
        
        function ermitteleAnsageTemperatur () {
            // Die Außentemperatur ist xx. Das Wetter heute ist xx
            // Einfache Temperaturansage mit SayIt.
            // Variante 1 mittels splitten der Temperatur, damit die Ansage nicht
            // "Es sind 18 Punkt 2 Grad " sagt.
        
            var temperatursensor = getState(idTemperatursensor).val;
            var temp_string = temperatursensor.toString();
            log('Temp  ' + temp_string);
            var temp_array = [];
            temp_array = temp_string.split(".");
        
            // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
            // Es wird dann nur "18" gelesen.
            if (!temp_array[1]) {
                temp_array[1] = "0";
                log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
            }
            return{
                'Ganzzahl'      : temp_array[0],
                'Nachkommazahl' : temp_array[1]
            };
        }
        
        function ermitteleGeburtstage () {
            var geburtstage = getState(idGeburtstage).val;
            if (geburtstage.length < 2) { // wenn der Inhalt des Objektes "idGeburtstage" weniger als 2 Zeichen lang ist (also praktisch leer), dann ...
                geburtstage = 'niemand'; // oder "niemand", "keiner"
            }
            log(geburtstage);
            return (geburtstage);
        }
        
        // ################################### 
        // Trigger für Ansage
        on(idSayVar, function (data) {
        
            var ansagetext = "Guten Morgen, heute ist " + ermitteleAnsagedatum().Wochentag + " der " + ermitteleAnsagedatum().Tag + "te " + ermitteleAnsagedatum().Monat + ' ' + ermitteleAnsagedatum().Jahr 
                    + ". Es ist" + ermitteleAnsagedatum().Stunde + "  Uhr und " + ermitteleAnsagedatum().Minute + "  Minuten." 
                    + " Die Aussentemperatur beträgt " + ermitteleAnsageTemperatur().Ganzzahl + "," + ermitteleAnsageTemperatur().Nachkommazahl + " Grad." 
                    + " Wetter Bedingungen," + ermitteleWetter() +" ."
                    + " Heute haben Geburtstag: "+ ermitteleGeburtstage() +" .";
        
            log('Trigger: ' + data.state.val);
            if (data.state.val === true) {
                setState(idSayIt, lautstaerke + ";" + ansagetext);  // hier also ("40;Guten Morgen ...")
            }
        });
        
        /* Kalenderevent auswerten ----> nur Geburtstage
        
        sucht im iCal Adapter nach events (heute)
        auf Anfrage von Skorpil im Forum erstellt.
        http://forum.iobroker.de/viewtopic.php?f=21&t=2347&p=20627&sid=524f9dda2f313d3cbb183941df61fc38#p20627
        
        27.02.2016 erstellt von Pix
        02.03.2016 Anpassung und Aufbereitung für Sprachausgabe
        */
        
        //Datum als String ermitteln;
        function ermitteleDatum() {
            var d= new Date();
        
            //Tagesdatum ermitteln
                var day = new Array("00","01","02","03","04","05","06","07","06","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31");
                var t = day[d.getDate().toString()];
        
            //Monat ermitteln
                var month = new Array("01","02","03","04","05","06","07","08","09","10","11","12");
                var m = month[d.getMonth().toString()];
        
            //Jahr ermitteln
                var j = d.getFullYear().toString();
        
            var datum= t+"."+m+"."+j+" ";
            //log("datum:   " + datum);
            return (datum);
        }
        
        createState('Kalenderereignisse.heute', '', {
            name: 'Events von heute',
            type: 'string'
        });
        
        var idListe =  'Kalenderereignisse.heute';
        
        function pruefeKalender() {
            var inhalt = getState('ical.0.data.table').val;
            var heute = ermitteleDatum();
            try{
                var ereignisse = JSON.stringify(inhalt, null, 2); // Ausgabe als String
                //log(ereignisse);
                var ereignisheute = '', // Liste (kommasepariert)
                    ereignisheute_zeilen = ''; // Liste (mit Zeilenumbruch, zB für Anzeige in VIS)
                for(var i = 0; i <inhalt.length; i++)/{/alle/events/durchgehen/if/(/(inhalt[i].date.indexof(heute)/!="-1)" ||/(inhalt[i].date.indexof('heute')/)/strings/datum/oder/relatives/(nicht/nicht)/gefunden/var/ereignis="inhalt[i].event;" komma/im/namen/ersetzen="">0) ? ', ' : '';
                        ereignisheute = ereignisheute + komma + ereignis;
                        ereignisheute = ereignisheute.replace('Geburtstag von ', ''); // "Geburtstag von " löschen
                    } 
                }
                // Aufbereitung für die Ansage (falls vorhanden, wird letztes Komma durch und ersetzt)
                var lastkomma = ereignisheute.lastIndexOf(','); // letztes Komma in der Reihe
                if (lastkomma != -1) {
                   var vorn = ereignisheute.slice(0,lastkomma-1);
                   var hinten = ereignisheute.slice(lastkomma+1, ereignisheute.length);
                   ereignisheute = vorn + ' und' + hinten;
                }
                // Ende Aufbereitung für die Ansage
        
                setState(idListe, ereignisheute);
                log('Geburtstage: ' + ereignisheute);
            } catch (fehler_try) {
                log('Fehler beim Kalenderevent einlesen ' + fehler_try);
            }
        }
        
        // bei Aktualisierung des Kalenders
        on ({id:'ical.0.events.Geburtstag', change: 'any'}, function(data) {
            pruefeKalender();
        });
        
        //bei Skriptstart
        pruefeKalender();</inhalt.length;>`
        
        Kannst Du mir helfen? Hast Du eine Idee, woran das liegen könnte?
        
        Liebe Grüße
        
        Bernd[/i][/i][/i]
        
        1 Antwort Letzte Antwort
        0
        • P Offline
          P Offline
          pix
          schrieb am zuletzt editiert von
          #34

          Hallo Bernd,

          nur ganz kurz:

          Klappt es denn, wenn du das Skript neu startest?

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

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

          Gruß

          Pix

          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
            #35

            Lieber Pix,

            Danke für Deine rasche Antwort.

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

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

            Danke für die Hilfe,

            Bernd

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

              Lieber Pix,

              nochmal ich. :D

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

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

              Im log steht jetzt

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

              Was bedeutet "registered 2 subscriptions and 2 schedules"?

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

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

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

              Liebe Grüße,

              Bernd

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

                Feedback:

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

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

                Danke für die Unterstützung.

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

                  Hallo Bernd,

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

                  Gruß

                  Pix

                  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
                    #39

                    Lieber "Guru" Pix :D ,

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

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

                    Liebe Grüße

                    Bernd

                    1 Antwort Letzte Antwort
                    0
                    • E Offline
                      E Offline
                      eagleye
                      schrieb am zuletzt editiert von
                      #40

                      Hallo,

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

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

                      Kann mir jemand helfen?

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

                      1 Antwort Letzte Antwort
                      0
                      • Homer.J.H Offline
                        Homer.J.H Offline
                        Homer.J.
                        schrieb am zuletzt editiert von
                        #41

                        Gib in der Instanz 1 Tag ein und aktualisiere den Adapter mal dann müsste es gehen.

                        1 Antwort Letzte Antwort
                        0
                        • E Offline
                          E Offline
                          eagleye
                          schrieb am zuletzt editiert von
                          #42

                          Das habe ich schon probiert.

                          Dann zeigt er genau an, was auf dem Bild ist.

                          Die Termine für heute UND für Morgen (was ja "1" ja ist).

                          "0" eingeben stattdessen brachte auch nicht das ersehnte.

                          Verstehe nicht warum man nicht im Adapter nur die heutigen Tage einstellen kann. :(

                          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

                          653

                          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