Feiertagsberechnung - Skript

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

Moderator: Co-Administratoren

Cosi
Beiträge: 39
Registriert: 04.11.2019, 16:38
Hat sich bedankt: 1 Mal
Danksagung erhalten: 3 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Cosi » 19.01.2020, 20:59

Hallo Petrus,
ist ja toll. mit dem neuen Skript gibt es nun keine Probleme mehr mit den eigenen Feiertagen.
Ich habe mir inzwischen die Mühe gemacht, eine komplette Bedienungsanleitung für das Skript zusammen zu stellen.
Das mache ich oft, wenn schwierige Sachen zu tun sind. Dann habe ich auch keine Schwierigkeiten, wenn ich später
darauf zurück greifen muß.
Besten Dank für Deine Gute Arbeit und nette Zusammenarbeit.
Cosi
PS leider nur 10 Beiträge möglich 11 bis 14 folgen
Dateianhänge
Bedienungsanleitung 10.jpg
Bedienungsanleitung 9.jpg
Bedienungsanleitung 8.jpg
Bedienungsanleitung 7.jpg
Bedienungsanleitung 6.jpg
Bedienungsanleitung 5.jpg
Bedienungsanleitung 4.jpg
Bedienungsanleitung 3.jpg
Bedienungsanleitung 2.jpg
Bedienungsanleitung 1.jpg

Cosi
Beiträge: 39
Registriert: 04.11.2019, 16:38
Hat sich bedankt: 1 Mal
Danksagung erhalten: 3 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Cosi » 19.01.2020, 21:02

Hallo Petrus,
wie versprochen hier noch Datei 11 bis 14
Gruß
Cosi
Dateianhänge
Bedienungsanleitung 14.jpg
Bedienungsanleitung 13.jpg
Bedienungsanleitung 12.jpg
Bedienungsanleitung 11.jpg

Cosi
Beiträge: 39
Registriert: 04.11.2019, 16:38
Hat sich bedankt: 1 Mal
Danksagung erhalten: 3 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Cosi » 02.06.2020, 13:57

Hallo Petrus,
habe noch das etwas ältere Skript und
irgentwie finde ich Dein neuestes Skript für die Feiertag-Berechnung nicht. (vor lauter Bäumen)
Kannst Du mal den Link einblenden zum Downladen ?
Wäre sehr nett von Dir. Gewiß sind auch noch andere daran interessiert.
Schön hier ein Dank an Deine gute Zusammenarbeit.
Gruß
Cosi

mskrause
Beiträge: 167
Registriert: 13.10.2018, 20:02
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 13 Mal
Danksagung erhalten: 19 Mal

Re: Feiertagsberechnung - Skript

Beitrag von mskrause » 02.06.2020, 14:12

Cosi hat geschrieben:
02.06.2020, 13:57
Kannst Du mal den Link einblenden zum Downladen ?
Petrus aktualisiert das Script bislang immer im ersten Beitrag
viewtopic.php?f=31&t=4058

Gruß Marco

Cosi
Beiträge: 39
Registriert: 04.11.2019, 16:38
Hat sich bedankt: 1 Mal
Danksagung erhalten: 3 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Cosi » 08.06.2020, 20:33

Hallo Petrus,
Marco hat mir mitgeteilt, daß Du im ersten Beitrag immer die neueste Version der Feiertagsberechnung anbietest.
Aber die neueste Version hat keine Kennung. Es ist nicht zu erkennen welche Version vorliegt.
Wäre es nicht besser dies durch irgend eine Kenntlichmachung darzustellen.
Danke
Gruß Cosi

Cosi
Beiträge: 39
Registriert: 04.11.2019, 16:38
Hat sich bedankt: 1 Mal
Danksagung erhalten: 3 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Cosi » 11.06.2020, 12:03

