YAWN – Yet Another anWesenheitssimulatioN

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

Benutzeravatar
splunge
Beiträge: 65
Registriert: 10.04.2013, 22:43

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von splunge » 02.09.2015, 21:02

Korrekt, bei meiner Konfiguration wird CalcActionTimes immer um 6:10 Morgens ausgeführt. Die Zeit kann man natürlich variieren, sie muss nur vor der frühst möglichen Aktion liegen.

Theoretisch kann man CalcActionTimes auch mehrmals aufrufen. Mit jedem Aufruf werden die Aktionszeitpunkte neu festgelegt.
Gleiches ist auch bei einem Neustart der CCU möglich. Eigentlich sogar eine sehr gute Idee!

Gruß
Splunge

Benutzeravatar
Blackeye
Beiträge: 547
Registriert: 15.08.2015, 16:33
Hat sich bedankt: 2 Mal

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von Blackeye » 02.09.2015, 22:47

Ein Lob, ein Lob, mmmmhhhh, ein Lob..

[emoji1] [emoji1] [emoji1] [emoji1] [emoji1] [emoji1] [emoji1]

Gesendet von meinem MI 4W mit Tapatalk

Benutzeravatar
Blackeye
Beiträge: 547
Registriert: 15.08.2015, 16:33
Hat sich bedankt: 2 Mal

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von Blackeye » 04.09.2015, 13:43

Hi,

die Variabel "Lange_Schlafen" wird nicht gesetzt,.... Im Script wird auch ein Fehler angezeigt:

! Das Skript berechnet das Osterdatum und die Feiertage im aktuellen Jahr,
! prueft ob heute ein Feiertag ist und hinterlegt das Ergebnis in der Systemvariable "Feiertag"

! Script von Peter Beck (01-2011)
! Überarbeitet von Splunge (Feiertag_morgen entfernt, Wochenende und Freier_Tag hinzugefügt)
! Version 2.2.2s

! Es werden folgende Systemvariablen benötigt:
! Feiertag (Typ: Boolean)
! Wochenende (Typ: Boolean)
! Freier_Tag (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 = "NW"; ! 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();
}

! Ermitteln, wieviele Tage der Februar im aktuellen Jahr hat

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
string sWochentag = system.Date("%w"); ! der heutige Wochentag

integer Durchlauf = 0;

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

if ((sWochentag == "0") || (sWochentag == "6")) { Wochenende = 1; } ! Wochenende

if ((sWochentag == "5") || (sWochentag == "6")) { kurz_vor_WE = 1; } ! Vor Wochenende

!***************************************************************************
! 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
!***************************************************************************

