kristianml Skrevet 6. februar Skrevet 6. februar 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. Siter
Pter Skrevet 6. februar Skrevet 6. februar 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' Siter
kristianml Skrevet 6. februar Skrevet 6. februar (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 6. februar av kristianml 1 Siter
Pter Skrevet 6. februar Skrevet 6. februar Perfekt, takk @kristianml og @NeoID. Må bare få skrevet om filteret i Node-RED flow'en nå. Var litt endringer der som du skrev. 1 Siter
Smurfen Skrevet 6. februar Skrevet 6. februar 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 🙂 Siter
kristianml Skrevet 6. februar Skrevet 6. februar 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) 1 Siter
feddiriko Skrevet 6. februar Skrevet 6. februar (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 6. februar av feddiriko 3 Siter
SveinHa Skrevet 6. februar Skrevet 6. februar 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... Siter
Ziggy Skrevet 7. februar Skrevet 7. februar 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. Siter
nle Skrevet 7. februar Skrevet 7. februar (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 7. februar av nle Siter
SveinHa Skrevet 7. februar Skrevet 7. februar nle skrev (36 minutter siden): Her er noen av logoene de bruker. De ligger også i https://api.drivstoffappen.no/api/v1/brands 1 Siter
nle Skrevet 7. februar Skrevet 7. februar (endret) Ja, var mest for å ikke bruke av Drivstoffappens data budsjett. Men det spiller vel kanskje ikke så stor rolle. Endret 7. februar av nle 1 Siter
VikingOy Skrevet 8. februar Skrevet 8. februar 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? Siter
SveinHa Skrevet 8. februar Skrevet 8. februar 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: Siter
VikingOy Skrevet 8. februar Skrevet 8. februar (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 8. februar av VikingOy Fant svaret selv. Siter
SveinHa Skrevet 8. februar Skrevet 8. februar VikingOy skrev (11 timer siden): (Det var vel det @SveinHa mente) Jepp Siter
nle Skrevet 9. februar Skrevet 9. februar 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? Siter
Chrulf Skrevet 10. februar Skrevet 10. februar 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? Siter
terjemath Skrevet 12. februar Skrevet 12. februar (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 12. februar av terjemath 2 Siter
VikingOy Skrevet 12. februar Skrevet 12. februar 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 ? Siter
Chrulf Skrevet 12. februar Skrevet 12. februar 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. Siter
terjemath Skrevet 13. februar Skrevet 13. februar 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. Siter
msandvold Skrevet 14. februar Skrevet 14. februar 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? Siter
NeoID Skrevet 14. februar Skrevet 14. februar (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: Endret 14. februar av NeoID Siter
Tander Skrevet 14. februar Skrevet 14. februar 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. Siter
Anbefalte innlegg
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.