Feiertagsberechnung - Skript

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

Moderator: Co-Administratoren

Petrus
Beiträge: 134
Registriert: 13.01.2010, 20:53
Hat sich bedankt: 1 Mal
Danksagung erhalten: 25 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Petrus » 23.01.2010, 16:07

Perfekt, DANKE kaju!

LG
Peter

sambasamba
Beiträge: 1602
Registriert: 16.08.2009, 23:18
Wohnort: Landau/Südpfalz
Hat sich bedankt: 21 Mal
Danksagung erhalten: 4 Mal

Re: Feiertagsberechnung - Skript

Beitrag von sambasamba » 23.01.2010, 18:26

... nur daß die Astro-Funktion der CCU nicht mit meinem Helligkeitsempfinden übereinstimmt. Ich verwende deshalb Teddys Tageszeiten-script - ist auf Kajus Seite: http://www.homematic-inside.de/tecbase/ ... eilen.html

V.

Benutzeravatar
kaju74
Beiträge: 2050
Registriert: 06.03.2007, 13:14
Danksagung erhalten: 19 Mal
Kontaktdaten:

Re: Feiertagsberechnung - Skript

Beitrag von kaju74 » 24.01.2010, 10:07

Hallo.

Daraus stammen doch die Codezeilen. Damit ließe sich auch einfach ein Offset programmieren, wenn die Zeiten zu früh oder zu spät sind.

Lieben Gruß,
kaju

sambasamba
Beiträge: 1602
Registriert: 16.08.2009, 23:18
Wohnort: Landau/Südpfalz
Hat sich bedankt: 21 Mal
Danksagung erhalten: 4 Mal

Re: Feiertagsberechnung - Skript

Beitrag von sambasamba » 24.01.2010, 10:15

Kaju: schon klar. Ich brauch aber die (korrigierte) Tageszeit, und nicht nur 'Tag'/'Nacht' auch noch für andere Funktionen, da ist es wohl besser ich lasse das Tageszeiten-script laufen, und kann dann von überall auf die globale Variable zugreifen.

Benutzeravatar
kaju74
Beiträge: 2050
Registriert: 06.03.2007, 13:14
Danksagung erhalten: 19 Mal
Kontaktdaten:

Re: Feiertagsberechnung - Skript

Beitrag von kaju74 » 24.01.2010, 10:51

das dann schon :D :D

PeterM
Beiträge: 761
Registriert: 14.10.2008, 10:15
System: Alternative CCU (auf Basis OCCU)
Wohnort: Walldorf/Baden
Danksagung erhalten: 2 Mal

Re: Feiertagsberechnung - Skript

Beitrag von PeterM » 27.01.2010, 18:22

Hallo Peter,

super Teil diese Feiertagsberechnung, hab das gleich mal als Makro in meine Homeputer-Programmierung aufgenommen (natrürlich nach der entsprechenden Übersetzung).
Endlich kann ich an Feiertagen ausschlafen, ohne von KeyMatic, oder irgendeinem Treppenlicht/Rollladen geweckt zu werden :mrgreen:

Vielen Dank :!:

Viele Grüsse,
Peter

Petrus
Beiträge: 134
Registriert: 13.01.2010, 20:53
Hat sich bedankt: 1 Mal
Danksagung erhalten: 25 Mal

Re: Feiertagsberechnung - Skript

Beitrag von Petrus » 30.01.2010, 17:59

Hallo Peter,

vielen Dank für die Lorbeeren. Habe mir seiner Zeit auch die Homeputer Software mit der Zentrale gekauft. Jedoch liegt die Software noch jungfräulich in der Ecke. Welche Vorteile hätte ich denn (abgesehen von der grafischen Bedienung), hinsichtlich der Programmierung und des funktionsumfangs, im Gegensatz zur direkten Programmierung im WebUI der Zentrale?

Sicher könnte ich mir die Doku des Hersteller durchlesen, um diese Frage im Detail zu klären, jedoch ist mir die Meinung eines Anwenders viel wichtiger!

Gruß
Peter

PeterM
Beiträge: 761
Registriert: 14.10.2008, 10:15
System: Alternative CCU (auf Basis OCCU)
Wohnort: Walldorf/Baden
Danksagung erhalten: 2 Mal

Re: Feiertagsberechnung - Skript