if ((bland == "BB") || (bland == "MV") || (bland == "SA") || (bland == "ST") || (bland == "TH")) {
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 SL
!****************************

if (bland == "SL") {

! Buß- und Bettag (Mittwoch vor dem Sonntag vor dem 1. Advent)

fDiff = 32; ! 32 Tage vor dem 4. Advent

! Um den 4. Advent zu ermitteln, muss zunächst der Wochentag des 24. Dez. ermittelt werden

! Wochentagberechnung wie folgt:

! TZ = Tag mod 7 => Tag = 24 fuer den 24.12.
! MZ = 5 => 0,3,3,6,1,4,6,2,5,0,3,5 (Fuer jeden Monat Jan. bis Dez. eine Ziffer)
! JZ = (Zahl + (Zahl / 4)) mod 7 => Zahl = 10, die letzten beiden Ziffern der Jahreszahl 2010
! JHZ = (3 - (Zahl mod 4)) * 2 => Zahl = 20, die ersten beiden Ziffern der Jahreszahl 2010
! SJK = Zahl => Schaltjahreskorrektur: Zahl = 0 wenn kein Schaltjahr, sonst Zahl = 6
! Ergebnis = (TZ + MZ + JZ + JHZ + SJK) mod 7 => 0 = So, 1 = Mo, 2 = Di, 3 = Mi, 4 = Do, 5 = Fr, 6 = Sa

! Mit dieser Rechnung kann man zu jedem Datum den Wochentag berechnen.

LVar1 = oDatum.Substr(8, 2).ToInteger();
zahl = (LVar1 + (LVar1 / 4)) % 7;
LVar1 = oDatum.Substr(6, 2).ToInteger();
LVar2 = ((3 - (LVar1 % 4)) * 2) + zahl;
LVar1 = oDatum.Substr(6, 4).ToInteger() % 4;

if (LVar1 == 0) { zahl = 6; } else { zahl = 0; }

LVar1 = ((24 % 7) + 5 + LVar2 + zahl) % 7; ! Ergebnis (LVar1) ist die Wochentagszahl

! Feiertag ermitteln: 30 Novembertage - (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

LVar1 = system.Date("%d").ToInteger() + 1.00; ! Einen Tag weiter --> morgen
index = system.Date("%m");
LVar2 = index.ToInteger();

zahl = (3 * LVar2) - 3;
LVar3 = mTage.Substr(zahl, 2).ToInteger(); ! Anzahl der Tage im aktuellen Monat
if (LVar1 > LVar3) { ! Wenn Monatsgrenze überschritten wurde
sDatum = "01.";
if (LVar2 == 12) {
sDatum = sDatum # "01.";
} else {
LVar2 = LVar2 + 1.00;
if (LVar2 < 10) { sDatum = sDatum # "0" # LVar2.ToString() # "."; } else { sDatum = sDatum # LVar2.ToString() # "."; }
}
} else {
if (LVar1 < 10) { sDatum = "0" # LVar1.ToString() # "." # index # ".";} else { sDatum = LVar1.ToString() # "." # index # "."; }
}
} else {
dom.GetObject('Feiertag_morgen').State(Feiertag);
Durchlauf = 2;
}

!----------------------------------------------------------------------
dom.GetObject('Feiertag').State(Feiertag);
dom.GetObject('Wochenende').State(Wochenende);

if ((Feiertag == 1) || (Wochenende == 1))
{
dom.GetObject('Freier_Tag').State(1);
}
else
{
dom.GetObject('Freier_Tag').State(0);
}



dom.GetObject('kurz_vor_WE').State(kurz_vor_WE);
dom.GetObject('Feiertag_morgen').State(Feiertag);

if ((kurz_vor_WE == 1) || (Feiertag_morgen == 1))
{
dom.GetObject('lange_Schlafen').State(1);
}
else
{
dom.GetObject('lange_Schlafen').State(0);
}


Die Variablen "kurz_vor WE" und "Feiertag_morgen" wurden angelegt

Benutzeravatar
splunge
Beiträge: 65
Registriert: 10.04.2013, 22:43

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von splunge » 04.09.2015, 15:12

Hallo Lars,

lange Codeabschnitte bitte mittels code-Option im Forum posten. Dann bleibt es übersichtlicher.

An welcher Stelle gibt es denn die Fehlermeldung? Vermutlich hier:

Code: Alles auswählen

dom.GetObject('kurz_vor_WE').State(kurz_vor_WE);
dom.GetObject('Feiertag_morgen').State(Feiertag);

if ((kurz_vor_WE == 1) || (Feiertag_morgen == 1))   <==== hier?!?
{
dom.GetObject('lange_Schlafen').State(1);
}
else
{
dom.GetObject('lange_Schlafen').State(0);
}
Die Variable "Feiertag_morgen" ist eine Systemvariable, keine Skriptvariable.
Du musst also in deiner Abfrage Feiertag statt Feiertag_morgen verwenden.

Noch etwas: so wie es aussieht verwendest du bei der Bestimmung von "Freier_Tag" den Feiertag-Wert vom zweiten Durchlauf, also vom nächsten Tag. Du musst den Abschnitt also vor den zweiten Durchlauf verschieben. Danach kann "Feiertag" dann im zweiten Durchlauf überschrieben und für die Bestimmung von "lange_Schlafen" verwendet werden.

Benutzeravatar
Blackeye
Beiträge: 547
Registriert: 15.08.2015, 16:33
Hat sich bedankt: 2 Mal

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von Blackeye » 04.09.2015, 16:13

Hi,

richtig der Fehler ist genau an dieser Stelle. Habe ich dich richtig verstanden, dass ich den Code so anpassen soll:

Code: Alles auswählen

dom.GetObject('kurz_vor_WE').State(kurz_vor_WE);
dom.GetObject('Feiertag_morgen').State(Feiertag_morgen);

if ((kurz_vor_WE == 1) || (Feiertag_morgen == 1))
{
   dom.GetObject('lange_Schlafen').State(1);
}
else
{
   dom.GetObject('lange_Schlafen').State(0);
}
Leider bewehrt er sich immer noch...

Den 2. Teil deiner Antwort verstehe ich leider gar nicht....

Benutzeravatar
splunge
Beiträge: 65
Registriert: 10.04.2013, 22:43

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von splunge » 04.09.2015, 17:51

Hallo, so einfach klappt das leider nicht.

Selbst wenn du "Feiertag_morgen" in deinem Skript als Variable anlegst (mit boolean Feiertag_morgen = 0; weiter oben im Skript) wird zwar der Fehler weg sein, aber die Variable wird nirgendwo im Skript beschrieben.

Lass es auf "Feiertag" stehen und verschiebe den ganzen Block.

Zum Verschieben:
du machst in deinem Skript zwei Durchläufe, einmal für heute und einmal für den nächsten Tag. Such mal nach "! Datum von morgen für den 2. Durchlauf ermitteln"

Das Ende deines Skriptes muss also wie folgt aussehen (ohne Gewähr, da ich es nicht testen konnte):

Code: Alles auswählen

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

		if ((Feiertag == 1) || (Wochenende == 1))
		{
			dom.GetObject('Freier_Tag').State(1);
		}
		else
		{
			dom.GetObject('Freier_Tag').State(0);
		}
		Durchlauf = 1;

		! Datum von morgen für den 2. Durchlauf ermitteln

		LVar1 = system.Date("%d").ToInteger() + 1.00; ! Einen Tag weiter --> morgen
		index = system.Date("%m");
		LVar2 = index.ToInteger();

		zahl = (3 * LVar2) - 3;
		LVar3 = mTage.Substr(zahl, 2).ToInteger(); ! Anzahl der Tage im aktuellen Monat
		if (LVar1 > LVar3) { ! Wenn Monatsgrenze überschritten wurde
			sDatum = "01.";
			if (LVar2 == 12) {
				sDatum = sDatum # "01.";
			} else {
				LVar2 = LVar2 + 1.00;
				if (LVar2 < 10) { sDatum = sDatum # "0" # LVar2.ToString() # "."; } else { sDatum = sDatum # LVar2.ToString() # "."; }
			}
		} else {
			if (LVar1 < 10) { sDatum = "0" # LVar1.ToString() # "." # index # ".";} else { sDatum = LVar1.ToString() # "." # index # "."; }
		}
	} else {
		dom.GetObject('kurz_vor_WE').State(kurz_vor_WE);
		dom.GetObject('Feiertag_morgen').State(Feiertag);

		if ((kurz_vor_WE == 1) || (Feiertag == 1))
		{
		   dom.GetObject('lange_Schlafen').State(1);
		}
		else
		{
		   dom.GetObject('lange_Schlafen').State(0);
		}
		Durchlauf = 2;
	}
}

Benutzeravatar
Blackeye
Beiträge: 547
Registriert: 15.08.2015, 16:33
Hat sich bedankt: 2 Mal

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von Blackeye » 05.09.2015, 19:04

Hi,

jetzt läuft es gar nicht mehr....

Hier ist der momentane Code:

Code: Alles auswählen

! Das Skript berechnet das Osterdatum und die Feiertage im aktuellen Jahr,
! prueft ob heute ein Feiertag ist und hinterlegt das Ergebnis in der Systemvariable "Feiertag"

! Script von Peter Beck (01-2011)
! Überarbeitet von Splunge (Feiertag_morgen entfernt, Wochenende und Freier_Tag hinzugefügt)
! Version 2.2.2s

! Es werden folgende Systemvariablen benötigt:
! Feiertag   (Typ: Boolean)
! Wochenende (Typ: Boolean)
! Freier_Tag (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 = "NW";     ! 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();
}

! Ermitteln, wieviele Tage der Februar im aktuellen Jahr hat

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
string sWochentag = system.Date("%w"); ! der heutige Wochentag

integer Durchlauf = 0;

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


if ((sWochentag == "0") || (sWochentag == "6")) { Wochenende = 1; } ! Wochenende

if ((sWochentag == "5") || (sWochentag == "6")) { kurz_vor_WE = 1; } ! Vor Wochenende

!***************************************************************************
! 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
!***************************************************************************

if ((bland == "BB") || (bland == "MV") || (bland == "SA") || (bland == "ST") || (bland == "TH")) {
   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 SL
!****************************

if (bland == "SL") {

   ! Buß- und Bettag (Mittwoch vor dem Sonntag vor dem 1. Advent)

   fDiff = 32; ! 32 Tage vor dem 4. Advent

   ! Um den 4. Advent zu ermitteln, muss zunächst der Wochentag des 24. Dez. ermittelt werden

   ! Wochentagberechnung wie folgt:

   ! TZ  = Tag mod 7                             => Tag = 24 fuer den 24.12.
   ! MZ = 5                                      => 0,3,3,6,1,4,6,2,5,0,3,5 (Fuer jeden Monat Jan. bis Dez. eine Ziffer)
   ! JZ = (Zahl + (Zahl / 4)) mod 7              => Zahl = 10, die letzten beiden Ziffern der Jahreszahl 2010
   ! JHZ = (3 - (Zahl mod 4)) * 2                => Zahl = 20, die ersten beiden Ziffern der Jahreszahl 2010
   ! SJK = Zahl                                  => Schaltjahreskorrektur: Zahl = 0 wenn kein Schaltjahr, sonst Zahl = 6
   ! Ergebnis = (TZ + MZ + JZ + JHZ + SJK) mod 7 => 0 = So, 1 = Mo, 2 = Di, 3 = Mi, 4 = Do, 5 = Fr, 6 = Sa

   ! Mit dieser Rechnung kann man zu jedem Datum den Wochentag berechnen.

   LVar1 = oDatum.Substr(8, 2).ToInteger();
   zahl  = (LVar1 + (LVar1 / 4)) % 7;
   LVar1 = oDatum.Substr(6, 2).ToInteger();
   LVar2 = ((3 - (LVar1 % 4)) * 2) + zahl;
   LVar1 = oDatum.Substr(6, 4).ToInteger() % 4;

   if (LVar1 == 0) { zahl = 6; } else { zahl = 0; }

   LVar1 = ((24 % 7) + 5 + LVar2 + zahl) % 7; ! Ergebnis (LVar1) ist die Wochentagszahl

   ! Feiertag ermitteln: 30 Novembertage - (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').State(Feiertag);
      dom.GetObject('Wochenende').State(Wochenende);

      if ((Feiertag == 1) || (Wochenende == 1))
      {
         dom.GetObject('Freier_Tag').State(1);
      }
      else
      {
         dom.GetObject('Freier_Tag').State(0);
      }
      Durchlauf = 1;

      ! Datum von morgen für den 2. Durchlauf ermitteln

      LVar1 = system.Date("%d").ToInteger() + 1.00; ! Einen Tag weiter --> morgen
      index = system.Date("%m");
      LVar2 = index.ToInteger();

      zahl = (3 * LVar2) - 3;
      LVar3 = mTage.Substr(zahl, 2).ToInteger(); ! Anzahl der Tage im aktuellen Monat
      if (LVar1 > LVar3) { ! Wenn Monatsgrenze überschritten wurde
         sDatum = "01.";
         if (LVar2 == 12) {
            sDatum = sDatum # "01.";
         } else {
            LVar2 = LVar2 + 1.00;
            if (LVar2 < 10) { sDatum = sDatum # "0" # LVar2.ToString() # "."; } else { sDatum = sDatum # LVar2.ToString() # "."; }
         }
      } else {
         if (LVar1 < 10) { sDatum = "0" # LVar1.ToString() # "." # index # ".";} else { sDatum = LVar1.ToString() # "." # index # "."; }
      }
   } 
else 
{
      dom.GetObject('kurz_vor_WE').State(kurz_vor_WE);
      dom.GetObject('Feiertag_morgen').State(Feiertag);

      if ((kurz_vor_WE == 1) || (Feiertag == 1))
      {
         dom.GetObject('lange_Schlafen').State(1);
      }
      else
      {
         dom.GetObject('lange_Schlafen').State(0);
      }
      Durchlauf = 2;
   }
}

Benutzeravatar
Blackeye
Beiträge: 547
Registriert: 15.08.2015, 16:33
Hat sich bedankt: 2 Mal

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von Blackeye » 05.09.2015, 20:18

Hi,

ich glaube ich habe es jetzt:

Code: Alles auswählen

! Das Skript berechnet das Osterdatum und die Feiertage im aktuellen Jahr,
! prueft ob heute ein Feiertag ist und hinterlegt das Ergebnis in der Systemvariable "Feiertag"

! Script von Peter Beck (01-2011)
! Überarbeitet von Splunge (Feiertag_morgen entfernt, Wochenende und Freier_Tag hinzugefügt)
! Version 2.2.2s

! Es werden folgende Systemvariablen benötigt:
! Feiertag   (Typ: Boolean)
! Wochenende (Typ: Boolean)
! Freier_Tag (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 = "NW";     ! 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();
}

! Ermitteln, wieviele Tage der Februar im aktuellen Jahr hat

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
string sWochentag = system.Date("%w"); ! der heutige Wochentag

boolean Feiertag = 0; ! 0/1 = kein/Feiertag
boolean Wochenende = 0; ! 0/1 = kein/Wochenende
boolean kurz_vor_WE = 0; ! 0/1 = kein/Wochenende
if ((sWochentag == "0") || (sWochentag == "6")) { Wochenende = 1; } ! Wochenende

if ((sWochentag == "5") || (sWochentag == "6")) { kurz_vor_WE = 1; } ! Wochenende

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

    integer Durchlauf = 0;

    while (Durchlauf < 2)
    {


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
!***************************************************************************

if ((bland == "BB") || (bland == "MV") || (bland == "SA") || (bland == "ST") || (bland == "TH")) {
   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 SL
!****************************

if (bland == "SL") {

   ! Buß- und Bettag (Mittwoch vor dem Sonntag vor dem 1. Advent)

   fDiff = 32; ! 32 Tage vor dem 4. Advent

   ! Um den 4. Advent zu ermitteln, muss zunächst der Wochentag des 24. Dez. ermittelt werden

   ! Wochentagberechnung wie folgt:

   ! TZ  = Tag mod 7                             => Tag = 24 fuer den 24.12.
   ! MZ = 5                                      => 0,3,3,6,1,4,6,2,5,0,3,5 (Fuer jeden Monat Jan. bis Dez. eine Ziffer)
   ! JZ = (Zahl + (Zahl / 4)) mod 7              => Zahl = 10, die letzten beiden Ziffern der Jahreszahl 2010
   ! JHZ = (3 - (Zahl mod 4)) * 2                => Zahl = 20, die ersten beiden Ziffern der Jahreszahl 2010
   ! SJK = Zahl                                  => Schaltjahreskorrektur: Zahl = 0 wenn kein Schaltjahr, sonst Zahl = 6
   ! Ergebnis = (TZ + MZ + JZ + JHZ + SJK) mod 7 => 0 = So, 1 = Mo, 2 = Di, 3 = Mi, 4 = Do, 5 = Fr, 6 = Sa

   ! Mit dieser Rechnung kann man zu jedem Datum den Wochentag berechnen.

   LVar1 = oDatum.Substr(8, 2).ToInteger();
   zahl  = (LVar1 + (LVar1 / 4)) % 7;
   LVar1 = oDatum.Substr(6, 2).ToInteger();
   LVar2 = ((3 - (LVar1 % 4)) * 2) + zahl;
   LVar1 = oDatum.Substr(6, 4).ToInteger() % 4;

   if (LVar1 == 0) { zahl = 6; } else { zahl = 0; }

   LVar1 = ((24 % 7) + 5 + LVar2 + zahl) % 7; ! Ergebnis (LVar1) ist die Wochentagszahl

   ! Feiertag ermitteln: 30 Novembertage - (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').State(Feiertag);
            Durchlauf = 1;

            ! Datum von morgen für den 2. Durchlauf ermitteln

            LVar1 = system.Date("%d").ToInteger() + 1.00; ! Einen Tag weiter --> morgen
            index = system.Date("%m");
            LVar2 = index.ToInteger();

            zahl = (3 * LVar2) - 3;
            LVar3 = mTage.Substr(zahl, 2).ToInteger(); ! Anzahl der Tage im aktuellen Monat
            if (LVar1 > LVar3) { ! Wenn Monatsgrenze überschritten wurde
                sDatum = "01.";
                if (LVar2 == 12) {
                    sDatum = sDatum # "01.";
                } else {
                    LVar2 = LVar2 + 1.00;
                    if (LVar2 < 10) { sDatum = sDatum # "0" # LVar2.ToString() # "."; } else { sDatum = sDatum # LVar2.ToString() # "."; }
                }
            } else {
                if (LVar1 < 10) { sDatum = "0" # LVar1.ToString() # "." # index # ".";} else { sDatum = LVar1.ToString() # "." # index # "."; }
            }
        } else {
            dom.GetObject('Feiertag_morgen').State(Feiertag);
            Durchlauf = 2;
        }
    }



dom.GetObject('Feiertag').State(Feiertag);
dom.GetObject('Wochenende').State(Wochenende);

if ((Feiertag == 1) || (Wochenende == 1))

{
   dom.GetObject('Freier_Tag').State(1);
}
else
{
   dom.GetObject('Freier_Tag').State(0);
}

dom.GetObject('kurz_vor_WE').State(kurz_vor_WE);
dom.GetObject('Feiertag_morgen').State(Feiertag);


if ((kurz_vor_WE == 1) || (Feiertag == 1))
{
   dom.GetObject('lange_Schlafen').State(1);
}
else
{
   dom.GetObject('lange_Schlafen').State(0);
}

Danke an ALLE!!!!

Benutzeravatar
Blackeye
Beiträge: 547
Registriert: 15.08.2015, 16:33
Hat sich bedankt: 2 Mal

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von Blackeye » 06.09.2015, 11:16

Hi,

ich nochmal .....

Habe jetzt versucht das "lange_Schlafen" in den Actionsaufruf zu integrieren, leider ohne Erfolg.....

Ich habe die Variable diffiniert und habe mir den Wert geladen....
Die Änderung habe ich erst einmal nur für die Aktion 16 und halt im oberen Bereich gemacht:

Code: Alles auswählen

! #############################################################

! Yet Another anWesenheitssimulatioN (YAWN)

! CalcActionTimes
! V1.1

! by Splunge

! #############################################################

! Beschreibung:
! Festlegung verschiedener Aktionen zu bestimmten Zeitpunkten
! Die Zeitpunkte können fest oder von verschiedenen Sonnenauf-
! bzw. untergangszeiten abhängig sein.
! Die Zeiten können eine Untergrenze (frühestens) oder Obergrenze
! (spätestens) haben
! Die Zeiten können Bedingungen haben (nur wenn vor/nach xx:xx)
! Es kann eine Zufallszeit eingerechnet werden

! Die ermittelten Zeiten werden parallel mit der zugehörigen
! Aktionsnummer in jeweils eine Liste geschrieben.
! Anschließend werden die Listen in chronologischer Reihenfolge
! sortiert.

! Abschließend wird der erste Zeitwert verwendet und der
! CUxD-Timer damit aufgezogen.
! Damit ist dieses Skript beendet.

! Der CUxD-Timer triggert ein weiteres Programm, dass im folgenden
! die jeweils aktuelle Aktionen ausführt und den CUxD-Timer für
! die nächste Aktion aufzieht.

! #############################################################

! Änderungen:
! V1.1:
! Kommentar bzgl. Datentyp von Sekunde_SA_Buergerlich etc. korrigiert.

! #############################################################

! Systemvoraussetzungen:
! - CUxD (V0.58) muss installiert sein (als Geräte müssen SystemExec
!   und Timer eingerichtet sein)
! - modifiziertes Twilight.tcl (V1.5b) muss installiert und aktiv sein
!   (setzt wiederum den daemonizer aus dem LCD_Msg-Addon voraus)
! - zur Bestimmung eines freien Tages (Wochenende oder Feiertag) kann
!   das modifizierte Feiertagsscript (V2.2.2s) auf Basis der Version
!   von Homematic-Inside verwendet werden
! - LogMe.tcl (>= V1.0) muss vorhanden sein, wenn Logging verwendet
!   werden soll

! #############################################################

! Ausführungszeitpunkt des Skriptes:
! um 06:10, da der theoretisch frühest mögliche Zeitpunkt für eine
! Aktion 06:15 ist. Das hat jedoch zur Folge, dass in Wintermonaten,
! in denen der astronomische Sonnenaufgang nach 06:10 liegt
! (ca. 06.12. bis 03.02.), die Sonnenauf- und untergangswerte vom
! Vortag verwendet werden.
! Der Zufallswert sollte dies jedoch überdecken

! #############################################################

! Umgebungsvariablen, die benötigt werden
! 
! lesend:
! "Sekunden_SA_Buergerlich" (Typ Zahl - 0 bis 2147483647)
! "Sekunden_SU_Buergerlich" (Typ Zahl - 0 bis 2147483647)
! "Sekunden_SA_Indoor" ((Typ Zahl - 0 bis 2147483647)
! "Sekunden_SU_Indoor" (Typ Zahl - 0 bis 2147483647)
! "Freier_Tag" (Typ Logikwert)
! "YAWN_LogLevel" (Typ Integer - 0 bis 3)
! 
! schreibend:
! "YAWN_ZeitenListe" (Typ Zeichenkette)
! "YAWN_AktionsListe" (Typ Zeichenkette)

! #############################################################

! Variablendefinition

! Variablen für die Sonnenauf/untergangszeiten
time SA_Buergerlich;   ! Absolute Zeit des bürgerlichen Sonnenaufgangs
time SU_Buergerlich;   ! Absolute Zeit des bürgerlichen Sonnenuntergangs
time SA_Indoor;            ! Absolute Zeit des Indoor Sonnenaufgangs
time SU_Indoor;            ! Absolute Zeit des Indoor Sonnenuntergang

! Variablen für die Zufallszahl
string tmpRand;      ! Hilfsvariable für Zufallszahl (inkl. Modulo für aktuelle Aktion)
integer RAND;         ! Zufallszahl für Vormittag bzw. Nachmittag

! Variablen für die Zeitberechnung
boolean freierTag;
integer tmpStd;               ! Hilsvariable zur Berechnung der Tagessekunden
integer tmpMin;               ! Hilsvariable zur Berechnung der Tagessekunden
integer tmpSek;               ! Hilsvariable zur Berechnung der Tagessekunden
integer tmpStartTime;      ! Startzeitpunkt der aktuellen Aktion in Tagessekungen
integer tmpLowerLimit;   ! Unteres Limit in Tagessekunden
integer tmpUpperLimit;   ! Oberes Limit in Tagessekunden
integer tmpIfBefore;      ! Bedingungenszeitpunkt "wenn vor Zeitpunkt" in Tagessekunden
integer tmpIfAfter;         ! Bedingungszeitpunkt "wenn nach Zeitpunkt" in Tagessekunden
integer tmpJetzt;            ! Enthält den aktuellen Zeitpunkt in Tagessekunden
integer tmpTwilight;      ! Hilfsvariable für Dämmerungszeiten
string actAktion;            ! Aktuell berechnete Aktion
boolean langeSchlafen;		!

! Variablen für das Sortieren
string unsortedTimes = "";      ! unsortierte Werteliste
string unsortedActions = "";   ! unsortierte Aktionsliste
string tmpTimes;                     ! Hilfsliste für die Werte
string tmpActions;                  ! Hilfsliste für die Aktionen
string sepr = ",";                  ! Listentrennzeichen
integer i;                              ! Schleifenindex
integer minIndex;                  ! Index des minimalen Elementes
string actValue;                     ! aktueller Wert der unsortierten Liste
integer minValue;                     ! kleinster gefundener Wert
string sortedTimes = "";         ! sortierte Werteliste
string sortedActions = "";      ! sortierte Aktionsliste

! Variablen für die Timersteuerung
string timerWert;      ! Weckzeit für das erste Ereignis

! Variablen für das Logging
integer LogLevel;         ! Level des Loggings (0 = Nichts, 1 = Aktionen, 2 = Berechnung und Aktionen, 3 = Alles)
string logtext = "Berechne Aktionszeiten... _nl_ ";   ! Logtext

! #############################################################

! Sonnenauf- und untergangszeiten holen
SA_Buergerlich = (dom.GetObject('Sekunden_SA_Buergerlich').State()).ToTime();
SU_Buergerlich = (dom.GetObject('Sekunden_SU_Buergerlich').State()).ToTime();
SA_Indoor = (dom.GetObject('Sekunden_SA_Indoor').State()).ToTime();
SU_Indoor = (dom.GetObject('Sekunden_SU_Indoor').State()).ToTime();

! Information ob freier Tag (Wochenende, Feiertag) holen
freierTag = dom.GetObject('Freier_Tag').State();


! Information ob ich Morgen ausschlafen könnte, wäre ich denn da :-)
langeSchlafen = dom.GetObject('lange_Schlafen').State();


! jetzigen Uhrzeit ermitteln
tmpStd = system.Date("%H").ToInteger();
tmpMin = system.Date("%M").ToInteger();
tmpSek = system.Date("%S").ToInteger();
tmpJetzt = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

! Logging-Status holen
LogLevel = dom.GetObject('YAWN_LogLevel').State();

if (LogLevel >= 2)
{
   tmpStd = SA_Buergerlich.Hour();
   tmpMin = SA_Buergerlich.Minute();
   tmpSek = SA_Buergerlich.Second();
   tmpTwilight = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;
   logtext = logtext # "Sonnenaufgang Bürgerlich: " # tmpTwilight # " - " # SA_Buergerlich.Format("%H:%M:%S") # " _nl_ ";

   tmpStd = SA_Indoor.Hour();
   tmpMin = SA_Indoor.Minute();
   tmpSek = SA_Indoor.Second();
   tmpTwilight = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;
   logtext = logtext # "Sonnenaufgang Indoor: " # tmpTwilight # " - " # SA_Indoor.Format("%H:%M:%S") # " _nl_ ";

   tmpStd = SU_Indoor.Hour();
   tmpMin = SU_Indoor.Minute();
   tmpSek = SU_Indoor.Second();
   tmpTwilight = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;
   logtext = logtext # "Sonnenuntergang Indoor: " # tmpTwilight # " - " # SU_Indoor.Format("%H:%M:%S") # " _nl_ ";
   
   tmpStd = SU_Buergerlich.Hour();
   tmpMin = SU_Buergerlich.Minute();
   tmpSek = SU_Buergerlich.Second();
   tmpTwilight = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;
   logtext = logtext # "Sonnenuntergang Bürgerlich: " # tmpTwilight # " - " # SU_Buergerlich.Format("%H:%M:%S") # " _nl_ ";
}


! #############################################################

! Vormittagsaktionen

! Zufallszahl ermitteln
dom.GetObject("CUxD.CUX2801001:3.CMD_SETS").State("hexdump -d -n 2  /dev/urandom");
dom.GetObject("CUxD.CUX2801001:3.CMD_QUERY_RET").State(1);
string tmpRand = dom.GetObject("CUxD.CUX2801001:3.CMD_RETS").State();
RAND = (tmpRand.Substr(10)).ToInteger();

if (LogLevel >= 2)
{
   logtext = logtext # "Zufallszahl für den Vormittag: " # RAND # " _nl_ ";
}

! *************************************************************
! Aktion 0 - DG Flurlicht hinten und Treppe an
! WT: um 06:15 + Zufall(30min)
! WE: um 07:00 + Zufall(40min)
! *************************************************************
actAktion = "0";
if (freierTag == false)
{
   tmpStd = 6;
   tmpMin = 15;
   tmpSek = 0;
}
else
{
   tmpStd = 7;
   tmpMin = 0;
   tmpSek = 0;
}
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

if (freierTag == false)
{
   tmpStartTime = tmpStartTime + ((RAND % 31)*60);
}
else
{
   tmpStartTime = tmpStartTime + ((RAND % 41)*60);
}

! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
if (tmpStartTime >= tmpJetzt + 10)
{
   if (unsortedTimes.Length() == 0)
   {
      ! beim ersten Element noch kein Listentrennzeichen hinzufügen
      unsortedTimes = tmpStartTime.ToString();
      unsortedActions = actAktion;
   }
   else
   {
      unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
      unsortedActions = unsortedActions # sepr # actAktion;
   }
}

! *************************************************************
! Aktion 1 - Licht Diele, Küche, Wohnzimmer an
! WT: um 07:00, wenn früher als SA_Indoor - 10min, + Zufall(20min)
! WE: um 07:15, wenn früher als SA_Indoor - 10min, + Zufall(40min)
! *************************************************************
actAktion = "1";
if (freierTag == false)
{
   tmpStd = 7;
   tmpMin = 0;
   tmpSek = 0;
}
else
{
   tmpStd = 7;
   tmpMin = 15;
   tmpSek = 0;
}
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStd = SA_Indoor.Hour();
tmpMin = SA_Indoor.Minute();
tmpSek = SA_Indoor.Second();
tmpIfBefore = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpIfBefore = tmpIfBefore - (10 * 60);

if (tmpStartTime < tmpIfBefore)
{
   if (freierTag == false)
   {
      tmpStartTime = tmpStartTime + ((RAND % 21)*60);
   }
   else
   {
      tmpStartTime = tmpStartTime + ((RAND % 41)*60);
   }
   
   ! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
   if (tmpStartTime >= tmpJetzt + 10)
   {
      if (unsortedTimes.Length() == 0)
      {
         ! beim ersten Element noch kein Listentrennzeichen hinzufügen
         unsortedTimes = tmpStartTime.ToString();
         unsortedActions = actAktion;
      }
      else
      {
         unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
         unsortedActions = unsortedActions # sepr # actAktion;
      }
   }
}

! *************************************************************
! Aktion 2 - EG Rollläden hoch
! WT: um SA_Buergerlich - 10min, frühestens um 07:00, spätestens um 07:45, + Zufall(20min)
! WE: um SA_Buergerlich - 20min, frühestens um 07:15, spätestens um 08:30, + Zufall(40min)
! *************************************************************
actAktion = "2";
tmpStd = SA_Buergerlich.Hour();
tmpMin = SA_Buergerlich.Minute();
tmpSek = SA_Buergerlich.Second();
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

if (freierTag == false)
{
   tmpStartTime = tmpStartTime - (10 * 60);
   
   tmpStd = 7;
   tmpMin = 0;
   tmpSek = 0;
   tmpLowerLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;
   
   tmpStd = 7;
   tmpMin = 45;
   tmpSek = 0;
   tmpUpperLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;
}
else
{
   tmpStartTime = tmpStartTime - (20 * 60);
   
   tmpStd = 7;
   tmpMin = 15;
   tmpSek = 0;
   tmpLowerLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;
   
   tmpStd = 8;
   tmpMin = 30;
   tmpSek = 0;
   tmpUpperLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;   
}
if (tmpStartTime < tmpLowerLimit)
{
   tmpStartTime = tmpLowerLimit;
}
else
{
   if (tmpStartTime > tmpUpperLimit)
   {
      tmpStartTime = tmpUpperLimit;
   }
}

if (freierTag == false)
{
   tmpStartTime = tmpStartTime + ((RAND % 21)*60);
}
else
{
   tmpStartTime = tmpStartTime + ((RAND % 41)*60);
}

! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
if (tmpStartTime >= tmpJetzt + 10)
{
   if (unsortedTimes.Length() == 0)
   {
      ! beim ersten Element noch kein Listentrennzeichen hinzufügen
      unsortedTimes = tmpStartTime.ToString();
      unsortedActions = actAktion;
   }
   else
   {
      unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
      unsortedActions = unsortedActions # sepr # actAktion;
   }
}

! *************************************************************
! Aktion 3 - DG Rollläden hoch, DG Flurlicht hinten und Treppe aus
! WT: um 07:15 + Zufall(40min)
! WE: um 08:00 + Zufall(60min)
! *************************************************************   
actAktion = "3";
if (freierTag == false)
{
   tmpStd = 7;
   tmpMin = 15;
   tmpSek = 0;
}
else
{
   tmpStd = 8;
   tmpMin = 0;
   tmpSek = 0;
}
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

if (freierTag == false)
{
   tmpStartTime = tmpStartTime + ((RAND % 41)*60);
}
else
{
   tmpStartTime = tmpStartTime + ((RAND % 61)*60);
}

! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
if (tmpStartTime >= tmpJetzt + 10)
{
   if (unsortedTimes.Length() == 0)
   {
      ! beim ersten Element noch kein Listentrennzeichen hinzufügen
      unsortedTimes = tmpStartTime.ToString();
      unsortedActions = actAktion;
   }
   else
   {
      unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
      unsortedActions = unsortedActions # sepr # actAktion;
   }
}

! *************************************************************
! Aktion 4 - Licht Diele, Küche, Wohnzimmer aus
! WT: um SA_Indoor - 10min, wenn später als 07:00, + Zufall(20min)
! WE: um SA_Indoor - 20min, wenn später als 07:15, + Zufall(40min)
! *************************************************************
actAktion = "4";
tmpStd = SA_Indoor.Hour();
tmpMin = SA_Indoor.Minute();
tmpSek = SA_Indoor.Second();
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

if (freierTag == false)
{
   tmpStd = 7;
   tmpMin = 0;
   tmpSek = 0;
}
else
{
   tmpStd = 7;
   tmpMin = 15;
   tmpSek = 0;
}
tmpIfAfter = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

if (tmpStartTime > tmpIfAfter)
{
   if (freierTag == false)
   {
      tmpStartTime = tmpStartTime - (10 * 60) + ((RAND % 21)*60);
   }
   else
   {
      tmpStartTime = tmpStartTime - (20 * 60) + ((RAND % 41)*60);
   }
   
   ! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
   if (tmpStartTime >= tmpJetzt + 10)
   {
      if (unsortedTimes.Length() == 0)
      {
         ! beim ersten Element noch kein Listentrennzeichen hinzufügen
         unsortedTimes = tmpStartTime.ToString();
         unsortedActions = actAktion;
      }
      else
      {
         unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
         unsortedActions = unsortedActions # sepr # actAktion;
      }
   }
}

! #############################################################

! Nachmittagsaktionen

! Zufallszahl neu ermitteln
dom.GetObject("CUxD.CUX2801001:3.CMD_SETS").State("hexdump -d -n 2  /dev/urandom");
dom.GetObject("CUxD.CUX2801001:3.CMD_QUERY_RET").State(1);
string tmpRand = dom.GetObject("CUxD.CUX2801001:3.CMD_RETS").State();
RAND = (tmpRand.Substr(10)).ToInteger();

if (LogLevel >= 2)
{
   logtext = logtext # "Zufallszahl für den Nachmittag: " # RAND # " _nl_ ";
}

! *************************************************************
! Aktion 5 - Licht Diele und DG Flurlicht hinten und Treppe an
! WT & WE: um SU_Indoor - 10min, wenn früher als 19:30, + Zufall(20min)
! *************************************************************
actAktion = "5";
tmpStd = SU_Indoor.Hour();
tmpMin = SU_Indoor.Minute();
tmpSek = SU_Indoor.Second();
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStartTime = tmpStartTime - (10 * 60);

tmpStd = 19;
tmpMin = 30;
tmpSek = 0;
tmpIfBefore = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

if (tmpStartTime < tmpIfBefore)
{
   tmpStartTime = tmpStartTime + ((RAND % 21)*60);
   
   ! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
   if (tmpStartTime >= tmpJetzt + 10)
   {
      if (unsortedTimes.Length() == 0)
      {
         ! beim ersten Element noch kein Listentrennzeichen hinzufügen
         unsortedTimes = tmpStartTime.ToString();
         unsortedActions = actAktion;
      }
      else
      {
         unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
         unsortedActions = unsortedActions # sepr # actAktion;
      }
   }
}

! *************************************************************
! Aktion 6 - Licht Wohnzimmer an
! WT & WE: um SU_Indoor - 10min, spätestens um 21:40, + Zufall(20min)
! *************************************************************
actAktion = "6";
tmpStd = SU_Indoor.Hour();
tmpMin = SU_Indoor.Minute();
tmpSek = SU_Indoor.Second();
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStartTime = tmpStartTime - (10 * 60);

tmpStd = 21;
tmpMin = 40;
tmpSek = 0;
tmpUpperLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

if (tmpStartTime > tmpUpperLimit)
{
   tmpStartTime = tmpUpperLimit;
}

tmpStartTime = tmpStartTime + ((RAND % 21)*60);

! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
if (tmpStartTime >= tmpJetzt + 10)
{
   if (unsortedTimes.Length() == 0)
   {
      ! beim ersten Element noch kein Listentrennzeichen hinzufügen
      unsortedTimes = tmpStartTime.ToString();
      unsortedActions = actAktion;
   }
   else
   {
      unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
      unsortedActions = unsortedActions # sepr # actAktion;
   }
}

! *************************************************************
! Aktion 7 - Licht Küche an
! WT & WE: um SU_Indoor - 10min, wenn früher als 20:30, + Zufall(20min)
! *************************************************************
actAktion = "7";
tmpStd = SU_Indoor.Hour();
tmpMin = SU_Indoor.Minute();
tmpSek = SU_Indoor.Second();
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStartTime = tmpStartTime - (10 * 60);

tmpStd = 20;
tmpMin = 30;
tmpSek = 0;
tmpIfBefore = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

if (tmpStartTime < tmpIfBefore)
{
   tmpStartTime = tmpStartTime + ((RAND % 21)*60);
   
   ! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
   if (tmpStartTime >= tmpJetzt + 10)
   {
      if (unsortedTimes.Length() == 0)
      {
         ! beim ersten Element noch kein Listentrennzeichen hinzufügen
         unsortedTimes = tmpStartTime.ToString();
         unsortedActions = actAktion;
      }
      else
      {
         unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
         unsortedActions = unsortedActions # sepr # actAktion;
      }
   }
}

! *************************************************************
! Aktion 8 - Rollläden Kinder runter
! WT & WE: um SU_Buergerlich - 15min, frühestens um 17:30, spätestens um 19:30, + Zufall(30min)
! *************************************************************
actAktion = "8";
tmpStd = SU_Buergerlich.Hour();
tmpMin = SU_Buergerlich.Minute();
tmpSek = SU_Buergerlich.Second();
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStartTime = tmpStartTime - (15 * 60);

tmpStd = 17;
tmpMin = 30;
tmpSek = 0;
tmpLowerLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStd = 19;
tmpMin = 30;
tmpSek = 0;
tmpUpperLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

if (tmpStartTime < tmpLowerLimit)
{
   tmpStartTime = tmpLowerLimit;
}
else
{
   if (tmpStartTime > tmpUpperLimit)
   {
      tmpStartTime = tmpUpperLimit;
   }
}

tmpStartTime = tmpStartTime + ((RAND % 31)*60);

! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
if (tmpStartTime >= tmpJetzt + 10)
{
   if (unsortedTimes.Length() == 0)
   {
      ! beim ersten Element noch kein Listentrennzeichen hinzufügen
      unsortedTimes = tmpStartTime.ToString();
      unsortedActions = actAktion;
   }
   else
   {
      unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
      unsortedActions = unsortedActions # sepr # actAktion;
   }
}

! *************************************************************
! Aktion 9 - Rollläden Schlafzimmer und Bad runter
! WT & WE: um SU_Buergerlich - 15min, frühestens um 17:30, spätestens um 21:30, + Zufall(30min)
! *************************************************************
actAktion = "9";
tmpStd = SU_Buergerlich.Hour();
tmpMin = SU_Buergerlich.Minute();
tmpSek = SU_Buergerlich.Second();
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStartTime = tmpStartTime - (15 * 60);

tmpStd = 17;
tmpMin = 30;
tmpSek = 0;
tmpLowerLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStd = 21;
tmpMin = 30;
tmpSek = 0;
tmpUpperLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

if (tmpStartTime < tmpLowerLimit)
{
   tmpStartTime = tmpLowerLimit;
}
else
{
   if (tmpStartTime > tmpUpperLimit)
   {
      tmpStartTime = tmpUpperLimit;
   }
}

tmpStartTime = tmpStartTime + ((RAND % 31)*60);

! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
if (tmpStartTime >= tmpJetzt + 10)
{
   if (unsortedTimes.Length() == 0)
   {
      ! beim ersten Element noch kein Listentrennzeichen hinzufügen
      unsortedTimes = tmpStartTime.ToString();
      unsortedActions = actAktion;
   }
   else
   {
      unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
      unsortedActions = unsortedActions # sepr # actAktion;
   }
}

! *************************************************************
! Aktion 10 - EG Rollläden runter
! WT & WE: um SU_Buergerlich - 10min, frühestens um 17:30, spätestens um 21:45, + Zufall(30min)
! *************************************************************
actAktion = "10";
tmpStd = SU_Buergerlich.Hour();
tmpMin = SU_Buergerlich.Minute();
tmpSek = SU_Buergerlich.Second();
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStartTime = tmpStartTime - (10 * 60);

tmpStd = 17;
tmpMin = 30;
tmpSek = 0;
tmpLowerLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStd = 21;
tmpMin = 45;
tmpSek = 0;
tmpUpperLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

if (tmpStartTime < tmpLowerLimit)
{
   tmpStartTime = tmpLowerLimit;
}
else
{
   if (tmpStartTime > tmpUpperLimit)
   {
      tmpStartTime = tmpUpperLimit;
   }
}

tmpStartTime = tmpStartTime + ((RAND % 31)*60);

! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
if (tmpStartTime >= tmpJetzt + 10)
{
   if (unsortedTimes.Length() == 0)
   {
      ! beim ersten Element noch kein Listentrennzeichen hinzufügen
      unsortedTimes = tmpStartTime.ToString();
      unsortedActions = actAktion;
   }
   else
   {
      unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
      unsortedActions = unsortedActions # sepr # actAktion;
   }
}

! *************************************************************
! Aktion 11 - Licht Diele, DG Flurlicht hinten und Treppe aus
! WT & WE: um 19:30, wenn später als SU_Indoor - 10min, + Zufall(20min)
! *************************************************************
actAktion = "11";
tmpStd = 19;
tmpMin = 30;
tmpSek = 0;
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStd = SU_Indoor.Hour();
tmpMin = SU_Indoor.Minute();
tmpSek = SU_Indoor.Second();
tmpIfAfter = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpIfAfter = tmpIfAfter - (10 * 60);

if (tmpStartTime > tmpIfAfter)
{
   tmpStartTime = tmpStartTime + ((RAND % 21)*60);
   
   ! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
   if (tmpStartTime >= tmpJetzt + 10)
   {
      if (unsortedTimes.Length() == 0)
      {
         ! beim ersten Element noch kein Listentrennzeichen hinzufügen
         unsortedTimes = tmpStartTime.ToString();
         unsortedActions = actAktion;
      }
      else
      {
         unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
         unsortedActions = unsortedActions # sepr # actAktion;
      }
   }
}

! *************************************************************
! Aktion 12 - DG Flurlicht vorne an
! WT & WE: um SU_Indoor - 10min, frühestens um 19:30, spätestens um 20:30, + Zufall(30min)
! *************************************************************
actAktion = "12";
tmpStd = SU_Indoor.Hour();
tmpMin = SU_Indoor.Minute();
tmpSek = SU_Indoor.Second();
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStartTime = tmpStartTime - (10 * 60);

tmpStd = 19;
tmpMin = 30;
tmpSek = 0;
tmpLowerLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStd = 20;
tmpMin = 30;
tmpSek = 0;
tmpUpperLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

if (tmpStartTime < tmpLowerLimit)
{
   tmpStartTime = tmpLowerLimit;
}
else
{
   if (tmpStartTime > tmpUpperLimit)
   {
      tmpStartTime = tmpUpperLimit;
   }
}

tmpStartTime = tmpStartTime + ((RAND % 31)*60);

! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
if (tmpStartTime >= tmpJetzt + 10)
{
   if (unsortedTimes.Length() == 0)
   {
      ! beim ersten Element noch kein Listentrennzeichen hinzufügen
      unsortedTimes = tmpStartTime.ToString();
      unsortedActions = actAktion;
   }
   else
   {
      unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
      unsortedActions = unsortedActions # sepr # actAktion;
   }
}

! *************************************************************
! Aktion 13 - Licht Küche aus
! WT & WE: um 20:30, wenn später als SU_Indoor - 10min, + Zufall(20min)
! *************************************************************
actAktion = "13";
tmpStd = 20;
tmpMin = 30;
tmpSek = 0;
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStd = SU_Indoor.Hour();
tmpMin = SU_Indoor.Minute();
tmpSek = SU_Indoor.Second();
tmpIfAfter = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpIfAfter = tmpIfAfter - (10 * 60);

if (tmpStartTime > tmpIfAfter)
{
   tmpStartTime = tmpStartTime + ((RAND % 21)*60);
   
   ! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
   if (tmpStartTime >= tmpJetzt + 10)
   {
      if (unsortedTimes.Length() == 0)
      {
         ! beim ersten Element noch kein Listentrennzeichen hinzufügen
         unsortedTimes = tmpStartTime.ToString();
         unsortedActions = actAktion;
      }
      else
      {
         unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
         unsortedActions = unsortedActions # sepr # actAktion;
      }
   }
}

! *************************************************************
! Aktion 14 - Licht Arbeitszimmer an
! WT & WE: um SU_Indoor - 10min, frühestens um 18:00, spätestens um 21:10, + Zufall(30min)
! *************************************************************
actAktion = "14";
tmpStd = SU_Indoor.Hour();
tmpMin = SU_Indoor.Minute();
tmpSek = SU_Indoor.Second();
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStartTime = tmpStartTime - (10 * 60);

tmpStd = 18;
tmpMin = 0;
tmpSek = 0;
tmpLowerLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStd = 21;
tmpMin = 10;
tmpSek = 0;
tmpUpperLimit = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

if (tmpStartTime < tmpLowerLimit)
{
   tmpStartTime = tmpLowerLimit;
}
else
{
   if (tmpStartTime > tmpUpperLimit)
   {
      tmpStartTime = tmpUpperLimit;
   }
}

tmpStartTime = tmpStartTime + ((RAND % 31)*60);

! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
if (tmpStartTime >= tmpJetzt + 10)
{
   if (unsortedTimes.Length() == 0)
   {
      ! beim ersten Element noch kein Listentrennzeichen hinzufügen
      unsortedTimes = tmpStartTime.ToString();
      unsortedActions = actAktion;
   }
   else
   {
      unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
      unsortedActions = unsortedActions # sepr # actAktion;
   }
}

! *************************************************************
! Aktion 15 - DG FLurlicht vorne aus
! WT & WE: um 21:30 + Zufall(30min)
! *************************************************************
actAktion = "15";
tmpStd = 21;
tmpMin = 30;
tmpSek = 0;
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStartTime = tmpStartTime + ((RAND % 31)*60);

! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
if (tmpStartTime >= tmpJetzt + 10)
{
   if (unsortedTimes.Length() == 0)
   {
      ! beim ersten Element noch kein Listentrennzeichen hinzufügen
      unsortedTimes = tmpStartTime.ToString();
      unsortedActions = actAktion;
   }
   else
   {
      unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
      unsortedActions = unsortedActions # sepr # actAktion;
   }
}

! *************************************************************
! Aktion 16 - Licht Wohnzimmer aus
! WT & WE: um 22:00 + Zufall(90min)
! *************************************************************
actAktion = "16";

if (langeSchlafen == false)

{
   tmpStd = 22;
   tmpMin = 0;
   tmpSek = 0;
}
else
{
tmpStd = 23;
tmpMin = 10;
tmpSek = 0;
}

tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStartTime = tmpStartTime + ((RAND % 91)*60);

! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
if (tmpStartTime >= tmpJetzt + 10)
{
   if (unsortedTimes.Length() == 0)
   {
      ! beim ersten Element noch kein Listentrennzeichen hinzufügen
      unsortedTimes = tmpStartTime.ToString();
      unsortedActions = actAktion;
   }
   else
   {
      unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
      unsortedActions = unsortedActions # sepr # actAktion;
   }
}

! *************************************************************
! Aktion 17 - Licht Arbeitszimmer aus
! WT & WE: um 22:00 + Zufall(100min)
! *************************************************************
actAktion = "17";
tmpStd = 22;
tmpMin = 0;
tmpSek = 0;
tmpStartTime = (tmpStd * 3600) + (tmpMin * 60) + tmpSek;

tmpStartTime = tmpStartTime + ((RAND % 101)*60);

! Aktion nur hinzufügen, wenn sie frühestens in 10 Sekunden stattfindet
if (tmpStartTime >= tmpJetzt + 10)
{
   if (unsortedTimes.Length() == 0)
   {
      ! beim ersten Element noch kein Listentrennzeichen hinzufügen
      unsortedTimes = tmpStartTime.ToString();
      unsortedActions = actAktion;
   }
   else
   {
      unsortedTimes = unsortedTimes # sepr # tmpStartTime.ToString();
      unsortedActions = unsortedActions # sepr # actAktion;
   }
}

! ##############################################################

! Zeiten und Aktionen chronologisch (aufsteigend) sortieren

while (unsortedTimes.Length() > 0)
{
   ! Suchhilfen initialisieren
   minValue = 2147483647;   ! Integer-Maximalwert
   minIndex = 0;
   i = 0;
   ! Werteliste durchlaufen und aktuellen Listenwert ermitteln
   foreach(actValue,unsortedTimes.Split(sepr))
   {
      ! Ist der aktuelle Listenwert kleiner als der aktuelle Minimalwert?
      if (actValue.ToInteger() < minValue)
      {
         ! dann Wert und Index zwischenspeichern
         minValue = actValue.ToInteger();
         minIndex = i;
      }
    i = i + 1;
   }
   
   ! Nach Durchlaufen der Werteliste, das Ergebnis wegschreiben und die zu sortierende Werteliste aktualisieren
   
   ! Ergebnis wegschreiben
   if (sortedTimes.Length() == 0)
   {
      ! beim ersten Element noch kein Listentrennzeichen hinzufügen
      sortedTimes = minValue.ToString();
      sortedActions = unsortedActions.StrValueByIndex(sepr,minIndex);
   }
   else
   {
      sortedTimes = sortedTimes # sepr # minValue.ToString();
      sortedActions = sortedActions # sepr # unsortedActions.StrValueByIndex(sepr,minIndex);
   }
   
   ! unsortierte Werteliste um gefundenen Minimalwert reduzieren, indem zunächst alle Elemente ausser dem Minimalelement in eine Hilfsliste kopiert werden.
   ! Anschließend wird die Hilfsliste in die zu sortierende Liste umkopiert.
   
   ! Hilfsvariablen initialisieren
   tmpTimes = "";
   tmpActions = "";
   i = 0;
   foreach(actValue,unsortedTimes.Split(sepr))
   {
      ! Wenn der aktuelle Index nicht dem des Minimalwertes entspricht, dann übernehmen
      if (i != minIndex)
      {
         if (tmpTimes.Length() == 0)
         {
            ! beim ersten Element noch kein Listentrennzeichen hinzufügen
            tmpTimes = actValue;
            tmpActions = unsortedActions.StrValueByIndex(sepr,i);
         }
         else
         {
            tmpTimes = tmpTimes # sepr # actValue;
            tmpActions = tmpActions # sepr # unsortedActions.StrValueByIndex(sepr,i);
         }
      }
    i = i + 1;
   }
   ! neue zu sortierende Liste aus Hilfsliste übernehmen
  unsortedTimes = tmpTimes;
   unsortedActions = tmpActions;
}

dom.GetObject('YAWN_ZeitenListe').State(sortedTimes);
dom.GetObject('YAWN_AktionsListe').State(sortedActions);

if (LogLevel >= 2)
{
   logtext = logtext # "Aktionszeiten: " # sortedTimes # " _nl_ ";
   logtext = logtext # "Aktionenliste: " # sortedActions # " _nl_ ";
}

! ##############################################################

! Timer für erste Aktion aufziehen
tmpStartTime = (sortedTimes.StrValueByIndex(sepr,0)).ToInteger();

tmpStd = tmpStartTime/3600;
tmpMin = (tmpStartTime%3600)/60;
tmpSek = tmpStartTime%60;

timerWert = tmpStd.ToString() # ":" # tmpMin.ToString() # ":" # tmpSek.ToString();

dom.GetObject("CUxD.CUX2800002:1.TIMER_SET").State(timerWert);
if (LogLevel >= 3)
{
   logtext = logtext # "Timer aufgezogen auf: " # timerWert # " _nl_ ";
}

! ##############################################################

! Logfile wegschreiben
if (LogLevel >= 2)
{
   dom.GetObject("CUxD.CUX2801001:3.CMD_EXEC").State("/usr/local/addons/TCL/LogMe.tcl YAWN 1 "# logtext);
}

! ##############################################################

! Fertig! Ab jetzt wird ein separates Programm zum Schalten
! der Aktoren per CUxD-Timer getriggert

! ########################################################

Benutzeravatar
splunge
Beiträge: 65
Registriert: 10.04.2013, 22:43

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von splunge » 07.09.2015, 20:58

Hallo Lars,

nach einem ereignisreichen Wochenende komme ich nun mal wieder dazu, dir zu helfen.

Aber der Reihe nach...
Dein Freier_Tag-Skript wird so auch weiterhin nicht funktionieren, da du die while-Schleife zu früh zumachst. Irgendwo müsste auch eine "}" zu viel sein. Hat die Syntaxprüfung denn nicht gemeckert?
Hier jedenfalls nochmal das komplette Skript in aktueller Form:

Code: Alles auswählen

! Das Skript berechnet das Osterdatum und die Feiertage im aktuellen Jahr,
! prueft ob heute ein Feiertag ist und hinterlegt das Ergebnis in der Systemvariable "Feiertag"

! Script von Peter Beck (01-2011)
! Überarbeitet von Splunge (Feiertag_morgen entfernt, Wochenende und Freier_Tag hinzugefügt)
! Version 2.2.2s

! Es werden folgende Systemvariablen benötigt:
! Feiertag   (Typ: Boolean)
! Wochenende (Typ: Boolean)
! Freier_Tag (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 = "NW";     ! 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();
}

! Ermitteln, wieviele Tage der Februar im aktuellen Jahr hat

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
string sWochentag = system.Date("%w"); ! der heutige Wochentag

integer Durchlauf = 0;

while (Durchlauf < 2)
{

	boolean Feiertag = 0; ! 0/1 = kein/Feiertag
	boolean Wochenende = 0; ! 0/1 = kein/Wochenende
	boolean kurz_vor_WE = 0; ! 0/1 = kein/Ausschlafen

	if ((sWochentag == "0") || (sWochentag == "6")) { Wochenende = 1; } ! Wochenende
	if ((sWochentag == "5") || (sWochentag == "6")) { kurz_vor_WE = 1; } ! Vor Wochenende

	!***************************************************************************
	! 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
	!***************************************************************************

	if ((bland == "BB") || (bland == "MV") || (bland == "SA") || (bland == "ST") || (bland == "TH")) {
		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 SL
	!****************************

	if (bland == "SL") {

		! Buß- und Bettag (Mittwoch vor dem Sonntag vor dem 1. Advent)

		fDiff = 32; ! 32 Tage vor dem 4. Advent

		! Um den 4. Advent zu ermitteln, muss zunächst der Wochentag des 24. Dez. ermittelt werden

		! Wochentagberechnung wie folgt:

		! TZ  = Tag mod 7                             => Tag = 24 fuer den 24.12.
		! MZ = 5                                      => 0,3,3,6,1,4,6,2,5,0,3,5 (Fuer jeden Monat Jan. bis Dez. eine Ziffer)
		! JZ = (Zahl + (Zahl / 4)) mod 7              => Zahl = 10, die letzten beiden Ziffern der Jahreszahl 2010
		! JHZ = (3 - (Zahl mod 4)) * 2                => Zahl = 20, die ersten beiden Ziffern der Jahreszahl 2010
		! SJK = Zahl                                  => Schaltjahreskorrektur: Zahl = 0 wenn kein Schaltjahr, sonst Zahl = 6
		! Ergebnis = (TZ + MZ + JZ + JHZ + SJK) mod 7 => 0 = So, 1 = Mo, 2 = Di, 3 = Mi, 4 = Do, 5 = Fr, 6 = Sa

		! Mit dieser Rechnung kann man zu jedem Datum den Wochentag berechnen.

		LVar1 = oDatum.Substr(8, 2).ToInteger();
		zahl  = (LVar1 + (LVar1 / 4)) % 7;
		LVar1 = oDatum.Substr(6, 2).ToInteger();
		LVar2 = ((3 - (LVar1 % 4)) * 2) + zahl;
		LVar1 = oDatum.Substr(6, 4).ToInteger() % 4;

		if (LVar1 == 0) { zahl = 6; } else { zahl = 0; }

		LVar1 = ((24 % 7) + 5 + LVar2 + zahl) % 7; ! Ergebnis (LVar1) ist die Wochentagszahl

		! Feiertag ermitteln: 30 Novembertage - (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').State(Feiertag);
		dom.GetObject('Wochenende').State(Wochenende);

		if ((Feiertag == 1) || (Wochenende == 1))
		{
			dom.GetObject('Freier_Tag').State(1);
		}
		else
		{
			dom.GetObject('Freier_Tag').State(0);
		}

		Durchlauf = 1;

		! Datum von morgen für den 2. Durchlauf ermitteln

		LVar1 = system.Date("%d").ToInteger() + 1.00; ! Einen Tag weiter --> morgen
		index = system.Date("%m");
		LVar2 = index.ToInteger();

		zahl = (3 * LVar2) - 3;
		LVar3 = mTage.Substr(zahl, 2).ToInteger(); ! Anzahl der Tage im aktuellen Monat
		if (LVar1 > LVar3) { ! Wenn Monatsgrenze überschritten wurde
			sDatum = "01.";
			if (LVar2 == 12) {
				sDatum = sDatum # "01.";
			} else {
				LVar2 = LVar2 + 1.00;
				if (LVar2 < 10) { sDatum = sDatum # "0" # LVar2.ToString() # "."; } else { sDatum = sDatum # LVar2.ToString() # "."; }
			}
		} else {
			if (LVar1 < 10) { sDatum = "0" # LVar1.ToString() # "." # index # ".";} else { sDatum = LVar1.ToString() # "." # index # "."; }
		}
	} else {
		dom.GetObject('Feiertag_morgen').State(Feiertag);
		dom.GetObject('kurz_vor_WE').State(kurz_vor_WE);

		if ((kurz_vor_WE == 1) || (Feiertag == 1))
		{
			dom.GetObject('lange_Schlafen').State(1);
		}
		else
		{
			dom.GetObject('lange_Schlafen').State(0);
		}

		Durchlauf = 2;
	}
}
In deinem CalcActionTimes-Skript kann ich bei Aktion 16 keinen offensichtlichen Fehler finden. Auch die Syntax ist in Ordnung.
Woran hast du denn gemerkt, dass es nicht korrekt funktioniert hat? Welche Zeit wurde denn am Freitag und den restlichen Tagen berechnet?
Momentan stellt dein Skript folgendes dar:
- vor einem Wochenende (Freitags) bzw. vor einem Feiertag: Aktion starten um 23:10 + Zufallszeit zwischen 0 und 90 Minuten (also zwischen 23:10 und 0:40)
- sonst (incl. Samstags): Aktion starten um 22:00 + Zufallszeit zwischen 0 und 90 Minuten (also zwischen 22:00 und 23:30)

Wobei ich glaube das Problem erkannt zu haben: wenn die Zeit über den aktuellen Tag hinausgeht, in deinem Fall also z.B. 0:40, können die Skripte damit nicht umgehen. Denn 0:40 liegt für CalcActionTimes VOR dem aktuellen Zeitpunkt und wird somit ignoriert. Das Skript weiß ja nicht, dass die berechnete Zeit für den nächsten Tag gilt.
Um das zu berücksichtigen müssten mehrere Skripte komplett überarbeitet werden. So z.B. auch die chronologische Sortierung.

Ich fürchte, im Moment ist YAWN nur für Aktionen innerhalb eines Tages geeignet. Wird die Tagesgrenze überschritten, geht's schief. Sorry!
Mal schauen, wann ich die Zeit finde dafür eine Lösung zu finden...

Gruß
Splunge

Antworten

Zurück zu „Projektvorstellungen“