Gå til innhold
  • Bli medlem
Moskus

SCRIPT: Fridager.vb - Sjekk for offentlige høytider og andre tilsvarende dager

Anbefalte innlegg

Det er bra at en av mine første OpenSource-kodesnutter kom til nytte :) Det er ikke alle som vet at det å beregne helligdager i Norge er enkel mattematikk ;)

  • Like 1

Del dette innlegget


Lenke til innlegg
Del på andre sider
21 minutter siden, xibriz skrev:

Det er ikke alle som vet at det å beregne helligdager i Norge er enkel mattematikk ;)

Jeg visste ikke... ;) 

Del dette innlegget


Lenke til innlegg
Del på andre sider
36 minutter siden, xibriz skrev:

Det er ikke alle som vet at det å beregne helligdager i Norge er enkel mattematikk ;)

 

Hmm... når jeg gikk på skolen så var ikke ligninger med 14 ukjente betegnelsen på "enkel mattematikk"...

Spoiler

 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

 

... men joda, det ser vel verre ut enn det egentlig er. :) 

Del dette innlegget


Lenke til innlegg
Del på andre sider
17 minutter siden, ZoRaC skrev:

Hmm... når jeg gikk på skolen så var ikke ligninger med 14 ukjente betegnelsen på "enkel mattematikk"...

Det er ikke antall ukjente som løses. Alle variablene har jo en kjent løsning.

Verre er det hvis vi måtte kjøre annen analyse på det.

 

Vet heller ikke om jeg ser problemet. Men så liker jeg matte. ;) 

Del dette innlegget


Lenke til innlegg
Del på andre sider
1 time siden, Moskus skrev:

Det er ikke antall ukjente som løses. Alle variablene har jo en kjent løsning.

 

Definisjonsspørsmål... "p" lar seg ikke løse uten "h" og "m", som ikke lar seg løse uten "a", "b", "d" og "g", osv. Før man har regnet ut dem er de jo "ukjent". ;) 

Del dette innlegget


Lenke til innlegg
Del på andre sider
16 minutter siden, ZoRaC skrev:

Definisjonsspørsmål...

Nei. ;)

Noen er selvfølgelig avhengig av de andre, men alle har en kjent løsning.

Del dette innlegget


Lenke til innlegg
Del på andre sider
44 minutter siden, ZoRaC skrev:

 

Ser ikke helt forskjellen på ligningssettet med 14 ukjente og f.eks dette med 3...

https://www.diskusjon.no/index.php?showtopic=1466150

 

I dette tilfelle er det bare en ukjent variabel.

 

1. påskedag = X
Langfredag = X-2
Skjærtorsdag = X-3
osv.

 

Løser man X har man resten.

 

Endret av xibriz

Del dette innlegget


Lenke til innlegg
Del på andre sider
1 time siden, ZoRaC skrev:

 

Ser ikke helt forskjellen på ligningssettet med 14 ukjente og f.eks dette med 3...

https://www.diskusjon.no/index.php?showtopic=1466150

Fordi alle de fjorten går ikke inn i hverandre, Det er ikke 14 ligninger med 14 ukjente. :) 

 

Men samme det. Scriptet fungerer. ;) 

Del dette innlegget


Lenke til innlegg
Del på andre sider

Det kunne man.

Startet i gårkveld på et helligdags-script som tar for seg en kalendernettside for å finne ut om det er hellig eller ei.

Viste ikke dette kunne løses matematisk, men jeg akter å fortsette (mest tor gøy).

 

Fordelen med matematikk som her er at man slipper være avhengig av tilgang til en webside og Internett.

Fordelen med å hente info fra en side er at man slipper å ha korrekt dato stilt inn på serveren samt slipper ta høyde for hvorvidt politiske krefter endrer helligdagene.

Ikke at jeg tror noen av de to grunnene er særlig betydelige :P

 

Endret av Evelen

Del dette innlegget


Lenke til innlegg
Del på andre sider
2 timer siden, Asterix skrev:

Kunne også potensielt løses med mindre matematikk, med denne? https://webapi.no/api/v1/holydays/2017

