One can subscribe to many different types of calendars in Google Calendar (Sports, Teams, astrological, etc.). There are also several holidays Calendars (e.g., US Holidays, US Federal Holidays, etc.). Do you know if it is possible to use the CalDav bindings to connect to a subscribed Holidays Calendar to check whether a particular day (e.g., today or tomorrow) is a holiday?
Thanks Vincent. Iâd put a tentative task on my Calendar for today surmising that would be the answer: âImport Holidaysâ
If I could impose further⊠Do you stilljust use CalDavCommand? Could you provide an example of one of your calendar holiday entries?
I can see how the Command can trigger to set that a holiday has begun. I suppose one could configure a holiday entry to âturn on earlyâ to have openHAB âseeâ the upcoming holiday. But Iâm going to play around with the Personal binding to try to âsee aheadâ for upcoming holidays because I need the day transitions for my HVAC schedule to take holidays vs. workdays into account.
var int year = now.getYear
var int dayOfYear = now.getDayOfYear
var int a = year % 19
var int b = year / 100
var int c = year % 100
var int d = b / 4;
var int e = b % 4;
var int f = (b + 8) / 25;
var int g = (b - f + 1) / 3;
var int h = (19 * a + b - d - g + 15) % 30;
var int i = c / 4;
var int k = c % 4;
var int L = (32 + 2 * e + 2 * i - h - k) % 7;
var int m = (a + 11 * h + 22 * L) / 451;
var int month = (h + L - 7 * m + 114) / 31;
var int day = ((h + L - 7 * m + 114) % 31) + 1;
var boolean holiday = false
var String holidayName = null
var org.joda.time.DateTime easterSunday = parse(year+"-"+month+"-"+day)
var org.joda.time.DateTime stAdvent = parse(year+"-12-25").minusDays(((parse(year+"-12-25").getDayOfWeek) + 21))
holidayName = null
// bundesweiter Feiertag
if (dayOfYear==parse(year+"-01-01").getDayOfYear) {
holidayName = "new_years_day" // Neujahr
holiday = true
}
// Baden-WĂŒrttemberg, Bayern, Sachsen-Anhalt
else if (dayOfYear==parse(year+"-01-06").getDayOfYear) {
holidayName = "holy_trinity"// Heilige 3 Könige
holiday = false
}
// Carnival ;-)
else if (dayOfYear==easterSunday.getDayOfYear-48) {
holidayName = "carnival_monday" // Rosenmontag
holiday = true
}
// bundesweiter Feiertag
else if (dayOfYear==easterSunday.getDayOfYear-2) {
holidayName = "good_friday" // Karfreitag
holiday = true
}
// Brandenburg
else if (dayOfYear==easterSunday.getDayOfYear) {
holidayName = "easter_sunday" // Ostersonntag
holiday = false
}
// bundesweiter Feiertag
else if (dayOfYear==easterSunday.getDayOfYear+1) {
holidayName = "easter_monday" // Ostermontag
holiday = true
}
// bundesweiter Feiertag
else if (dayOfYear==parse(year+"-05-01").getDayOfYear) {
holidayName = "1st_may"// Tag der Arbeit
holiday = true
}
// bundesweiter Feiertag
else if (dayOfYear==easterSunday.getDayOfYear+39) {
holidayName = "ascension_day" // Christi Himmelfahrt
holiday = true
}
// Brandenburg
else if (dayOfYear==easterSunday.getDayOfYear+49) {
holidayName = "whit_sunday" // Pfingstsonntag
holiday = false
}
// bundesweiter Feiertag
else if (dayOfYear==easterSunday.getDayOfYear+50) {
holidayName = "whit_monday" // Pfingstmontag
holiday = true
}
// Baden-WĂŒrttemberg, Bayern, Hessen, NRW, Rheinland-Pfalz, Saarland sowie regional in Sachsen, ThĂŒringen
else if (dayOfYear==easterSunday.getDayOfYear+60) {
holidayName = "corpus_christi" // Frohnleichnahm
holiday = true
}
// Saarland sowie regional in Bayern
else if (dayOfYear==parse(year+"-08-15").getDayOfYear) {
holidayName = "assumption_day" // MariÀ Himmelfahrt
holiday = false
}
// bundesweiter Feiertag
else if (dayOfYear==parse(year+"-10-03").getDayOfYear) {
holidayName = "reunification" // Tag der deutschen Einheit
holiday = true
}
// Brandenburg, Mecklenburg-Vorpommern, Sachsen, Sachsen-Anhalt, ThĂŒringen
else if (dayOfYear==parse(year+"-10-31").getDayOfYear) {
holidayName = "reformation_day" // Reformationstag
holiday = false
}
// Baden-WĂŒrttemberg, Bayern, NRW, Rheinland-Pfalz, Saarland
else if (dayOfYear==parse(year+"-11-01").getDayOfYear) {
holidayName = "all_saints_day" // Allerheiligen
holiday = true
}
// religiöser Tag
else if (dayOfYear==stAdvent.getDayOfYear-14) {
holidayName = "remembrance_day" // Volkstrauertag
holiday = false
}
// religiöser Tag
else if (dayOfYear==stAdvent.getDayOfYear-7) {
holidayName = "sunday_in_commemoration_of_the_dead" // Totensonntag
holiday = false
}
// Sachsen
else if (dayOfYear==stAdvent.getDayOfYear-11) {
holidayName = "day_of_repentance" // BuĂ- und Bettag
holiday = false
}
// kann auch der 4te Advent sein
else if (dayOfYear==parse(year+"-12-24").getDayOfYear) {
holidayName = "christmas_eve" // Heiligabend
holiday = true
}
// bundesweiter Feiertag
else if (dayOfYear==parse(year+"-12-25").getDayOfYear) {
holidayName = "1st_christmas_day" // 1. Weihnachtstag
holiday = true
}
// bundesweiter Feiertag
else if (dayOfYear==parse(year+"-12-26").getDayOfYear) {
holidayName = "2nd_christmas_day" // 2. Weihnachtstag
holiday = true
}
// Silvester
else if (dayOfYear==parse(year+"-12-31").getDayOfYear) {
holidayName = "new_years_eve" // Silvester
holiday = true
}
var boolean schoolvac = false
var String schoolvacName = null
// NRW Daten von http://www.schulferien.org/NRW/nrw.html
if (year == 2019) {
if (dayOfYear >= parse(year+"-01-01").getDayOfYear &&
dayOfYear <= parse(year+"-01-04").getDayOfYear ) {
schoolvacName = "Weihnachtsferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-04-15").getDayOfYear &&
dayOfYear <= parse(year+"-04-27").getDayOfYear ) {
schoolvacName = "Osternferien"
schoolvac = true
} else if (dayOfYear == parse(year+"-06-11").getDayOfYear ) {
schoolvacName = "Pfingstferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-07-15").getDayOfYear &&
dayOfYear <= parse(year+"-08-27").getDayOfYear ) {
schoolvacName = "Sommerferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-10-14").getDayOfYear &&
dayOfYear <= parse(year+"-10-26").getDayOfYear ) {
schoolvacName = "Herbstferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-12-23").getDayOfYear&&
dayOfYear <= parse(year+"-12-31").getDayOfYear) {
schoolvacName = "Weihnachtsferien"
schoolvac = true
}
}
if (year == 2020) {
if (dayOfYear >= parse(year+"-01-01").getDayOfYear &&
dayOfYear <= parse(year+"-01-06").getDayOfYear ) {
schoolvacName = "Weihnachtsferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-04-06").getDayOfYear &&
dayOfYear <= parse(year+"-04-18").getDayOfYear ) {
schoolvacName = "Osternferien"
schoolvac = true
} else if (dayOfYear == parse(year+"-06-02").getDayOfYear ) {
schoolvacName = "Pfingstferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-06-29").getDayOfYear &&
dayOfYear <= parse(year+"-08-11").getDayOfYear ) {
schoolvacName = "Sommerferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-10-12").getDayOfYear &&
dayOfYear <= parse(year+"-10-24").getDayOfYear ) {
schoolvacName = "Herbstferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-12-23").getDayOfYear&&
dayOfYear <= parse(year+"-12-31").getDayOfYear) {
schoolvacName = "Weihnachtsferien"
schoolvac = true
}
}
if (year == 2021) {
if (dayOfYear >= parse(year+"-01-01").getDayOfYear &&
dayOfYear <= parse(year+"-01-06").getDayOfYear ) {
schoolvacName = "Weihnachtsferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-03-29").getDayOfYear &&
dayOfYear <= parse(year+"-04-10").getDayOfYear ) {
schoolvacName = "Osternferien"
schoolvac = true
} else if (dayOfYear == parse(year+"-05-25").getDayOfYear ) {
schoolvacName = "Pfingstferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-07-05").getDayOfYear &&
dayOfYear <= parse(year+"-08-17").getDayOfYear ) {
schoolvacName = "Sommerferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-10-11").getDayOfYear &&
dayOfYear <= parse(year+"-10-23").getDayOfYear ) {
schoolvacName = "Herbstferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-12-24").getDayOfYear&&
dayOfYear <= parse(year+"-12-31").getDayOfYear) {
schoolvacName = "Weihnachtsferien"
schoolvac = true
}
}
if (year == 2022) {
if (dayOfYear >= parse(year+"-01-01").getDayOfYear &&
dayOfYear <= parse(year+"-01-08").getDayOfYear ) {
schoolvacName = "Weihnachtsferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-04-11").getDayOfYear &&
dayOfYear <= parse(year+"-04-23").getDayOfYear ) {
schoolvacName = "Osternferien"
schoolvac = true
// } else if (dayOfYear == parse(year+"-05-25").getDayOfYear ) {
// schoolvacName = "Pfingstferien"
// schoolvac = true
} else if (dayOfYear >= parse(year+"-06-27").getDayOfYear &&
dayOfYear <= parse(year+"-08-09").getDayOfYear ) {
schoolvacName = "Sommerferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-10-04").getDayOfYear &&
dayOfYear <= parse(year+"-10-15").getDayOfYear ) {
schoolvacName = "Herbstferien"
schoolvac = true
} else if (dayOfYear >= parse(year+"-12-23").getDayOfYear&&
dayOfYear <= parse(year+"-12-31").getDayOfYear) {
schoolvacName = "Weihnachtsferien"
schoolvac = true
}
}
if (holidayName !== null) {
sendCommand(SpecialDay,holidayName)
} else {
sendCommand(SpecialDay,"")
}
if (holiday) {
sendCommand(Holiday,ON)
} else {
sendCommand(Holiday,OFF)
}
if (schoolvacName !== null) {
sendCommand(SchoolVacationName,schoolvacName)
} else {
sendCommand(SchoolVacationName,"")
}
if (schoolvac) {
postUpdate(SchoolVacation,ON)
} else {
postUpdate(SchoolVacation,OFF)
}
rule file
rule "Feiertage berechnen"
when
// Item Test changed from OFF to ON or
System started or
Time cron "0 0 1 * * ?"
then
logDebug("Holiday", "Script Calculation started")
callScript("holiday")
end
Is the first rule file the âholidayâ script invoked by rule "Feiertage berechnen"?
Fo you have the holiday.map file as well?
I had not considered it, but I can probably calculate most of the other US holidays that donât have a âfixedâ day of a particular month:
New Yearâs Day
Easter per the formula
Independence Day - July 4
Christmas Day
New Yearâs Eve
The rest all have a âformulaâ:
MLK Day - third Monday of January
Presidents Day - third Monday in February
Memorial Day - last Monday of May
Labor Day - first Monday of September
Columbus Day - second Monday of October
Election Day (school holiday) - first Tuesday after November 1
Thanksgiving - fourth Thursday in November
Problem is, I donât know how to code that to efficiently. I bet the logic is out there already. Just a matter of searching. What scares me is date data types and operations in openHAB DSL!
MLK Day - third Monday of January: 1 0 0 ? JAN 2#3 *
Presidents Day - third Monday in February: 1 0 0 ? FEB 2#3 *
Memorial Day - last Monday of May: 1 0 0 ? MAY 2L *
Labor Day - first Monday of September: 1 0 0 ? SEP 2#1 *
Columbus Day - second Monday of October: 1 0 0 ? OCT 2#2 *
This case is special and you will need 2 cron and check if the day of the month is NOT the first 1 0 0 ? OCT 3#1 * or 1 0 0 ? OCT 3#2 *
Election Day (school holiday) - first Tuesday after November 1: ``
Thanksgiving - fourth Thursday in November
[/quote]
These too except easter of course
New Yearâs Day: `1 0 0 1 JAN ? *`
Easter per the formula
Independence Day - July 4 `1 0 0 4 JUL ? *`
Christmas Day `1 0 0 25 DEC ? *`
New Yearâs Eve `1 0 0 31 DEC ? *`
For example MLK day: 1 0 0 ? JAN 2#3 *
Going back to caldav, I send a âday typeâ to the system. I have an item Holiday_Type that can the values NONE, BANK, SCHOOL. In Britain we call the special holidays BANK holidays
According to the value of the item, I set different heating schedules
Which one are you referring to - Columbus Day or Election Day?
I did not realize that cron was so versatile! I know that cron be used as Time cron xxxx in a Ruleâs trigger. But that would require separate rules that fire at midnight of the particular holiday. Is there a DSL method that can be invoked with cron strings so I can get back an actaul date in a variable? Iâd like to use them in a case or if statement to check against âtodayâ or âtomorrowâ? If itâs DSL, then thatâs ideal and I donât have to maintain events in a calendar.
var eastFasadeIn = ( 90 - 90 + diffToFasade ) //For example: -26.09 or 333,91 - because 0 and 360 is north
Sun_Fasade_Illum_East.postUpdate( if (azimut > eastFasadeIn.remainder(360.0BD) && azimut < eastFasadeOut.remainder(360.0BD) && height >0) ON else OFF)
Especially for holidays, it might be worthwhile to watch the progress of the âEphemerisâ service which exposes the data from the jollyday library to openHAB:
Of course this had to be a global need and someone has already provided a programmatic solution. I will definitely track the Ephemeris service.
Hopefully this comes along soon. Iâd rather leverage a facility like this that provides lots of options⊠without lots of code to write or maintain. My holidays need is not critical⊠so Iâll be patient and wait for the Ephemeris service (binding or action) to be released.