Jos haluaa helpolla eikä tarvetta automaatioille tai muutta ulkonäköä niin upotta iframella hsl:n oma näytön:
Pysäkkinäyttö
Jos haluaa säätää oman näköiseksi ja mahdollisesti automaatioita tehdä lähtöjen mukaan niin alla olevalla onnistuu.
Vaatii digitransit-apin käyttäjäksi rekisteröitymistä. Järkevää valmista palikkaa en löytänyt, niin tein itse tällaisen mikä hakee tiedot sieltä apista.
Tällä kahden pysäkin seuraavat lähdöt talteen (laita urliin api-key ja pysäkkien koodit oikeiksi)
YAML:
rest:
- resource: https://api.digitransit.fi/routing/v1/routers/hsl/index/graphql?digitransit-subscription-key=XXXXXXXX
method: POST
scan_interval: 30
headers:
User-Agent: Home Assistant
Content-Type: application/graphql
payload: >
{
stop1: stop(id: "HSL:212XXXX") {
name
stoptimesWithoutPatterns(numberOfDepartures: 4) {
scheduledArrival
realtimeArrival
arrivalDelay
scheduledDeparture
realtimeDeparture
departureDelay
realtime
realtimeState
serviceDay
headsign
trip {
route {
shortName
}
}
}
}
stop2: stop(id: "HSL:212YYYY") {
name
stoptimesWithoutPatterns(numberOfDepartures: 4) {
scheduledArrival
realtimeArrival
arrivalDelay
scheduledDeparture
realtimeDeparture
departureDelay
realtime
realtimeState
serviceDay
headsign
trip {
route {
shortName
}
}
}
}
}
sensor:
- name: HSL stop1 raw
unique_id: hsl_stop1_raw
value_template: OK
json_attributes_path: "$.data.stop1"
json_attributes:
- "stoptimesWithoutPatterns"
- name: HSL stop2 raw
unique_id: hsl_stop2_raw
value_template: OK
json_attributes_path: "$.data.stop2"
json_attributes:
- "stoptimesWithoutPatterns"
Flex table cardilla olen tehnyt näille ui:hin näytöt:
YAML:
type: custom:flex-table-card
entities:
include: sensor.hsl_stop2_raw
columns:
- name: Pysäkin nimi
icon: mdi:bus
data: stoptimesWithoutPatterns
modify: x.trip.route.shortName + " " + x.headsign
- name: .
data: stoptimesWithoutPatterns
modify: >
const now = new Date().getHours() * 60 * 60 + new Date().getMinutes() * 60
+ new Date().getSeconds(); if (Math.abs(x.realtimeDeparture - now) < 5*60)
{
Math.floor(Math.abs(x.realtimeDeparture - now)/60) + " min";
} else {
const lts = new Date(x.realtimeDeparture*1000 - 7200000).toLocaleTimeString('fi-FI');
lts.substring(0, lts.length-3);
}
css:
table: "width: 100%; padding: 6px;"
thead th: "color: transparent; padding: 0 0 6px 0;"
thead th:first-child: "color: var(--secondary-text-color); font-size: 16px; font-weight: 500;"
thead th ha-icon: "color: rgba(0,87,162,1);"
tbody tr:nth-child(odd)+: "background-color: rgba(0,87,162,0.1);"
tbody tr:nth-child(even)+: "background-color: rgba(0,87,162,0.2);"
tbody td:first-child: >-
font-weight: 300; border-top-left-radius: 4px; border-bottom-left-radius:
6px;
tbody td:last-child: >-
font-weight: 500; border-top-right-radius: 4px; border-bottom-right-radius:
6px;