Feiertagsberechnung - Skript

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

thorkillar
Beiträge: 48
Registriert: 24.01.2017, 16:46

Re: Feiertagsberechnung - Skript

Beitrag von thorkillar » 31.10.2017, 08:36

Guten Morgen,

Danke für eure Hilfe. Also irgendwas mach ich falsch.

Ich habe das Skript nochmal kopiert und in die Werteliste
Folgendes eingetragen

30.10.-02.11.;31.10.;15.11.-31.12.

Die variablen heißen :

Arbeitstag_heute
Arbeitstag_morgen
Urlaubstage

Wenn ich das Skript starte,dann passiert auch was,
und zwar wird der Wert der Arbeitstag Variablen
Wird immer auf false gesetzt. (wenn ich die Variable
Vorher auf true setzte)

Ich habe bei der Variable Urlaubstage auch angeschaut,
Dass kein Leerzeichen am Anfang oder Ende steht (C&P Fehler)

Habt ihr noch Ideen ? Was sein könnte ?
Vielen DANK
Thorkillar

Cash
Beiträge: 1184
Registriert: 09.01.2016, 17:42
Wohnort: Sauerland
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Cash » 31.10.2017, 13:34

Aber dann funktioniert es doch? Wenn beide Variablen vorher auf true sind und danach auf false passt es doch. Denn laut der Werteliste ist sowohl heute als auch Morgen bei Dir Urlaub...

30.10. bis 02.11. Erst am 02.11 wird das Programm die Variable Arbeitstag_morgen wieder auf true setzen.

thorkillar
Beiträge: 48
Registriert: 24.01.2017, 16:46

Re: Feiertagsberechnung - Skript

Beitrag von thorkillar » 01.11.2017, 07:31

Danke!
Wie doof kann man sein.
Funktioniert bestens .

Ich ging von aus, dass der Wert 1 sein muss. ??
Vielen DANK
Thorkillar

Belei
Beiträge: 59
Registriert: 20.07.2016, 21:57

Re: Feiertagsberechnung - Skript

Beitrag von Belei » 27.01.2018, 15:54

Hallo,
ich füge gerade den Feiertagsscript bei mir ein.
Und habe auf der Homematic-Inside Seite folgenden Kommentar gelesen, zu einer kleinen Fehlerbehebung:

Code: Alles auswählen

Hallo Petrus,

dieses Jahr hat mir das Script den Buß- und Bettag auf den 17.11.berechnet. Ursache ist offenbar eine falsche Berechnung des Wochentags vom 24.12. in einem Schaltjahr, das Script hat den Freitag berechnet... Ich habe daher die Berechnung des Wochentags vom 24.12. so um geschrieben:
time t24 = system.Date("%Y").ToInteger()#"-12-24 18:00:00";
time w24 = t24.ToTime();
integer wt24 = w24.Format("%w");
LVar1 = wt24.ToInteger();

Dieser Teil ersetzt alle Zeilen zwischen:
" ! Mit dieser Rechnung kann man zu jedem Datum den Wochentag berechnen."
und
" ! Feiertag ermitteln: 30 Novembertage - (fDiff + Wochentagszahl - 24)"
im unteren Bereich des Scriptes.
Gruß weißnix

Sollte man das machen oder ist das nicht notwendig?

Petrus
Beiträge: 134
Registriert: 13.01.2010, 20:53
Hat sich bedankt: 1 Mal
Danksagung erhalten: 25 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Petrus » 27.01.2018, 17:20

Hallo Belei,

ist korrekt und in einer korrigierten Version 2.3 im ersten Post angefügt.

Btw. Ich überarbeite schon seit einiger Zeit das gesamte Skript. Aufgrund zeitlicher Probleme ist es noch nicht fertig. Sollte aber in Kürze verfügbar sein.
Grund: Im alten Skript werden die Berechnungen der Feiertagsdaten bei jedem Aufruf ausgeführt. Da sich die Daten im Jahr jedoch nicht ändern, wäre eine Berechnung 1x jährlich vollkommen ausreichend. Zudem gibt's noch andere Gründe, Änderungen und Verbesserungen. Also immer mal wieder vorbeischauen.