Hallo Petrus,
zunächst wünsche ich einen schönen Feiertag.
Im Feiertagscript versuche ich "Feiertag-Eigene" als Werteliste einzusetzen.
Habe ich dort meine eigenen Feiertage gesetzt und führe im Script-test das Programm aus, wobei ich
b_CheckSVs = true; und b_calc = true; setze. Ich erhalte immer die Fehlermeldung "ValueTyp wrong".
Das Programm nimmt meine eigenen Feiertage nicht an.
Auch im "Feiertag-Daten" erscheinen sie nicht.
Woran liegt das und wie kann dies geändert werden.?
herzliche Grüße und bleib gesund !!
Cosi

Cosi
Beiträge: 39
Registriert: 04.11.2019, 16:38
Hat sich bedankt: 1 Mal
Danksagung erhalten: 3 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Cosi » 14.06.2020, 13:21

Hallo Petrus,
in einem der Skripte wird die Rolladensteuerung angesprochen.
Bei mir läuft es so:
Die Öffnungszeiten der Rolläden variieren zwischen Wochenende und Werktag. Wochenende später ; Werktag früher ; je nach eigenem Wunsch.
Sollte an einem Werktag ein Feiertag sein, dann wird wie am Wochenende geöffnet.
Die Rolladenschließzeiten hatte ich lange an die Elevation angehängt. Das funktionierte für mich nicht zufriedenstellend, da die Dämmerungszeiten in den Jahreszeiten sehr unterschiedlich sind und die Elevation dies nicht erfassen kann. Außerdem ist es ein großer Unterschied, ob die Sonne bei strahlendblauem Himmel oder bei schwarzen Gewitterwolken untergeht. So kann es geschehen, daß es noch recht hell ist und man sitzt plötzlich hinter geschlossenen Rolläden. Oder umgekehrt es ist schon recht dunkel und noch kein Rolladen zu.
Meine Lösung ist:
Ein Lichtsensor erfaßt die Helligkeit. So ist schon mal der Helligkeitsunterschied bewölkt bzw. sonnenklar erfaßt.
Mit folgender Methode erfasse ich nun die Unterschiede bei der Dämmerung.
Für jeden Monat von Januar bis Juni addiere ich zum erfaßten Helligkeitswert einen bestimmtem Wert hinzu. Für die Monate Juli-Dezember verringere ich diesen Zuschlag wieder in umgekehrter Weise. Damit habe ich eine sehr brauchbare Gesamtlösung gefunden.
Die einzustellenden Werte sind natürlich vom verwendeten Lichtsensor abhängig. Ich addiere zum Lichtwert des Sensors das 4 fache der Monatsnummer hinzu; z.B. für Januar 1x4, für Juni 6x4;
Ich verwende den Außenbewegungsmelder von ELV, der zwar keine Lux-Werte liefert, aber ausreichend ist für die grobe Rolladensteuerung.
Die Werte für den Bewegungslichtsensor müssen selbst ermittelt werden, da auch der Standort des Gerätes ausschlaggebend ist.
Gruß
Cosi

Andy1981
Beiträge: 349
Registriert: 25.12.2015, 08:41
Danksagung erhalten: 4 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Andy1981 » 03.10.2020, 20:38

Code: Alles auswählen

! Feiertagsberechnung - Complete-V3.1 von Petrus (01-2020)

!   Changelog:
! - Daten der Feiertage werden "nur 1x" im Jahr berechnet
!   Ausnahme: Sobald ueber die SV neue, eigene Daten hinzugefuegt werden,
!             erfolgt beim naechsten Scriptaufruf eine erneute Berechnung
! - Die berechneten Daten werden chronologisch sortiert und in den SVs abgelegt
!   => Daten koennen damit z.B. in anderen Programmen ausgewertet werden
! - Berechnungen komplett ueberarbeitet => Gueltigkeit bis zum Jahr 2199
! - Auswertungen erfolgen mit Jahrestagen statt mit Datumsangaben => kompakteres Programm
! - V3.01: Falsches Format bei der Ermittlung der aktuellen Tageszahl korrigiert
! - V3.02: Bugfix: Abfrage Feiertage-Eigene
! - V3.03: Da es in letzter Zeit des oefteren Aenderungen bei den gesetzlichen Feiertagen
!          gegeben hat, wurde die Moeglichkeit ergaenzt, die Feiertagsberechnung beim
!          Skriptaufruf zu erzwingen. (Im Normalfall geschieht dies immer nur zu Beginn eines Jahres)
!          (siehe unten, Beschreibung der Skriptvariablen-Nr.5)
! - V3.1:  - Trim-Funktion beim Einlesen der Daten aus den Variablen ergaenzt, um ungewollt
!            eingegebene Leerzeichen zu loeschen. Andernfalls kann es in der WebUI
!            zu Darstellungsproblemen bei der Anwendung der Systemvariablen kommen.
!          - Die Systemvariablen "Feiertag-Heute-Name" und "Feiertag-Morgen-Name",
!            die die Namen der Feiertage beinhalten, koennen ab dieser Version weggelassen
!            oder in der CCU geloescht werden.
!          - Die SV-Nr.4 "Feiertag-Eigene" kann jetzt wahlweise als Zeichenkette (default) oder
!            in der CCU als Werteliste definiert werden.
!          - Zudem kann die SV "Feiertag-Eigene" auch weggelassen oder in der CCU geloescht werden.

