Beräkning av Påsk - HomeSeer edition....

av Bamsefar » 24 maj 2017, 18:20

Jag vill gärna att min hemautomation klarar sig själv, utan kontakt med omvärlden med ytterligare beroenden. Nu är det såklart så att min HomeSeer Zee S2 har internet - men istället för att bli beroende av google calender eller något liknande, som har en otrolig tendens till att ändra sina APIer lite si och så, så gör jag allt själv :mrgreen:

Således, favorit (för mig) i repris, men nu i HomeSeer utgåva: Hur man räknar fram Sveriges samtliga helgdagar så man slipper hålla reda på dagar som man är ledig (om man följer kalenderns icke röda dagar och så vidare - ja jag är väl medveten om att de finns de som går schema, som de som jobbar inom t.ex. sjukvården).

Kod: Markera allt
Function EasternCalc(ByVal Parms As Date) As Date

        Dim CurrentYear As Integer = CInt(Parms.ToString("yyyy"))
        Dim c, n, k, i, j, l, m, d

        c = CurrentYear \ 100
        n = CurrentYear - 19 * (CurrentYear \ 19)
        k = (c - 17) \ 25
        i = c - c \ 4 - (c - k) \ 3 + 19 * n + 15
        i = i - 30 * (i \ 30)
        i = i - (i \ 28) * (1 - (i \ 28) * (29 \ (i + 1)) * ((21 - n) \ 11))
        j = CurrentYear + CurrentYear \ 4 + i + 2 - c + c \ 4
        j = j - 7 * (j \ 7)
        l = i - j
        m = 3 + (l + 40) \ 44
        d = l + 28 - 31 * (m \ 4)

        EasternCalc = CDate(CStr(CurrentYear) + "-" + CStr(m) + "-" + CStr(d))

End Function

Function WorkDay(ByVal dateToCheck As Date) As String

        Dim easterDay As Date = Nothing
        Dim returnValue As Boolean

        returnValue = "true"

        '-- Indatum är en Lördag eller Söndag
        If dateToCheck.DayOfWeek = 6 Or dateToCheck.DayOfWeek = 0 Then
            returnValue = "false"
        '-- Indatum är nationaldag
        ElseIf dateToCheck.Month = 6 And dateToCheck.Day = 6 Then
            returnValue = "false"
        '-- Indatum är Nyårsdag eller Trettondag
        ElseIf (dateToCheck.Month = 1 And (dateToCheck.Day = 1 Or dateToCheck.Day = 6)) Then
            returnValue = "false"
        '-- Indatum är 1:a maj
        ElseIf (dateToCheck.Month = 5 And dateToCheck.Day = 1) Then
            returnValue = "false"
        '-- Indatum är Julafton,Juldag, Annandag eller Nyårsafton
        ElseIf (dateToCheck.Month = 12 And (dateToCheck.Day = 24 Or dateToCheck.Day = 25 Or dateToCheck.Day = "26" Or dateToCheck.Day = "31")) Then
            returnValue = "false"
        End If


        '-- Påskdagen
        easterDay = EasternCalc(dateToCheck)
      
        '-- Långfredag = Påskdagen - 2 dagar
        If (easterDay.AddDays(-2).ToShortDateString = dateToCheck.ToShortDateString) Then
            returnValue = "false"
        End If

        '-- AnnandagPåsk = Påskdagen + 1 dag
        If (easterDay.AddDays(1).ToShortDateString = dateToCheck.ToShortDateString) Then
            returnValue = "false"
        End If

        '-- Kristihimmelfärdsdag? +39 dagar från Påskdagen?
        If (easterDay.AddDays(39).ToShortDateString = dateToCheck.ToShortDateString) Then
            returnValue = "false"
        End If

        '-- hitta midsommardagen för att kunna kontrollera midsommarafton
        '-- midsommardagen = den lördag som infaller under tiden den 20-26 juni -> midsommarafton bör vara den fredag som inträffar under tiden 19-25 juni
        If ( dateToCheck.Month = 6 And dateToCheck.Day >= 19 And dateToCheck.Day <= 25 And dateToCheck.DayOfWeek = 5 ) Then
            returnValue = "false"
        End If

        '            If ( Vacation_Days(dateToCheck) ) Then
        '                  returnValue = "false"
        '            End

        WorkDay = returnValue

End Function

    Sub Main(ByVal Parms As String)

        Dim MyDate As Date = Nothing
        If Parms <> "" Then
            MyDate = DateTime.Parse(Parms)
        Else
            MyDate = DateTime.Now
        End If

        If ( WorkDay(MyDate) = "True") Then
            hs.setDeviceValueByRef(27, 0, True) 'Arbetsdag Idag
        Else
            hs.setDeviceValueByRef(27, 1, True) 'Ledig Idag
        End If
 
        If ( WorkDay(MyDate.AddDays(1)) = "True") Then
            hs.setDeviceValueByRef(28, 0, True) 'Arbetsdag Imorgon
        Else
            hs.setDeviceValueByRef(28, 1, True) 'Ledig Imorgon
        End If

    End Sub
Använder HomeSeer Zee S2, en pytteliten låda (läs: Raspberry pi2, snart pi3) som bara tickar och går, trots crashat SD kort - någon dag skall jag fixa det.....

Lua för nybörjare
Bamsefar
Z-Wave Kung
 
Inlägg: 1038
Blev medlem: 25 nov 2013, 15:06
Ort: Stockholm

av sonnyboy » 30 maj 2017, 19:47

Jag använder fortfarande den som du gjorde till HC2.
Det fungerar fortfarande lika bra som när du gjorde den.
Återigen tack så mycket :)
Fibaro HomeCenter 2
Fw 4.151 Beta
BeyondMeasure 1.10
25 Enheter, 55 Scener tidigare, 8 nu med gea GEA
sonnyboy
Proffsmedlem
 
Inlägg: 561
Blev medlem: 26 sep 2013, 08:05
Ort: Västerås

Dustin

Återgå till HomeSeer