Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Cronjob am Ende vom Quartal

    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

    Cronjob am Ende vom Quartal

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

      Ist dieser Code richtig um nur am letzten Tag eines Quartales um 23:58 Uhr was auszuführen?

      // Funktion zum Einrichten der geplanten Ausführung
      function setupSchedule() {
        const now = new Date();
        const currentMonth = now.getMonth() + 1;
        const currentYear = now.getFullYear();
        let cronPattern;
      
        if (currentMonth === 3 || currentMonth === 6 || currentMonth === 9 || currentMonth === 12) {
          cronPattern = `58 23 ${getLastDayOfQuarter(currentMonth)} ${getMonthName(currentMonth)} *`;
        } else {
          cronPattern = '0 0 1 1 *';
        }
      
        schedule(cronPattern, saveJson);
      }
      
      
      // Hilfsfunktion, um den Namen des Monats zu erhalten
      function getMonthName(month) {
        const months = [
          'Jan',
          'Feb',
          'Mar',
          'Apr',
          'May',
          'Jun',
          'Jul',
          'Aug',
          'Sep',
          'Oct',
          'Nov',
          'Dec',
        ];
        return months[month - 1];
      }
      
      // Hilfsfunktion, um das letzte Datum des Quartals zu erhalten
      function getLastDayOfQuarter(month) {
        const quarterEndMonths = [3, 6, 9, 12];
        const quarter = Math.floor((month - 1) / 3) + 1;
        const lastMonthOfQuarter = quarterEndMonths[quarter - 1];
        const lastDay = new Date(new Date().getFullYear(), lastMonthOfQuarter, 0).getDate();
        return lastDay;
      }
      
      // Einrichten der geplanten Ausführung beim Start des Skripts
      setupSchedule();
      
      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @Chris76e last edited by

        @chris76e sagte: nur am letzten Tag eines Quartales um 23:58 Uhr was auszuführen?

        Genügt es nicht so?

        schedule('58 23 30,31 3,6,9,12 *', function() {
            const now = new Date();
            const monat = now.getMonth() + 1;
            if(now.getDate() == 31 || monat == 6 || monat == 9) {
                // Aktion am Quartalsende
            }
        });
        
        Chris76e 1 Reply Last reply Reply Quote 0
        • Chris76e
          Chris76e @paul53 last edited by

          @paul53 sagte in Cronjob am Ende vom Quartal:

          @chris76e sagte: nur am letzten Tag eines Quartales um 23:58 Uhr was auszuführen?

          Genügt es nicht so?

          Deswegen frag ich ja 😊 Also würde das reichen was du geschrieben hast?

          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @Chris76e last edited by

            @chris76e sagte: Also würde das reichen was du geschrieben hast?

            Davon gehe ich aus. Spricht logisch etwas dagegen?

            Chris76e 1 Reply Last reply Reply Quote 0
            • Chris76e
              Chris76e @paul53 last edited by

              @paul53 Wenn ich das richtig verstanden habe

              58 = Minute 
              23 = Stunde 
              30,31 = Tag 30 oder 31 
              3,6,9,12 = Monat März, Juni, September oder Dezember
              

              Wass passiert dann z.B. im Dezember, wird es da am 30. und 31. ausgeführt?

              paul53 1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @Chris76e last edited by

                @chris76e sagte: wird es da am 30. und 31. ausgeführt?

                Es wird an beiden Tagen getriggert, aber der 30.12. wird durch die Abfrage ausgefiltert: Es ist weder der 31. noch Monat 6 oder 9.

                Chris76e 1 Reply Last reply Reply Quote 0
                • Chris76e
                  Chris76e @paul53 last edited by Chris76e

                  @paul53 Verstanden, also sollte das gesamte script so immer am letzten tag des quartals ausgeführt werden

                  function saveJson() {
                    // Aktuelles Jahr, Quartal und Monat abrufen
                    const now = new Date();
                    const currentYear = now.getFullYear();
                    const currentMonth = now.getMonth() + 1;
                    const currentQuarter = Math.floor((currentMonth - 1) / 3) + 1;
                  
                    // Datenpunkte abrufen und Min-/Max-Werte ermitteln
                    const tempMin = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Aussentemperatur.quarterMin`).val;
                    const tempMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Aussentemperatur.quarterMax`).val;
                    const humidityMin = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Aussenfeuchtigkeit.quarterMin`).val;
                    const humidityMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Aussenfeuchtigkeit.quarterMax`).val;
                    const pressureMin = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Druck_absolut.quarterMin`).val;
                    const pressureMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Druck_absolut.quarterMax`).val;
                    const windMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Wind.quarterMax`).val;
                    const gustMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Windboeen_max.quarterMax`).val;
                    const rainMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Regenrate.quarterMax`).val;
                    const irradianceMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Sonnenstrahlung.quarterMax`).val;
                    const uvIndexMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.UV_Index.quarterMax`).val;
                    const rainQuarter = getState(`statistics.0.temp.sumDelta.javascript.0.Wetterstation.Regen_Tag.quarter`).val;
                    const sunshineQuarter = getState(`0_userdata.0.Wetter.Sonne.SonnenStunden_Quartal`).val;
                  
                    // JSON-Datensatz erstellen
                    const data = {
                      year: currentYear,
                      quarter: currentQuarter,
                      tempMin,
                      tempMax,
                      humidityMin,
                      humidityMax,
                      pressureMin,
                      pressureMax,
                      windMax,
                      gustMax,
                      rainMax,
                      irradianceMax,
                      uvIndexMax,
                      rainQuarter,
                      sunshineQuarter
                    };
                  
                    // JSON-Datensatz aus dem Datenpunkt laden und parsen
                    const jsonDataString = getState('0_userdata.0.JSON.MinMax.Quartal').val || '[]';
                    let jsonData;
                    try {
                      jsonData = JSON.parse(jsonDataString);
                    } catch (error) {
                      console.error(`Error parsing JSON data: ${error}`);
                      jsonData = [];
                    }
                  
                    // JSON-Datensatz hinzufügen
                    jsonData.push(data);
                  
                    // JSON-Datensatz im Datenpunkt speichern
                    setState('0_userdata.0.JSON.MinMax.Quartal', JSON.stringify(jsonData), true);
                  }
                  // Zeitplan
                  schedule('58 23 30,31 3,6,9,12 *', function() {
                  
                      const now = new Date();
                  
                      const monat = now.getMonth() + 1;
                  
                      if(now.getDate() == 31 || monat == 6 || monat == 9) {
                  
                          // Aktion am Quartalsende
                  
                      }
                  
                  });
                  

                  und kann ich das verwenden für den letzten Tag eines Monats?

                  // Funktion zum Einrichten der geplanten Ausführung
                  function setupSchedule() {
                    const cronPattern = '58 23 28-31 * *'; // Ausführung am 28., 29., 30. oder 31. Tag des Monats um 23:58 Uhr
                    schedule(cronPattern, function() {
                      const now = new Date();
                      const isLastDayOfMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate() === now.getDate();
                      if (isLastDayOfMonth) {
                        saveJson();
                      }
                    });
                  }
                  // Einrichten der geplanten Ausführung beim Start des Skripts
                  setupSchedule();
                  
                  paul53 1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @Chris76e last edited by paul53

                    @chris76e
                    Die Prüfung auf letzten Tag des Monats würde ich so machen (bei Trigger um 23:58 Uhr):

                    if(new Date(Date.now() + 130000).getDate() == 1) { // morgen ist der 1.
                    

                    @chris76e sagte in Cronjob am Ende vom Quartal:

                    sollte das gesamte script so immer am letzten tag des quartals ausgeführt werden

                    Ja, wenn der Kommentar in Zeile 67 durch den Funktionsaufruf ersetzt wird.

                    Chris76e 1 Reply Last reply Reply Quote 0
                    • Chris76e
                      Chris76e @paul53 last edited by

                      @paul53 sagte in Cronjob am Ende vom Quartal:

                      Ja, wenn der Kommentar in Zeile 67 durch den Funktionsaufruf ersetzt wird.

                      Stehe jetzt gerade auf dem Schlauch, meinst du so?

                      
                      // Zeitplan
                      schedule('58 23 30,31 3,6,9,12 *', function() {
                      
                          const now = new Date();
                      
                          const monat = now.getMonth() + 1;
                      
                          if(now.getDate() == 31 || monat == 6 || monat == 9) 
                          
                      function saveJson() {
                        // Aktuelles Jahr, Quartal und Monat abrufen
                        const now = new Date();
                        const currentYear = now.getFullYear();
                        const currentMonth = now.getMonth() + 1;
                        const currentQuarter = Math.floor((currentMonth - 1) / 3) + 1;
                      
                        // Datenpunkte abrufen und Min-/Max-Werte ermitteln
                        const tempMin = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Aussentemperatur.quarterMin`).val;
                        const tempMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Aussentemperatur.quarterMax`).val;
                        const humidityMin = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Aussenfeuchtigkeit.quarterMin`).val;
                        const humidityMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Aussenfeuchtigkeit.quarterMax`).val;
                        const pressureMin = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Druck_absolut.quarterMin`).val;
                        const pressureMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Druck_absolut.quarterMax`).val;
                        const windMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Wind.quarterMax`).val;
                        const gustMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Windboeen_max.quarterMax`).val;
                        const rainMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Regenrate.quarterMax`).val;
                        const irradianceMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Sonnenstrahlung.quarterMax`).val;
                        const uvIndexMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.UV_Index.quarterMax`).val;
                        const rainQuarter = getState(`statistics.0.temp.sumDelta.javascript.0.Wetterstation.Regen_Tag.quarter`).val;
                        const sunshineQuarter = getState(`0_userdata.0.Wetter.Sonne.SonnenStunden_Quartal`).val;
                      
                        // JSON-Datensatz erstellen
                        const data = {
                          year: currentYear,
                          quarter: currentQuarter,
                          tempMin,
                          tempMax,
                          humidityMin,
                          humidityMax,
                          pressureMin,
                          pressureMax,
                          windMax,
                          gustMax,
                          rainMax,
                          irradianceMax,
                          uvIndexMax,
                          rainQuarter,
                          sunshineQuarter
                        };
                      
                        // JSON-Datensatz aus dem Datenpunkt laden und parsen
                        const jsonDataString = getState('0_userdata.0.JSON.MinMax.Quartal').val || '[]';
                        let jsonData;
                        try {
                          jsonData = JSON.parse(jsonDataString);
                        } catch (error) {
                          console.error(`Error parsing JSON data: ${error}`);
                          jsonData = [];
                        }
                      
                        // JSON-Datensatz hinzufügen
                        jsonData.push(data);
                      
                        // JSON-Datensatz im Datenpunkt speichern
                        setState('0_userdata.0.JSON.MinMax.Quartal', JSON.stringify(jsonData), true);
                      }
                      
                      });
                      
                      paul53 1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 @Chris76e last edited by

                        @chris76e sagte: meinst du so?

                        Nein, Zeile 63:

                        function saveJson() {
                          // Aktuelles Jahr, Quartal und Monat abrufen
                          const now = new Date();
                          const currentYear = now.getFullYear();
                          const currentMonth = now.getMonth() + 1;
                          const currentQuarter = Math.floor((currentMonth - 1) / 3) + 1;
                         
                          // Datenpunkte abrufen und Min-/Max-Werte ermitteln
                          const tempMin = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Aussentemperatur.quarterMin`).val;
                          const tempMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Aussentemperatur.quarterMax`).val;
                          const humidityMin = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Aussenfeuchtigkeit.quarterMin`).val;
                          const humidityMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Aussenfeuchtigkeit.quarterMax`).val;
                          const pressureMin = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Druck_absolut.quarterMin`).val;
                          const pressureMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Druck_absolut.quarterMax`).val;
                          const windMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Wind.quarterMax`).val;
                          const gustMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Windboeen_max.quarterMax`).val;
                          const rainMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Regenrate.quarterMax`).val;
                          const irradianceMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.Sonnenstrahlung.quarterMax`).val;
                          const uvIndexMax = getState(`statistics.0.temp.minmax.javascript.0.Wetterstation.UV_Index.quarterMax`).val;
                          const rainQuarter = getState(`statistics.0.temp.sumDelta.javascript.0.Wetterstation.Regen_Tag.quarter`).val;
                          const sunshineQuarter = getState(`0_userdata.0.Wetter.Sonne.SonnenStunden_Quartal`).val;
                         
                          // JSON-Datensatz erstellen
                          const data = {
                            year: currentYear,
                            quarter: currentQuarter,
                            tempMin,
                            tempMax,
                            humidityMin,
                            humidityMax,
                            pressureMin,
                            pressureMax,
                            windMax,
                            gustMax,
                            rainMax,
                            irradianceMax,
                            uvIndexMax,
                            rainQuarter,
                            sunshineQuarter
                          };
                         
                          // JSON-Datensatz aus dem Datenpunkt laden und parsen
                          const jsonDataString = getState('0_userdata.0.JSON.MinMax.Quartal').val || '[]';
                          let jsonData;
                          try {
                            jsonData = JSON.parse(jsonDataString);
                          } catch (error) {
                            console.error(`Error parsing JSON data: ${error}`);
                            jsonData = [];
                          }
                         
                          // JSON-Datensatz hinzufügen
                          jsonData.push(data);
                         
                          // JSON-Datensatz im Datenpunkt speichern
                          setState('0_userdata.0.JSON.MinMax.Quartal', JSON.stringify(jsonData), true);
                        }
                        
                        schedule('58 23 30,31 3,6,9,12 *', function() {
                            const now = new Date();
                            const monat = now.getMonth() + 1;
                            if(now.getDate() == 31 || monat == 6 || monat == 9) {
                                saveJson();
                            }
                        });
                        
                        Chris76e 1 Reply Last reply Reply Quote 1
                        • Chris76e
                          Chris76e @paul53 last edited by

                          @paul53 Danke

                          metaxa 1 Reply Last reply Reply Quote 0
                          • metaxa
                            metaxa @Chris76e last edited by

                            Kann ich das mit Blockly auch umsetzen?

                            Ich möchte gerne jeweils am Monatsletzten um 23:30 den Monatsertrag meiner PV-Anlage wegschreiben, mit SQL protokollieren und dann mit e-charts darstellen.

                            In Blockly/Trigger finde ich meiner Meinung nach nichts Passendes.

                            paul53 1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 @metaxa last edited by

                              @metaxa sagte: am Monatsletzten um 23:30 den Monatsertrag meiner PV-Anlage wegschreiben

                              Blockly_temp.JPG

                              1 Reply Last reply Reply Quote 1
                              • metaxa
                                metaxa last edited by

                                @paul53 Faszinierend, faszinierend ......

                                Jetzt täte ich es noch gerne verstehen:

                                205d90d9-7661-4b10-a948-57394efcfabf-image.png
                                ^Cronjob wird ausgeführt nur am 28., 29., 30., 31. jedes Monat

                                f317e36d-b138-4803-87b9-3b7d6b6c9149-image.png
                                ^liefert die aktuelle Systemzeit+30 Min.

                                92c8027a-a3f9-469e-b3a9-038599ba1fbb-image.png
                                ^Wenn die aktuelle Systemzeit+30Min. ?????????????? Das verstehe ich leider überhaupt nicht

                                @paul53 kannst du bitte versuchen mir das auszudeutschen?

                                Codierknecht 1 Reply Last reply Reply Quote 0
                                • Codierknecht
                                  Codierknecht Developer Most Active @metaxa last edited by

                                  @metaxa sagte in Cronjob am Ende vom Quartal:

                                  Jetzt täte ich es noch gerne verstehen:

                                  Wenn man um 23:30 triggert und dann 30 Minuten draufrechnet, landet man zwangsläufig beim nächsten Tag.
                                  Jetzt prüft man, ob dieser "nächste Tag" zufälligerweise der 1. ist.
                                  Ist das so, befindet man sich aktuell (23:30 Uhr) am letzten des Monats.

                                  metaxa 1 Reply Last reply Reply Quote 1
                                  • metaxa
                                    metaxa @Codierknecht last edited by

                                    @codierknecht sagte in Cronjob am Ende vom Quartal:

                                    dieser "nächste Tag" zufälligerweise der 1. ist.
                                    Ist das so, befindet man sich aktuell (23:30 Uhr) am letzten des Monat

                                    6d5de3cc-da24-43eb-80d3-e059af49037d-image.png
                                    d13cfd60-6770-43fc-98a5-977c82445cb1-image.png

                                    @Codierknecht & @paul53 Lieben Dank, verstanden!! 'SmilyMitVikiBeimGeistesblitz'

                                    1 Reply Last reply Reply Quote 0
                                    • First post
                                      Last post

                                    Support us

                                    ioBroker
                                    Community Adapters
                                    Donate

                                    679
                                    Online

                                    31.9k
                                    Users

                                    80.1k
                                    Topics

                                    1.3m
                                    Posts

                                    4
                                    16
                                    705
                                    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