Gå til innhold
  • Bli medlem
Moskus

SCRIPT: EnTur.vb - Få inn data fra EnTur

Anbefalte innlegg

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)

  1. Gå til en-tur.no
  2. Tast inn stoppesteder til og fra
  3. Kopier URL'en fra nettleseren etter søket (f.eks. som denne) inn URLdecoder.org for å gjøre den lettere å lese.
  4. 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.

 

image.png

 

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å.

 

  1. Lukk HS3.
  2. Åpne settings.ini
  3. Finn linjen som begynner med ScriptingReference=
  4. 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:

Spoiler

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Imports System.Collections.Generic

'Moskus 2019
'Besøk https://en-tur.no for å finne stop-ider og quay-ider

Sub CallsFromStopplace(parm As Object)
     Dim input() As String = parm.ToString.Split(",")
     Dim deviceRef As Integer = input(0).Trim
     Dim stop1 As String = input(1).Trim
     Dim quay As String = ""
     Dim entries As Integer = 5
     If input.GetLength(0) > 2 Then quay = input(2).Trim
     If input.GetLength(0) = 4 Then entries = input(3).Trim
 
     Dim list As List(Of EstimatedCall) = GetCallsFromStopPlace(stop1, quay, entries)
     Dim out As String = ""
 
     For Each c As EstimatedCall In list
         out &= c.ToString & "<br>"
     Next
     Dim minutesToNextDeparture As Integer = list(0).expectedArrivalTime.Subtract(Now).TotalMinutes
 
     hs.SetDeviceString(deviceRef, out, False)
     hs.SetDeviceValueByRef(deviceRef, minutesToNextDeparture, True)


End Sub

Sub TripsBetweenStops(parm As Object)
     Dim input() As String = parm.ToString.Split(",")
     Dim deviceRef As Integer = input(0).Trim
     Dim stop1 As String = input(1).Trim
     Dim stop2 As String = input(2).Trim
     Dim entries As Integer = 5
     If input.GetLength(0) = 4 Then entries = input(3).Trim
 
 
     Dim list As List(Of Trippattern) = GetTripBetweenStops(stop1, stop2, entries)
     Dim out As String = ""
 
     For Each c As Trippattern In list
         out &= c.ToString & "<br>"
     Next
     Dim minutesToNextDeparture As Integer = list(0).startTime.Subtract(Now).TotalMinutes
 
     hs.SetDeviceString(deviceRef, out, False)
     hs.SetDeviceValueByRef(deviceRef, minutesToNextDeparture, True)

End Sub

Private Function RunQuery(ByVal jsonQuery As String) As String
     Dim url As String = "https://api.entur.io/journey-planner/v2/graphql"
 
     Using client As New System.Net.WebClient
         client.Headers.Add("ET-Client-Name", "Moskus-InfoplakatForHomeseer")
         client.Headers.Add("User-Agent", "EnTur-script by Moskus")
         client.Headers.Add("Content-Type", "application/graphql")
         client.Encoding = System.Text.Encoding.UTF8
         client.BaseAddress = url
 
         Return client.UploadString(url, "POST", jsonQuery)
     End Using
End Function