Beitrag von PeterM » 31.01.2010, 10:00

Hallo Peter,

ich mag Skript-Programmierung nicht. Das ist der Hauptgrund weshalb ich mich für HP entschieden habe. :mrgreen:
Homeputer ist zwar nicht die hellste Programmiersprache, aber einfacher zu handhaben als Skript. Man kann in jeden Aktor ein Makro (= Programmierung) ablegen, oder von dort aus ein anderes Makro aufrufen, Makros aktivieren und deaktivieren, Protokolle schreiben und am Bildschirm anzeigen, Lokale und globale Variable (alle notwendigen Typen) definieren und verarbeiten. Makros können einmalig, oder in unterschiedlichen Intervallen (bis hin zu permanent) gestartet werden.
Mit Datum- und Uhrzeiten auf einfachste Art und Weise rechnen. Formeln muss man halt in einfache Schritte zerlegen, da Klammerungen einfach von links nach rechts verarbeitet werden, aber das ist ja kein Problem.
Man kann sie sehr einfach erlernen. Ich verwende HP paralell zu Skripten (auch wenn ich sie nicht mag), direkten Verknüpfungen und HM-Programmen. Auch das funktioniert, wenn man umsichtig arbeitet.

Ich glaube man kann hier nicht wirklich von Vor-/Nachteil sprechen - ist einfach ne Geschmacksfrage.

Viele Grüsse,
Peter

Higgi2000
Beiträge: 113
Registriert: 29.03.2008, 07:12

Re: Feiertagsberechnung - Skript

Beitrag von Higgi2000 » 31.01.2010, 19:00

Hallo Peter!

Kannst Du das Makro für CL mal hier posten - würde mir ´ne Menge Tipparbeit sparen! :)

Gruß Volker

PeterM
Beiträge: 761
Registriert: 14.10.2008, 10:15
System: Alternative CCU (auf Basis OCCU)
Wohnort: Walldorf/Baden
Danksagung erhalten: 2 Mal

Re: Feiertagsberechnung - Skript

Beitrag von PeterM » 31.01.2010, 19:29

Hallo Volker,

ich gehe mal davon aus, dass Peter (der das eigentliche Skript geschrieben hat) nichts dagegen hat...

Der Name meines Makros lautet: MAC_Feiertag

Code: Alles auswählen

//==========================================================================
// Feiertag berechnen
//==========================================================================

// Rosenmontag = 0 -> wird nicht gefeiert
// Rosenmontag = 1 -> wird gefeiert
  Rosenmontag:= 1
//  UVA_BLand:= "BW"

// Fuer "UVA_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

  SVA_Feiertag:= " "

  wenn UVA_Datum <> " " und
    UVA_Datum <> "" dann
    T:= Textteil(UVA_Datum,1,2)
    M:= Textteil(UVA_Datum,4,2)
    J:= Textteil(UVA_Datum,7,4)
  sonst
    T:= Monatstag
    M:= Monat
    J:= JAHR
    UVA_Datum:= Datum
  endewenn

// Berechnung Ostersonntag im aktuellen Jahr
// Modulo 19 aus dem aktuellen Jahr
  M19:= J / 19
  M19:= M19 * 19
  M19:= J - M19

// Jahr / 100
  J100:= J / 100

// Berechnung LVar1
  LVar1:= 8 * J100
  LVar1:= LVar1 + 13
  LVar1:= LVar1 / 25

  zahl:= 3 * J100
  zahl:= zahl + 3
  zahl:= zahl / 4
  zahl:= zahl + 15
  LVar1:= zahl - LVar1

  zahl:= 19 * M19
  LVar1:= LVar1 + zahl

// Modulo 30
  zahl:= LVar1 / 30
  zahl:= zahl * 30
  LVar1:= LVar1 - zahl

// Berechnung LVar2
  LVar2:= LVar1 / 29
  zahl:= LVar1 / 28
  zahl:= zahl - LVar2
  zahl:= zahl * M19
  zahl:= zahl / 11
  LVar2:= LVar2 + zahl

// Berechnung LVar3
  zahl:= 3 * J100
  zahl:= zahl + 3
  zahl:= zahl / 4
  zahl:= 2 - zahl
  LVar3:= J / 4
  zahl:= LVar3 + J + zahl
