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

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Skript - automatisch Eintrag im Google Kalender machen

NEWS

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

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

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

Skript - automatisch Eintrag im Google Kalender machen

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
7 Beiträge 3 Kommentatoren 285 Aufrufe 2 Watching
  • Ä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.
  • AtifanA Offline
    AtifanA Offline
    Atifan
    schrieb am zuletzt editiert von
    #1

    Hi Leute ich möchte folgendes mit Hilfe von Blockly oder NodeRed programmieren, weiss aber nicht genau wie ich das umsetzen soll.
    Evtl. hat hier einer ja ne Idee wie man das machen könnte.

    Ich möchte einen Xiaomi Zigbee Button dafür nutzen, dass wenn dieser einmal gedrückt wird, automatisch ein Eintrag in einem Google-Kalender gemacht wird.

    Ich drücke also am Tag einmal oder auch mehrmals den Button -> im IoBroker gibts den Datenpunkt "Button gedrückt ja" -> dieser Datenpunkt wird in dem Moment "true".
    Wenn das der Fall ist soll Iobroker automatisch in den Google Kalender für den "heutigen Tag" einen Eintrag machen "Button wurde heute gedrückt".

    Das ganze soll als Erinnerungsstütze dienen, so kann man immer in den Kalender schauen ob man heute schon das eine gemacht hat oder nicht.

    Hat einer ne Idee wie ich das Umsetzen kann? Ich würde so vorgehen, über Blockly einen Datenpunkt überwachen ("Button gedrückt"), und wenn der sich ändert mache "xxxx -> Daten in Kalender schreiben". Aber da weiss ich nicht wie ich das umsetzen soll.

    Habe z.B. den Adapter "ICal Kalender" installiert, falls man den dafür nutzen könnte.
    Bin für Tipps dankebar :)

    Grüße
    atifan

    AtifanA 1 Antwort Letzte Antwort
    0
    • AtifanA Atifan

      Hi Leute ich möchte folgendes mit Hilfe von Blockly oder NodeRed programmieren, weiss aber nicht genau wie ich das umsetzen soll.
      Evtl. hat hier einer ja ne Idee wie man das machen könnte.

      Ich möchte einen Xiaomi Zigbee Button dafür nutzen, dass wenn dieser einmal gedrückt wird, automatisch ein Eintrag in einem Google-Kalender gemacht wird.

      Ich drücke also am Tag einmal oder auch mehrmals den Button -> im IoBroker gibts den Datenpunkt "Button gedrückt ja" -> dieser Datenpunkt wird in dem Moment "true".
      Wenn das der Fall ist soll Iobroker automatisch in den Google Kalender für den "heutigen Tag" einen Eintrag machen "Button wurde heute gedrückt".

      Das ganze soll als Erinnerungsstütze dienen, so kann man immer in den Kalender schauen ob man heute schon das eine gemacht hat oder nicht.

      Hat einer ne Idee wie ich das Umsetzen kann? Ich würde so vorgehen, über Blockly einen Datenpunkt überwachen ("Button gedrückt"), und wenn der sich ändert mache "xxxx -> Daten in Kalender schreiben". Aber da weiss ich nicht wie ich das umsetzen soll.

      Habe z.B. den Adapter "ICal Kalender" installiert, falls man den dafür nutzen könnte.
      Bin für Tipps dankebar :)

      Grüße
      atifan

      AtifanA Offline
      AtifanA Offline
      Atifan
      schrieb am zuletzt editiert von Atifan
      #2

      Hi, ich hab mal ChatGPT gefragt und das hat mir ein Script erstellt, das ist echt mal Megagenial :)
      Allerdings geht schreiben nur in einen Nextcloud Kalender und nicht in den Google Kalender.
      Um in den Google Kalender zu schreiben benötigt man wohl einen Google Cloud Account und Zugriff auf die Google API, was aber kostenpflichtig ist.
      Falls einer das Script möchte, hier ist es.
      Es überwacht den Datenpunkt "0_userdata.0.Button" vom Typ Boolean. Wenn dieser "true" wird, wird ein Eintrag im Kalender gemacht.
      Es wird auch geprüft ob bereits ein Eintrag gemacht wurde, wenn das der Fall ist wird kein zweiter Eintrag gemacht.
      Im Script müssen angepasst werden: calendarUrl, username, password. Und der Eintrag den man machen möchte.
      In meinem Beispiel ist das der Text "Medikamente heute eingenommen".

      const http = require('http');
      const https = require('https');
      const url = require('url');
      
      const calendarUrl = '<ANPASSEN>';
      const username    = '<ANPASSEN>';
      const password    = '<ANPASSEN>';
      const CREATE_ON_CHECK_ERROR = false;
      
      function pad(n){ return n < 10 ? '0' + n : '' + n; }
      function caldavDateUTC(d){
          return d.getUTCFullYear().toString() +
              pad(d.getUTCMonth() + 1) +
              pad(d.getUTCDate()) + 'T' +
              pad(d.getUTCHours()) +
              pad(d.getUTCMinutes()) +
              pad(d.getUTCSeconds()) + 'Z';
      }
      function localDateNoZ(d){
          return d.getFullYear().toString() +
              pad(d.getMonth() + 1) +
              pad(d.getDate()) + 'T' +
              pad(d.getHours()) +
              pad(d.getMinutes()) +
              pad(d.getSeconds());
      }
      
      // Allgemeine HTTP-Request-Funktion
      function httpRequest(options, body, callback) {
          const parsedUrl = url.parse(options.url);
          const lib = parsedUrl.protocol === 'https:' ? https : http;
      
          const auth = Buffer.from(options.auth || '').toString('base64');
      
          const reqOptions = {
              hostname: parsedUrl.hostname,
              port: parsedUrl.port || (parsedUrl.protocol === 'https:' ? 443 : 80),
              path: parsedUrl.path,
              method: options.method || 'GET',
              headers: options.headers || {}
          };
      
          if (auth) reqOptions.headers['Authorization'] = 'Basic ' + auth;
      
          const req = lib.request(reqOptions, (res) => {
              let data = '';
              res.on('data', (chunk) => { data += chunk; });
              res.on('end', () => { callback(null, res, data); });
          });
      
          req.on('error', (err) => { callback(err); });
      
          if (body) req.write(body);
          req.end();
      }
      
      // Prüfen, ob heute schon ein Termin existiert
      function checkEventToday(callback) {
          const now = new Date();
          const localStart = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0,0,0);
          const localEnd   = new Date(now.getFullYear(), now.getMonth(), now.getDate()+1, 0,0,0);
      
          const timeMin = caldavDateUTC(localStart);
          const timeMax = caldavDateUTC(localEnd);
      
          const xml = '<?xml version="1.0" encoding="utf-8"?>' +
      '<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">' +
      '  <D:prop>' +
      '    <D:getetag/>' +
      '    <C:calendar-data/>' +
      '  </D:prop>' +
      '  <C:filter>' +
      '    <C:comp-filter name="VCALENDAR">' +
      '      <C:comp-filter name="VEVENT">' +
      '        <C:time-range start="' + timeMin + '" end="' + timeMax + '"/>' +
      '      </C:comp-filter>' +
      '    </C:comp-filter>' +
      '  </C:filter>' +
      '</C:calendar-query>';
      
          httpRequest({
              url: calendarUrl,
              method: 'REPORT',
              auth: username + ':' + password,
              headers: { 'Content-Type': 'application/xml', 'Depth': '1' }
          }, xml, function(error, response, body) {
              if (error) {
                  log("❌ Fehler beim Prüfen der Events: " + error, 'error');
                  return callback(null, CREATE_ON_CHECK_ERROR ? false : true);
              }
      
              const status = response ? response.statusCode : 'no-response';
              log("DEBUG: REPORT Status: " + status, 'debug');
      
              if (status < 200 || status >= 300) {
                  log("⚠️ Ungewöhnlicher REPORT-Status: " + status, 'warn');
                  return callback(null, CREATE_ON_CHECK_ERROR ? false : true);
              }
      
              let caldata = body.toString().replace(/\r\n[ \t]/g, '').replace(/\r\n/g, '\n');
              const summaryRegex = /(^|\n)SUMMARY(?:;[^:]*)?:\s*Medikamente heute eingenommen(\n|$)/i;
              const exists = summaryRegex.test(caldata);
      
              callback(null, exists);
          });
      }
      
      // Event erstellen
      function createEvent() {
          const now = new Date();
          const uid = Date.now() + '@iobroker';
      
          const startLocal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 6,0,0);
          const endLocal   = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 20,0,0);
      
          const dtstamp = caldavDateUTC(new Date());
          const dtStartLocal = localDateNoZ(startLocal);
          const dtEndLocal   = localDateNoZ(endLocal);
      
          const ics =
      "BEGIN:VCALENDAR\n" +
      "VERSION:2.0\n" +
      "PRODID:-//ioBroker//DE\n" +
      "BEGIN:VEVENT\n" +
      "UID:" + uid + "\n" +
      "DTSTAMP:" + dtstamp + "\n" +
      "DTSTART;TZID=Europe/Berlin:" + dtStartLocal + "\n" +
      "DTEND;TZID=Europe/Berlin:" + dtEndLocal + "\n" +
      "SUMMARY:Medikamente heute eingenommen\n" +
      "END:VEVENT\n" +
      "END:VCALENDAR";
      
          const filename = encodeURIComponent("medikamente-" + uid + ".ics");
          const eventUrl = calendarUrl + filename;
      
          httpRequest({
              url: eventUrl,
              method: 'PUT',
              auth: username + ':' + password,
              headers: { 'Content-Type': 'text/calendar; charset=utf-8' }
          }, ics, function(error, response) {
              if (error) {
                  log("❌ Fehler beim Erstellen des Events: " + error, 'error');
                  return;
              }
              const status = response ? response.statusCode : 'no-response';
              log("DEBUG: PUT Status: " + status, 'debug');
              if (status >= 200 && status < 300) {
                  log("✅ Termin erfolgreich erstellt", 'info');
              } else {
                  log("⚠️ Unerwartete Antwort beim Erstellen: " + status, 'warn');
              }
          });
      }
      
      // Button überwachen
      on({id: '0_userdata.0.Button', change: 'any'}, function(obj) {
          if (obj.state.val === true) {
              checkEventToday(function(err, exists) {
                  if (exists) {
                      log("ℹ️ Heute existiert bereits ein 'Medikamente heute eingenommen'-Termin — kein neuer Eintrag.", 'info');
                  } else {
                      createEvent();
                  }
              });
          }
      });
      
      
      D 1 Antwort Letzte Antwort
      0
      • AtifanA Atifan

        Hi, ich hab mal ChatGPT gefragt und das hat mir ein Script erstellt, das ist echt mal Megagenial :)
        Allerdings geht schreiben nur in einen Nextcloud Kalender und nicht in den Google Kalender.
        Um in den Google Kalender zu schreiben benötigt man wohl einen Google Cloud Account und Zugriff auf die Google API, was aber kostenpflichtig ist.
        Falls einer das Script möchte, hier ist es.
        Es überwacht den Datenpunkt "0_userdata.0.Button" vom Typ Boolean. Wenn dieser "true" wird, wird ein Eintrag im Kalender gemacht.
        Es wird auch geprüft ob bereits ein Eintrag gemacht wurde, wenn das der Fall ist wird kein zweiter Eintrag gemacht.
        Im Script müssen angepasst werden: calendarUrl, username, password. Und der Eintrag den man machen möchte.
        In meinem Beispiel ist das der Text "Medikamente heute eingenommen".

        const http = require('http');
        const https = require('https');
        const url = require('url');
        
        const calendarUrl = '<ANPASSEN>';
        const username    = '<ANPASSEN>';
        const password    = '<ANPASSEN>';
        const CREATE_ON_CHECK_ERROR = false;
        
        function pad(n){ return n < 10 ? '0' + n : '' + n; }
        function caldavDateUTC(d){
            return d.getUTCFullYear().toString() +
                pad(d.getUTCMonth() + 1) +
                pad(d.getUTCDate()) + 'T' +
                pad(d.getUTCHours()) +
                pad(d.getUTCMinutes()) +
                pad(d.getUTCSeconds()) + 'Z';
        }
        function localDateNoZ(d){
            return d.getFullYear().toString() +
                pad(d.getMonth() + 1) +
                pad(d.getDate()) + 'T' +
                pad(d.getHours()) +
                pad(d.getMinutes()) +
                pad(d.getSeconds());
        }
        
        // Allgemeine HTTP-Request-Funktion
        function httpRequest(options, body, callback) {
            const parsedUrl = url.parse(options.url);
            const lib = parsedUrl.protocol === 'https:' ? https : http;
        
            const auth = Buffer.from(options.auth || '').toString('base64');
        
            const reqOptions = {
                hostname: parsedUrl.hostname,
                port: parsedUrl.port || (parsedUrl.protocol === 'https:' ? 443 : 80),
                path: parsedUrl.path,
                method: options.method || 'GET',
                headers: options.headers || {}
            };
        
            if (auth) reqOptions.headers['Authorization'] = 'Basic ' + auth;
        
            const req = lib.request(reqOptions, (res) => {
                let data = '';
                res.on('data', (chunk) => { data += chunk; });
                res.on('end', () => { callback(null, res, data); });
            });
        
            req.on('error', (err) => { callback(err); });
        
            if (body) req.write(body);
            req.end();
        }
        
        // Prüfen, ob heute schon ein Termin existiert
        function checkEventToday(callback) {
            const now = new Date();
            const localStart = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0,0,0);
            const localEnd   = new Date(now.getFullYear(), now.getMonth(), now.getDate()+1, 0,0,0);
        
            const timeMin = caldavDateUTC(localStart);
            const timeMax = caldavDateUTC(localEnd);
        
            const xml = '<?xml version="1.0" encoding="utf-8"?>' +
        '<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">' +
        '  <D:prop>' +
        '    <D:getetag/>' +
        '    <C:calendar-data/>' +
        '  </D:prop>' +
        '  <C:filter>' +
        '    <C:comp-filter name="VCALENDAR">' +
        '      <C:comp-filter name="VEVENT">' +
        '        <C:time-range start="' + timeMin + '" end="' + timeMax + '"/>' +
        '      </C:comp-filter>' +
        '    </C:comp-filter>' +
        '  </C:filter>' +
        '</C:calendar-query>';
        
            httpRequest({
                url: calendarUrl,
                method: 'REPORT',
                auth: username + ':' + password,
                headers: { 'Content-Type': 'application/xml', 'Depth': '1' }
            }, xml, function(error, response, body) {
                if (error) {
                    log("❌ Fehler beim Prüfen der Events: " + error, 'error');
                    return callback(null, CREATE_ON_CHECK_ERROR ? false : true);
                }
        
                const status = response ? response.statusCode : 'no-response';
                log("DEBUG: REPORT Status: " + status, 'debug');
        
                if (status < 200 || status >= 300) {
                    log("⚠️ Ungewöhnlicher REPORT-Status: " + status, 'warn');
                    return callback(null, CREATE_ON_CHECK_ERROR ? false : true);
                }
        
                let caldata = body.toString().replace(/\r\n[ \t]/g, '').replace(/\r\n/g, '\n');
                const summaryRegex = /(^|\n)SUMMARY(?:;[^:]*)?:\s*Medikamente heute eingenommen(\n|$)/i;
                const exists = summaryRegex.test(caldata);
        
                callback(null, exists);
            });
        }
        
        // Event erstellen
        function createEvent() {
            const now = new Date();
            const uid = Date.now() + '@iobroker';
        
            const startLocal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 6,0,0);
            const endLocal   = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 20,0,0);
        
            const dtstamp = caldavDateUTC(new Date());
            const dtStartLocal = localDateNoZ(startLocal);
            const dtEndLocal   = localDateNoZ(endLocal);
        
            const ics =
        "BEGIN:VCALENDAR\n" +
        "VERSION:2.0\n" +
        "PRODID:-//ioBroker//DE\n" +
        "BEGIN:VEVENT\n" +
        "UID:" + uid + "\n" +
        "DTSTAMP:" + dtstamp + "\n" +
        "DTSTART;TZID=Europe/Berlin:" + dtStartLocal + "\n" +
        "DTEND;TZID=Europe/Berlin:" + dtEndLocal + "\n" +
        "SUMMARY:Medikamente heute eingenommen\n" +
        "END:VEVENT\n" +
        "END:VCALENDAR";
        
            const filename = encodeURIComponent("medikamente-" + uid + ".ics");
            const eventUrl = calendarUrl + filename;
        
            httpRequest({
                url: eventUrl,
                method: 'PUT',
                auth: username + ':' + password,
                headers: { 'Content-Type': 'text/calendar; charset=utf-8' }
            }, ics, function(error, response) {
                if (error) {
                    log("❌ Fehler beim Erstellen des Events: " + error, 'error');
                    return;
                }
                const status = response ? response.statusCode : 'no-response';
                log("DEBUG: PUT Status: " + status, 'debug');
                if (status >= 200 && status < 300) {
                    log("✅ Termin erfolgreich erstellt", 'info');
                } else {
                    log("⚠️ Unerwartete Antwort beim Erstellen: " + status, 'warn');
                }
            });
        }
        
        // Button überwachen
        on({id: '0_userdata.0.Button', change: 'any'}, function(obj) {
            if (obj.state.val === true) {
                checkEventToday(function(err, exists) {
                    if (exists) {
                        log("ℹ️ Heute existiert bereits ein 'Medikamente heute eingenommen'-Termin — kein neuer Eintrag.", 'info');
                    } else {
                        createEvent();
                    }
                });
            }
        });
        
        
        D Offline
        D Offline
        dirkhe
        Developer
        schrieb am zuletzt editiert von
        #3

        @atifan du kannst den webcal adapter nehmen, der macht genau das. Allerding ist das einrifhten der apj etwas komplizierter, habe ich aber in github dokumentiert. Ich hoffe mal, das funktioniert noch.

        AtifanA bahnuhrB 2 Antworten Letzte Antwort
        0
        • D dirkhe

          @atifan du kannst den webcal adapter nehmen, der macht genau das. Allerding ist das einrifhten der apj etwas komplizierter, habe ich aber in github dokumentiert. Ich hoffe mal, das funktioniert noch.

          AtifanA Offline
          AtifanA Offline
          Atifan
          schrieb am zuletzt editiert von
          #4

          @dirkhe AH nice ok danke schaue es mir mal an :)

          1 Antwort Letzte Antwort
          0
          • D dirkhe

            @atifan du kannst den webcal adapter nehmen, der macht genau das. Allerding ist das einrifhten der apj etwas komplizierter, habe ich aber in github dokumentiert. Ich hoffe mal, das funktioniert noch.

            bahnuhrB Online
            bahnuhrB Online
            bahnuhr
            Forum Testing Most Active
            schrieb am zuletzt editiert von
            #5

            @dirkhe sagte in Skript - automatisch Eintrag im Google Kalender machen:

            @atifan du kannst den webcal adapter nehmen, der macht genau das. Allerding ist das einrifhten der apj etwas komplizierter, habe ich aber in github dokumentiert. Ich hoffe mal, das funktioniert noch.

            Hat bei mir nicht geklappt.
            An diesem Punkt kam ich nicht weiter:
            b99f43d7-6733-4574-a8f9-26f013d870f9-image.png


            Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
            Danke.
            gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
            ScreenToGif :https://www.screentogif.com/downloads.html

            D 1 Antwort Letzte Antwort
            0
            • bahnuhrB bahnuhr

              @dirkhe sagte in Skript - automatisch Eintrag im Google Kalender machen:

              @atifan du kannst den webcal adapter nehmen, der macht genau das. Allerding ist das einrifhten der apj etwas komplizierter, habe ich aber in github dokumentiert. Ich hoffe mal, das funktioniert noch.

              Hat bei mir nicht geklappt.
              An diesem Punkt kam ich nicht weiter:
              b99f43d7-6733-4574-a8f9-26f013d870f9-image.png

              D Offline
              D Offline
              dirkhe
              Developer
              schrieb am zuletzt editiert von
              #6

              @bahnuhr was hat er denn gemeldet? Hast du "unsicher" zugelassen unter advanced?

              bahnuhrB 1 Antwort Letzte Antwort
              0
              • D dirkhe

                @bahnuhr was hat er denn gemeldet? Hast du "unsicher" zugelassen unter advanced?

                bahnuhrB Online
                bahnuhrB Online
                bahnuhr
                Forum Testing Most Active
                schrieb am zuletzt editiert von
                #7

                @dirkhe sagte in Skript - automatisch Eintrag im Google Kalender machen:

                "unsicher" zugelassen

                unsicher, etc. kam da nicht.
                Das Blatt sieht anders aus.


                Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                Danke.
                gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                ScreenToGif :https://www.screentogif.com/downloads.html

                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

                839

                Online

                32.4k

                Benutzer

                81.5k

                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