Mindre matematikk, riktignok, men mer styr for å tolke det. Tipper at scriptet over vil kreve vesentlig mindre ressurser enn å laste ned en fil og tolke den, og vurdere om datoen er en hellidag eller ikke (men den totale ressursbruken er neppe avgjørende).

 

Og så er det flere muligheter for feil. Hva om tjenesten flyttes, eller legges ned? Eller rett og slett bare har en dårlig dag? ;) 

Og man må uansett gjøre unntak for sine egne definerte feriedager, da webapi'en kun gir de offentlige høytidene.

Del dette innlegget


Lenke til innlegg
Del på andre sider

 

Det kan jo deles opp eventuelt i flere script, eller hendelser. Kanskje ryddigst sånn? 

 

f.eks

if offentlig_helligdag_Script finner helligdag

Set helligdag_device=on, else off

 

if fri_fra_jobben_script finner fri

Set fridag_device=on, else off

 

if helligdag_device or fridag_device = on

set fri_total = on, else off

Endret av Evelen
  • Like 1

Del dette innlegget


Lenke til innlegg
Del på andre sider
12 minutter siden, Evelen skrev:

Det kan jo deles opp eventuelt i flere script, eller hendelser.

... så man kan gjøre det enda mer komplisert enn nødvendig? :P 

Del dette innlegget


Lenke til innlegg
Del på andre sider
1 time siden, Moskus skrev:

... så man kan gjøre det enda mer komplisert enn nødvendig? :P 

øyet som ser det ;) blir vel egentlig bare mindre komplisert slik jeg ser det.

Del dette innlegget


Lenke til innlegg
Del på andre sider
1 hour ago, Moskus said:

Mindre matematikk, riktignok, men mer styr for å tolke det. Tipper at scriptet over vil kreve vesentlig mindre ressurser enn å laste ned en fil og tolke den, og vurdere om datoen er en hellidag eller ikke (men den totale ressursbruken er neppe avgjørende).

 

Og så er det flere muligheter for feil. Hva om tjenesten flyttes, eller legges ned? Eller rett og slett bare har en dårlig dag? ;) 

Og man må uansett gjøre unntak for sine egne definerte feriedager, da webapi'en kun gir de offentlige høytidene.

Egentlig om man snakker om å håndtere også andre fridager, så er hardcoding i en script ikke optimal synes jeg. Men det tilbyr en kjapp løsning til problemet, uten tvil.

Ideelt burde enten en script lese en annen kalender (som det var foreslått i samme tråd), eller burde HS ha en kalender som vi kunne forsyne med ferie og andre ting fra api'er eller ikke. 

Har feks en Somfy Tahoma boks, som har en grei måte å håndtere det, som jeg kunne tenke neg å ha i HS; det er en 'vanlig' kalender hvor du kan knytte 'dagstype' til de enkelte dager, feks standard, weekend, ferie, hjemmekontor osv...

Så definerer du hva som skjer i de forskjellige dagstypene. Alt på en grafisk måte (drag&drop). 

Ser at det ligger også noen plugins for å bringe en kalender i HS (feks HiTec), eller bringe innholdet til HS. Kanskje noen har erfaring med dette? ;)

Del dette innlegget


Lenke til innlegg
Del på andre sider
9 timer siden, Asterix skrev:

Ideelt burde enten en script lese en annen kalender (som det var foreslått i samme tråd), eller burde HS ha en kalender som vi kunne forsyne med ferie og andre ting fra api'er eller ikke. 

Det er uten tvil det ideelle. "Hardkoding" av fridager (det er nå enkelt å flytte til en ini-fil, hvis du synes det blir mindre "hardkodet" av det ;) ) er i mellomtiden et nødvendig onde, slik jeg ser det.

 

Jeg har lenge hatt en drøm om at HS leser Outlook.com-felleskalenderen vår. Men har foreløpig ikke fått det til.

Del dette innlegget


Lenke til innlegg
Del på andre sider
11 minutes ago, Moskus said:

 

Jeg har lenge hatt en drøm om at HS leser Outlook.com-felleskalenderen vår. Men har foreløpig ikke fått det til.

Når jeg Googlet litt rundt, fant jeg noe om det (fra han som lagde Tenscripting tror jeg). Men det var antakelig for den gamle versjonen av Outlook?

Del dette innlegget