// Modulo 7
  LVar3:= zahl / 7
  LVar3:= LVar3 * 7
  LVar3:= zahl - LVar3
  LVar3:= 7 - LVar3
  LVar3:= 21 + LVar1 - LVar2 - LVar3
// Modulo 7
  zahl:= LVar3 / 7
  zahl:= zahl * 7
  LVar3:= LVar3 - Zahl
  LVar3:= 7 - LVar3

  oMonat:= 3
  oTag:= 21 + LVar1 - LVar2 + LVar3
  wenn oTag > 31 dann
    oTag:= oTag - 31
    oMonat:= 4
  endewenn

  string:= oTag + "." + oMonat + "." + J

// string + 1, da sonst nach der Zuweisung 1 fehlt!!!!!!!
  Ostern:= string + 1
  SVA_Ostern:= Ostern

// feste Feiertage
// Neujahr
  wenn M = 1 und
    T = 1 dann
    SVA_Feiertag:= "Neujahr"
    verlassen
  endewenn

// Maifeiertag - Tag der Arbeit
  wenn M = 5 und
    T = 1 dann
    SVA_Feiertag:= "Maifeiertag"
    verlassen
  endewenn

// Tag der deutschen Einheit
  wenn M = 10 und
    T = 3 dann
    SVA_Feiertag:= "Tag der deutschen Einheit"
    verlassen
  endewenn

// Weihnachten/Silvester
  wenn M = 12 dann
    wenn T = 24 dann
      SVA_Feiertag:= "Heiligabend"
      verlassen
    endewenn
    wenn T = 25 dann
      SVA_Feiertag:= "1. Weihnachtsfeiertag"
      verlassen
    endewenn
    wenn T = 26 dann
      SVA_Feiertag:= "2. Weihnachtsfeiertag"
      verlassen
    endewenn
    wenn T = 31 dann
      SVA_Feiertag:= "Silvester"
      verlassen
    endewenn
  endewenn

// Hl. 3 Könige nur in BW, BY und ST
  wenn UVA_BLand = "BW" oder
    UVA_BLand = "BY" oder
    UVA_BLand = "ST" dann
    wenn M = 1 und
      T = 6 dann
      SVA_Feiertag:= "Hl. 3 Könige"
      verlassen
    endewenn
  endewenn

// Reformationstag in BB, MV, SA, ST und TH
  wenn UVA_BLand = "BB" oder
    UVA_BLand = "MV" oder
    UVA_BLand = "SA" oder
    UVA_BLand = "ST" oder
    UVA_BLand = "TH" dann
    wenn M = 10 und
      T = 31 dann
      SVA_Feiertag:= "Reformationstag"
      verlassen
    endewenn
  endewenn

// Allerheiligen in BW, BY, NW, RP und SL
  wenn UVA_BLand = "BW" oder
    UVA_BLand = "BY" oder
    UVA_BLand = "NW" oder
    UVA_BLand = "RP" oder
    UVA_BLand = "SL" dann
    wenn M = 11 und
      T = 1 dann
      SVA_Feiertag:= "Allerheiligen"
      verlassen
    endewenn
  endewenn

// Mariä Himmelfahrt in BY (aber nicht überall) und SL
  wenn UVA_BLand = "BY" oder
    UVA_BLand = "SL" dann
    wenn M = 8 und
      T = 15 dann
      SVA_Feiertag:= "Mariä Himmelfahrt"
      verlassen
    endewenn
  endewenn

// bewegliche Feiertage
// Fronleichnam in BW, BY, HE, NW, RP, SL, (SA, TH nicht überall)
  wenn UVA_BLand = "BW" oder
    UVA_BLand = "BY" oder
    UVA_BLand = "HE" oder
    UVA_BLand = "NW" oder
    UVA_BLand = "RP" oder
    UVA_BLand = "SL" oder
    UVA_BLand = "SA" oder
    UVA_BLand = "TH" dann
    dat:= Ostern + 60
    wenn UVA_Datum = dat dann
      SVA_Feiertag:= "Fronleichnam"
      verlassen
    endewenn
  endewenn

// Ostersonntag
  wenn UVA_Datum = Ostern dann
    SVA_Feiertag:= "Ostersonntag"
    verlassen
  endewenn

