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

Anbefalte innlegg

Skrevet
NeoID skrev (16 timer siden):

Er ikke helt ferdig med API'et enda pga sykdom og andre ting som må prioriteres, men her er koden for de av dere som er interessert. Det vil genere en gyldig X-API-KEY, helt uten brukernavn eller passord. 😛

 

Takk til NeoID! Jeg testet dette selv og kan bekrefte at det fungerer fint. Riktignok oversatt til Powershell siden jeg ikke bruker HA og ikke er stødig i Python. Jeg kan dele koden dersom noen er interessert, men ellers er det vel ikke relevant i Home Assistant-sammenheng i denne diskusjonen.

 

Men, det ser ut til at datamodellen er noe endret fra tidligere? Drifstofftype er nå en ID, ikke "D", "95" etc. Feltet DiscountID eksisterer ikke lenger, så navn er en kombinasjon av "brandID"+"name". Så det må gjøres et kall til /brands som beskrevet over for å finne navn på selskap. Her er et eksempel på JSON for en stasjon:

 

    {
      "id": 509,
      "brandId": 1,
      "countryId": 1,
      "stationTypeId": 1,
      "name": "Svinesund E6",
      "location": "Svinesundparken 2, 1789 Berg i Østfold",
      "latitude": "59.12838",
      "longitude": "11.273174",
      "pending": 0,
      "deleted": 0,
      "createdAt": "2020-10-18T20:29:43.000+0000",
      "updatedAt": "2024-02-06T10:07:06.000+0000",
      "prices": [
        {
          "id": 509,
          "fuelTypeId": 1,
          "currency": "Kr",
          "price": 19.49,
          "lastUpdated": 1707214026469,
          "createdAt": "2024-01-08T22:26:06.000+0000",
          "deleted": 0
        },
        {
          "id": 509,
          "fuelTypeId": 2,
          "currency": "Kr",
          "price": 18.99,
          "lastUpdated": 1707214026469,
          "createdAt": "2024-01-08T22:26:06.000+0000",
          "deleted": 0
        },
        {
          "id": 509,
          "fuelTypeId": 3,
          "currency": "Kr",
          "price": 22.31,
          "lastUpdated": 1707213631499,
          "createdAt": "2024-01-08T22:26:06.000+0000",
          "deleted": 0
        },

 

Det hadde vært praktisk med et endepunkt/parameter for oppslag på spesifikk stasjons-ID, men det har jeg ikke funnet.

Skrevet
42 minutes ago, kristianml said:

 

Takk til NeoID! Jeg testet dette selv og kan bekrefte at det fungerer fint. Riktignok oversatt til Powershell siden jeg ikke bruker HA og ikke er stødig i Python. Jeg kan dele koden dersom noen er interessert, men ellers er det vel ikke relevant i Home Assistant-sammenheng i denne diskusjonen.

Del gjerne koden for Powershell, fikk ikke det til i Python.

 

Når det gjelder DiscountID endret jeg til id en tid før endringen av api'et og det fungerte bra.  (Bruker Node-RED)

 

msg.payload = msg.payload.filter(e => e.id == '547'
Skrevet (endret)
Pter skrev (31 minutter siden):

Del gjerne koden for Powershell, fikk ikke det til i Python.

 

Når det gjelder DiscountID endret jeg til id en tid før endringen av api'et og det fungerte bra.  (Bruker Node-RED)

 

msg.payload = msg.payload.filter(e => e.id == '547'

 

Dette er Powershell-script som er proof-of-concept, så bør struktureres bedre men fungerer som lineær fremgangsmåte:

$petrolDataTokenResponse = Invoke-WebRequest -Uri "https://api.drivstoffappen.no/api/v1/authorization-sessions"
$petrolDataToken = ($petrolDataTokenResponse | ConvertFrom-Json).token

#konventer til Byte-array (Det viser seg kun at første siffer flyttes til siste posisjon. Kunne trolig vært løst med strengmanipulasjon fremfor å konvertere til byte-array)
$tokenBytes = [System.Text.Encoding]::UTF8.GetBytes($petrolDataToken)
#splitt ut første element i array, for en shift left
$first, $rest = $tokenBytes
#shift left
$tokenBytes = $rest + $first
#konventer til String.
$tokenShifted = [System.Text.Encoding]::UTF8.GetString($tokenBytes)

$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$utf8 = New-Object -TypeName System.Text.UTF8Encoding
$md5Hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($tokenShifted)))
#Må fjerne - fra string, og endre til lower-case
$md5Hash = ($md5Hash.Replace("-","")).ToLower()

$petrolDataHeaders = @{
    "X-API-KEY" = $md5Hash
    "X-CLIENT-ID" = "com.raskebiler.drivstoff.appen.ios"
}
    #$gAPI = "https://httpbin.org/headers" # brukt for test av headers 
#$petrolDataResponse = Invoke-WebRequest -Uri "https://api.drivstoffappen.no/api/v1/brands" -Headers $petrolDataHeaders -Method Get
$petrolDataResponse = Invoke-WebRequest -Uri "https://api.drivstoffappen.no/api/v1/stations?stationTypeId=1" -Headers $petrolDataHeaders -Method Get

#$petroldataresponse.content | Set-Content ($path+"\cache\petrol.json") #Lagre JSON med enten stasjoner eller selskaper
$petrolData = $petrolDataResponse.Content | ConvertFrom-Json -Depth 100 
$petrolData[([String[]]$petrolData.id).indexOf("534")] #Esso Svinesund

 

Endret av kristianml
  • Like 1
Skrevet

Dette er helt konge! Bra jobbet @NeoID og @kristianml !!

Jeg kom til at jeg fikk ut X-API nøkkelen med Python, så stoppet det litt på spørringen...
Men Powershell derimot er jeg bedre på, tok bort -depth parameteret fra convertfrom-json,
det trengs vel egentlig ikke. Men oppgraderer man powershell så funker det med -depth.

Så nå blir det og grave frem de aktuelle stasjonene i json-filen, som de sikkert har endret på igjen.
Sist brukte jeg location attributtet, det er fortsatt brukt til adresse ser jeg.
Litt usikker på hvilke vei det er lurt å gå for å enklest mulig oppdatere sensorer i HA.
Blir digg å få dette i HA igjen 🙂

Skrevet

Jeg vil bare påpeke at det er @NeoIDsom har funnet løsningen her. Jeg har bare benyttet meg av hans for å gjøre løsningen mer tilgjengelig for meg selv 🙂

 

Og du har helt rett om -depth @Smurfen, det har ingen funksjon i den sammenhengen. Den kom med under en klipp&lim av convertto-json lenger opp i scriptet mitt (upublisert del mot annet api) 

  • Like 1
Skrevet (endret)

Takk, fungerte bra. Aldri brukt Node-Red før, men her er flowen min. 

 

[{"id":"7ce7a7849c9c8b4e","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"276071b26f3e49a2","type":"inject","z":"7ce7a7849c9c8b4e","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":160,"y":220,"wires":[["fb25d94b.139e78"]]},{"id":"fb25d94b.139e78","type":"http request","z":"7ce7a7849c9c8b4e","name":"Get Token","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://api.drivstoffappen.no/api/v1/authorization-sessions","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":330,"y":220,"wires":[["9b28d83a.0226d"]]},{"id":"9b28d83a.0226d","type":"function","z":"7ce7a7849c9c8b4e","name":"Process Token","func":"msg.token = JSON.parse(msg.payload).token;\nmsg.tokenBytes = Buffer.from(msg.token);\nmsg.shiftedBytes = Buffer.concat([msg.tokenBytes.slice(1), msg.tokenBytes.slice(0, 1)]);\nmsg.shiftedToken = msg.shiftedBytes.toString();\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":220,"wires":[["bc5b206f4b80b029"]]},{"id":"17f2e29c.f0c2b3","type":"http request","z":"7ce7a7849c9c8b4e","name":"API Request","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://api.drivstoffappen.no/api/v1/stations?stationTypeId=1","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"X-API-KEY","valueType":"msg","valueValue":"md5Hash"},{"keyType":"other","keyValue":"X-CLIENT-ID","valueType":"other","valueValue":"com.raskebiler.drivstoff.appen.ios"}],"x":850,"y":220,"wires":[["77f3986f.d5f32c"]]},{"id":"77f3986f.d5f32c","type":"debug","z":"7ce7a7849c9c8b4e","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1030,"y":220,"wires":[]},{"id":"bc5b206f4b80b029","type":"md5","z":"7ce7a7849c9c8b4e","name":"MD5","fieldToHash":"shiftedToken","fieldTypeToHash":"msg","hashField":"md5Hash","hashFieldType":"msg","x":690,"y":220,"wires":[["17f2e29c.f0c2b3"]]}]
Endret av feddiriko
  • Like 3
Skrevet
feddiriko skrev (1 time siden):

men her er flowen min

Super den. Bare en JSON node på slutten så er dataene litt mer lesbare.

 

Ser databasen har endret seg en del så litt småfix gjenstår før jeg er helt oppegående...

Skrevet

3.0.0 av appen bruker en URL parameter 

&minUpdatedAt=2024-01-09T20%3A15%3A57%2B0100

for å begrense stasjoner (og datamende) overført til de som er endret etter dette tidspunktet. Tilsvarer

&minUpdatedAt=2024-01-09T20:15:57+0100

med ":" og "+" URL-enkodet.

De som allikevel setter opp noe som tar vare på states mellom requests kan vurdere å ta dette i bruk.

Skrevet (endret)

Her er noen av logoene de bruker. Hentet ut fra appen. De hoster de på Amazon AWS, men lasted de opp på imgur, så Drivstoffappen skal slippe. Bli sikkert ikke rare dataen, men alikevel.

 

Automat1: https://i.imgur.com/wBhHsLM.png
Circle K: https://i.imgur.com/CTJdiCp.png
Driv: https://i.imgur.com/8T7r8DR.png
Esso: https://i.imgur.com/UvFgrtv.png
Esso Express: https://i.imgur.com/qp4sFU9.png
Shell: https://i.imgur.com/qdSsMgw.png
Uno X: https://i.imgur.com/DRFnb47.png
Uno X Truck: https://i.imgur.com/WOxmdbu.png
Endret av nle
Skrevet (endret)

Ja, var mest for å ikke bruke av Drivstoffappens data budsjett. Men det spiller vel kanskje ikke så stor rolle.

Endret av nle
  • Like 1
Skrevet
feddiriko skrev (På 6.2.2024 den 22.23):

Takk, fungerte bra. Aldri brukt Node-Red før, men her er flowen min. 

 

[{"id":"7ce7a7849c9c8b4e","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"276071b26f3e49a2","type":"inject","z":"7ce7a7849c9c8b4e","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":160,"y":220,"wires":[["fb25d94b.139e78"]]},{"id":"fb25d94b.139e78","type":"http request","z":"7ce7a7849c9c8b4e","name":"Get Token","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://api.drivstoffappen.no/api/v1/authorization-sessions","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":330,"y":220,"wires":[["9b28d83a.0226d"]]},{"id":"9b28d83a.0226d","type":"function","z":"7ce7a7849c9c8b4e","name":"Process Token","func":"msg.token = JSON.parse(msg.payload).token;\nmsg.tokenBytes = Buffer.from(msg.token);\nmsg.shiftedBytes = Buffer.concat([msg.tokenBytes.slice(1), msg.tokenBytes.slice(0, 1)]);\nmsg.shiftedToken = msg.shiftedBytes.toString();\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":220,"wires":[["bc5b206f4b80b029"]]},{"id":"17f2e29c.f0c2b3","type":"http request","z":"7ce7a7849c9c8b4e","name":"API Request","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://api.drivstoffappen.no/api/v1/stations?stationTypeId=1","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"X-API-KEY","valueType":"msg","valueValue":"md5Hash"},{"keyType":"other","keyValue":"X-CLIENT-ID","valueType":"other","valueValue":"com.raskebiler.drivstoff.appen.ios"}],"x":850,"y":220,"wires":[["77f3986f.d5f32c"]]},{"id":"77f3986f.d5f32c","type":"debug","z":"7ce7a7849c9c8b4e","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1030,"y":220,"wires":[]},{"id":"bc5b206f4b80b029","type":"md5","z":"7ce7a7849c9c8b4e","name":"MD5","fieldToHash":"shiftedToken","fieldTypeToHash":"msg","hashField":"md5Hash","hashFieldType":"msg","x":690,"y":220,"wires":[["17f2e29c.f0c2b3"]]}]

Hei, og takk!
Jeg trodde kanskje at det skulle være enkelt å få ut listen over alle stasjonene (noe det sikkert også er), men så enkelt som å bare endre URL til https://api.drivstoffappen.no/api/v1/stations ga ikke noen slik oversikt.

Jeg ser at man ved å legge til ?stationTypeId= et tall fra 1 og oppover, får ut dataene for en-og-en stasjon, men det vi trenger er jo alt samlet i en database, eller har jeg misforstått noe?

Skrevet
VikingOy skrev (5 minutter siden):

listen over alle stasjonene

Du får alle 9703 stasjoner i den nevnte flow men heng på en JSON node på slutten så blir det langt mer lesbart:

image.png.6ee6f0b2d7a6de8c29df47cae5a0a717.png

image.png.17a7dc0f128a95f4c35f8d56b3ae06e8.png

 

Skrevet (endret)

Med denne URL'en får jeg kun ut én stasjon, og det er Lierkroa her i Asker (?)

responseUrl: "https://api.drivstoffappen.no/api/v1/stations?stationTypeId=1"
redirectList: array[0]

Hva er det jeg ikke skjønner, mon tro.....

[Edit]

Det som måtte til var bare å endre API Request'en til å returnere et "parsed JSON Object"

(Det var vel det @SveinHa mente)

Endret av VikingOy
Fant svaret selv.
Skrevet

Er det mer eller mindre jobb for serverene til Drivstoffappen å filtrere rett på API kallet med f.eks. "?stationTypeId=1" enn å filtrere lokalt etter å ha lastet ned alt?

Skrevet

Får noen til å lage en Home Assistant rest/command line sensor for dette? Har brukt en som tidligere ble lagt inn i tråden helt til endringene som skjedde. Enkelt å gjør om den koden?

Skrevet (endret)

## Drivstoffpris ##
  - sensor:
      name: fuel_prices_command
      scan_interval: 3600
      command: >
        petrolDataTokenResponse=$(curl -s "https://api.drivstoffappen.no/api/v1/authorization-sessions") &&
        petrolDataToken=$(echo "$petrolDataTokenResponse" | jq -r '.token') &&
        tokenBytes=$(echo -n "$petrolDataToken" | xxd -p -c 256) &&
        first=$(echo -n "$tokenBytes" | head -c 2) &&
        rest=$(echo -n "$tokenBytes" | tail -c +3) &&
        tokenBytesShifted="${rest}${first}" &&
        tokenShifted=$(echo -n "$tokenBytesShifted" | xxd -r -p) &&
        md5Hash=$(echo -n "$tokenShifted" | md5sum -b | awk '{print $1}') &&
        md5Hash=$(echo "$md5Hash" | tr '[:upper:]' '[:lower:]') &&
        X_API_KEY="$md5Hash" &&
        X_CLIENT_ID="com.raskebiler.drivstoff.appen.ios" &&
        petrolData=$(echo "$petrolDataResponse" | jq -c '.') &&
        echo "{\"verdi\":" $(
        curl -s -H "X-API-KEY: $X_API_KEY" -H "X-CLIENT-ID: $X_CLIENT_ID" "https://api.drivstoffappen.no/api/v1/stations?stationTypeId=1"
        | jq -c '[ .[] | select( .id | contains(33, 34, 35, 62, 67, 89, 105, 126, 1083, 4456, 5887)) ]'
        ) "}" 
      value_template: > 
        {{ value_json.verdi | length }}
      json_attributes: 
        - verdi

kristianml skrev (På 6.2.2024 den 14.20):
#konventer til Byte-array (Det viser seg kun at første siffer flyttes til siste posisjon. Kunne trolig vært løst med strengmanipulasjon fremfor å konvertere til byte-array)
$tokenBytes = [System.Text.Encoding]::UTF8.GetBytes($petrolDataToken)
#splitt ut første element i array, for en shift left
$first, $rest = $tokenBytes
#shift left
$tokenBytes = $rest + $first
#konventer til String.
$tokenShifted = [System.Text.Encoding]::UTF8.GetString($tokenBytes)

 

Endret av terjemath
  • Like 2
Skrevet
terjemath skrev (43 minutter siden):

## Drivstoffpris ##
  - sensor:
      name: fuel_prices_command
     

o.s.v.

 

Er dette YAML kode for å opprette sensor.fuel_prices_command i Home Assistant ?

Skrevet
terjemath skrev (2 timer siden):

## Drivstoffpris ##
  - sensor:
      name: fuel_prices_command
      scan_interval: 3600
      command: >

 

Konge! Takk :)

 

 

VikingOy skrev (1 time siden):

Er dette YAML kode for å opprette sensor.fuel_prices_command i Home Assistant ?

 

Det stemmer. For å fullføre koden til terjemath så legger du "command_line:" helt i starten av koden.

Skrevet
Chrulf skrev (15 timer siden):

 

Konge! Takk 🙂

 

 

 

Det stemmer. For å fullføre koden til terjemath så legger du "command_line:" helt i starten av koden.

Ja, om du ikke har opprettet en folder command_line.yaml i HA. Om du legger koden i cofiguration.yaml så må nok "command_line:" legges til.

Filteret | jq -c '[ .[] | select( .id | contains(33, 34, 35, 62, 67, 89, 105, 126, 1083, 4456, 5887)) ]' må endres til hver enkelt sine preferanser da dette er mine lokale stasjoner. Du får opp alle stasjoner dersom filteret droppes i koden.

 

Da api-et er noe forandret så kommer ikke "brandID" opp som "merkenavn" (Shell, Esso Uno-X osv.) i klartekst, men kun et ID nr. Har derfor laget et eget api-kall for å få opp dette. Gir egentlig bare en "link" mellom "brandID" og merkenavn samt link til "pictureUrl"

 

- sensor:
      name: fuel_brands_command
      scan_interval: 604800
      command: >
        petrolDataTokenResponse=$(curl -s "https://api.drivstoffappen.no/api/v1/authorization-sessions") &&
        petrolDataToken=$(echo "$petrolDataTokenResponse" | jq -r '.token') &&
        tokenBytes=$(echo -n "$petrolDataToken" | xxd -p -c 256) &&
        first=$(echo -n "$tokenBytes" | head -c 2) &&
        rest=$(echo -n "$tokenBytes" | tail -c +3) &&
        tokenBytesShifted="${rest}${first}" &&
        tokenShifted=$(echo -n "$tokenBytesShifted" | xxd -r -p) &&
        md5Hash=$(echo -n "$tokenShifted" | md5sum -b | awk '{print $1}') &&
        md5Hash=$(echo "$md5Hash" | tr '[:upper:]' '[:lower:]') &&
        X_API_KEY="$md5Hash" &&
        X_CLIENT_ID="com.raskebiler.drivstoff.appen.ios" &&
        petrolData=$(echo "$petrolDataResponse" | jq -c '.') &&
        echo "{\"brand\":" $(
        curl -s -H "X-API-KEY: $X_API_KEY" -H "X-CLIENT-ID: $X_CLIENT_ID" "https://api.drivstoffappen.no/api/v1/brands"
        | jq -c '[ .[] | select( .id | contains(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) ]'
        ) "}" 
      value_template: > 
        {{ value_json.brand | length }}
      json_attributes: 
        - brand

 

Denne dataen er relativt ganske statisk så ingen grunn til å trigge denne ofte. Derfor scan intervall på 604800 (i gang i uka).

Har også her filtrert på de 10 første "barndID". Mulig dette filteret må endres for å plukke ut de som faktisk er aktuelle.

Skrevet

Hei, @terjemath
Fantastisk at du la ut comand for HA 🙂
Jeg hadde den gamle versjonen, nå får jeg ut priser igjen.
Det jeg derimot sliter med er å få visning av Stasjonsnavn, pris på 95  (fuelTypeId: 2) og 98 (fuelTypeId: 2) samt sist oppdatert (stasjons logo også et pluss 🙂 ) i "custom:mushroom-template-card"

Er dette noe du allerede har hos deg, og ser råd for å dele med meg?

Skrevet (endret)

Her er et annet løsningsforslag, men jeg er ikke veldig fornøyd med det.

 

Jeg ville egentlig hente data fra et egetutviklet API. API'et er ferdig, men jeg finner ingen god måte å dynamisk hente data fra det og vise det i lovelace uten å gå via en sensor. Ulempen med å gå via sensor er at HA blir merkbart tregere når det foreligger store json-objekter i developer->states.
 

command_line:
  - sensor:
      name: Gas Prices
      command: >
        app_id="com.raskebiler.drivstoff.appen.android";
        api_brands="https://api.drivstoffappen.no/api/v1/brands";
        api_sessions="https://api.drivstoffappen.no/api/v1/authorization-sessions";
        api_stations="https://api.drivstoffappen.no/api/v1/stations?stationTypeId=1&includeDeleted=true&includePending=true&minUpdatedAt={{ (now() - timedelta(days=2)).strftime('%Y-%m-%dT%H:%M:%S%z') | urlencode }}";
        
        auth_token=$(curl -s $api_sessions | jq -r ".token");
        api_key=$(python -c "import hashlib; auth_token = \"$auth_token\"; shifted_auth_token = bytearray(auth_token, 'utf-8')[1:] + bytearray(auth_token, 'utf-8')[:1]; print(hashlib.md5(shifted_auth_token).hexdigest())");
        stations=$(curl -s -H "X-API-KEY: $api_key" -H "X-CLIENT-ID: $app_id" $api_stations);
        brands=$(curl -s -H "X-API-KEY: $api_key" -H "X-CLIENT-ID: $app_id" $api_brands);
        merged=$(jq -s '[.[0][] as $stations | .[1][] as $brands | select($stations.brandId == $brands.id) | $stations | .brand = $brands]' <(echo "$stations") <(echo "$brands"));
        echo "{\"stations\": $(echo "$merged") }"
      json_attributes:
        - stations
      value_template: 'OK'
      scan_interval: 1800

input_select:
  gas_prices_sort:
    name: Sort by
    options:
      - Last updated
      - Distance
      - Petrol
      - Diesel
    initial: Distance
    icon: mdi:sort


Her er min lovelace implementasjon. Det jeg synes er kult er at den alltid viser stasjoner som er nærme din nåværende posisjon.
 

type: custom:vertical-stack-in-card
cards:
  - type: entities
    title: Gas prices
    style: |
      .card-content { padding: 0 !important; }
    entities:
      - entity: input_select.gas_prices_sort
  - type: markdown
    content: >
     {% set data = namespace(stations=[]) %}
      {%- set current_person = states.person|selectattr("attributes.friendly_name", "==", user) | map(attribute="entity_id") | first | default("zone.home") -%}
      {%- set stations = state_attr("sensor.gas_prices", "stations") -%}
          {%- for item in stations -%}
            {%- set station_distance = distance(item.latitude, item.longitude, current_person) -%}
            {%- if station_distance <= 5.0 and
                item.prices | selectattr("fuelTypeId", "eq", 1) | map(attribute="price") | first | default(None) and
                item.prices | selectattr("fuelTypeId", "eq", 2) | map(attribute="price") | first | default(None) -%}
              {% set data.stations = data.stations + [{
                    "id": item.id,
                    "name": item.name,
                    "location": item.location,
                    "pictureUrl": item.brand.pictureUrl,
                    "updatedAt": item.updatedAt,
                    "distance": station_distance|round(1),
                    "priceType95": item.prices | selectattr("fuelTypeId", "eq", 2) | map(attribute="price") | first | default(0.0),
                    "priceTypeD": item.prices | selectattr("fuelTypeId", "eq", 1) | map(attribute="price") | first | default(0.0),
                  }]
              %}
            {%- endif -%}
          {%- endfor %}

      {% if is_state('input_select.gas_prices_sort', 'Last updated') %}
        {%- set data.stations = data.stations | sort(attribute='updatedAt', reverse = True) -%}
      {% elif is_state('input_select.gas_prices_sort', 'Distance') %}
        {%- set data.stations = data.stations | sort(attribute='distance') -%}
      {% elif is_state('input_select.gas_prices_sort', 'Petrol') %}
        {%- set data.stations = data.stations | sort(attribute='priceType95') -%}
      {% elif is_state('input_select.gas_prices_sort', 'Diesel') %}
        {%- set data.stations = data.stations | sort(attribute='priceTypeD') -%}
      {% endif %}

      <table>
      <thead>
        <th colspan="2">Gas station</th>
        <th>Diesel</th>
        <th>Petrol</th>
      </thead>
      <tbody>
      {%- for item in data.stations[:5] -%}
        <tr>
          <td rowspan="2"><img src="{{ item.pictureUrl }}" width="40"></td>
          <td rowspan="2">
            <h1>{{ item.name }}</h1>
            {{ item.location|replace(',', '<br/>', 1) }} ({{ item.distance }} Km)
          </td>
          <td>{{ "%0.2f"|format(item.priceTypeD) + ',-' if item.priceTypeD > 0.0 else '-' }}</td>
          <td>{{ "%0.2f"|format(item.priceType95) + ',-' if item.priceType95 > 0.0 else '-' }}</td>
        </tr>
        <tr>
          <td colspan="2">{{ relative_time(as_datetime(item.updatedAt)) + " ago" }}</td>
      </tr>
      {%- endfor %}
      </tbody>
      </table>
    card_mod:
      style:
        ha-markdown $: |
            table {
              width: 100%;
            }
            tbody tr:nth-child(4n-2),
            tbody tr:nth-child(4n-3) {
              background-color: var(--table-row-background-color);
            }
            tbody tr:nth-child(4n-1),
            tbody tr:nth-child(4n-0) {
              background-color: var(--table-row-alternative-background-color);
            }
            tbody tr:nth-child(odd) td:nth-child(1) {
              background-color: #fff;
              padding-right: 10px;
            }
            td h1 {
              font-size: 1.2em;
              font-weight: normal;
            }
            tbody td:nth-child(2) {
              padding: 0 10px 5px 10px;
            }
            tbody td:nth-last-child(-n+2) {
              text-align: center;
            }
            tbody tr:nth-child(odd) td:nth-last-child(-n+2) {
              font-size: 1.4em;
              padding: 5px;
            }
            tbody tr:nth-child(even) td:nth-last-child(-n+2)  {
              font-style: italic;
            }


Skjermbilde:
image.png.bef2b65a351468b5c840ab62c1df9cb2.png

Endret av NeoID
Skrevet

Hei NeoID.

 

La inn koden din og det fungerer bra. Opplever ikke noe treghet i HA så langt. HA kjører her i container på Synology NAS.

 

Et par spørsmål:

- Distansen er i luftlinje, jeg bor i nærheten av en fjord og får da stasjoner som ligger innenfor radius som angis, men det blir lang kjørelengde rundt fjorden for å komme til stasjonene som ligger på "feil side". Er det noen løsning for å hente ut kjøredistanse fra kart på noen måte i HA?

- Tid for siste oppdaterte priser angis på engelsk (f.eks. "2 days ago"), kan det konverteres til norsk likt det jeg har for vanning, som vist på bildet nedenfor? Jeg forsøker så godt det lar seg gjøre å bruke norsk i HA der det er mulig.

 

vanning.PNG

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.