Feiertagsberechnung - Skript

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

Moderator: Co-Administratoren

Wolf-unterwegs
Beiträge: 5
Registriert: 14.02.2019, 12:03

Re: Feiertagsberechnung - Skript

Beitrag von Wolf-unterwegs » 30.09.2019, 21:40

Wäre schön, wenn du hier etwas finden würdest. Ansonsten muss ich die Feiertage erst umständlich manuell eintragen

Code: Alles auswählen


    boolean Rosenmontag = 0;
    boolean Silvester   = 1;
    boolean Heiligabend = 1;

    string land  = "DE";
    string bland = "BW";


    integer Jahr = system.Date("%Y").ToInteger();
    integer oTag;
    integer oMonat;
    string oDatum;

    integer LVar1;
    integer LVar2;
    integer LVar3;
    integer zahl;


    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;


    if (oTag > 31) {

        oMonat = 4;
        oTag = oTag - 31;

    } else { oMonat = 3; }


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

    if ((Jahr % 400) == 0) {zahl=0;} else {if ((Jahr % 100) == 0) {zahl = 1;} else {zahl = Jahr % 4;}}
    if (zahl == 0) {
        string mTage = "31,29,31,30,31,30,31,31,30,31,30,31";
    } else {
        string mTage = "31,28,31,30,31,30,31,31,30,31,30,31";
    }

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

    while (Durchlauf < 2)
    {
        boolean Feiertag = 0;


        if (sDatum == "01.01.") { Feiertag = 1; }
        if (sDatum == "01.05.") { Feiertag = 1; }
        if (sDatum == "25.12.") { Feiertag = 1; }
        if (sDatum == "26.12.") { Feiertag = 1; }

        if (land == "DE") {
            if (sDatum == "03.10.") { Feiertag = 1; }
        }

        if (land == "AT") {
            if (sDatum == "26.10.") { Feiertag = 1; }
            if (sDatum == "08.12.") { Feiertag = 1; }
        }


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


        if ((bland == "BW") || (bland == "BY") || (bland == "ST") || (land == "AT")) {
            if (sDatum == "06.01.") { Feiertag = 1; }
        }


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


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


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


        string feiertage = "";

        if (land == "DE") {
            feiertage = "0,1,-2,39,50"; 
                                        
        }

        if (land == "AT") {
            feiertage = "0,1,39,50";    
                                        
        }


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


        if (Rosenmontag) {
            feiertage = feiertage # ",-48";
        }

        zahl = (3 * oMonat) - 3;
        integer oTage = mTage.Substr(zahl, 2).ToInteger();


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

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

            zahl = oTag + fDiff;

            if (fDiff > 0) {
                if (zahl > oTage) {
                    zahl = zahl - oTage;
                } else {
                   Schleife = 0;
                   LVar2 = oMonat;
                }
            } else {
                if (zahl > 0) {
                    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) {
                        Schleife = 0;
                        zahl = zahl + mTage.Substr(LVar3, 2).ToInteger();
                    }
                }
            } 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) {
                            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; }
        }


        if (bland == "SN") {

            fDiff = 32;
            LVar1 = (Jahr.ToString()#"-12-24 18:00:00").ToTime().Format("%w").ToInteger();
    

            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;


            sDatum = (system.Date("%F").ToTime().ToInteger() + 86400).ToTime().Format("%d.%m.");

        } else {
            dom.GetObject('Feiertag_morgen').State(Feiertag);
            Durchlauf = 2;
        }
    }
Gruß
Wolfgang

Gluehwurm
Beiträge: 12432
Registriert: 19.03.2014, 00:37
System: in Planung
Hat sich bedankt: 105 Mal
Danksagung erhalten: 380 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Gluehwurm » 30.09.2019, 22:02

Finden tu ich da nix ... da fehlt mir die Ahnung. :wink:

Irgendwie hast Du zu viel an dem Skript rumgemacht, jedenfalls kommt da

Code: Alles auswählen

Error 1 at row 207 col 11 near ^^
Parse following code failed:
Feiertagsliste von S.1 im Editor öffnen, Strg+A, Strg+C und in "Skript testen" Strg+V. Dann Bundesland ändern, vielleicht noch Heiligabend umstellen und auf Ausführen klicken.

Sollte das dann wieder nicht funktionieren, bitte dieses Skript posten.

Wolf-unterwegs
Beiträge: 5
Registriert: 14.02.2019, 12:03

Re: Feiertagsberechnung - Skript

Beitrag von Wolf-unterwegs » 01.10.2019, 12:34