Gruß
Petrus

sixx1234
Beiträge: 15
Registriert: 03.05.2017, 19:59

Boolean Variable erstellen??

Beitrag von sixx1234 » 11.02.2018, 10:16

Hallo Leute,

Ich versuche zur Zeit folgendes Programm bei mir zum laufen zu bringen :

viewtopic.php?t=4058

Leider stehen die beiden Variablen trotz eines Feiertags immer auf nein, die beiden Variablen sind vom Typ "Logikwert" aber in der Anleitung steht, dass diese vom Typ "boolean" sein müssten. Ist das das selbe oder wie kann ich eine boolean-Variable erstellen?

Ansonsten kann man bei diesem Programm ja eigentlich nichts falsch machen, einfach nur copy&paste...

Danke schön!
Zuletzt geändert von alchy am 13.02.2018, 07:17, insgesamt 1-mal geändert.
Grund: zusammengeführt aus Homematic Allgemein

Xel66
Beiträge: 14148
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 583 Mal
Danksagung erhalten: 1497 Mal

Re: Boolean Variable erstellen??

Beitrag von Xel66 » 11.02.2018, 10:48

Hast Du auch für Rosenmontag die boolsche (=Logik, =Wahrheitswert) Variable aktiviert? Heißen Deine angelegten Variablen wirklich so wie im Script ("Feiertag_heute" und "Feiertag_morgen", ohne die Anführungszeichen) hinterlegt? Bei mir läuft dieses Script in der Version 2.3 seit Jahren problemlos. Am Script kann es eher nicht liegen.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

sixx1234
Beiträge: 15
Registriert: 03.05.2017, 19:59

Re: Boolean Variable erstellen??

Beitrag von sixx1234 » 11.02.2018, 11:19

Vielen Dank für die Antwort,

Variablen vom Typ Logikwert heißen Feiertag_heute (Wahr=Ja und Falsch=Nein) und Feiertag_morgen (auch Wahr=Ja und Falsch= Nein),

Das Script sieht bei mir folgendermaßen aus :

