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

SCRIPT: Sjekk postleveranse


Moskus

Anbefalte innlegg

Et script som sjekker når du får levert post.

1. Du trenger en referanse til Newtonsoft.Json i ScriptingReferences.

2. Du trenger en virtuell device uten knapper eller statuser.

3. Du trenger en konto hos MyBring, du kan opprette gratis her (du trenger ikke firmanavn): https://www.mybring.com/signup/register/user

4. En API-key som du finner på denne siden: https://www.mybring.com/useradmin/account/settings/api

 

Kjør dette scriptet ved midnatt:

    Sub Main(ByVal params As Object)
        Dim devRef As Integer = DIN_DEVICEREF_HER
        Dim postnummer As Integer = DITT_POSTNUMMER_HER
        Dim mybring_email As String = "DIN@EPOSTADRESSE.HER"
        Dim mybring_key As String = "DIN_KEY_FRA_MYBRING"


        Dim url As String = "https://api.bring.com/address/api/no/postal-codes/" & postnummer & "/mailbox-delivery-dates"
        Dim source As String = ""
        Try
            Using client As New System.Net.WebClient
                Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls12
                client.Headers.Add("x-mybring-api-uid", mybring_email)
                client.Headers.Add("x-mybring-api-key", mybring_key)
                client.BaseAddress = url
                source = client.DownloadString(url)
            End Using

            Dim json As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(source)

            Dim nestePost As String = json.item("delivery_dates").item(0).ToString
            Dim nestePostDato As Date = DateTime.Parse(nestePostDato)
            Dim dagerTilPost As Integer = nestePostDato.Date.Subtract(Now.Date).Days

            Dim output As String = ""
            For i As Integer = 0 To json("delivery_dates").Count - 1
                Dim currentDate As Date = DateTime.Parse(json.item("delivery_dates").item(i))
                output &= GetDateDescription(currentDate) & "<br>"
            Next

            hs.SetDeviceValueByRef(devRef, dagerTilPost, True)
            hs.SetDeviceString(devRef, output, False)
        Catch ex As Exception
            hs.SetDeviceValueByRef(devRef, -1, True)
            hs.SetDeviceString(devRef, "Feil: " & ex.Message, False)
        End Try
    End Sub

    Function GetDateDescription(ByVal nextDate As Date)
        Dim dagerTilPost As Integer = nextDate.Date.Subtract(Now.Date).Days
        If dagerTilPost = 0 Then
            Return "I dag"
        ElseIf dagerTilPost = 1 Then
            Return "I morgen"
        Else
            Return nextDate.ToString("dddd d. MMM")
        End If
    End Function

 

 

Devicen vil da se slik ut:

image.png

 

Device Value er antall dager til postleveranse. "0" betyr da at posten blir levert i dag, kan f.eks. brukes som trigger til noe. :) 

 

 

EDIT: Takk til @daniel.h.iversen som fant ut at Posten har oppdaget at 2020 var i fjor. 👍

EDIT2: Takk til @DeVille som fant ut at siste 1 skal erstattes med 9.

EDIT3: Takk til @ZoRaC for sin oppdatering etter API-omleggingen hos Posten versjon som jeg bygget litt videre på.

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

Kjør denne versjonen og post resultatet, så ser vi hva jeg ikke har klart å ta hensyn til. :)

 

    Sub Main(ByVal params As Object)
        Dim devRef As Integer = 3915
        Dim postnummer As Integer = 4026
        Dim url As String = "https://www.posten.no/levering-av-post-2020/_/component/main/1/leftRegion/1?postCode=" & postnummer

        Dim source As String = ""

        Try
            Using client As New System.Net.WebClient
                client.Headers.Add("x-requested-with", "XMLHttpRequest")
                client.BaseAddress = url
                source = client.DownloadString(url)
            End Using

            Dim json = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(source)

            Dim output As String = ""
            For i As Integer = 0 To json("nextDeliveryDays").Count - 2
                output &= json("nextDeliveryDays")(i).ToString & "<br>"
            Next
            output &= json("nextDeliveryDays")(json("nextDeliveryDays").Count - 1).ToString

            'Dim nestePostdag As Date = DateTime.Parse((json("nextDeliveryDays")(0).ToString).Replace("i morgen", "").Replace("i dag", ""))
            'Dim dagerTilPost As Integer = nestePostdag.Date.Subtract(Now.Date).Days
            Dim dagerTilPost as Integer = 0


            hs.SetDeviceValueByRef(devRef, dagerTilPost, True)
            hs.SetDeviceString(devRef, output, False)
        Catch ex As Exception
            hs.SetDeviceValueByRef(devRef, -1, True)
            hs.SetDeviceString(devRef, "Feil: " & ex.Message, False)
        End Try
    End Sub

 

  • Like 1