// Ostermontag
  dat:= Ostern + 1
  wenn UVA_Datum = dat dann
    SVA_Feiertag:= "Ostermontag"
    verlassen
  endewenn

// Karfreitag
  dat:= Ostern - 2
  wenn UVA_Datum = dat dann
    SVA_Feiertag:= "Karfreitag"
    verlassen
  endewenn

// Christi Himmelfahrt
  dat:= Ostern + 39
  wenn UVA_Datum = dat dann
    SVA_Feiertag:= "Christi Himmelfahrt"
    verlassen
  endewenn

// Pfingstmontag
  dat:= Ostern + 50
  wenn UVA_Datum = dat dann
    SVA_Feiertag:= "Pfingstmontag"
    verlassen
  endewenn

// Buß- und Bettag in SL
  wenn UVA_BLand = "SL" dann
    LVar1:= Textteil(J,3,2)
    zahl:= LVar1 / 4
    LVar1:= LVar1 + zahl
    zahl:= LVar1 / 7
    zahl:= zahl * 7
    zahl:= LVar1 - zahl

    LVar1:= Textteil(J,1,2)
    LVar2:= LVar1 / 4
    LVar2:= LVar2 * 4
    LVar2:= LVar1 - LVar2
    LVar2:= 3 - LVar2
    LVar2:= LVar2 * 2
    LVar2:= LVar2 + zahl

    LVar1:= J / 4
    LVar1:= LVar1 * 4
    LVar1:= J - LVar1

    wenn LVar1 = 0 dann
      zahl:= 6
    sonst
      zahl:= 0
    endewenn

    LVar1:= 3 + 5 + LVar2 + zahl
    zahl:= LVar1 / 7
    zahl:= zahl * 7
    LVar1:= LVar1 - zahl

    zahl:= 32 + LVar1 - 24
    zahl:= 30 - zahl
    string:= zahl + ".11." + J
    dat:= string

    wenn UVA_Datum = dat dann
      SVA_Feiertag:= "Buß- und Bettag"
      verlassen
    endewenn
  endewenn

// Brauchtumstage
// Rosenmontag nur wenn gewünscht
  wenn Rosenmontag = 1 dann
    dat:= Ostern - 48
    wenn UVA_Datum = dat dann
      SVA_Feiertag:= "Rosenmontag"
      verlassen
    endewenn
  endewenn
Im Makro selbst müssen noch folgende Variablen angelegt werden:

Code: Alles auswählen

Name                Typ            Startwert
---------------------------------------------
Rosenmontag          Zahl           
J                       Zahl
LVar1                Zahl           0
LVar2                Zahl           0
LVar3                Zahl           0
Zahl                  Zahl           0
M19                  Zahl           0
J100                 Zahl           0
Ostern              Datum
String               Zeichen
OTag                Zahl
oMonat             Zahl
M                     Zahl
T                     Zahl
dat                  Datum
Die Nullen sind sehr wichtig (wie manchmal auch im wirklichen Leben), sonst wird mit Dezimalen gerechnet was alles durcheinander bringt.

Desweiteren muessen folgende Objekte angelegt werden:

UVA_BLand (Typ Zeichen)
SVA_Feiertag (Typ Zeichen)
SVA_Ostern (Typ Zeichen)
UVA_Datum (Typ Zeichen)

Der Aufruf geschieht über:

UVA_Datum:= Datum (hier kann auch ein anderes Datum übergeben werden)
(wichtig ist hierbei, dass das Format immer dd.mm.yyyy sein muss, sonst läufts schief)
UVA_BLand:= "BW" (das Kürzel für euer Bundesland)
aufrufen(MAC_Feiertag)
(das habe ich in einem Makro, welches einmal nach Mitternacht aufgerufen wird - ändert sich ja nicht während des Tages :lol: )

Zurückgeliefert wird:

SVA_Ostern - enthält das Osterdatum für das in UVA_Datum übergebene Jahr
SVA_Feiertag - enthält den Namen des Feiertages (falls kein Feiertag, ist die Variable leer -> " ")

Die Gross-/Kleinschreibung in den Variablennamen ist unwichtig (ist nur so ne Angewohnheit).

Ich hoffe, ich habe alles. Wenn nicht, einfach melden - obwohl, das braucht man wohl nicht zu erwähnen :)

Viele Grüsse,
Peter

Antworten

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