Anzahl der Tage pro Monat in eine Variable ausgeben, inkl. Berücksichtigung von Schaltjahren

Am Anfang eines neuen Jahres sowie eines Monats möchte ich gerne die Anzahl der Tage in jeweils eine separate Variable speichern, eine für das Jahr, eine für den Monat.

Ein möglicher Flow für die Tage/Monat könnte z.B. wie folgt aussehen, allerdings ist der Februar noch nicht berücksichtigt:

Und fürs Jahr, inklusive Berücksichtigung von Schaltjahren, z.B. so:

Theoretisch könnte ich das Ergebnis aus der Jahresberechnung mit in den Monats-Flow einbeziehen und so die Tagesanzahl für den Februar korrekt setzen lassen, aber geht das Ganze nicht irgendwie einfacher?

Für die Ermittlung eines Schaltjahres gibt es übrigens Regeln. Allerdings wüsste ich nicht, wie ich diese Regeln in einem Flow (Berechnung einer Variable) umsetzen könnte:

  • Ist die Jahreszahl durch vier teilbar, aber nicht durch 100, ist es ein Schaltjahr.
  • Ist die Jahreszahl durch 100 teilbar, aber nicht durch 400, ist es kein Schaltjahr.
  • Ist die Jahreszahl durch 400 teilbar, dann ist es ein Schaltjahr.

Hat jemand eine Idee wie man das insgesamt vereinfachen kann? Evtl. mit einem Homey Script? Leider kann ich selber kein Script programmieren… :face_with_hand_over_mouth:

Hab leider keim Homey zum testen aber sollte so klappen:

let date = new Date(); //Akutelles Datum für Jahr/Monat
return new Date(date.getFullYear(), date.getMonth(), 0).getDate(); //Gib die Tage des Monats zurück

Schaltjahr

let date = new Date(); //Akutelles Datum für Jahr

//Der %-Operator gibt den Rest von zwei Zahlen zurück. Damit können wir dann Schaltjahre berechnen
return date.getFullYear() % 400 === 0 || (date.getFullYear() % 100 !== 0 && date.getFullYear() % 4 === 0) ? 366 : 365;

Erst mal vielen Dank!

Das erste Script für die Tage gibt 31 zurück, was ja falsch ist.

Das zweite Script für das Schaltjahr gibt 365 zurück, was, zumindest in den aktuellen Jahr, korrekt ist.

Abgesehen von dem Fehler im ersten Script, wie übergebe ich die Werte in eine Variable?
Habe das folgende Script in den Beispielen gefunden:

/*
 * This script sets a global variable.
 */

global.set('myHomeyScriptVariable', 'Some Value');

Wenn meine Variable für die Anzahl der Tage im Monat TageMonat heißt, wie müsste das Script dann ergänzt werden?
Habe schon rumprobiert, aber ohne Erfolg.

Fehler behoben. Die Monate beginnen bei 0 und nicht bei 1 :smiley: Sollte nun richtig sein.

let date = new Date(); //Akutelles Datum für Jahr/Monat
return new Date(date.getFullYear(), date.getMonth()-1, 0).getDate(); //Gib die Tage des Monats zurück

Entweder mit der Homey-Script Karte die ein Token wieder gibt und dann kannst du alles machen oder direkt via Homey script. Da weiß ich aber aktuell nicht wie man dort eine Variable neu setzt.

Eventuell klappt das so.

let date = new Date(); //Akutelles Datum für Jahr/Monat
global.set('TageMonat', new Date(date.getFullYear(), date.getMonth()-1, 0).getDate());
let date = new Date(); //Akutelles Datum für Jahr

//Der %-Operator gibt den Rest von zwei Zahlen zurück. Damit können wir dann Schaltjahre berechnen
global.set('TageJahr', date.getFullYear() % 400 === 0 || (date.getFullYear() % 100 !== 0 && date.getFullYear() % 4 === 0) ? 366 : 365);

:+1:t3:

Nur mit dem reinenHomey-Script hat’s leider nicht funktioniert, aber wie vorgeschlagen auf diesem Weg, und das würde mir reichen.

Was bedeutet denn dieses MyArg? Ist schon klar “Mein Argument”. Aber was ist ein “Argument” und muss dort was Anderes eingetragen werden? Wenn ja, was?

Du könntest Argumente einreichen z.b. Tokens oder Globale Tokens etc… Dann kannst du damit im Homey Script arbeiten. Es gibt diese Karte auch ohne Argumente. Bei meinen Script braucht man jetzt keine Argumente.

Sobald ich mein Homey hab, kann ich schauen wie ich das hinbekomme mit den Globalen Variablen. (:crossed_fingers: das im Dezember die neuen Homey schon ausgeliefert werden)

1 Like

Damit kannst du dem Script ein Array an Argumenten (ähnlich einer vorbelegten Array Variable) mitliefern, die dann im Script Wiederverwendung finden können.

Ich hab z.B. ein kleines Script, das je nach mitgeliefertem Argument alle meine Geräte die “Weihnacht” im Namen haben an oder ausschaltet.
Ich muss nur zusehen, dass jegliche Weihnachtsbeleuchtung “Weihnacht” im Namen enthält.

Dazu gebe ich in MyArg den string an oder aus mit und das Script macht alles andere eigenständig.

1 Like

Kennen Sie auch diese App? Ist leider (noch) nicht mit dem neuen Homey 2023 kompatibel.
Eine Karte für das Schaltjahr ist verfügbar.
Vielleicht können Sie damit etwas anfangen?

https://homey.app/nl-nl/app/com.cyclone-software.holidays/Vrije-dagen/

1 Like

@spkesDE und @Jarek_J, vielen Dank für Eure Erklärungen. @RonnyW hatte auch schon mal versucht mir in diesem Zusammenhang was zu erklären, aber ich verstehe es einfach nicht, sorry. :pensive:

@Mike1233, vielen Dank für den Hinweis, wusste ich noch nicht. Aber extra eine zusätzliche App nur für das Schaltjahr?
Aber du hast mich auf eine Idee gebracht. Für die Feiertage und Schulferien in Deutschland nutze ich bereits die App IcalCalender mit entsprechenden Kalender-Abos oder iCal Dateien. Bevor ich diesen Thread erstellt hatte, hatte ich bereits nach einem fertigen Kalender gesucht der die Schaltjahre und Tage/Monat beinhaltet, habe aber nichts gefunden.
Da ich für Homey aber auch eigene Kalender nutze, habe ich jetzt in einem dieser Kalender einen Termin zum 01.01.2024 (das ist das nächste Schaltjahr) eingetragen, welcher sich automatisch alle 4 Jahre wiederholt. Da diese eine Ausnahmeregelung Ist die Jahreszahl durch 100 teilbar, aber nicht durch 400, ist es kein Schaltjahr. erst 2100 zutrifft, spielt diese keine Rolle.

So sieht dann der Flow für die Anzahl der Tage/Jahr aus:

@spkesDE, hoffe bist nicht sauer, dass ich jetzt diesen Flow und nicht Dein Script nutze… :see_no_evil:
Falls etwas nicht funktionieren sollte, könnte ich bei diesem Flow selber etwas korrigieren. Beim Script wäre ich wieder auf fremde Hilfe angewiesen. Das Script Tage/Monat werde ich aber nutzen, vielen Dank dafür! :+1:t3:

2 Likes