Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

SCRIPT: Flaggdag.vb - sjekk om dagen i dag er flaggdag


ZoRaC

Anbefalte innlegg


Scriptet er basert på @Moskus sitt "Fridager.vb":


Tar derfor bare "kortversjonen" av oppsettet her:
* Lag en virtuell device "Flaggdag" med verdiene "Ja" (On) og "Nei" (Off)

* Noter deg devID
* Lag "Flaggdag.vb":

Sub Main(ByVal deviceReference As String)
        'Moskus 2017
        Dim devRef As Integer = Integer.Parse(deviceReference.ToString)

        Dim isCurrentDateFlagday As Boolean = IsFlagday(Now) 

        If isCurrentDateFlagday Then
            hs.CAPIControlHandler(hs.CAPIGetSingleControlByUse(devRef, HomeSeerAPI.ePairControlUse._On))
        Else
            hs.CAPIControlHandler(hs.CAPIGetSingleControlByUse(devRef, HomeSeerAPI.ePairControlUse._Off))
        End If

    End Sub

    Public Function IsFlagday(ByVal _date As Date) As Boolean
        'translated php script form xibriz: https://www.diskusjon.no/index.php?showtopic=1084239

        _date = _date.Date 'in case time was added
        Dim easterDate As Date = GetEasterDate(_date.Year)

        'Sjekker om datoen er 1. Januar
        If _date = New Date(_date.Year, 1, 1) Then Return True

        'Sjekker om datoen er 21. Januar (Prinsesse Ingrid Alexandra)
        If _date = New Date(_date.Year, 1, 21) Then Return True

        'Sjekker om datoen er 6. februar (samefolkets dag)
        If _date = New Date(_date.Year, 2, 6) Then Return True

        'Sjekker om datoen er 21. februar (Kong Haralds bursdag)
        If _date = New Date(_date.Year, 2, 21) Then Return True

        'Sjekker om datoen er 1. påskedag
        If _date = easterDate Then Return True

        'Sjekker om datoen er 1. mai (offentlig høytidsdag)
        If _date = New Date(_date.Year, 5, 1) Then Return True

        'Sjekker om datoen er 8. mai (frigjøringsdag)
        If _date = New Date(_date.Year, 5, 8) Then Return True

        'Sjekker om datoen er 17. mai (grunnlovsdag)
        If _date = New Date(_date.Year, 5, 17) Then Return True

        'Sjekker om datoen er 7. juni (unionsoppløsning)
        If _date = New Date(_date.Year, 6, 7) Then Return True

        'Sjekker om datoen er 1. pinsedag (50. påskedag)
        If _date = easterDate.AddDays(49) Then Return True

        'Sjekker om datoen er 4. juli (Dronning Sonja)
        If _date = New Date(_date.Year, 7, 4) Then Return True

        'Sjekker om datoen er 20. juli (Kronprins Haakon)
        If _date = New Date(_date.Year, 7, 20) Then Return True

        'Sjekker om datoen er 29. juli (Olsok)
        If _date = New Date(_date.Year, 7, 29) Then Return True

        'Sjekker om datoen er 19. august (Mette-Marit)
        If _date = New Date(_date.Year, 8, 19) Then Return True

        'Sjekker om datoen er 1. juledag (25. desember)
        If _date = New Date(_date.Year, 12, 25) Then Return True

        Return False
    End Function

    Public Function GetEasterDate(ByVal Year As Integer) As Date
        'Originally taken from: http://www.thoughtproject.com/Snippets/Easter/Easter.vb.txt

        Dim a As Integer
        Dim b As Integer
        Dim c As Integer
        Dim d As Integer
        Dim e As Integer
        Dim f As Integer
        Dim g As Integer
        Dim h As Integer
        Dim i As Integer
        Dim k As Integer
        Dim l As Integer
        Dim m As Integer
        Dim n As Integer
        Dim p As Integer

        If Year < 1583 Then
            Return Nothing
        Else

            ' Step 1: Divide the year by 19 and store the
            ' remainder in variable A.  Example: If the year
            ' is 2000, then A is initialized to 5.

            a = Year Mod 19

            ' Step 2: Divide the year by 100.  Store the integer
            ' result in B and the remainder in C.

            b = Year \ 100
            c = Year Mod 100

            ' Step 3: Divide B (calculated above).  Store the
            ' integer result in D and the remainder in E.

            d = b \ 4
            e = b Mod 4

            ' Step 4: Divide (b+8)/25 and store the integer
            ' portion of the result in F.

            f = (b + 8) \ 25

            ' Step 5: Divide (b-f+1)/3 and store the integer
            ' portion of the result in G.

            g = (b - f + 1) \ 3

            ' Step 6: Divide (19a+b-d-g+15)/30 and store the
            ' remainder of the result in H.

            h = (19 * a + b - d - g + 15) Mod 30

            ' Step 7: Divide C by 4.  Store the integer result
            ' in I and the remainder in K.

            i = c \ 4
            k = c Mod 4

            ' Step 8: Divide (32+2e+2i-h-k) by 7.  Store the
            ' remainder of the result in L.

            l = (32 + 2 * e + 2 * i - h - k) Mod 7

            ' Step 9: Divide (a + 11h + 22l) by 451 and
            ' store the integer portion of the result in M.

            m = (a + 11 * h + 22 * l) \ 451

            ' Step 10: Divide (h + l - 7m + 114) by 31.  Store
            ' the integer portion of the result in N and the
            ' remainder in P.

            n = (h + l - 7 * m + 114) \ 31
            p = (h + l - 7 * m + 114) Mod 31

            ' At this point p+1 is the day on which Easter falls.
            ' n is 3 for March or 4 for April.

            Return DateSerial(Year, n, p + 1)

        End If

    End Function

* Lag disse eventene:

image.png.575e9a8cf886fc6dfa0d006ee78c27a6.png

(parameters er devID til devicen du laget)

 

Påminnelse om å flagge:

image.png.66ae8562436989098cfc1d500fa370f1.png

(jeg bruker et script som sender meg pushvarsel via Pushover, hvis jeg er hjemme, men du kan bruke hva du vil som "action")

Påminnelse om å ta ned:
image.png.826789c01ea7df4cec488241a53e9736.png
Her er "cannot re-run for" en fordel, for man skal ta ned flagget enten kl 2100 eller ved solnedgang. Ønsker ikke påminnelse på begge de tidspunktene. :) 

  • Like 4
  • Thanks 1
Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.