! ==============================================================================
! Systemvariable Nr.1 und Nr.2 vom Typ: Logikwert
! Name-Nr.1/2 (Default): Feiertag-Heute / Feiertag-Morgen
! Werte: true/false = Ja/Nein
! ==============================================================================
	string sv_Bool = "Feiertag-Heute,Feiertag-Morgen";

! ==============================================================================
! Systemvariable Nr.3 vom Typ: Zeichenkette
! Name der SV-Nr.3 (Default): "Feiertag-Daten"
! Bedeutung: SV fuer die berechneten Jahrestage der Feiertage
! Werte fuer SV-Nr.3: Werden vom Script automatisch generiert!

! Systemvariable Nr.4 (optional) vom Typ: Zeichenkette (Default) oder Werteliste
! Name der SV-Nr.4 (Default): "Feiertag-Eigene"
! Bedeutung: Systemvariable, in die eigene Feiertagsdaten eingetragen werden koennen

! Moegliche Werte fuer SV-Nr.4:
! Datum (XX.XX. oder X.X.) oder mit Differenzangabe zum Ostersonntag (OS), 1.Advent (AD) oder Muttertag (MT)
! Beispiele: "OS-48=Rosenmontag;MT+0=Muttertag;AD-11=Buß- und Bettag"
! Trennzeichen zwischen den einzelnen Daten ist das Semikolon.

! Hinweis: Wenn man die SV "Feiertag-Eigene" in der CCU nicht benoetigt,
!          dann den Eintrag einfach loeschen. Beispiel: string sv_Daten = "Feiertag-Daten";
! ==============================================================================
	string sv_Daten = "Feiertag-Daten,Feiertag-Eigene";

! ==============================================================================
! Systemvariable Nr.5 und Nr.6 (optional) vom Typ: Werteliste
! Name-Nr.5/6 (Default): Feiertag-Heute-Name / Feiertag-Morgen-Name
! Werte: Namen der Feiertage analog zu den in SV-Nr.3 gespeicherten Daten

! Hinweis: Wenn man die Namen der Feiertage in der CCU nicht benoetigt,
!          dann die Namen einfach loeschen. Beispiel: string sv_Name = "";
! ==============================================================================
	string sv_Name = "Feiertag-Heute-Name,Feiertag-Morgen-Name";

! ============================================================================
! Scriptvariable Nr. 1
! Bedeutung: Die Feiertagsliste mit Datum und Name
! Werte: Datum (XX.XX. oder X.X.) oder mit Differenzangabe zum Ostersonntag (OS), 1.Advent (AD) oder Muttertag (MT)
! Trennzeichen zwischen den einzelnen Daten ist das Semikolon.
! ============================================================================
	string s_Feiertage = "01.01.=Neujahr;03.10.=Tag der deutschen Einheit;OS-2=Karfreitag;OS+1=Ostermontag;OS+50=Pfingstmontag;OS+39=Christi Himmelfahrt;25.12.=1. Weihnachtsfeiertag;26.12.=2. Weihnachtsfeiertag;01.05.=Tag der Arbeit;01.11.=Allerheiligen;OS+60=Fronleichnam;06.01.=Heilige Drei Könige;15.08.=Mariä Himmelfahrt;OS-48=Rosenmontag;MT+0=Muttertag;24.12.=Heiligabend;31.12.=Silvester;AD+0=1.Advent;AD+7=2.Advent;AD+14=3.Advent;AD+21=4.Advent";