Ich hatte es natürlich zuerst mit dem Original-Skript versucht.
Beim Suchen fand ich dann etwas, dass teilweise Kommentare und/oder Umlaute ein Problem verursacht haben.
Daher das rudimentäre Skript
Das originale war dieses:

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.4
    ! Korrektur Berechnung Buß- und Bettag
    ! Tippfehler einer Variablen korrigiert
	
    ! 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 = 0; ! 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
            sDatum = (system.Date("%F").ToTime().ToInteger() + 86400).ToTime().Format("%d.%m.");

        } else {
            dom.GetObject('Feiertag_morgen').State(Feiertag);
            Durchlauf = 2;
        }
    }

Gluehwurm
Beiträge: 12432
Registriert: 19.03.2014, 00:37
System: in Planung
Hat sich bedankt: 105 Mal
Danksagung erhalten: 380 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Gluehwurm » 01.10.2019, 13:54

Nur wo "Feiertagsliste_V2.2.." drauf steht, ist auch Feiertagsliste... drin. 8)

Sieht so aus, als ob Du nicht das Skript "Feiertagsliste_V2.2.txt" genommen hast, sondern die Geschichte mit der alten "Feiertage_V2.4.txt" versuchst. Das geht so nicht.

@Petrus
Vielleicht lassen sich die alten Versionen deutlicher absetzen. Danke

Wolf-unterwegs
Beiträge: 5
Registriert: 14.02.2019, 12:03

Re: Feiertagsberechnung - Skript

Beitrag von Wolf-unterwegs » 01.10.2019, 18:32

Shame on me - hatte tatsächlich das falsche Skript erwischt :?
Jetzt funktioniert alles wie gewünscht.
Hätte ich die Zeilen direkt darunter etwas genauer gelesen....

Danke euch herzlich für die Hilfe und das weisen auf den rechten Weg :D

Gruß
Wolfgang

pkmax
Beiträge: 3
Registriert: 01.02.2019, 17:31
Hat sich bedankt: 3 Mal

Re: Feiertagsberechnung - Skript

Beitrag von pkmax » 02.11.2019, 11:13

Hallo Zusammen,
Zunächst einmal vielen Dank an Petrus für die beiden Scripte (Feiertag u. Urlaub) und die tolle Arbeit. Bin vor ein paar Tagen darauf gestoßen und habe die Programme mit den Scripten erstellt. Mit den Feiertagen klappt es auch ganz perfekt.
Leider habe ich jedoch Problem mit der Urlaubseingabe und hoffe mir kann da jemand weiterhelfen. Ich bin laut der Beschreibung (1.Post) vorgegangen und habe nach dem "Script testen" (Systemvariablen wurden erstellt), ein Programm, welches das Script aufruft, erstellt. Wenn ich nun das Programm starte (habe nach dem Testlauf die debug Auswertung wieder auf "false" gestellt), bleibt die Urlaubsausgabe leider immer auf "kein Urlaub". Irgendwie stehe ich da leider komplett auf der Leitung.
Vielen Dank im Voraus für Eure Hilfe
Schöne Grüße
Peter


Anbei ein paar Screenshots von meinem Vorgang:
Dateianhänge
01.png
Erstellung System Variablen mittels "Script testen"
02.png
Definition Test Urlaubstag "03.11.2019"
03.png
Sytemvariable 03.11.2019 wurde erstellt
03.png (6.22 KiB) 1713 mal betrachtet
04.png
Status der Systemvariablen; sollte die Variable Urlaub-Morgen mir nicht anzeigen, dass morgen ein Urlaubstag ist?

Benutzeravatar
Meyer11
Beiträge: 88
Registriert: 28.11.2017, 11:32
System: Alternative CCU (auf Basis OCCU)
Wohnort: Ostfriesland
Hat sich bedankt: 12 Mal
Danksagung erhalten: 3 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Meyer11 » 04.11.2019, 10:52

Petrus hat geschrieben:
27.11.2018, 21:12

Code: Alles auswählen

! Setzt Schul- bzw. Arbeitstag-Heute/-Morgen - Edit 02.12.2018

