YAWN – Yet Another anWesenheitssimulatioN
Moderator: Co-Administratoren
Re: YAWN – Yet Another anWesenheitssimulatioN
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
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
Re: YAWN – Yet Another anWesenheitssimulatioN
Ein Lob, ein Lob, mmmmhhhh, ein Lob..
[emoji1] [emoji1] [emoji1] [emoji1] [emoji1] [emoji1] [emoji1]
Gesendet von meinem MI 4W mit Tapatalk
[emoji1] [emoji1] [emoji1] [emoji1] [emoji1] [emoji1] [emoji1]
Gesendet von meinem MI 4W mit Tapatalk
Re: YAWN – Yet Another anWesenheitssimulatioN
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
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
Re: YAWN – Yet Another anWesenheitssimulatioN
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: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.
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);
}
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.
Re: YAWN – Yet Another anWesenheitssimulatioN
Hi,
richtig der Fehler ist genau an dieser Stelle. Habe ich dich richtig verstanden, dass ich den Code so anpassen soll:
Leider bewehrt er sich immer noch...
Den 2. Teil deiner Antwort verstehe ich leider gar nicht....
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);
}
Den 2. Teil deiner Antwort verstehe ich leider gar nicht....
Re: YAWN – Yet Another anWesenheitssimulatioN
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):
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;
}
}
Re: YAWN – Yet Another anWesenheitssimulatioN
Hi,
jetzt läuft es gar nicht mehr....
Hier ist der momentane Code:
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;
}
}
Re: YAWN – Yet Another anWesenheitssimulatioN
Hi,
ich glaube ich habe es jetzt:
Danke an ALLE!!!!
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);
}
Re: YAWN – Yet Another anWesenheitssimulatioN
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:
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
! ########################################################
Re: YAWN – Yet Another anWesenheitssimulatioN
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:
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
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;
}
}
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