Gå til innhold
  • Bli medlem

Anbefalte innlegg

Skrevet

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:

  Vis skjult innhold

 

 

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

Oppdatert januar 2020 pga. bruk av TSL12.

 

  • Like 3
Skrevet
  Moskus skrev (På 14.1.2019 den 14.29):

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

 

Ekspander  

 

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?

Skrevet (endret)

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
Skrevet

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

Skrevet

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?

Skrevet (endret)

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
Skrevet
  GeneralVirus skrev (På 15.1.2019 den 21.20):

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

Ekspander  

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

Skrevet
  Moskus skrev (På 16.1.2019 den 9.04):

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

Ekspander  

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

 

Skrevet
  GeneralVirus skrev (På 15.1.2019 den 21.20):

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

Ekspander  

 

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

Skrevet

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

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.

Skrevet
  Moskus skrev (På 17.1.2019 den 8.00):

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.

Ekspander  

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

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.