object svObj=dom.GetObject(ID_SYSTEM_VARIABLES); object svObjects; string tag; 
foreach(tag, ("-Heute,-Morgen").Split(",")){
  boolean workday=true; boolean schoolday=true;
  if((svObj.Get("Feiertag"#tag).Value()) || (svObj.Get("Urlaub"#tag).Value()) || (svObj.Get("Wochenende"#tag).Value())){workday=false;}
  if((svObj.Get("Feiertag"#tag).Value()) || (svObj.Get("Schulferien"#tag).Value()) || (svObj.Get("Wochenende"#tag).Value())){schoolday=false;}
  svObjects = svObj.Get("Arbeitstag" # tag); if(svObjects){ svObjects.State(workday); }
  svObjects = svObj.Get("Schultag" # tag); if(svObjects){ svObjects.State(schoolday); }
}
Ich habe mich an den o.g. Script bedient, um die Schul- bzw. Arbeitstage zu setzen.
Angelegt habe ich die Variablen Schultag-Heute; Schultag-Morgen; Arbeitstag-Heute;Arbeitstag-Morgen

Dazu habe ich ein Programm erstellt, welches kurz nach Mitternacht folgende Scripte abarbeitet:
FeiertageProg.jpg
Leider erhalte ich am heuten Montag folgende Werte
Schultag.jpg
Was mache ich falsch ?
Gruß Frank

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 » 12.11.2019, 13:06

pkmax hat geschrieben:
02.11.2019, 11:13
...
Leider habe ich jedoch Problem mit der Urlaubseingabe und hoffe mir kann da jemand weiterhelfen.
...
Hallo Peter,

ich antworte dir leider erst jetzt, da ich keine Hinweismail - das jemand einen neuen Post geschrieben hat - erhalten habe.

Zu deinem Problem: Im 1. Post steht unter ergänzendem Hinweis, dass die Systemvariable Urlaubstage vom Skript als Typ Zeichenkette angelegt wird. Dadurch kannst du deine Urlaubsdaten/-tage in die Systemvariable z.B. nur mit einer App oder per Skript befüllen. Möchtest du die Daten stets über die WebUI einpflegen, dann musst du den Typ der Systemvariablen händisch auf Werteliste ändern.

Gruß
Petrus

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 » 12.11.2019, 13:15

Meyer11 hat geschrieben:
04.11.2019, 10:52
Ich habe mich an den o.g. Script bedient, um die Schul- bzw. Arbeitstage zu setzen.
Ich gehe davon aus, dass du das Skript aus dem 1.Post verwendest. Die Ergänzung erfordert aber, dass du dieses spezielle Urlaubstageskript verwendest. Es werden zudem die Zustände der SVs Wochenende-Heute und Wochenende-Morgen abgefragt. Es wurde so geschrieben, dass es die Existenz dieser SVs voraussetzt.

Wenn du also das "originale" Skript aus dem 1. Post verwendest, dann nutze ergänzend das folgende Skript:

Code: Alles auswählen

! Setzt Schul- bzw. Arbeitstag-Heute/-Morgen - Edit 12.11.2019

object svObj=dom.GetObject(ID_SYSTEM_VARIABLES); object svObjects=null; string tag; string svname; 
foreach(tag, ("-Heute,-Morgen").Split(",")){
  boolean workday=true;
  foreach(svname, ("Feiertag,Urlaub,Wochenende").Split(",")){
    svObjects = svObj.Get(svname # tag); if (svObjects) { if (svObjects.Value()){ workday = false; } }
  }
  boolean schoolday=true;
  foreach(svname, ("Feiertag,Schulferien,Wochenende").Split(",")){
    svObjects = svObj.Get(svname # tag); if (svObjects) { if (svObjects.Value()){ schoolday = false; } }
  }
  svObjects = svObj.Get("Arbeitstag" # tag); if(svObjects){ svObjects.State(workday); }
  svObjects = svObj.Get("Schultag" # tag); if(svObjects){ svObjects.State(schoolday); }
}
Hierdurch werden alle nicht vorhandenen SVs bei der Auswertung ignoriert. Oder ersetze das Urlaubstage-Skript aus dem 1. Post mit dem speziellen Skript (Link).

Gruß
Petrus

pkmax
Beiträge: 3
Registriert: 01.02.2019, 17:31
Hat sich bedankt: 3 Mal

Re: Feiertagsberechnung - Skript

Beitrag von pkmax » 12.11.2019, 17:36

Hallo Petrus,
vielen Dank für deine Antwort. Leider habe ich es trotzdem nicht hinbekommen….
Ich habe die Systemvariable auf Werteliste geändert, jedoch kommt, wenn man das Script ausführt die Antwort: Value Type Wrong!.
Die Systemvariable habe ich wie im Bild geändert.
Nach Programmaufruf hat die Systemvariable dann den Inhalt: „Wert1“.
Ist das überhaupt korrekt, dass ich die Urlaubstage über das Script übergebe, also die Werte dort reinschreibe, wo vorher „Urlaubstage“ drinnengestanden ist (siehe Bild Anhang)?
Kannst du mir bitte weiterhelfen? Vielen Dank im Voraus und LG
Peter
Dateianhänge
sysvar auf werteliste.png
systemvariablen.png
Urlaubstage - ValueTyp wrong.png
sysvar auf werteliste.png

Antworten

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