Private Function GetCallsFromStopPlace(ByVal _stop As String, Optional ByVal _quay As String = "", Optional ByVal entries As Integer = 5) As List(Of EstimatedCall)
     Dim jsonQuery As String = "{stopPlace(id: """ & _stop & """) {id name estimatedCalls(startTime: """ & Now.ToString("yyyy-MM-ddTHH:mm:sszzz") & """, timeRange: 72100, numberOfDepartures: " & (entries * 2 + 2) & "){ realtime aimedArrivalTime expectedArrivalTime destinationDisplay {frontText} quay {id} serviceJourney {journeyPattern {line {id name transportMode}}}}}}"
 
     Dim result As String = RunQuery(jsonQuery)
     Dim enTurJson As EnTur = Newtonsoft.Json.JsonConvert.DeserializeObject(Of EnTur)(result)
 
     Dim lst As New List(Of EstimatedCall)
     Dim count As Integer = 0
     For Each e As EstimatedCall In enTurJson.data.stopPlace.estimatedCalls
         If _quay <> "" Then
             If e.quay.id = _quay Then
                 lst.Add(e)
                 count += 1
             End If
         Else
             lst.Add(e)
             count += 1
         End If
         If count = entries Then Exit For
     Next
     Return lst
End Function

Private Function GetTripBetweenStops(ByVal stop1 As String, ByVal stop2 As String, Optional ByVal entries As Integer = 5) As List(Of Trippattern)
     Dim jsonQuery As String = "{trip(from:{place: """ & stop1 & """} to: {place: """ & stop2 & """} modes: [bus] numTripPatterns: " & entries & ") { tripPatterns { startTime endTime duration walkDistance legs {mode distance line {id publicCode name } }}}}"

     Dim result As String = RunQuery(jsonQuery)
     Dim enTurJson As EnTur = JsonConvert.DeserializeObject(Of EnTur)(result)

     Return enTurJson.data.trip.tripPatterns
End Function

Sub Main(parm As Object)
'    hs.Writelog("EnTur", GetCallsFromStopPlace("NSR:StopPlace:27753"))
'   Dim list As List(Of EstimatedCall) = GetCallsFromStopPlace("NSR:StopPlace:27753", "NSR:Quay:47785")
    
    Dim list As List(Of Trippattern) = GetTripBetweenStops("NSR:StopPlace:59854", "NSR:StopPlace:27753")

    Dim out As String = ""
     For Each c As Trippattern In list
         out &= c.ToString & "<br>"
     Next

    hs.WriteLog("EnTur", out)
End Sub

Public Class EnTur
    Private _data As Data
    Public Property data() As Data
        Get
             Return _data
        End Get
        Set(Byval value As Data )
             _data = value
        End Set
    End Property
End Class

Public Class Data
    Private _stopPlace As Stopplace
    Public Property stopPlace() As Stopplace
        Get
             Return _stopPlace
        End Get
        Set(Byval value As Stopplace )
             _stopPlace = value
        End Set
    End Property
    Private _trip As Trip
    Public Property trip() As Trip
        Get
             Return _trip
        End Get
        Set(Byval value As Trip )
             _trip = value
        End Set
    End Property

End Class

Public Class Stopplace
    Private _id As String
    Public Property id() As String
        Get
             Return _id
        End Get
        Set(Byval value As String )
             _id = value
        End Set
    End Property
    Private _name As String
    Public Property name() As String
        Get
             Return _name
        End Get
        Set(Byval value As String )
             _name = value
        End Set
    End Property
    Private _estimatedCalls As List(Of EstimatedCall)
    Public Property estimatedCalls() As List(Of EstimatedCall)
        Get
             Return _estimatedCalls
        End Get
        Set(Byval value As List(Of EstimatedCall) )
             _estimatedCalls = value
        End Set
    End Property
End Class

Public Class EstimatedCall
    Private _realtime As Boolean
    Public Property realtime() As Boolean
        Get
             Return _realtime
        End Get
        Set(Byval value As Boolean )
             _realtime = value
        End Set
    End Property
    Private _aimedArrivalTime As Date
    Public Property aimedArrivalTime() As Date
        Get
             Return _aimedArrivalTime
        End Get
        Set(Byval value As Date )
             _aimedArrivalTime = value
        End Set
    End Property
    Private _aimedDepartureTime As Date
    Public Property aimedDepartureTime() As Date
        Get
             Return _aimedDepartureTime
        End Get
        Set(Byval value As Date )
             _aimedDepartureTime = value
        End Set
    End Property
    Private _expectedArrivalTime As Date
    Public Property expectedArrivalTime() As Date
        Get
             Return _expectedArrivalTime
        End Get
        Set(Byval value As Date )
             _expectedArrivalTime = value
        End Set
    End Property
    Private _expectedDepartureTime As Date
    Public Property expectedDepartureTime() As Date
        Get
             Return _expectedDepartureTime
        End Get
        Set(Byval value As Date )
             _expectedDepartureTime = value
        End Set
    End Property
    Private _actualArrivalTime As Object
    Public Property actualArrivalTime() As Object
        Get
             Return _actualArrivalTime
        End Get
        Set(Byval value As Object )
             _actualArrivalTime = value
        End Set
    End Property
    Private _actualDepartureTime As Object
    Public Property actualDepartureTime() As Object
        Get
             Return _actualDepartureTime
        End Get
        Set(Byval value As Object )
             _actualDepartureTime = value
        End Set
    End Property
    Private __date As String
    Public Property _date() As String
        Get
             Return __date
        End Get
        Set(Byval value As String )
             __date = value
        End Set
    End Property
    Private _forBoarding As Boolean
    Public Property forBoarding() As Boolean
        Get
             Return _forBoarding
        End Get
        Set(Byval value As Boolean )
             _forBoarding = value
        End Set
    End Property
    Private _forAlighting As Boolean
    Public Property forAlighting() As Boolean
        Get
             Return _forAlighting
        End Get
        Set(Byval value As Boolean )
             _forAlighting = value
        End Set
    End Property
    Private _destinationDisplay As Destinationdisplay
    Public Property destinationDisplay() As Destinationdisplay
        Get
             Return _destinationDisplay
        End Get
        Set(Byval value As Destinationdisplay )
             _destinationDisplay = value
        End Set
    End Property
    Private _quay As Quay
    Public Property quay() As Quay
        Get
             Return _quay
        End Get
        Set(Byval value As Quay )
             _quay = value
        End Set
    End Property
    Private _serviceJourney As Servicejourney
    Public Property serviceJourney() As Servicejourney
        Get
             Return _serviceJourney
        End Get
        Set(Byval value As Servicejourney )
             _serviceJourney = value
        End Set
    End Property

    Public Overrides Function ToString() As String
         Return Me.expectedArrivalTime.ToString("HH:mm") & " (" & Me.aimedArrivalTime.ToString("HH:mm") & ")" & ": " & Me.serviceJourney.journeyPattern.line.name & " " & Me.destinationDisplay.frontText
    End Function

    Public Shared Sub ToFile(ByVal calls As List(Of EstimatedCall), ByVal filename As String)
         If calls.Count = 0 Then Exit Sub
 
         Dim sb As New Text.StringBuilder
         'FEILER
         'calls.ForEach(Sub(x) sb.AppendLine(x.ToString))
         My.Computer.FileSystem.WriteAllText(Environment.CurrentDirectory & "\" & filename, sb.ToString, False)
    End Sub
End Class

Public Class Destinationdisplay
    Private _frontText As String
    Public Property frontText() As String
        Get
             Return _frontText
        End Get
        Set(Byval value As String )
             _frontText = value
        End Set
    End Property
End Class

Public Class Quay
    Private _id As String
    Public Property id() As String
        Get
             Return _id
        End Get
        Set(Byval value As String )
             _id = value
        End Set
    End Property
    Private _name As String
    Public Property name() As String
        Get
             Return _name
        End Get
        Set(Byval value As String )
             _name = value
        End Set
    End Property
End Class

Public Class Servicejourney
    Private _journeyPattern As Journeypattern
    Public Property journeyPattern() As Journeypattern
        Get
             Return _journeyPattern
        End Get
        Set(Byval value As Journeypattern )
             _journeyPattern = value
        End Set
    End Property
End Class

Public Class Journeypattern
    Private _line As Line
    Public Property line() As Line
        Get
             Return _line
        End Get
        Set(Byval value As Line )
             _line = value
        End Set
    End Property
End Class

Public Class Line
    Private _id As String
    Public Property id() As String
        Get
             Return _id
        End Get
        Set(Byval value As String )
             _id = value
        End Set
    End Property
    Private _name As String
    Public Property name() As String
        Get
             Return _name
        End Get
        Set(Byval value As String )
             _name = value
        End Set
    End Property
    Private _transportMode As String
    Public Property transportMode() As String
        Get
             Return _transportMode
        End Get
        Set(Byval value As String )
             _transportMode = value
        End Set
    End Property
    Private _publicCode As String
    Public Property publicCode() As String
        Get
             Return _publicCode
        End Get
        Set(Byval value As String )
             _publicCode = value
        End Set
    End Property
End Class


Public Class Trip
    Private _tripPatterns As List(Of Trippattern)
    Public Property tripPatterns() As List(Of Trippattern)
        Get
             Return _tripPatterns
        End Get
        Set(Byval value As List(Of Trippattern) )
             _tripPatterns = value
        End Set
    End Property
End Class

Public Class Trippattern
    Private _startTime As Date
    Public Property startTime() As Date
        Get
             Return _startTime
        End Get
        Set(Byval value As Date )
             _startTime = value
        End Set
    End Property
    Private _endTime As Date
    Public Property endTime() As Date
        Get
             Return _endTime
        End Get
        Set(Byval value As Date )
             _endTime = value
        End Set
    End Property
    Private _duration As Integer
    Public Property duration() As Integer
        Get
             Return _duration
        End Get
        Set(Byval value As Integer )
             _duration = value
        End Set
    End Property
    Private _walkDistance As Double
    Public Property walkDistance() As Double
        Get
             Return _walkDistance
        End Get
        Set(Byval value As Double )
             _walkDistance = value
        End Set
    End Property
    Private _legs As List(Of Leg)
    Public Property legs() As List(Of Leg)
        Get
             Return _legs
        End Get
        Set(Byval value As List(Of Leg) )
             _legs = value
        End Set
    End Property

    Public Overrides Function ToString() As String
        Return Me.startTime.ToString("HH:mm") & " → " & Me.endTime.ToString("HH:mm") & ":  Rute " & Me.legs(0).line.name
    End Function

    Public Shared Sub ToFile(ByVal calls As List(Of Trippattern), ByVal filename As String)
        If calls.Count = 0 Then Exit Sub

        Dim sb As New Text.StringBuilder
        'FEILER
        ' calls.ForEach(Sub(x) sb.AppendLine(x.ToString))
        My.Computer.FileSystem.WriteAllText(Environment.CurrentDirectory & "\" & filename, sb.ToString, False)
    End Sub
End Class

Public Class Leg
    Private _mode As String
    Public Property mode() As String
        Get
             Return _mode
        End Get
        Set(Byval value As String )
             _mode = value
        End Set
    End Property
    Private _distance As Single
    Public Property distance() As Single
        Get
             Return _distance
        End Get
        Set(Byval value As Single )
             _distance = value
        End Set
    End Property
    Private _line As Line
    Public Property line() As Line
        Get
             Return _line
        End Get
        Set(Byval value As Line )
             _line = value
        End Set
    End Property
End Class

 

 

 

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)

 

image.png

 

image.png

 

 

 

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).

 

image.png

 

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

 

image.png

 

 

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. :) 

 

image.png

 

 

EDIT: Oppdatert juli 2019 pga. flytting av URL for EnTur APIet. Gjeldene URL er nå: https://api.entur.io/journey-planner/v2/graphql

  • Like 3

Del dette innlegget


Lenke til innlegg
Del på andre sider
20 hours ago, Moskus said:

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å.

 

  1. Lukk HS3.
  2. Åpne settings.ini
  3. Finn linjen som begynner med ScriptingReference=
  4. 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

 

 

I min HS3 installasjon på Windows, finner jeg ikke noen linje med "ScriptingReference=" i filen ..\HomeSeer HS3\Config\settings.ini. Synes det var litt snålt. Kjører jo vb script. Er det fordi HS3 finner det den trenger til vanlig i path?

Del dette innlegget


Lenke til innlegg
Del på andre sider

Ja, det synes jeg også er snålt... Men du kan legge den til, rett under [settings]

 

image.png

Del dette innlegget


Lenke til innlegg
Del på andre sider

Tester scripet. Men får feilmelding:

 

Running script C:\Program Files (x86)\HomeSeer HS3\scripts\EnTur.vb :Exception has been thrown by the target of an invocation.->Does entry point CallsFromStopplace exist in script? at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at Scheduler.clsRunVBNetScript.ExecuteScript()

 

 

EDIT: Glem det, glemte "NSR:" foran Quay nummeret.

Endret av GeneralVirus

Del dette innlegget


Lenke til innlegg
Del på andre sider

Scriptet funger flott. Veldig kjekt å slippe å ta opp mobilen for å sjekke hvor mye bussen er forsinket i dag :)  En annen ting, hvordan takler dere norske "spesialtegn" i device staus? Blir det rotete fordi Windows er på engelsk?

542515766_Screenshotfrom2019-01-1512-55-09.png.a896615c13603aa8522cb266ac1b9d35.png

Del dette innlegget


Lenke til innlegg
Del på andre sider

Ai... webencoding, ja. Sannsynligvis bare å konfigurere webclient riktig. Jeg skal sjekke. Hvilket stoppested er det?

 

EDIT: Sannsynligvis holder med  å bare bruke UTF8. Legg til 

client.Encoding = System.Text.Encoding.UTF8

Mellom using-kodene i RunQuery, evt. bare erstatt hele greia (dvs kun RunQuery) med koden under:

Private Function RunQuery(ByVal jsonQuery As String) As String
     Dim url As String = "https://api.entur.org/journeyplanner/2.0/index/graphql"
 
     Using client As New System.Net.WebClient
         client.Headers.Add("ET-Client-Name", "Moskus-InfoplakatForHomeseer")
         client.Headers.Add("User-Agent", "EnTur-script by Moskus")
         client.Headers.Add("Content-Type", "application/graphql")
         client.Encoding = System.Text.Encoding.UTF8
         client.BaseAddress = url
 
         Return client.UploadString(url, "POST", jsonQuery)
     End Using
End Function

 

 

Sjekker du før jeg oppdaterer førstepost?

Del dette innlegget


Lenke til innlegg
Del på andre sider

Funker fint dette! Takk @Moskus

 

Ser EnTur apiet kaller rutene her merkelige navn, bruker xxxxxx-xxxxxxx-xxxxxxx isteden for rute nummeret. Litt irriterende.

 

Og ja, mye æøå feil her også :(

Endret av GeneralVirus

Del dette innlegget


Lenke til innlegg
Del på andre sider
2 minutter siden, GeneralVirus skrev:

Og ja, mye æøå feil her også :(

Sjekk posten over din og rapporter tilbake. :) 

Del dette innlegget


Lenke til innlegg
Del på andre sider

Dette er sanntid:

image.png

 

Klokkeslettet i parentes er passeringstidspunktet ihht tabell. Det foran er det reelle.

Del dette innlegget


Lenke til innlegg
Del på andre sider

@Moskus Jeg endret scriptet til å bruke "publiCode" fra apiet istedenfor "name"? Det er vist rutenummeret og brukes som oftest i avgangstavler sammen med frontText. Ble penere for meg da :)

Del dette innlegget


Lenke til innlegg
Del på andre sider
11 timer siden, GeneralVirus skrev:

@Moskus Jeg endret scriptet til å bruke "publiCode" fra apiet istedenfor "name"? Det er vist rutenummeret og brukes som oftest i avgangstavler sammen med frontText. Ble penere for meg da :)

Hvor? Kan du være litt mer spesifikk? :) 

Del dette innlegget


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

Hvor? Kan du være litt mer spesifikk? :) 

Endret først denne å la til publicCode

 

    Dim jsonQuery As String = "{stopPlace(id: """ & _stop & """) {id name estimatedCalls(startTime: """ & Now.ToString("yyyy-MM-ddTHH:mm:sszzz") & """, timeRange: 72100, numberOfDepartures: " & (entries * 2 + 2) & "){ realtime aimedArrivalTime expectedArrivalTime destinationDisplay {frontText} quay {id} serviceJourney {journeyPattern {line {id name publicCode transportMode}}}}}}"

Så denne for å endre hva som legges i HS devicen.

 

     Return Me.expectedArrivalTime.ToString("HH:mm") & " (" & Me.aimedArrivalTime.ToString("HH:mm") & ")" & ": Rute " & Me.serviceJourney.journeyPattern.line.publicCode & " " & Me.destinationDisplay.frontText

 

Del dette innlegget


Lenke til innlegg
Del på andre sider
16 hours ago, GeneralVirus said:

@Moskus Jeg endret scriptet til å bruke "publiCode" fra apiet istedenfor "name"? Det er vist rutenummeret og brukes som oftest i avgangstavler sammen med frontText. Ble penere for meg da :)

 

Jeg likte også den bedre. Rutenummer og kortere navn gir bedre info og penere visning. Takk for tipset.

Del dette innlegget


Lenke til innlegg
Del på andre sider

Ja, det er godt mulig, jeg har jo kun testet de jeg selv har bruk for. Kan gjøre endringen i hovedscriptet øverst. :) 

Del dette innlegget


Lenke til innlegg
Del på andre sider

Win10 og får ikke kjørt. Forslag? Har satt opp ScriptingReference som forklart.

 

jan-17 00.16.04   Error Compiling script C:\Program Files (x86)\HomeSeer HS3\scripts\EnTur.vb: 'Trim' is not a member of 'String'.
jan-17 00.16.04   Error Compiling script C:\Program Files (x86)\HomeSeer HS3\scripts\EnTur.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.

Del dette innlegget


Lenke til innlegg
Del på andre sider
8 timer siden, iceball skrev:
jan-17 00.16.04   Error Compiling script C:\Program Files (x86)\HomeSeer HS3\scripts\EnTur.vb: 'Trim' is not a member of 'String'.

Wow! 😮

 

Trim er en standardfunksjon i .NET, ligger under String, og har vært i .NET siden versjon 1.0. Du kan evt. prøve å søk&erstatte alle ".Trim" med ".Trim()", men VB.net trenger ikke parenteser slik som C# gjør.

Del dette innlegget


Lenke til innlegg
Del på andre sider
29 minutter siden, Moskus skrev:

Wow! 😮

 

Trim er en standardfunksjon i .NET, ligger under String, og har vært i .NET siden versjon 1.0. Du kan evt. prøve å søk&erstatte alle ".Trim" med ".Trim()", men VB.net trenger ikke parenteser slik som C# gjør.

Synes stadig at det er noe smårart med serveren min.

Vel, prøvde å endre, ny feilmelding 😏

 

1   Error 3 Running script C:\Program Files (x86)\HomeSeer HS3\scripts\EnTur.vb :Exception has been thrown by the target of an invocation.->Does entry point CallsFromStopplace exist in script? at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at Scheduler.clsRunVBNetScript.ExecuteScript()

Del dette innlegget


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

Does entry point CallsFromStopplace exist in script?

Yes, it does.

 

Har du prøvd å kopiere scriptet en gang til? Kan være du har fått med noen tegn som ikke burde være der.

 

Evt. .NET Repair Tool:

https://www.microsoft.com/en-us/download/details.aspx?id=30135

Del dette innlegget


Lenke til innlegg
Del på andre sider

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Fjern formatering

  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.


  • Lignende innhold

    • Av Moskus
      Nå kan du endelig få endre trigger-tiden til dine eventer med noen enkle tastetrykk! Det fungerer fint på websiden, HStouch og HS Mobile.  
       
      Vi har alle eventer som går av på et visst tidspunkt. F.eks. vekkerklokker. Av og til vil man enkelt kunne endre tiden på vekkerklokken uten å måtte navigere til Event-siden og finne selve eventet. Kanskje vil man at ungene skal kunne gjøre det, etc.
       
      Med dette scriptet får du en device som dette:
      ... som lar deg endre klokkeslettet på et event.
       
      Her er scriptet (vær nøye med filnavnet, det må være riktig):
      TimeDevice.vb
      Public Sub Main(ByVal input As Object) 'Moskus 2019 '----------------------------- 'The Main sub will update 'DeviceRef,NewTime 'Example: 3245,13:00 -> will set device 3245 to 13:00 and the event to trigger at 13:00 '----------------------------- Dim deviceRef As Integer = input.ToString.Split(",")(0) Dim timeString As String = input.ToString.Split(",")(1) Dim _time As TimeSpan = TimeSpan.Parse(timeString) UpdateDeviceAndEvent(deviceRef, _time) End Sub Public Sub CreateDevice() Dim deviceRef As Integer = hs.NewDeviceRef("Klokkekontroll") Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(deviceRef) dev.Location(hs) = "Klokke" dev.Location2(hs) = "Klokke" dev.Device_Type_String(hs) = "Ditt event her" hs.SaveEventsDevices() AddDeviceButtons(deviceRef) Dim _time As New TimeSpan hs.SetDeviceString(deviceRef, _time.ToString("hh\:mm"), False) hs.SetDeviceValueByRef(deviceRef, _time.TotalMinutes, True) End Sub Public Sub ButtonPress(ByVal input As Object) Dim deviceRef As Integer = input(0) Dim parameter As String = input(1) Dim deviceValue As Integer = hs.DeviceValue(deviceRef) Dim minutesToAdd As Integer = Integer.Parse(parameter) Dim newValue As Integer = deviceValue + minutesToAdd If newValue < 0 Then newValue = 24 * 60 + minutesToAdd If newValue > 24 * 60 Then newValue = minutesToAdd Dim _time As TimeSpan = New TimeSpan(0, newValue, 0) UpdateDeviceAndEvent(deviceRef, _time) End Sub Public Sub UpdateDeviceAndEvent(ByVal deviceRef As Integer, ByVal _time As TimeSpan) hs.SetDeviceString(deviceRef, _time.ToString("hh\:mm"), False) hs.SetDeviceValueByRef(deviceRef, _time.TotalMinutes, True) Dim eventName As String = DirectCast(hs.GetDeviceByRef(deviceRef), Scheduler.Classes.DeviceClass).Device_Type_String(hs) Dim eventRef As String = hs.GetEventRefByName(eventName) hs.EventSetTimeTrigger(eventRef, New Date(1, 1, 1).Add(_time)) hs.SaveEventsDevices() End Sub Public Sub AddDeviceButtons(ByVal device_ref As String) Dim devID As Integer = CInt(device_ref) hs.DeviceScriptButton_DeleteAll(devID) hs.DeviceProperty_dvMISC(device_ref, HomeSeerAPI.Enums.eDeviceProperty.MISC_Set, HomeSeerAPI.Enums.dvMISC.SHOW_VALUES) Try hs.WriteLog("TimeDevice.vb", "Added button 1: " & hs.DeviceScriptButton_AddButton(devID, "+5 min", 5, "TimeDevice.vb", "ButtonPress", "+5", 1, 1, 1)) hs.WriteLog("TimeDevice.vb", "Added button 2: " & hs.DeviceScriptButton_AddButton(devID, "-5 min", -5, "TimeDevice.vb", "ButtonPress", "-5", 1, 2, 1)) hs.WriteLog("TimeDevice.vb", "Added button 3: " & hs.DeviceScriptButton_AddButton(devID, "+15 min", 15, "TimeDevice.vb", "ButtonPress", "+15", 1, 3, 1)) hs.WriteLog("TimeDevice.vb", "Added button 4: " & hs.DeviceScriptButton_AddButton(devID, "-15 min", -15, "TimeDevice.vb", "ButtonPress", "-15", 1, 4, 1)) hs.WriteLog("TimeDevice.vb", "Added button 5: " & hs.DeviceScriptButton_AddButton(devID, "+1 time", 60, "TimeDevice.vb", "ButtonPress", "+60", 2, 1, 1)) hs.WriteLog("TimeDevice.vb", "Added button 6: " & hs.DeviceScriptButton_AddButton(devID, "-1 time", -60, "TimeDevice.vb", "ButtonPress", "-60", 2, 2, 1)) Catch ex As Exception hs.WriteLog("TimeDevice.vb", "Error adding buttons: " & ex.Message) End Try End Sub  
      Du trenger først å lage et event som trigger scriptet med rutinen "CreateDevice", slik:

       
      Gå nå til Device Manager-siden. Velg at "Klokke" skal vises, både for "Floor" og "Room". MEN: Du må også huske på å velge ALLE device typer:

       
      Da får du opp den nye devicen. Denne kan du navngi og gi plassering akkurat som det passer deg.
       
      Så skal vi bestemme hvilket event som skal trigges. Navnet sette vi som en "Device Type String" under Advanced-taben. Merk at hele navnet skal brukes, og at det er "Gruppe" + mellomrom + "Event navn". La oss si at jeg vil trigge et test-event som jeg har navngitt "Et timer-event", som her:

       
      Da er hele evnetnavnet mitt: "Test Et timer-event", og det setter vi inn her:

      ... og trykker "Done".
      NB! Når vi nå går tilbake til Device Manager, må vi huske på å vise alle Device Types igjen, fordi den har vi nettopp endret til noe nytt som ikke var valgt før.
       
      Så er det bare å stille klokka.  
      Endrer vi tiden på devicen til dette...

      ... vil eventet også endres:

       
      Det gjør ingenting om eventet ditt har andre conditions, de vil ikke bli påvirket av dette.  
       
       
       
      Scriptet har også en rutine for å endre klokkeslettet med eventer, f.eks. hvis man skal stille tilbake flere  vekkerklokker etter en ferie. 
      Da kaller man bare rutinen/metoden "Main" (eller lar være å spesifisere rutine), og bruker deviceRef og klokkeslett som parameter.
      Dette:

       
      ... gir dette:

      ... og selvfølgelig dette:

       
    • Av clio75
      Hva skal hentes denne uka er et gjentagende SPM hjemme hos oss. 
      Så jeg fant APPEN "Min renovasjon.". Men en app er jo ikke løsningen på noe. For man vil jo ha denne informasjonen inn i homeseer. 
       
      MinRenovasjon.vb
      Sub Main(ByVal parameters As Object) 'Clio75 All Credits to Moskus@hjemmeautomasjon.no 'Inspired and based on Moskus scrip NewsReader.vb Dim DevID As Integer = parameters.ToString.Split("|")(0) Dim KommuneNr As String = parameters.ToString.Split("|")(1) Dim Gatekode As String = parameters.ToString.Split("|")(2) Dim GateNavn As String = parameters.ToString.Split("|")(3) Dim GateNr As String = parameters.ToString.Split("|")(4) 'Setting URL string 'Dim URLGateName as string = URLEncode(GateNavn) ' hs.WriteLog("Soppel Debug", URLGateName ) 'Dim url As String = "https://komteksky.norkart.no/komtek.renovasjonwebapi/api/tommekalender/?kommunenr=0710&gatenavn=bl%C3%A5b%C3%A6rveien&gatekode=45024&husnr=16" 'Sette sammen URL: Dim kommuneURL as string = "kommunenr=" & KommuneNr Dim GateKodeURL as string = "gatekode=" & Gatekode Dim GateNavnURL as string = "gatenavn=" & GateNavn Dim GateNrURL as string = "husnr=" & GateNr Dim url As String = "https://komteksky.norkart.no/komtek.renovasjonwebapi/api/tommekalender/?kommunenr=0710&gatenavn=blåbærveien&gatekode=45024&husnr=16" Dim source As String = "" Try Using client As New System.Net.WebClient 'Sette Headers client.headers.set("Kommunenr", KommuneNr ) client.headers.set("RenovasjonAppKey", "AE13DEEC-804F-4615-A74E-B4FAC11F0A30") Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls12 client.Encoding = System.Text.Encoding.UTF8 source = client.DownloadString(url) End Using Catch ex As Exception hs.WriteLog("Soppel Error", "Net Feil: " & ex.Message) End Try If source = "" Then hs.WriteLog("soppel Error", "Got no response from url: " & url) Exit Sub End If Try Dim json = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(source) Dim numMembers As Integer = 4 Dim DeviceText As String = "" For i As Integer = 0 To numMembers Dim output As String = "" Dim output2 As String = "" output = json(i)("FraksjonId") output2 = json(i)("Tommedatoer")(0) & " Neste :" & json(i)("Tommedatoer")(1) Select Case Output Case "1" output = Replace(output, "1", "<b>Restavfall : </b><br>") Case "2" output = Replace(output, "2", "<b>Papiravfall : </b><br>") Case "3" output = Replace(output, "3", "<b>Matavfall : </b> <br>") Case "4" output = Replace(output, "4", "<b>Glass/Metall : </b><br>") Case "5" output = Replace(output, "5", "<b>Drikkekartonger </b><br>") Case "6" output = Replace(output, "6", "<b>Grovavfall : </b><br>") Case "7" output = Replace(output, "7", "<b>Plastavfall : </b><br>") End Select DeviceText &= "" & output & " " & output2 & "<br>" 'hs.WriteLog("Soppel debug", output & " " & output2 ) Next hs.SetDeviceString(DevID, DeviceText , True) Catch ex As Exception hs.WriteLog("Soppel Error", "Net Feil: " & ex.Message) End Try End Sub Så en event : 
      Parameters : 
      DevieRef | Kommunenummer | Gatenummer | GataNavn | Husnummer
       
      Ser jeg forsatt har manuell trigger i screenshot, men en gang i døgnet burde vel holde i de fleste tilfeller. 

       
      SOM ga meg denne : 
       

       
      Instalering : 
      VeiNummer: 
      For å finne vegnummeret kan du gå inn på https://www.vegvesen.no/vegkart zoom deg inn på vegen din og nærmest mulig huset ditt klikker du på veien, Så finner du de 5 sifferene du trenger(Rødt). 
      Kommune Nummeret var de fire første her i Blått : 0710 

       
      HomeSeer trenger en referanse til Newtonsoft.Json.Dll, det kan du sette opp ved å lese under "Installasjon" i denne tråden: https://www.hjemmeautomasjon.no/forums/topic/4338-script-enturvb-få-inn-data-fra-entur/
       
      Takk Til: 
      Dette hadde jeg ikke klart alene.
       @Moskus skal ha en stor takk for sine delinger av script. Tatt utgangspunktet i hans NewsReader.VB
       @Marhil  Takk for tipset om Min renovasjons app eller hvordan jeg fant Gatenummer
      Og alle de andre som deler kode og eksempler åpnet på nett
       

    • Av Moskus
      Nyheter er viktig, og din bolig burde vite hva som skjer. HStouch kommer med en RSS-leser, men den støtter ikke norske tegn, og fungerer bare når den vil. Ettersom jeg ble lei av det, skrev jeg et lite script for å hente frem nyheter.
       
      NewsReader.vb
      Sub Main(ByVal parameters As Object) 'Moskus 2019 Dim devID As Integer = parameters.ToString.Split("|")(0) Dim url As String = "https://api.rss2json.com/v1/api.json?rss_url=" & System.Net.WebUtility.HtmlEncode(parameters.ToString.Split("|")(1)) Dim source As String = "" Try Using client As New System.Net.WebClient Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls12 client.Encoding = System.Text.Encoding.UTF8 source = client.DownloadString(url) End Using Catch ex As Exception hs.WriteLog("NewsReader Error", "Net Feil: " & ex.Message) End Try If source = "" Then hs.WriteLog("NewsReader Error", "Got no response from url: " & url) Exit Sub End If Try Dim json = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(source) Dim output As String = "" For i As Integer = 0 To 4 output &= "• <b>" & json("items")(i)("title") & "</b><br>" output &= json("items")(i)("description") & "<br><br>" Next hs.SetDeviceString(devID, output, True) Catch ex As Exception hs.WriteLog("NewsReader Error", "Net Feil: " & ex.Message) End Try End Sub HomeSeer trenger en referanse til Newtonsoft.Json.Dll, det kan du sette opp ved å lese under "Installasjon" i denne tråden: https://www.hjemmeautomasjon.no/forums/topic/4338-script-enturvb-få-inn-data-fra-entur/
       
       
      Du trenger en virtuell device per nyhetskilde du vil ha. Ingen controller er viktig, velg "Status Only device" og "Do not log commands from this device".
       
      Så lager du et event. Det kan trigge hvert 15. minutt. Og så legger du til en kjøring av NewsReader.vb for hver nyhetskilde du ønsker deg. Parameter for scriptet er "DEV_ID|http://nyhetskilde.com/rss/", altså device ID, en "pipe" | og kilden. Huk av "Wait for script to finish" og "Only allow a single instance"
       

       
      Da blir resultatet dette:

       
      Her er noen nyhetskilder:
      https://www.aftenbladet.no/rss
      https://www.aftenposten.no/rss
      https://www.nrk.no/toppsaker.rss
      https://www.dagbladet.no/rss/
      https://www.vg.no/rss/feed/?categories=1068&limit=10&format=rss&private=1  - sjekk https://vg.no/rss for å sette opp din egen feed.
       
       
       
    • Av Moskus
      Tegneserier er gøy. Automatiske tegneserier er selvfølgelig enda gøyere. Tidligere var det bare å linke bildet på nettet, men VG ville gjøre det litt vanskeligere for oss. Men det lar seg ordne.
       
      Aller først trenger vi SP_ID'en din. Logg inn på VG (det holder med en gratis-konto), og trykk F12 (eller åpne Developer Console)
      Så finner du "Application" på menyen øverst, finner så cookies, og velger "www.vg.no". Dobbelttrykk på tekstfeltet etter "SP_ID" og kopier hele denne lange, uforståelige teksten til et sted.
       

       
       
       
      NB! Dette scriptet omfatter sletting av filer, og kan potensielt gå ad undas. Det er selvfølgelig testet en del av meg, men som alltid: Ta backup først!
       
      Scriptet er her:
      Tegneserie.vb
      Sub Main(ByVal input As Object) 'Moskus 2019 'Parametre: device_ID|Tegneserie 'Serie-alternativer: Pondus, Lunch, Hjalmar, Tegnehanne Dim devID As String = input.ToString.Split("|")(0) Dim serie As String = input.ToString.Split("|")(1) Dim deleteFiles As Boolean = True Dim SP_ID As String = "DIN_LANGE_SPID_STRENG_HER" Dim directoryName As String = hs.GetAppPath & "/html/images/Tegneserier/" 'Check if "Tegneserier" exits If (Not System.IO.Directory.Exists(directoryName)) Then System.IO.Directory.CreateDirectory(directoryName) 'Delete local files If deleteFiles Then For Each deleteFile As String In System.IO.Directory.GetFiles(directoryName, serie.ToLower & "*.*", System.IO.SearchOption.TopDirectoryOnly) System.IO.File.Delete(deleteFile) Next End If Dim remoteFile As String = "" Dim filename As String = serie.ToLower & "_" & Now.Date.ToString("yyMMdd") & ".jpg" Dim localFile As String = hs.GetAppPath & "/html/images/Tegneserier/" & filename Dim dateFormat As String = Now.Year & "-" & Now.Month.ToString("00") & "-" & Now.Day.ToString("00") Select Case serie.ToLower Case = "pondus" remoteFile = "https://www.vg.no/tegneserier/api/images/pondus/" & dateFormat Case = "lunch" remoteFile = "https://www.vg.no/tegneserier/api/images/lunch/" & dateFormat Case = "hjalmar" remoteFile = "https://www.vg.no/tegneserier/api/images/hjalmar/" & dateFormat Case = "tegnehanne" remoteFile = "https://www.vg.no/tegneserier/api/images/tegnehanne/" & dateFormat End Select If remoteFile <> "" Then Try Using client As New System.Net.WebClient Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls12 client.Headers.Add(Net.HttpRequestHeader.Cookie, "SP_ID=" & SP_ID) client.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0") client.DownloadFile(remoteFile, localFile) client.Dispose() End Using Catch ex As Exception hs.WriteLog("Tegneserier", "Ex: " & ex.ToString) End Try Dim dateValue As Integer = CInt(Now.Date.ToString("yyMMdd")) hs.SetDeviceString(devID, "<img src='/images/HomeSeer/status/custom.gif' />", True) hs.SetDeviceString(devID, "<img src='./images/Tegneserier/" & filename & "' width='300px' />", False) hs.SetDeviceValueByRef(devID, dateValue, True) Else hs.WriteLog("Tegneserie", "RemoteFile ikke spesifisert for tegneserie: " & serie) End If End Sub Du legger inn SP_ID-strengen din istedenfor "DIN_LANGE_SPID_STRENG_HER".
       
      I tillegg må du lage en device pr. tegneserie du er interessert i. Som i nyhetsscriptet er dette en "Status Only" device.
       
      Så er det bare å sette opp eventet. Tegneseriene blir oppdatert kl. 08:00, så 08:15 er sikkert et bra tidspunkt. Kun ukedager og lørdager. Huk av "Wait for Script to finish" og "Only allow singe instance". Så repeter for hver tegneserie.
       
      Parameter er dev_ID|Tegneserie, f.eks. 3689|Pondus.

       

       
       
      ... som gir oss:

       
      Bredden er satt til 300px for at hele tegneserien skal dukke opp i Device Management, men dette er ikke en begrensning i f.eks. HStouch.
    • Av Guahtdim
      Problemet er som følger:
      Jeg overvåker fryser og ønsker å sende en melding i god tid før den har nådd 0 grader. Etter å ha opplevd ett par ganger at fryseren er blitt lukket, men ikke tett med tilsvarende dårlig kjøling så ønsker jeg å kunne varsle meg selv når man er på vei mot 0 grader ett stykke før den har nådd f.eks. -3 grader. 
       
      Nå overvåker jeg kun på overstigning av -3 grader, men dette har en tendens å inntreffe lenge etter at jeg har dratt inn til jobb og siden jeg er pendler ett greit stykke (Moss - Oslo) så er det ikke å stikke fra jobben for å sjekke/lukke fryseren.
       
      Finnes det noe plugin eller script for å se om temperaturen er på vei opp utenom de vanlige "bølgene" som oppstår mellom hver gang kompressoren slår inn? Eller er dette noe man må "snekre" selv?
×
×
  • Opprett ny...