Code: Alles auswählen

 ! Das Skript berechnet das Osterdatum und die Feiertage im aktuellen Jahr,
    ! prueft ob heute und morgen ein Feiertag ist und hinterlegt das Ergebnis in den
    ! Systemvariablen "Feiertag_heute" und "Feiertag_morgen"

    ! Script von Peter Beck (01-2018)
    ! Österreichergänzung von randyp (05-2012)
    ! Version 2.3
    ! Korrektur Berechnung Buß- und Bettag
	
    ! Sachsen eingearbeitet bzw. korrigiert von Matthias Herold (11-2013)
    ! Sachsen hat Buß- und Bettag: hinzugefügt, Saarland nicht: gelöscht

    ! Es werden folgende Systemvariablen benötigt:
    ! Feiertag_heute  (Typ: Boolean)
    ! Feiertag_morgen (Typ: Boolean)

    boolean Rosenmontag = 1; ! Rosenmontag ein Brauchtumstag? 1=Ja/0=Nein
    boolean Silvester   = 1;      ! Silvester stets ein freier Tag? 1=Ja/0=Nein
    boolean Heiligabend = 1;    ! Heiligabend stets ein freier Tag? 1=Ja/0=Nein

    string land  = "DE";      ! AT oder DE
    string bland = "BW";     ! Bundesland in DE, in den wir wohnen (in Österreich auch für bland AT eintragen)

    ! Fuer "bland" bitte folgende Abkuerzungen benutzen:
    ! BW = Baden-Württemberg
    ! BY = Bayern
    ! BE = Berlin
    ! BB = Brandenburg
    ! HB = Bremen
    ! HH = Hamburg
    ! HE = Hessen
    ! MV = Mecklenburg-Vorpommern
    ! NI = Niedersachsen
    ! NW = Nordrhein-Westfalen
    ! RP = Rheinland-Pfalz
    ! SL = Saarland
    ! SN = Sachsen
    ! ST = Sachen-Anhalt
    ! SH = Schleswig-Holstein
    ! TH = Thüringen

    ! AT = Österreich


    !****************************************************
    ! Ab hier Script CODE - Don't change behind this line
    !****************************************************

    ! Berechnen des Ostersonntags im aktuellen Jahr

    integer Jahr = system.Date("%Y").ToInteger(); ! Das aktuelle Jahr ermitteln
    integer oTag;   ! Das Tagesdatum vom Ostersonntag
    integer oMonat; ! Das Monatsdatum von Ostersonntag
    string oDatum;  ! Das komplette Datum vom Ostersonntag

    integer LVar1;  ! Wird für die Berechnungen benötigt
    integer LVar2;  ! Wird für die Berechnungen benötigt
    integer LVar3;  ! Wird für die Berechnungen benötigt
    integer zahl;   ! Wird für die Berechnungen benötigt

    ! Die modifizierte Gauss-Formel nach Lichtenberg

    LVar1 = ((19 * (Jahr % 19)) + (15 + (((3 * (Jahr / 100)) + 3) / 4) - (((8 * (Jahr / 100)) + 13) / 25))) % 30;
    LVar2 = (LVar1 / 29) + (((LVar1 / 28) - (LVar1 / 29)) * ((Jahr % 19) / 11));
    LVar3 = 7 - (((21 + LVar1 - LVar2) - (7 - ((Jahr + (Jahr / 4) + (2 - (((3 * (Jahr / 100)) + 3) / 4))) % 7))) % 7);
    oTag  = (21 + LVar1 - LVar2) + LVar3;

    ! Den errechneten Wert formatieren. Ausgehend vom Monat März

    if (oTag > 31) { ! Der Monat März hat nur 31 Tage -> Ostern im April

        oMonat = 4;
        oTag = oTag - 31;

    } else { oMonat = 3; } ! Ostern ist im März

    ! Das Ergebnis in Variable oDatum hinterlegen

    if (oTag < 10) {
        oDatum = "0" # oTag.ToString() # "." # "0" # oMonat.ToString() # "." # Jahr.ToString();
    } else {
        oDatum = oTag.ToString() # "." # "0" # oMonat.ToString() # "." # Jahr.ToString();
    }

     ! Anzahl der Februartage im aktuellen Jahr => Schaltjahr?
    if ((Jahr % 400) == 0) {zahl=0;} else {if ((Jahr % 100) == 0) {zahl = 1;} else {zahl = Jahr % 4;}}
    if (zahl == 0) { ! Ein Schaltjahr -> Feb. = 29 Tage
        string mTage = "31,29,31,30,31,30,31,31,30,31,30,31"; ! Anzahl der Tage im Monat Jan.-Dez.
    } else {
        string mTage = "31,28,31,30,31,30,31,31,30,31,30,31"; ! Anzahl der Tage im Monat Jan.-Dez.
    }

    string sDatum = system.Date("%d.%m."); ! Das heutige Datum
    integer Durchlauf = 0;

    while (Durchlauf < 2)
    {
        boolean Feiertag = 0; ! 0/1 = kein/Feiertag

        !***************************************************************************
        ! Feste Feiertage bundesweit, fuer DE und AT
        !***************************************************************************

        if (sDatum == "01.01.") { Feiertag = 1; } ! Neujahr
        if (sDatum == "01.05.") { Feiertag = 1; } ! Maifeiertag - Tag der Arbeit
        if (sDatum == "25.12.") { Feiertag = 1; } ! 1. Weihnachtstag
        if (sDatum == "26.12.") { Feiertag = 1; } ! 2. Weihnachtstag

        !***************************************************************************
        ! Feste Feiertage bundesweit in DE
        !***************************************************************************
        if (land == "DE") {
            if (sDatum == "03.10.") { Feiertag = 1; } ! Tag der Deutschen Einheit
        }

        !***************************************************************************
        ! Feste Feiertage bundesweit in AT
        !***************************************************************************
        if (land == "AT") {
            if (sDatum == "26.10.") { Feiertag = 1; } ! Österreichischer Nationalfeiertag
            if (sDatum == "08.12.") { Feiertag = 1; } ! Maria Empfaengnis
        }

        !***************************************************************************
        ! Eigene, feste Feiertage?
        !***************************************************************************

        if ((Heiligabend) && (sDatum == "24.12.")) { Feiertag = 1; } ! Weihnachten
        if ((Silvester) && (sDatum == "31.12."))   { Feiertag = 1; } ! Silvester

        !***************************************************************************
        ! Fester Feiertag in BW, BY, ST, AT
        !***************************************************************************

        if ((bland == "BW") || (bland == "BY") || (bland == "ST") || (land == "AT")) {
            if (sDatum == "06.01.") { Feiertag = 1; } ! Erscheinungsfest - Hl. 3 Koenige
        }

        !***************************************************************************
        ! Fester Feiertag in BB, MV, SA, ST, TH, SN
        !***************************************************************************

        if ((bland == "BB") || (bland == "MV") || (bland == "SA") || (bland == "ST") || (bland == "TH") || (bland == "SN")) {
            if (sDatum == "31.10.") { Feiertag = 1; } ! Reformationstag
        }

        !***************************************************************************
        ! Fester Feiertag in BW, BY, NW, RP, SL, AT
        !***************************************************************************

        if ((bland == "BW") || (bland == "BY") || (bland == "NW") || (bland == "RP") || (bland == "SL") || (land == "AT")) {
            if (sDatum == "01.11.") { Feiertag = 1; } ! Allerheiligen
        }

        !***************************************************************************
        ! Fester Feiertag in BY (nicht überall), SL, AT
        !***************************************************************************

        if ((bland == "BY") || (bland == "SL") || (land == "AT")) {
           if (sDatum == "15.08.") { Feiertag = 1; } ! Maria Himmelfahrt
        }

        !***************************************************************************
        !** Bewegliche Feiertage bundesweit **
        !***************************************************************************

        string feiertage = "";

        if (land == "DE") {
            feiertage = "0,1,-2,39,50"; ! Array mit Differenztage zum Ostersonntag
                                        ! Ostersonntag, Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
        }

        if (land == "AT") {
            feiertage = "0,1,39,50";    ! Array mit Differenztage zum Ostersonntag
                                        ! Ostersonntag, Ostermontag, Christi Himmelfahrt, Pfingstmontag
        }

        !***************************************************************************
        ! Bewegliche Feiertage BW, BY, HE, NW, RP, SL, (SA, TH nicht überall), AT
        !***************************************************************************

        if ((bland == "BW") || (bland == "BY") || (bland == "HE") || (bland == "NW") || (bland == "RP") || (bland == "SL") || (bland == "SA") || (bland == "TH") || (land == "AT")) {
            feiertage = feiertage # ",60"; ! Fronleichnam
        }

        !***************************************************************************
        !***   Hier evtl. weitere Feier-/Brauchtumstage ***
        !***************************************************************************

        if (Rosenmontag) {
            feiertage = feiertage # ",-48"; ! Rosenmontag stets 48 Tage vor dem Ostersonntag
        }

        !***************************************************************************
        ! Ab hier werden die Feiertage berechnet
        !***************************************************************************

        ! Anzahl der Tage im Ostermonat
        zahl = (3 * oMonat) - 3;
        integer oTage = mTage.Substr(zahl, 2).ToInteger(); ! Anzahl der Tage im Ostermonat

        string fDatum;    ! Das Feiertagsdatum
        integer fDiff;    ! Anzahl der Tage von Ostersonntag entfernt
        boolean Schleife; ! Für die Berechnungen in der while-Schleife notwendig

        string index;
        foreach(index, feiertage.Split(",")) {

            fDiff = index.ToInteger();
            Schleife = 1;

            zahl = oTag + fDiff; ! Differenztage zum Referenztag hinzurechnen

            if (fDiff > 0) {
                if (zahl > oTage) {
                    zahl = zahl - oTage; ! Sind wir ausserhalb des Referenzmonats?
                } else { ! Nein => Berechnungschleife nicht durchlaufen.
                   Schleife = 0;
                   LVar2 = oMonat;
                }
            } else {
                if (zahl > 0) { ! Wenn innerhalb des Referenzmonats => Berechnungsschleife nicht durchlaufen.
                    Schleife = 0;
                    LVar2 = oMonat;
                }
            }

            LVar1 = 0;

            if (fDiff > 0) {
                while (Schleife) {
                    LVar1 = LVar1 + 1.00;
                    LVar2 = oMonat + LVar1;
                    LVar3 = (3 * LVar2) - 3;
                    zahl = zahl - mTage.Substr(LVar3, 2).ToInteger();
                    if (zahl <= 0) { ! Aktueller Monat gefunden
                        Schleife = 0;
                        zahl = zahl + mTage.Substr(LVar3, 2).ToInteger(); ! Wieder addieren, um den Tag zu berechnen
                    }
                }
            } else {
                if (fDiff < 0) {
                    while (Schleife) {
                        LVar1 = LVar1 + 1.00;
                        LVar2 = oMonat - LVar1;
                        LVar3 = (3 * LVar2) - 3;
                        zahl = zahl + mTage.Substr(LVar3, 2).ToInteger();
                        if (zahl > 0) { ! Aktueller Monat gefunden
                            Schleife = 0;
                        }
                    }
                }
            }

            if (zahl < 10) {
                fDatum = "0" # zahl.ToString() # ".";
            } else {
                fDatum = zahl.ToString() # ".";
            }

            if (LVar2 < 10) {
                fDatum = fDatum # "0" # LVar2.ToString() # ".";
            } else {
                fDatum = fDatum # LVar2.ToString() # ".";
            }

            if (sDatum == fDatum) { Feiertag = 1; }
        }

        !****************************
        ! Beweglicher Feiertag im SN
        !****************************

        if (bland == "SN") {

            ! Buß- und Bettag (Mittwoch vor dem Sonntag vor dem 1. Advent)
            fDiff = 32; ! 32 Tage vor dem 4. Advent
            LVar1 = (Jahr.ToString()#"-12-24 18:00:00").ToTime().Format("%w").ToInteger();
    
            ! Feiertag ermitteln: 30 Novembertage - (i_fDiff + Wochentagszahl - 24)
            ! Der Monat ist stets der November
            zahl = 30 - (fDiff + LVar1 - 24);
            fDatum = zahl.ToString() # ".11.";

            if (sDatum == fDatum) { Feiertag = 1; }
        }

        if (Durchlauf == 0) {
            dom.GetObject('Feiertag_heute').State(Feiertag);
            Durchlauf = 1;

            ! Datum von morgen für den 2. Durchlauf ermitteln
            s_Datum = (system.Date("%F").ToTime().ToInteger() + 86400).ToTime().Format("%d.%m.");

        } else {
            dom.GetObject('Feiertag_morgen').State(Feiertag);
            Durchlauf = 2;
        }
    }
Land, Bundesland habe ich abgeändert und der Rosenmontag steht auch auf 1
Zuletzt geändert von alchy am 11.02.2018, 11:28, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

Lukas1979
Beiträge: 19
Registriert: 01.04.2017, 11:45

Re: Boolean Variable erstellen??

Beitrag von Lukas1979 » 12.02.2018, 23:50

Hallo,

um dir da auch noch mal ne Antwort drauf zu geben. Ja, Boolean und Logikwert ist das selbe. Der Begriff Boolean bzw. Boolesche-Variable kommt aus der Schaltalgebra. Und heißt in Programmierhochsprachen auch Boolean. Wobei die Vereinbarung in der Regel mit "bool" erfolgt. In der Homematic heißt das Logikwert.

In der Homematic gibt auch den Integer Wert, der eigentlich Float oder Double heißen sollte. Denn eigentlich kann ein Integer keine Kommastelle aufnehmen. Nur mal nebenbei.

Petrus
Beiträge: 134
Registriert: 13.01.2010, 20:53
Hat sich bedankt: 1 Mal
Danksagung erhalten: 25 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Petrus » 01.03.2018, 16:07

Hallo Zusammen,

für den Fall, dass sie noch jemand einsetzt, habe ich die Scripte für "Urlaubstage" und "Feiertage" im 1. Post mal auf den letzten Stand gebracht.
(viewtopic.php?t=4058)

Gruß
Petrus

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“