Lenke til kommentar
Del på andre sider

Jo, men hva er device-stringen? Jeg ser at den kan inneholde tekst som "i dag" eller "i morgen", og derfor fjerner jeg dem før jeg prøver å parse verdien til en dato. Men det ser ut som du har fått noe som ikke har tatt hensyn til, eller at jeg har bommet på en.

 

 

6 minutter siden, Gjelsvik skrev:

Vet ikke om det er relevant, men om jeg forsøker url`n i nettleser, så får jeg bare en hvit side. (med riktig postnummer i url)

Det stemmer, det er fordi man må legge til headeren "x-requested-with:XMLHttpRequest".

Lenke til kommentar
Del på andre sider

Ai, da. Det er jo det samme jeg skulle ha, det hadde jeg trodd skulle fungere. :(

Da er det mulig jeg må sende CultureInfo.

 

Prøv dette, da. :)

 

    Sub Main(ByVal params As Object)
        Dim devRef As Integer = 3915
        Dim postnummer As Integer = 4026
        Dim url As String = "https://www.posten.no/levering-av-post-2020/_/component/main/1/leftRegion/1?postCode=" & postnummer

        Dim source As String = ""

        Try
            Using client As New System.Net.WebClient
                client.Headers.Add("x-requested-with", "XMLHttpRequest")
                client.BaseAddress = url
                source = client.DownloadString(url)
            End Using

            Dim json = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(source)

            Dim output As String = ""
            For i As Integer = 0 To json("nextDeliveryDays").Count - 2
                output &= json("nextDeliveryDays")(i).ToString & "<br>"
            Next
            output &= json("nextDeliveryDays")(json("nextDeliveryDays").Count - 1).ToString

            Dim nestePostdag As Date = DateTime.Parse((json("nextDeliveryDays")(0).ToString.ToLower).Replace("i morgen", "").Replace("i dag", ""), New System.Globalization.CultureInfo("nb-NO"))
            Dim dagerTilPost As Integer = nestePostdag.Date.Subtract(Now.Date).Days

            hs.SetDeviceValueByRef(devRef, dagerTilPost, True)
            hs.SetDeviceString(devRef, output, False)
        Catch ex As Exception
            hs.SetDeviceValueByRef(devRef, -1, True)
            hs.SetDeviceString(devRef, "Feil: " & ex.Message, False)
        End Try
    End Sub

 

 

... da skal "value" bli 1.

  • Thanks 1
Lenke til kommentar
Del på andre sider

Hei!

Denne bør også fungere i HS4? Jeg er ikke veldig stø i dette ennå, men fikk lagt inn scriptet og knyttet det til en event. Når jeg kjører eventen, kjører scriptet, men det skjer ingenting med devicen jeg har opprettet. Ser heller ingen feil i loggen. Mulig jeg har oversett ett eller annet, og i så fall mistenker jeg at det gjelder oppsettet av den virtuelle devicen. Usikker på hvordan man oppretter en slik "uten knapper eller statuser" (slik det står i første post). Noen som har tips til løsning?

Lenke til kommentar
Del på andre sider

hs.SetDeviceString burde gjøre jobben uansett, hvis ikke den fungerer, så er det mye som burde fungere.

 

Men du kan jo prøve å kjøre dette miniscriptet:

hs.SetDeviceString(DIN_DEV_REF,  "Dette er en test", True)

Lenke til kommentar
Del på andre sider

Tusen takk for god hjelp!

Joda, det fungerer faktisk glimrende... det gjorde det hele vanskeligere å forstå...

 

Men når jeg nå ser i loggen (mulig jeg hadde på et filter tidligere siden jeg ikke så den da); så ser jeg (etter å ha kjørt Posten-scriptet): 

 

Compiling script posten.vb: 'Newtonsoft' is not declared. It may be inaccessible due to its protection level.

og Compiling script posten.vb: Namespace or type specified in the Imports 'System.Core' doesn't contain any public member or cannot be found. Make sure the namespace or the type is defined and contains at least one public member. Make sure the imported element name doesn't use any aliases.

 

Jeg har lagt til i settings.ini (nder ScriptingReferences:

Newtonsoft.Json;C:\Program Files (x86)\HomeSeer HS3\Bin\homeseer\Newtonsoft.Json.dll

Jeg har også sjekket at dll'en ligger i stien over (har oppgradert fra HS3, derfor hs3 i stien). Noe mer jeg bør gjøre i forbindelse med denne dll'en?

Lenke til kommentar
Del på andre sider

Desverre, @ZoRaC. har forsøkt det også. Ingen forskjell. Det virker nesten ikke som om ScriptingReferences-linja blir lest inn... 

 

Den ser for øvrig slik ut. Linja ligger nederst i [Settings] seksjonen.

ScriptingReferences=System.Core;System.Core.dll;System.Net;System.Net.dll;Newtonsoft.Json;"C:\Program Files (x86)\HomeSeer HS3\Bin\homeseer\Newtonsoft.Json.dll"

ini-fila blir lest inn og skrevet til ved hver oppstart av HS, så jeg vet at det er rett fil.

Lenke til kommentar
Del på andre sider

Ja, fila ligger der, men jeg har også flere andre newtonsoft.dll-filer på maskinen. Et søk ga faktisk over 120 eksemplarer. Noen ligger i andre plug-ins mapper (eks. DoorBird og Z-Wave), Ettersom jeg også har Nuget installert, er det noen eksemplarer under der. Noen ligger under Visual Studio. Den jeg peker på i ini-fila er på 474 KB. Noen er på 514, 478 og 457. Tror du jeg peker på feil versjon? 

Lenke til kommentar
Del på andre sider

Ser forøvrig også at Newtonsoft er definert i HS4.exe.config:

 

<dependentAssembly>
          <assemblyIdentity name="Newtonsoft.Json"
                    publicKeyToken="30ad4fe6b2a6aeed"	/>
          <codeBase version="12.0.0.0"
                href="bin/homeseer/Newtonsoft.Json.dll" />
          <codeBase version="8.0.0.0"
                href="bin/Z-Wave/Newtonsoft.Json.dll" />
</dependentAssembly>

Men jeg aner ikke om det har noe å si...

Lenke til kommentar
Del på andre sider

39 minutes ago, nilst said:

Desverre, @ZoRaC. har forsøkt det også. Ingen forskjell. Det virker nesten ikke som om ScriptingReferences-linja blir lest inn... 

 

Den ser for øvrig slik ut. Linja ligger nederst i [Settings] seksjonen.


ScriptingReferences=System.Core;System.Core.dll;System.Net;System.Net.dll;Newtonsoft.Json;"C:\Program Files (x86)\HomeSeer HS3\Bin\homeseer\Newtonsoft.Json.dll"

ini-fila blir lest inn og skrevet til ved hver oppstart av HS, så jeg vet at det er rett fil.

 

Min Scriptingsreferences linje har semikolon for å skille "tjeneste-" og "dll-" parene og komma mellom hvert par. Ser ut som at du har semikolon hele veien.

Altså slik: (farget hvert par for å gjøre det lesbart) Hva om du gjør om på dette?

 

scriptingreferences.PNG

  • Like 1
Lenke til kommentar
Del på andre sider

2 minutter siden, Gjelsvik skrev:

 

Min Scriptingsreferences linje har semikolon for å skille "tjeneste-" og "dll-" parene og komma mellom hvert par. Ser ut som at du har semikolon hele veien.

Altså slik: (farget hvert par for å gjøre det lesbart) Hva om du gjør om på dette?

 

scriptingreferences.PNG

 

Fantastisk!

 

Der forsvant feilmeldingene gitt! Ble riktignok erstattet av en ny: Compiling script posten.vb: Illegal characters in path.

Men det er nok noe annet.

 

Tusen takk for god hjelp så langt!

 

Lenke til kommentar
Del på andre sider

  • 4 uker senere...

Noen som har testet på Linux?

Får bare en devicestring som denne:

Sitat

Exception has been thrown by the target of an invocation.


 

EDIT:

Måtte endre litt på denne for at det skulle funke:

Sitat

Dim output As String = json.item("nextDeliveryDays").item(0).tostring

 

Endret av ZoRaC
  • Like 1
Lenke til kommentar
Del på andre sider

  • 4 uker senere...
På 27.7.2020 den 12.30, Moskus skrev:

Du trenger en referanse til Newtonsoft.Json i ScriptingReferences.

 

Oi, hva har jeg gjort galt nå da?

 

Sitat

sep-16 08.31.31 ErrorCompiling script C:\Program Files (x86)\HomeSeer HS3\scripts\moskus-pat.vb: Newtonsoft er ikke deklarert. Den kan være utilgjengelig på grunn av beskyttelsesnivået.

sep-16 08.31.31 ErrorCompiling script C:\Program Files (x86)\HomeSeer HS3\scripts\moskus-pat.vb: Navneområdet eller typen som er angitt i importene System.Core, inneholder ikke noe felles medlem eller finnes ikke. Kontroller at navneområdet eller typen er definert og inneholder minst ett felles medlem. Kontroller at det importerte elementnavnet ikke bruker noen aliaser.

 

 

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.