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. ioBroker Allgemein
  4. Kalender von Website auslesen

NEWS

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

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

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

Kalender von Website auslesen

Geplant Angeheftet Gesperrt Verschoben ioBroker Allgemein
parserwebsite auslesenkalenderical adapter
28 Beiträge 3 Kommentatoren 2.4k Aufrufe 4 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.
  • A andrenaether

    @liv-in-sky Ohh wow ich habe mich inzwischen auch damit befasst aber habe es nicht hinbekommen... :disappointed_relieved:
    Kannst du mir das zeigen, erklären .... bin da echt am verzweifeln .....
    aber mega das es Leute wie dich gibt die da eine Ahnung haben :-)

    liv-in-skyL Offline
    liv-in-skyL Offline
    liv-in-sky
    schrieb am zuletzt editiert von
    #17

    @andrenaether sagte in Kalender von Website auslesen:

    aber habe es nicht hinbekommen

    was genau - den webcal adapter ?

    nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

    A 1 Antwort Letzte Antwort
    0
    • liv-in-skyL liv-in-sky

      @andrenaether sagte in Kalender von Website auslesen:

      aber habe es nicht hinbekommen

      was genau - den webcal adapter ?

      A Offline
      A Offline
      andrenaether
      schrieb am zuletzt editiert von
      #18

      @liv-in-sky Und wie du die daten aus der website geholt hast .... Ich habe noch keinen Richtigen Plan wie das alles umsetzen und zusammenbauen ... :fearful:

      liv-in-skyL 1 Antwort Letzte Antwort
      0
      • A andrenaether

        @liv-in-sky Und wie du die daten aus der website geholt hast .... Ich habe noch keinen Richtigen Plan wie das alles umsetzen und zusammenbauen ... :fearful:

        liv-in-skyL Offline
        liv-in-skyL Offline
        liv-in-sky
        schrieb am zuletzt editiert von
        #19

        @andrenaether sagte in Kalender von Website auslesen:

        Und wie du die daten aus der website geholt hast

        das kommt noch - ich nutze ein script, welches du dann bekommst - zuerst muss aber der webcal adapter richtig eingerichtet werden

        nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

        A 1 Antwort Letzte Antwort
        0
        • A andrenaether

          @liv-in-sky Ohh wow ich habe mich inzwischen auch damit befasst aber habe es nicht hinbekommen... :disappointed_relieved:
          Kannst du mir das zeigen, erklären .... bin da echt am verzweifeln .....
          aber mega das es Leute wie dich gibt die da eine Ahnung haben :-)

          liv-in-skyL Offline
          liv-in-skyL Offline
          liv-in-sky
          schrieb am zuletzt editiert von
          #20

          @andrenaether sagte in Kalender von Website auslesen:

          mega das es Leute wie dich gibt die da eine Ahnung haben

          bei diesen ganzen google anmelde-kram habe ich nicht wirklich eine ahnung :-) habe nach anleitung solange geklickt, bis es lief

          nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

          1 Antwort Letzte Antwort
          0
          • liv-in-skyL liv-in-sky

            @andrenaether sagte in Kalender von Website auslesen:

            Und wie du die daten aus der website geholt hast

            das kommt noch - ich nutze ein script, welches du dann bekommst - zuerst muss aber der webcal adapter richtig eingerichtet werden

            A Offline
            A Offline
            andrenaether
            schrieb am zuletzt editiert von
            #21

            @liv-in-sky Ich finde den Adapter nicht .... nur auf github .... Doch da lässt er sich nicht installieren über die url..... aber bin dran

            liv-in-skyL A 2 Antworten Letzte Antwort
            0
            • A andrenaether

              @liv-in-sky Ich finde den Adapter nicht .... nur auf github .... Doch da lässt er sich nicht installieren über die url..... aber bin dran

              liv-in-skyL Offline
              liv-in-skyL Offline
              liv-in-sky
              schrieb am zuletzt editiert von
              #22

              @andrenaether zur not können wir auch mal eine anydesk session machen - da seh ich deinen bildschirm und wir können gemeinsam durchgehen, was zu machen ist

              nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

              1 Antwort Letzte Antwort
              0
              • A andrenaether

                @liv-in-sky Ich finde den Adapter nicht .... nur auf github .... Doch da lässt er sich nicht installieren über die url..... aber bin dran

                A Offline
                A Offline
                andrenaether
                schrieb am zuletzt editiert von andrenaether
                #23

                @andrenaether so Adapter habe ich und installiert ..... richte ihn gerade ein ... Habe heute wenig zeit ... muss gleich los ....
                Gruss andre :-)

                D 1 Antwort Letzte Antwort
                0
                • A andrenaether

                  @andrenaether so Adapter habe ich und installiert ..... richte ihn gerade ein ... Habe heute wenig zeit ... muss gleich los ....
                  Gruss andre :-)

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

                  @andrenaether nimm die emai lieber raus und schreibe ihm per pn

                  A 1 Antwort Letzte Antwort
                  0
                  • D dirkhe

                    @andrenaether nimm die emai lieber raus und schreibe ihm per pn

                    A Offline
                    A Offline
                    andrenaether
                    schrieb am zuletzt editiert von
                    #25

                    @dirkhe oh danke dir :-)

                    liv-in-skyL 2 Antworten Letzte Antwort
                    0
                    • liv-in-skyL Offline
                      liv-in-skyL Offline
                      liv-in-sky
                      schrieb am zuletzt editiert von
                      #26

                      für später das sccript zum import - bitte noch nicht ausführen lassen - machen wir zusammen

                      
                      
                      let url="https://irs.indico.ch/bodenseearena/views/Graphical?location=Bodenseearena"
                      let gesucht;
                      let theJson=[];let myCalArr=[];let myCalArrTomorrow=[];
                      const myDP="0_userdata.0.CONTROL-OWN.AAATEST.testJSON"
                      
                      async function doit(){
                      await getData();
                      //log(gesucht[0])
                      //log(String(gesucht.length))
                      for(let i=0;i<gesucht.length;i++){
                         let mytime=gesucht[i].replace(/.*new Date\((.*?)\).*/,"$1").split(",")
                         let mydatum=mytime[2]+"."+String(Number(mytime[1])+1)+"."+mytime[0];
                         let myzeit;
                         let todayDay=formatDate(getDateObject((new Date().getTime())), "T.M.JJJJ");
                         log(mydatum)
                         mytime.length==4 ? myzeit=mytime[3]+":"+"00" : myzeit=mytime[3]+":"+mytime[4];
                        //let mydauer=Number(gesucht[i].replace(/.*new Date\(.*?\)\, (.*?)\,.*/,"$1"))/100000;
                         //log(mydauer)
                         
                       theJson.push({
                           "zeit":myzeit,
                           "datum":mydatum,
                           "ereignis":gesucht[i].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/," ")
                       })
                       //if (i<5){
                       myCalArr.push({
                           "start":mydatum+" "+ myzeit,
                           "end":mydatum+" "+ add15MinutesToTime(myzeit),
                           "summary":gesucht[i].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/," "),
                           "description":"from IOB Script"
                       })
                       //log(todayDay+"   -   "+mydatum)
                       if(todayDay===mydatum){
                       myCalArrTomorrow.push({
                           "start":mydatum+" "+ myzeit,
                           "end":mydatum+" "+ add15MinutesToTime(myzeit),
                           "summary":gesucht[i].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/," "),
                           "description":"from IOB Script"
                       })}
                       //}
                      }
                      //log(JSON.stringify(myCalArr));
                      log(JSON.stringify(myCalArrTomorrow));
                      
                      setState(myDP,JSON.stringify(theJson));
                      //toCalender(myCalArr);
                      toCalender(myCalArrTomorrow);
                      }
                      
                      
                      async function getData(){
                         return new Promise(async (resolve, reject) => {
                      
                        await request(url, async function (error, response, result) {
                       
                        gesucht="";
                         const myregex = /^this\.AddAppointment.*$/gm;
                        gesucht=result.match(myregex);  
                       
                          if (gesucht!="" && error==null) {resolve()} else {reject()}
                      ;  }).on("error", function (e) {console.error(e);});
                      
                        
                       });
                      
                      }
                      
                      schedule("1 5 * * *", async function () {
                         doit(); 
                      });
                      
                      
                      
                      function toCalender(myArr){
                      sendTo("webcal.0", "addEvents", {
                         calendar: "eislaufhalle",
                         events: myArr
                       })
                       }
                      
                       function add15MinutesToTime(time) {
                       const [hours, minutes] = time.split(":").map(Number);
                      
                       let totalMinutes = hours * 60 + minutes;
                       totalMinutes += 30;
                      
                       const newHours = Math.floor(totalMinutes / 60);
                       const newMinutes = totalMinutes % 60;
                      
                       const formattedNewHours = newHours < 10 ? `0${newHours}` : newHours;
                       const formattedNewMinutes = newMinutes < 10 ? `0${newMinutes}` : newMinutes;
                      
                       return `${formattedNewHours}:${formattedNewMinutes}`;
                      }
                      
                      
                       
                      
                      

                      nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                      1 Antwort Letzte Antwort
                      0
                      • A andrenaether

                        @dirkhe oh danke dir :-)

                        liv-in-skyL Offline
                        liv-in-skyL Offline
                        liv-in-sky
                        schrieb am zuletzt editiert von
                        #27

                        @andrenaether

                        wegen der doppeleinträge

                        kopiere mal diesen block in beide scripte

                            theJson=[];
                            myCalArr=[];
                            myCalArrTomorrow=[];
                            countAlarm=0;
                        

                        an diese stelle im script:

                        Image 103.png

                        nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                        1 Antwort Letzte Antwort
                        0
                        • A andrenaether

                          @dirkhe oh danke dir :-)

                          liv-in-skyL Offline
                          liv-in-skyL Offline
                          liv-in-sky
                          schrieb am zuletzt editiert von liv-in-sky
                          #28

                          @andrenaether

                          ich glaube, ich habe den fehler gefunden - tritt erst auf, wenn die 2te anlage auch daten enthält - sieht im google-cal wieder so aus:

                          Image 115.png

                          die telegram-sache hat ja eh funktioniert:

                          Image 116.png

                          • kopiere diesen teil bei dir ab zeile 14 (also dein setting darüber im script behalten) mal rein
                          • mache vorher eine kopie des jetzigen scriptes - zur sicherheit
                          • diese änderung gilt nur für den innenbereich (halle) - der andere bereich braucht uch noch andere änderungen !!!!!

                          Image 117.png

                          async function doit(){ 
                             theJson=[];
                             myCalArr=[];
                             myCalArrTomorrow=[];
                             myCalArrTomorrowAlarm=[];
                             countAlarm=0;
                          
                          await getData();
                          //log(gesucht[0])
                          //log(String(gesucht.length))
                          for(let i=0;i<gesucht.length;i++){
                             let mytime=gesucht[i].replace(/.*new Date\((.*?)\).*/,"$1").split(",");
                             let theDauer=gesucht[i].replace(/.*new Date\(.*?\)\, (.*?)\,.*/,"$1").replace(/00000/,"");
                             let myDauer=getDauer(theDauer)
                             let mydatum=mytime[2]+"."+String(Number(mytime[1])+1)+"."+mytime[0];
                             let myzeit;
                              let theOrt=String(gesucht[i].replace(/.*new Date\(.*?\)\, .*?\, \[\'(.)\'\].*/,"$1")); //log("ORT - "+theOrt)
                             let todayDay=formatDate(getDateObject((new Date().getTime())), "T.M.JJJJ");
                            // log(mydatum+ "---" + theDauer+ "---" + myDauer)
                             mytime.length==4 ? myzeit=mytime[3]+":"+"00" : myzeit=mytime[3]+":"+mytime[4];
                            //let mydauer=Number(gesucht[i].replace(/.*new Date\(.*?\)\, (.*?)\,.*/,"$1"))/100000;
                             //log(mydauer)
                             
                           theJson.push({
                               "zeit":myzeit,
                               "datum":mydatum,
                               "ereignis":gesucht[i].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/," "),
                               "dauer":getDauer(theDauer)
                           })
                           //if (i<5){
                           myCalArr.push({
                               "start":mydatum+" "+ myzeit,
                               "end":mydatum+" "+ add15MinutesToTime(myzeit,getDauer(theDauer)),
                               "summary":gesucht[i].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/," "),
                               "description":"from IOB Script"
                           })
                          
                           if(todayDay===mydatum && theOrt == "1" ){ //log(todayDay+"   -   "+theOrt)
                           myCalArrTomorrow.push({
                               "start":mydatum+" "+ myzeit,
                               "end":mydatum+" "+ add15MinutesToTime(myzeit,getDauer(theDauer)),
                               "summary":gesucht[i].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/g," "),
                               "description":"from IOB Script"
                           })
                           if (countAlarm==0){                                            // einmal bei alarm ersten werte ins array
                                                myCalArrTomorrowAlarm.push({
                                               "start":mydatum+" "+ subtract15MinutesFromTime(myzeit,15),
                                               "end":mydatum+" "+ subtract15MinutesFromTime(myzeit,10),
                                               "summary":"ALARM:"+gesucht[i].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/g," "),
                                               "description":"from IOB Script"
                           })
                           }
                           countAlarm ++;
                           let mytimeAnfangNext;
                            if(i+1<gesucht.length){ mytimeAnfangNext=gesucht[i+1].replace(/.*new Date\((.*?)\).*/,"$1").split(",");} else { mytimeAnfangNext=gesucht[i].replace(/.*new Date\((.*?)\).*/,"$1").split(",");}
                            let myzeitAnfangNext;
                            mytimeAnfangNext.length==4 ? myzeitAnfangNext=mytimeAnfangNext[3]+":"+"00" : myzeitAnfangNext=mytimeAnfangNext[3]+":"+mytimeAnfangNext[4];
                           // log(myzeitAnfangNext)
                           // log(add15MinutesToTime(myzeit,getDauer(theDauer)))
                            if(calculateTimeDifferenceInMinutes(add15MinutesToTime(myzeit,getDauer(theDauer)),myzeitAnfangNext)>3000 ){
                                                                // log(Number(calculateTimeDifferenceInMinutes( add15MinutesToTime(myzeit,getDauer(theDauer)),myzeitAnfangNext)))
                                                                  myCalArrTomorrowAlarm.push({
                                                                 "start":mydatum+" "+ subtract15MinutesFromTime(myzeitAnfangNext,5),
                                                                 "end":mydatum+" "+ subtract15MinutesFromTime(myzeitAnfangNext,1),
                                                                 "summary":"ALARM:"+gesucht[i+1].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/g," "),
                                                                 "description":"from IOB Script"
                           })
                                                                 
                                                                 
                                                                 
                                                                 } else{
                           if(i+1<gesucht.length){
                           myCalArrTomorrowAlarm.push({
                               "start":mydatum+" "+ add15MinutesToTime(myzeit,getDauer(theDauer)),
                               "end":mydatum+" "+ add15MinutesToTime(add15MinutesToTime(myzeit,5),getDauer(theDauer)),
                               "summary":"ALARM:"+gesucht[i+1].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/g," "),
                               "description":"from IOB Script"
                           })  } else{myCalArrTomorrowAlarm.push({
                                                              "start":mydatum+" "+ add15MinutesToTime(myzeit,getDauer(theDauer)),
                                                              "end":mydatum+" "+ add15MinutesToTime(add15MinutesToTime(myzeit,5),getDauer(theDauer)),
                                                              "summary":"ALARM:"+" Letzte Aktion",   //gesucht[i].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/," ")
                                                              "description":"from IOB Script"
                           })
                          
                           }
                                                                 }
                           
                           }
                           //}
                          }
                          //log(JSON.stringify(myCalArr));
                          //myCalArrTomorrowAlarm=myCalArrTomorrowAlarm.slice(0,-1);  //löscht letzten eintrag aus Alarm Array
                          //log(JSON.stringify(myCalArrTomorrowAlarm));
                          
                          //setState(myDP,JSON.stringify(theJson));
                          //toCalender(myCalArr);
                          //toCalender(myCalArrTomorrow,myKalender,instanz);
                          
                          if (!wiederholung) {toCalender(myCalArrTomorrowAlarm,myKalenderAlarm,instanzAlarm); 
                                             toCalender(myCalArrTomorrow,myKalender,instanz);
                                            // log("in nicht wiederholung - einmal morgens")
                                             myOldArrAlarm=myCalArrTomorrowAlarm
                                             setState(myDPOldArrayAlarm,JSON.stringify(myOldArrAlarm));
                                            } else{
                          
                                                  let changeDetails = findChanges(JSON.parse(getState(myDPOldArrayAlarm).val),myCalArrTomorrowAlarm)
                                                  console.log(changeDetails);
                                                  myOldArrAlarm=myCalArrTomorrowAlarm
                                                  setState(myDPOldArrayAlarm,JSON.stringify(myOldArrAlarm));
                                                  if(changeDetails.length>0) {log(JSON.stringify(changeDetails))
                                                                              for (let i=0;i<changeDetails.length;i++){ 
                                                                                                                      if(changeDetails[i].action=="added" || changeDetails[i].action=="changed" )
                                                                                                                            {toCalender([changeDetails[0]],myKalenderAlarmAenderung,instanzAlarmAenderung); 
                                                                                                                            }
                                                                                                                      }
                                                                             }setState(myDPOldArrayAlarm,JSON.stringify(myCalArrTomorrowAlarm));
                          
                                                  }
                          }
                          
                          
                          async function getData(){
                             return new Promise(async (resolve, reject) => {
                          
                            await request(url, async function (error, response, result) {
                           
                            gesucht="";
                             const myregex = /^this\.AddAppointment.*$/gm;
                            gesucht=result.match(myregex); //log(gesucht) 
                            gesucht=gesucht.filter(platz => platz.includes("['1']"));
                            //log(gesucht)
                              if (gesucht!="" && error==null) {resolve()} else {reject()}
                          ;  }).on("error", function (e) {console.error(e);});
                          
                            
                           });
                          
                          }
                          
                          
                          schedule("1 5 * * *", async function () {
                             wiederholung=false;
                             doit(); 
                          });
                          /*schedule("3,33 5-23 * * *", async function () {
                             wiederholung=true;
                             doit(); 
                          });*/
                          //wiederholung=false; doit();
                          
                          
                          function toCalender(myArr,Kalender,myInstanz){
                          sendTo("webcal."+myInstanz, "addEvents", {
                             calendar: Kalender,
                             events: myArr
                           })
                           }
                          
                           function add15MinutesToTime(time,howLong) {
                           const [hours, minutes] = time.split(":").map(Number);
                          
                           let totalMinutes = hours * 60 + minutes;
                           totalMinutes += howLong;
                          
                           const newHours = Math.floor(totalMinutes / 60);
                           const newMinutes = totalMinutes % 60;
                          
                           const formattedNewHours = newHours < 10 ? `0${newHours}` : newHours;
                           const formattedNewMinutes = newMinutes < 10 ? `0${newMinutes}` : newMinutes;
                          
                           return `${formattedNewHours}:${formattedNewMinutes}`;
                          }
                          
                          function subtract15MinutesFromTime(time,howLong) {
                           const [hours, minutes] = time.split(":").map(Number);
                          
                           let totalMinutes = hours * 60 + minutes;
                           totalMinutes -= howLong;
                          
                           if (totalMinutes < 0) {
                             totalMinutes += 24 * 60; // Falls die Zeit negativ wird, füge 24 Stunden hinzu
                           }
                          
                           const newHours = Math.floor(totalMinutes / 60);
                           const newMinutes = totalMinutes % 60;
                          
                           const formattedNewHours = newHours < 10 ? `0${newHours}` : newHours;
                           const formattedNewMinutes = newMinutes < 10 ? `0${newMinutes}` : newMinutes;
                          
                           return `${formattedNewHours}:${formattedNewMinutes}`;
                          }
                          
                          
                          function getDauer(dauer){
                           //  const minChange=[{"18":30},{"27":45},{"36":60},{"45":75},{"54":90},{"63":105},{"72":120},{"81":135},{"90":150},{"99":165},{"108":180}]; 
                            // log(String(minChange["18"]))
                             return (dauer/9)*15
                          }
                          
                          function calculateTimeDifferenceInMinutes(startTime, endTime) {
                           const [startHours, startMinutes] = startTime.split(":").map(Number);
                           const [endHours, endMinutes] = endTime.split(":").map(Number);
                          
                           const totalStartMinutes = startHours * 60 + startMinutes;
                           const totalEndMinutes = endHours * 60 + endMinutes;
                          
                           let timeDifference = totalEndMinutes - totalStartMinutes;
                          
                           if (timeDifference < 0) {
                             timeDifference += 24 * 60; // Falls die Differenz negativ wird, füge 24 Stunden hinzu
                           }
                          
                           return timeDifference;
                          }
                          
                          /*
                          function findChanges(oldArray, newArray) {
                           const changes = [];
                          
                           newArray.forEach(newItem => {
                             const oldItem = oldArray.find(item => item.start === newItem.start);
                          
                             if (!oldItem) {
                               changes.push({ start: newItem.start, action: "added" });
                             } else {
                               const changedKeys = Object.keys(newItem).filter(key => oldItem[key] !== newItem[key]);
                               if (changedKeys.length > 0) {
                                 changes.push({ start: newItem.start, action: "changed", keys: changedKeys });
                               }
                             }
                           });
                          
                           oldArray.forEach(oldItem => {
                             const newItem = newArray.find(item => item.start === oldItem.start);
                             if (!newItem) {
                               changes.push({ start: oldItem.start, action: "deleted" });
                             }
                           });
                          
                           return changes;
                          }
                          */
                          
                          function findChanges(oldArray, newArray) {
                           const changes = [];
                          
                           newArray.forEach(newItem => {
                             const oldItem = oldArray.find(item => item.start === newItem.start);
                          
                             if (!oldItem) {
                               changes.push({ ...newItem, action: "added" });
                             } else {
                               const changedKeys = Object.keys(newItem).filter(key => oldItem[key] !== newItem[key]);
                               if (changedKeys.length > 0) {
                                 const changeDetails = { ...newItem, action: "changed", changedKeys };
                                 changes.push(changeDetails);
                               }
                             }
                           });
                          
                           oldArray.forEach(oldItem => {
                             const newItem = newArray.find(item => item.start === oldItem.start);
                             if (!newItem) {
                               changes.push({ ...oldItem, action: "deleted" });
                             }
                           });
                          
                           return changes;
                          }
                          

                          nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und 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
                          FAQ Cloud / IOT
                          HowTo: Node.js-Update
                          HowTo: Backup/Restore
                          Downloads
                          BLOG

                          783

                          Online

                          32.5k

                          Benutzer

                          81.6k

                          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