Lenke til innlegg
Del på andre sider

Outlook-versjonenes APIer er relativt like, så det kan godt være det fungerer nå. Mitt problem er imidlertid at det ikke er "default calendar" jeg skal hente informasjon fra, og det var plutselig vanskeligere enn det burde. Men det er mulig jeg som er treig, og ikke har prøvd nok...

Del dette innlegget


Lenke til innlegg
Del på andre sider

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå

  • Lignende innhold

    • Av Guahtdim
      Jeg har fått meg Daikin varmepumpe med Wifi modul. Og det må jo inn i Homeseer. Jeg har hatt den i ca 36 timer, men ikke kommet lenger enn å teste av og på vha Postman basert på script av @Christoffer. Script er kult det, men jeg foretrekker å lage plugin.
       
      I første omgang ser jeg for meg å transformere scriptet til @Christoffer
      Men er det andre ting som hadde vært fint å ha? 
       
      Egne spørsmål : Skifter varmepumpen ofte ip? Eller holder den på den tar første gang? 
    • Av Sture00
      Er det noen som har en link/guide til hvordan man får frem alle knappene på den runde Trådfri fjernkontrollen i Homeseer? Har nå kun on/off og batteri. 
    • Av Moskus
      Dette scriptet lar deg hente inn trafikkinformasjon fra EnTur.  
       
      Finne reiseruter, IDer for "StopPlace" og "Quay"
      Å bruke scriptet er ikke så vanskelig. Det vanskelige er å finne IDene til stasjonene du vil spore. 
       
      La oss si at jeg vil finne alle busser som går fra "Tasta Senter" (og mot Stavanger sentrum, men det kommer vi tilbake til)
      Gå til en-tur.no Tast inn stoppesteder til og fra Kopier URL'en fra nettleseren etter søket (f.eks. som denne) inn URLdecoder.org for å gjøre den lettere å lese. Finn "startID" og kopier ut strengen som begynner med "NSR:". For Tasta Senter er denne "NSR:StopPlace:28163"  
      Oppdatering: Etter tips fra @Odd Are er det enklere å gå hit med brukernavn/passord guest/guest og hente QuayIDer og StopPlaceIDer derfra.
       

       
      Vel og bra!  Nå vet vi at busstoppet ved Tasta Senter heter "NSR:StopPlace:28163". Men et busstopp kan faktisk ha flere plattformer, f.eks. en på hver side av veien. Det heter visst "Quay" på engelsk.
       
      Jeg er ikke interessert i begge sider av veien for kun en av dem har vanligvis trafikk mot sentrum. For å finne Quay, må vi bruke GraphQL-exploreren til EnTur (som dessverre ikke er like forseggjort som Tibber sin). Vi er interessert i denne spørringen som finner alle avganger for et stoppested, og vi må endre id: "NSR:StopPlace:28163" og avgangstiden (startTime:"2018-06-19T09:00:00+0200") til det riktige. I skrivende stund ser min spørring slik ut. 
       
      Så går vi gjennom resultatene, vi skal prøve å finne riktig "Quay".
       
      Det første treffet er inneholder denne teksten:
      "destinationDisplay": { "frontText": "Tasta - Vardeneset" }, "quay": { "id": "NSR:Quay:48450" }, ... men en buss med "Tasta - Vardeneset" tar meg i feil retning! Ergo er "NSR:Quay:48450" ikke riktig.
       
      Det neste treffet inneholder dette:
      "destinationDisplay": { "frontText": "Stavanger" }, "quay": { "id": "NSR:Quay:48449" }, Jepp! Riktig! Altså kan vi filtrere på "NSR:Quay:48449" for å finne avganger fra "NSR:StopPlace:28163" som kun går mot Stavanger.
       
       
       
      Installasjon
      Du trenger en referanse til Newtonsoft.Json.dll for at scriptet skal fungere. Json er mye i bruk i dag, og siden jeg har oppdaget at Webclient nå er innebygget i HS3 (og superenkel å bruke), så er det bare å legge inn Json-støtte for scripting også.
       
      Lukk HS3. Åpne settings.ini Finn linjen som begynner med ScriptingReference= Vanligvis står det kun System.Core;System.Core.dll. Vi skal legge til Newtonsoft bak der. Hos meg (på Windows) skal linjen da se slik ut:  
      ScriptingReferences=System.Core;System.Core.dll,Newtonsoft.Json;C:\Program Files (x86)\HomeSeer HS3\Bin\homeseer\Newtonsoft.Json.dll Lagre og start HS3 igjen. For Linux skal den muligens se slik ut, men du må sjekke plasseringen på /bin/homeseer/Newtonsoft.Json.dll selv.
      ScriptingReferences=System.Core;System.Core.dll,Newtonsoft.Json;/usr/local/HomeSeer/bin/homeseer/Newtonsoft.Json.dll  
       
      Kopier scriptet under og lagre det som EnTur.vb. Etter massiv testing fra @Tor-Erik er vi ganske sikre på at det også kjører på Linux.  
       
      EnTur.vb:
       
       
      Du må også lage deg noen devicer selv for å faktisk vise data. Dette gjør foreløpig ikke scriptet for deg. Den trenger ingen status values, men kanskje en enkel status Graphics for å ha et ikon (istedenfor Off/Dim/On-ikoner)
        

       

       
       
       
      Så trenger vi et event for å oppdatere teksten. Dette kan f.eks. kjøre hvert minutt.
      Parametre for funksjonen "CallsFromStopplace" er deviceID, stopplaceID, quayID (optional), antall_avganger (optional).
       

       
      Du kan ha flere script-kall i et event, hvis du har flere stopp, avganger, etc du vil kontrollere.  
       

       
       
      Parametre for funksjonen "TripsBetweenStops" er deviceID, stopplaceID (fra), stopplaceID (til), antall_avganger (optional). Det er et enkelt ruteoppslag, fint fra større stasjoner (f.eks. "Stavanger") til et bestemt stoppested.
       
      DeviceValue i hver device er antall minutter til neste avgang. Kan brukes til automasjon.  
       

       
       
    • Av Sture00
      Sliter med å få koblet til 1000lm trådfri pærer med ConBee II. Har til nå fått opp to runde fjernkontroller og en rund dimmer fra trådfri samt 30w led driveren men ingen av pærene dukker opp. Har siste firmware på Deconz og begge pærene får jeg opp i Hue bridge. Begge pærene har jeg reset flere ganger. Noen så har bedre erfaring? 
    • Av Guahtdim
      Jeg holder på med en liten plugin for å kunne legge inn sms ved hjelp av Twilio. Kunne det være noe interresse for noe slikt?
       
      Rflink plugin ble litt for stor (så den er midlertidig lagt på vent) og selv hadde jeg behov for sms sending. Jeg har kokt sammen noe som er en alpha. Jeg er kommet dit at det sender greit, men jeg mangler litt overstyring (bl.a. muligheten til å overstyre default telefonnummer).
       
      I event

       
      2019-04-27: Nå også med muligheten til å hente inn telefonnummeret som det skal mottas fra i teksten på en annen enhet (device).
      Man kan plukke enhet.
      Velge om man skal ta teksten som
      As Is - som den er
      PlanyoFormat - eget format (47) 12345678
      RegEx - Regulært uttrykk
       

       
      Config
      Nytt fra 2019-04-27 er at man kan velge å legge inn alphanumeric id som avsender. Man kan f.eks. ha HomeSeer som avsender.
      Krav til alphanumeric id: Max 11 tegn. Kun A-Z, a-z, 1-9 og <space>. Man kan ikke ha kun tall for å spoofe andre nummer
      Resend guard - beskytter deg mot å sende samme melding mer enn en gang over gitt periode. Her har jeg selv satt den til 2 minutter. Så hvis det kommer en eksakt lik melding til samme mottaker og den allerede er sendt for 2 minutter siden eller mindre så sendes ikke ny.
       

       
       
       
      Videre planer:
      <ingen for øyeblikket> Kunne overstyre default receivers når man legger inn event. Kunne sette en levetid på sms slik at hvis den ikke blir sendt på første forsøk så prøves inntil sms blir sendt eller angitt levetid er over.  
      Jeg er åpen for innspill hvis noen ser noen mangler.
       
       
      HSPI_TwilioSeer_1.0.7069.32266.zip
       
       
×