! ============================================================================
! Scriptvariable Nr. 2
! Bedeutung (b_debug): Zum testen des Scripts in der Testumgebung der WebUI
!                      kann die DEBUG-Funktion aktiviert werden. Daten werden
!                      dann neu berechnet und gespeichert. Ausgaben erfolgen
!                      ausschliesslich in der WebUI.
!                      SV's Nr.1 und 2 werden nicht veraendert!
! Default : false
! Werte   : true (Funktion ein) ; false (Funktion aus)

! Scriptvariable Nr. 3
! Bedeutung (s_today): Ist die DEBUG-Funktion aktiviert, dann wird ausschliesslich
!                      das angegebene Datum "s_today" als Referenzdatum fuer die
!                      Ermittlung eines Feiertages verwendet.
! Wert  : beliebiges Datum
! Format: JJJJ-MM-TT

! Scriptvariable Nr. 4
! Bedeutung (b_CheckSVs): Falls aktiviert, werden die benoetigten Systemvariablen
!                         ggf. automatisch in der CCU angelegt und, sofern bereits
!                         vorhanden, auf den korrekten Typ hin ueberprueft.
! Werte   : true (Funktion ein) ; false (Funktion aus)
! Default : false
! Hinweis : Es ist in der Regel ausreichend, wenn diese Funktion nur bei der
!           1. Anwendung aktiviert und danach wieder deaktiviert wird.

! Scriptvariable Nr. 5
! Bedeutung (b_DeleteSVs): Falls aktiviert, werden bereits vorhandene Systemvariablen,
!                          die nicht dem Default-Typ entsprechen, geloescht und dann
!                          neu angelegt.
! Werte   : true (Funktion ein) ; false (Funktion aus)
! Default : false
! Hinweis : Diese Funktion ist nur aktiv, wenn die Scriptvariable Nr. 4 (b_CheckSVs)
!           ebenfalls auf true gesetzt wird.

! Scriptvariable Nr. 6
! Bedeutung (b_calc): Falls aktiviert, werden die Feiertagsdaten bei "jedem"
!                     Skriptdurchlauf neu berechnet.
! Werte   : true (aktiviert) ; false (deaktviert)
! Default : false
! Hinweis : Ein aktivieren der Funktion macht z. B. dann Sinn, wenn es gesetzliche
!           Aenderungen bei den Feiertagen innerhalb eines laufenden Jahres gibt.
!           Es werden dann die geaenderten Daten in der SV "s_Feiertage" neu berechnet.
!           Im Anschluss sollte die Funktion wieder deaktiviert werden.
! ============================================================================
	boolean b_debug = false;
	string  s_today = "2020-01-01";
	boolean b_CheckSVs = false;
	boolean b_DeleteSVs = false;
	boolean b_calc=false;

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

