Feiertagsberechnung - Skript
Moderator: Co-Administratoren
-
- Beiträge: 48
- Registriert: 24.01.2017, 16:46
Re: Feiertagsberechnung - Skript
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 ?
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
Thorkillar
-
- Beiträge: 1184
- Registriert: 09.01.2016, 17:42
- Wohnort: Sauerland
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
Re: Feiertagsberechnung - Skript
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.
30.10. bis 02.11. Erst am 02.11 wird das Programm die Variable Arbeitstag_morgen wieder auf true setzen.
-
- Beiträge: 48
- Registriert: 24.01.2017, 16:46
Re: Feiertagsberechnung - Skript
Danke!
Wie doof kann man sein.
Funktioniert bestens .
Ich ging von aus, dass der Wert 1 sein muss. ??
Wie doof kann man sein.
Funktioniert bestens .
Ich ging von aus, dass der Wert 1 sein muss. ??
Vielen DANK
Thorkillar
Thorkillar
Re: Feiertagsberechnung - Skript
Hallo,
ich füge gerade den Feiertagsscript bei mir ein.
Und habe auf der Homematic-Inside Seite folgenden Kommentar gelesen, zu einer kleinen Fehlerbehebung:
Sollte man das machen oder ist das nicht notwendig?
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?
-
- Beiträge: 134
- Registriert: 13.01.2010, 20:53
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 25 Mal
Re: Feiertagsberechnung - Skript
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
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
Boolean Variable erstellen??
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!
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
Grund: zusammengeführt aus Homematic Allgemein
-
- Beiträge: 14169
- Registriert: 08.05.2013, 23:33
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Nordwürttemberg
- Hat sich bedankt: 586 Mal
- Danksagung erhalten: 1501 Mal
Re: Boolean Variable erstellen??
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
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
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
Re: Boolean Variable erstellen??
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 :
Land, Bundesland habe ich abgeändert und der Rosenmontag steht auch auf 1
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;
}
}
Zuletzt geändert von alchy am 11.02.2018, 11:28, insgesamt 1-mal geändert.
Grund: Code in Codetags posten
Grund: Code in Codetags posten
Re: Boolean Variable erstellen??
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.
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.
-
- Beiträge: 134
- Registriert: 13.01.2010, 20:53
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 25 Mal
Re: Feiertagsberechnung - Skript
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
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