! *** Systemvariablen pruefen?
object svObjects=dom.GetObject(ID_SYSTEM_VARIABLES);
object svObj; string s_wert1; integer i_wert2=0; integer i_wert1;
if (b_CheckSVs) {
	! SV: Namensliste (Werteliste)
	if (sv_Name.Trim()){
		foreach(s_wert1, sv_Name.Split(",")) {
			svObj = svObjects.Get(s_wert1); i_wert1=1;
			if (svObj) {
					if (svObj.ValueType() != ivtInteger) {
						if (b_DeleteSVs) {
							dom.DeleteObject(svObj.ID());
							WriteLine(s_wert1 # " : old systemvariable deleted!");
						} else { WriteLine(s_wert1 # " : ValueSubTyp wrong! Script terminated."); quit; }
				}	else { if (b_debug) { WriteLine(s_wert1 # " : ValueTyp OK!"); } i_wert1=0; }
			}
			if (i_wert1){
				svObj = dom.CreateObject(OT_VARDP);
				svObjects.Add(svObj.ID());
				svObj.Name(s_wert1);
				svObj.ValueType(ivtInteger);
				svObj.ValueSubType(istEnum);
				svObj.DPInfo("Feiertagname");
				svObj.ValueList("-");
				svObj.State(0);
				dom.RTUpdate(false);
				if (b_debug) { WriteLine(s_wert1 # " : Systemvariable created!"); }
			}
		}
	}
	! SV: Feiertag (Logikwert)
	foreach(s_wert1, sv_Bool.Split(",")) {
			svObj = svObjects.Get(s_wert1); i_wert1=1;
			if (svObj) {
					if (svObj.ValueSubType() != istBool) {
						if (b_DeleteSVs) {
							dom.DeleteObject(svObj.ID());
							WriteLine(s_wert1 # " : old systemvariable deleted!");
						} else { WriteLine(s_wert1 # " : ValueSubTyp wrong!"); quit; }
					}	else { if (b_debug) { WriteLine(s_wert1 # " : ValueTyp OK!"); } i_wert1=0; }
			}
			if (i_wert1){
					svObj = dom.CreateObject(OT_VARDP);
					svObjects.Add(svObj.ID());
					svObj.Name(s_wert1);
					svObj.ValueType(ivtBinary);
					svObj.ValueSubType(istBool);
					svObj.ValueName0("Nein");
					svObj.ValueName1("Ja");
					svObj.State(false);
					svObj.DPInfo("Ist ein Feiertag?");
					svObj.ValueUnit("");
					dom.RTUpdate(false);
					if (b_debug) { WriteLine(s_wert1 # " : Systemvariable created!"); }
			}
	}
	! SV: Datenliste (Zeichenkette)
	foreach(s_wert1, sv_Daten.Split(",")) {
		svObj = svObjects.Get(s_wert1); i_wert1=1;
		if (svObj) {
			if (svObj.ValueType() != ivtString) {
				if (b_DeleteSVs) {
					dom.DeleteObject(svObj.ID());
					WriteLine(s_wert1 # " : old systemvariable deleted!");
				} else { WriteLine(s_wert1 # " : ValueTyp wrong!"); quit; }
			} else { if (b_debug) { WriteLine(s_wert1 # " : ValueTyp OK!"); } i_wert1=0; }
		}
		if (i_wert1){
			svObj = dom.CreateObject(OT_VARDP);
			svObjects.Add(svObj.ID());
			svObj.Name(s_wert1);
			svObj.ValueType(ivtString);
			svObj.ValueSubType(istChar8859);
			if(i_wert2){
				svObj.DPInfo("Eigene Feier- und Ereignistage");
				svObj.Visible(true);
			} else {
				svObj.DPInfo("Berechnete Jahrestage der Feier- und Ereignistage"); i_wert2=1;
			  svObj.Visible(false);
			}
			svObj.ValueUnit("");
			svObj.State("");
			svObj.Internal(false);
			dom.RTUpdate(false);
			if (b_debug) { WriteLine(s_wert1 # " : Systemvariable created!"); }
		}
	}
}

! *** Das Jahr
if (b_debug) { integer i_jahr=s_today.StrValueByIndex("-",0).ToInteger(); } else { integer i_jahr=system.Date("%Y").ToInteger(); }

! *** Schaltjahr (SJ) : (ja/nein)=(1/0)
integer SJ=((!i_jahr%400)||((i_jahr%100)&&(!i_jahr%4))).ToInteger();

! *** Jahreszahl heute (s_today)
!     Nur bei DEBUG berechnen. Statt: s_today=system.Date(s_today#" 06:00:00").ToTime().Format("%j").ToString(0);
if (b_debug){ i_wert1=s_today.StrValueByIndex("-",1).ToInteger();
							s_today=((s_today.StrValueByIndex("-",2).ToInteger()+((489*i_wert1)/16)-30)-((7+i_wert1)/10)*(2-SJ)).ToString();
						} else {s_today=system.Date("%j").ToInteger().ToString();}
i_wert1=s_today.ToInteger();

! *** Jahreszahl morgen (s_tomorrow)
string s_tomorrow="1"; if(i_wert1<(365+SJ)){ s_tomorrow=(i_wert1+1).ToString(); }

! *** SV-Objekte definieren
string s_Obj=sv_Daten.StrValueByIndex(",", 0).Trim(); string s_Obj2=sv_Daten.StrValueByIndex(",", 1).Trim();
svObj=svObjects.Get(s_Obj); object svObj2=svObjects.Get(s_Obj2);

! *** Wenn nicht DEBUG, dann aktuelle Daten aus SV holen.
string s_fDaten="";
if (!b_debug) {
	if (svObj){
		! Wenn Daten bereits im aktuellen Jahr berechnet wurden => keine erneute Berechnung erforderlich => nur Daten aus SV holen.
		if ((svObj.Value().StrValueByIndex("#", 0)).ToInteger()==i_jahr){
			s_fDaten=svObj.Value();
			! Wenn neue, eigene Daten in SV stehen (neuer Zeitstempel) => dann doch Berechnung erneut durchfuehren.
			if (svObj2) {if (svObj2.Timestamp().ToInteger() > (s_fDaten.StrValueByIndex(";", 0).StrValueByIndex("#", 1)).ToInteger()){b_calc=true;}}
		} else { b_calc=true; }
		! Script beenden, wenn SV nicht existiert.
	} else { WriteLine(s_Obj # " : SV-Object not found. Script terminated!"); quit; }
}

! *** Berechnungen
string s_wert2;
if ((b_calc) || (b_debug)) {
	! Osterkennziffer (i_wert3) fuer Berechnungen ermitteln
	integer i_wert3=(204-(i_jahr%19)*11)%30; i_wert3=120+i_wert3-(i_wert3/27); i_wert1=(i_wert3+((i_jahr*5)/4)-(i_jahr/2100))%7; i_wert3=i_wert3-i_wert1;

	! Ostersonntag   :Tag   :Monat              :Jahrestag (OS+0)
	i_wert1=1+(i_wert3%31); i_wert2=i_wert3/31; integer OS=i_wert1+59+((i_wert2==4).ToInteger()*31)+SJ; ! Jahrestag (OS+0)
	if (b_debug) {WriteLine("\nOstersonntag ist am "#i_wert1.ToString()#"."#i_wert2.ToString()#". und der "#OS.ToString()#". Tag im Jahr "#i_jahr.ToString());}

	! Muttertag      :Tag im Mai                :Jahrestag (MT+0)
	i_wert1=8+(i_wert3%7)-(7*(118/i_wert3)); integer MT=i_wert1+120+SJ;
	if (b_debug) {WriteLine("Muttertag ist am "#i_wert1.ToString()#".5. und der "#MT.ToString()#". Tag im Jahr "#i_jahr.ToString());}

	! 1.Advent       :Tag            :Monat                   :Jahrestag (AD+0)
	i_wert1=1+((26+(i_wert3%7))%30); i_wert2=12-(i_wert1/27); integer AD=i_wert1+304+((i_wert2==12).ToInteger()*30)+SJ;
	if (b_debug) {WriteLine("1. Advent ist am "#i_wert1.ToString()#"."#i_wert2.ToString()#". und der "#AD.ToString()#". Tag im Jahr "#i_jahr.ToString());}

	! **Ggf. eigene Feier-/Festtage aus SV ergaenzen
	if (svObj2){
		if (svObj2.ValueType() == ivtString) {s_fDaten=svObj2.Value();} else {
	    if (svObj2.ValueType() == ivtInteger) {s_fDaten=svObj2.ValueList();} else {WriteLine(svObj2.Name()#" = ValueTyp wrong! Script terminated!"); quit;}
		}
		if (s_fDaten.Find("=")>0){ s_Feiertage=s_Feiertage#";"#s_fDaten; }
		s_fDaten=i_jahr.ToString() # "#" # svObj2.Timestamp().ToInteger().ToString();
	} else { s_fDaten=i_jahr.ToString() # "#0"; }

	! Daten einlesen, Jahrestage berechnen und merken
	string s_fNamen="-";
	foreach(s_wert2,s_Feiertage.Split(";")){
		! Zeitwert aus Feiertagseintrag holen
		s_wert1=s_wert2.StrValueByIndex("=",0).Trim();
		! Pruefen ob Angabe ein beweglicher Feiertag zu OS,MT,AD ist
		i_wert1=((s_wert1.Substr(0,2)=="OS").ToInteger()*OS)+((s_wert1.Substr(0,2)=="MT").ToInteger()*MT)+((s_wert1.Substr(0,2)=="AD").ToInteger()*AD);
		! Wenn beweglicher Feiertag => Differenz zum Referenztag (OS,MT,AD) addieren
		if (i_wert1) { s_fDaten=s_fDaten # ";" # (i_wert1+s_wert1.Substr(2,s_wert1.Length()-2).ToInteger()).ToString();
		} else { ! ...andernfalls normale Datumsangabe: Tages- und Monatswert formatieren...
			i_wert1=s_wert1.StrValueByIndex(".",0).ToInteger(); i_wert2=s_wert1.StrValueByIndex(".",1).ToInteger();
			s_wert1=((i_wert1+((489*i_wert2)/16)-30)-((7+i_wert2)/10)*(2-SJ)).ToString(); ! ...Jahrestag berechnen
			s_fDaten=s_fDaten # ";" # s_wert1; ! ...und zur Datenliste hinzufuegen
		}
		s_fNamen=s_fNamen # ";" # s_wert2.StrValueByIndex("=",1).Trim(); ! zugehoerigen Namen zur Namenliste hinzufuegen
	}

	! *** Daten und Namen chronologisch sortieren ***
	i_wert3=0; i_wert1=2; foreach(s_wert1,s_fDaten.Split(";")){i_wert3=i_wert3+1;}
	while(i_wert1<i_wert3){ i_wert2 = i_wert1;
		if((i_wert2>1) && (s_fDaten.StrValueByIndex(";",i_wert2-1).ToInteger()>s_fDaten.StrValueByIndex(";",i_wert2).ToInteger())){
			AD=i_wert2; i_wert2=i_wert2-1;
			while((i_wert2>1) && (s_fDaten.StrValueByIndex(";",i_wert2-1).ToInteger()>s_fDaten.StrValueByIndex(";",AD).ToInteger())){i_wert2=i_wert2-1;}
			MT=0; s_wert1=""; s_wert2="";
			while(MT<i_wert3){
				if (MT==i_wert2) {s_wert1=s_wert1#s_fDaten.StrValueByIndex(";",AD)#";"; s_wert2=s_wert2#s_fNamen.StrValueByIndex(";",AD)#";";}
				if (MT!=AD) {s_wert1=s_wert1#s_fDaten.StrValueByIndex(";",MT)#";"; s_wert2=s_wert2#s_fNamen.StrValueByIndex(";",MT)#";";}
				MT=MT+1;
			}
			s_fDaten=s_wert1.Substr(0,s_wert1.Length()-1); s_fNamen=s_wert2.Substr(0,s_wert2.Length()-1);
		}
		i_wert1=i_wert1+1;
	}

	! *** Daten in die SV schreiben ***
	if (svObj){ s_fDaten=s_fDaten#";"; svObj.State(s_fDaten); } else { WriteLine(s_Obj # " : SV-Object not found. Script terminated!"); quit; } ! Script beenden, wenn SV nicht existiert.

	! *** Namen in die SV schreiben (optional) ***
	if (sv_Name.Trim()){ ! Pruefen, ob Systemvariable angegeben wurde
		foreach(s_wert1, sv_Name.Split(",")) {
			svObj = svObjects.Get(s_wert1.Trim());
			if (svObj) { svObj.ValueList(s_fNamen); svObj.State(0); }
		}
	}
	! *** Bei DEBUG ermittelte Daten ausgeben ***
	if (b_debug) { WriteLine("\nErmittelte Daten: "); i_wert1=1; while(i_wert1<i_wert3){WriteLine(s_fDaten.StrValueByIndex(";",i_wert1)#" : "#s_fNamen.StrValueByIndex(";",i_wert1)); i_wert1=i_wert1+1;}}
}

! *** Auf Feiertag heute und morgen pruefen ***
i_wert2=0;
while(i_wert2<2){
	if (i_wert2==0){s_wert1=s_today; s_wert2="\nHeute ("#s_wert1;} else {s_wert1=s_tomorrow; s_wert2="Morgen ("#s_wert1;}
	s_Obj=sv_Name.StrValueByIndex(",",i_wert2).Trim(); s_Obj2=sv_Bool.StrValueByIndex(",",i_wert2).Trim();
	svObj=svObjects.Get(s_Obj); ! SV fuer die Feiertagsnamen (optional)
	svObj2=svObjects.Get(s_Obj2); if (!svObj2) { WriteLine(s_Obj2 # " : SV-Object not found. Script terminated!"); quit; } ! Script beenden, wenn SV nicht existiert.
	i_wert1=s_fDaten.Find(";"#s_wert1#";"); ! Jahrestag in den Daten suchen
	if (i_wert1>=0){ ! Wenn Wert gefunden => Feiertag...
		i_wert1=1; while(s_wert1!=s_fDaten.StrValueByIndex(";",i_wert1)) { i_wert1=i_wert1+1; } ! ...dann Position (Index) ermitteln...
		if (!b_debug) { if (svObj){svObj.State(i_wert1);} svObj2.State(1); } else { Write(s_wert2#") ist ein Feiertag"); if (svObj){WriteLine(" : " # web.webGetValueFromList(svObj.ValueList(),i_wert1));} else {WriteLine("!");} } ! ...und Ergebnis in SVs setzen oder bei DEBUG ausgeben.
	} else { ! ...andernfalls kein Wert gefunden => kein Feiertag
		if (!b_debug) { if (svObj){svObj.State(0);} svObj2.State(0); } else { WriteLine(s_wert2#") ist kein Feiertag!"); }
	}
	i_wert2=i_wert2+1; ! weiterer Durchlauf fuer morgen
}
Nach Ausführen kommt folgende Meldung. Egal ob Compakt oder Complete Script.

Feiertag-Daten : SV-Object not found. Script terminated!
Zuletzt geändert von alchy am 03.10.2020, 22:17, insgesamt 1-mal geändert.
Grund: Code in Codetags posten
Andy

MathiasZ

Re: Feiertagsberechnung - Skript

Beitrag von MathiasZ » 03.10.2020, 21:16

Ich muß jetzt auch mal meinen Senf dazu geben. :mrgreen:
Vielen Dank an den Entwickler. Ich habe mir gerade eine RaspberryMatic neu aufgesetzt, mit allen Programmen und Skripten, die man ohne Geräte machen kann.
Auf der produktiven RaspberryMatic läuft es schon seit langem.
Alle 👍👍hoch!

Benutzeravatar
Black
Beiträge: 5463
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 418 Mal
Danksagung erhalten: 1069 Mal
Kontaktdaten:

Re: Feiertagsberechnung - Skript

Beitrag von Black » 03.10.2020, 22:14

Andy1981 hat geschrieben:
03.10.2020, 20:38
(...)
Bitte in Code Tags Posten !!!


zu deiner Frage, da hätte man auch selber drauf kommen können.
zeile 329,330,331:

Code: Alles auswählen

s_Obj=sv_Name.StrValueByIndex(",",i_wert2).Trim(); s_Obj2=sv_Bool.StrValueByIndex(",",i_wert2).Trim();
svObj=svObjects.Get(s_Obj); ! SV fuer die Feiertagsnamen (optional)
svObj2=svObjects.Get(s_Obj2); if (!svObj2) { WriteLine(s_Obj2 # " : SV-Object not found. Script terminated!"); quit; } ! Script beenden, wenn SV nicht existiert.  

Ihm fehlen da wohl die Systemvariablen , die es dazu braucht. Also behebenä

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Antworten

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