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

Drivstoffpriser i HA


hjemmedude

Anbefalte innlegg

Hei - noen som har fått inn drivstoffpriser fra drivstoffappen i HA? Jeg prøver med denne; Home Assistant - Hente billigste bensin · GitHub 

Via facebook ser jeg diverse løsninger i Node Red, prøver å unngå node red siden jeg ikke bruker det.

Per nå trøbler det litt for prisen for 98 og 95 vises og ikke prisen for diesel. 

Fant alle bensinstasjoner her;

https://api.drivstoffappen.no/api/stations?stationType=0&countryCode=NO

  • Like 1
Lenke til kommentar
Del på andre sider

Det er enkelt  å få til uten node-red. Jeg har ferdig konfigurasjon til dette, men utilgjengelig grunnet systemkrasj.

 

Du henter priser via REST, lager template sensor for hvert drivstoff pr stasjon.

Endret av MrE
Lenke til kommentar
Del på andre sider

17 minutes ago, MrE said:

Det er enkelt  å få til uten node-red. Jeg har ferdig konfigurasjon til dette, men utilgjengelig grunnet systemkrasj.

 

Du henter priser via REST, lager template sensor for hvert drivstoff pr stasjon.

Alt er enkelt når man kan det 🙂 Legg gjerne ut noen hint til oss andre når systemet ditt er oppe å går igjen.

Lenke til kommentar
Del på andre sider

MrE skrev (16 timer siden):

Det er enkelt  å få til uten node-red. Jeg har ferdig konfigurasjon til dette, men utilgjengelig grunnet systemkrasj.

 

Du henter priser via REST, lager template sensor for hvert drivstoff pr stasjon.

Når du er tilbake fra kræsj ser jeg gjerne løsningen din også 😊 

Koden over henter via curl oppdatering hver time og jeg merker på HA at alt blir tregt under Development tools og states siden den skal laste inn alle stasjoner i Norge. For min og sikkert de fleste er det kun 4-6 stasjoner i nærheten som er aktuelle.

I tillegg sliter jeg med 98 bensin pris og ikke diesel selv om jeg ser i koden at det bes om price_diesel

Lenke til kommentar
Del på andre sider

Takker og bukker @VikingOy

 

Mye bedre å dele NodeRed flows som compact JSON tagget som "Kode" slik som dette:

[{"id":"9103052baf82e5d0","type":"inject","z":"2447f70b5f1095ba","name":"Hvert 10 min","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"600","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":360,"y":130,"wires":[["687284b792794184"]]},{"id":"687284b792794184","type":"http request","z":"2447f70b5f1095ba","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://api.drivstoffappen.no/api/stations?stationType=0&countryCode=NO","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"Content-Type","valueType":"other","valueValue":"application/json"},{"keyType":"other","keyValue":"X-API-KEY","valueType":"other","valueValue":"2CD114509703F6E0A976C32FCB79C4F62966EEC6"},{"keyType":"other","keyValue":"User-Agent","valueType":"other","valueValue":"Drivstoffappen/1.3.8 (com.raskebiler.drivstoff.appen; build:130; iOS 15.2.1) Alamofire/5.4.4"}],"x":550,"y":130,"wires":[["18ec6499f1fefde8","e7e0a907d77667f2","283d51c6efeddbb7","85dd9827b7d9a90c"]]},{"id":"18ec6499f1fefde8","type":"function","z":"2447f70b5f1095ba","name":"Esso Avaldsnes","func":"msg.payload = msg.payload.filter((/** @type {{ discountInfo: string; }} */ e) => e.discountInfo == 'Esso Avaldsnes');\nmsg.payload[0].stationDetails = msg.payload[0].stationDetails.filter(e => e.type == '95' || e.type == 'D' )\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":130,"wires":[["0e5b02362818c9c1"]]},{"id":"e7e0a907d77667f2","type":"function","z":"2447f70b5f1095ba","name":"Uno-X Avaldsnes","func":"msg.payload = msg.payload.filter(e => e.discountInfo == 'Uno-X Avaldsnes');\nmsg.payload[0].stationDetails = msg.payload[0].stationDetails.filter(e => e.type == '95' || e.type == 'D' )\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":780,"y":190,"wires":[["0e5b02362818c9c1"]]},{"id":"283d51c6efeddbb7","type":"function","z":"2447f70b5f1095ba","name":"YX 7-Eleven Norheim","func":"msg.payload = msg.payload.filter(e => e.discountInfo == 'YX 7-Eleven Norheim');\nmsg.payload[0].stationDetails = msg.payload[0].stationDetails.filter(e => e.type == '95' || e.type == 'D' )\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":790,"y":250,"wires":[["0e5b02362818c9c1"]]},{"id":"85dd9827b7d9a90c","type":"function","z":"2447f70b5f1095ba","name":"Tanken Helganes - Flyplassvegen","func":"msg.payload = msg.payload.filter(e => e.discountInfo == 'Tanken Helganes - Flyplassvegen');\nmsg.payload[0].stationDetails = msg.payload[0].stationDetails.filter(e => e.type == '95' || e.type == 'D' )\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":830,"y":310,"wires":[["0e5b02362818c9c1"]]},{"id":"0e5b02362818c9c1","type":"debug","z":"2447f70b5f1095ba","name":"debug 88","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1090,"y":130,"wires":[]}]

 

Lenke til kommentar
Del på andre sider

Min forståelse er at dette API'et ikke er åpent og fritt tilgjengelig. 
Det er nok en eller annen IT-dyktig luring som har funnet det og gjort en eksperimentell reverse engineering.

Det kan bety at API'et når som helt kan forandres og slutte å virke.  Det er en del av gamet.

 

Men, så er det gjerne slik at selskapet bak ofte velger å se gjennom fingrene med at det alltid vil være noen som "finner" frem til slike API'er fordi de som bruker slike for det første ofte er i veldig fåtall (nerdene som oss), og dernest så er all markedsføring, god markedsføring. Vi er med å sprer info om eksistensen til Drivstoffappen.no. Og sist, men ikke minst - vi bidrar nok også med en del verdifull tilbakemelding dersom Drivstoffappen.no gidder å ta seg bryet med følge litt med på forumene våre.  Kall oss gjerne gratis betatestere.

  • Like 3
Lenke til kommentar
Del på andre sider

Hei,

 

Her er slik jeg har gjort det, uten bruk av Node-Red etc. Jeg bruker Auto-Entities kortet i HA, og sorterer på pris lavest - høyest. Ett kort for bensin, og ett for diesel. Jeg hadde en del planer for hvordan jeg skulle ha dette, blant annet med bilde som ikon, kart som viste de forskjellige stasjonene, legge inn når den ble sist oppdatert etc.. Tiden strekker dessverre ikke til, så det har blitt lagt på is inntil videre. Anyways, her er det jeg har så langt:

 

I configuration.yaml har jeg lagt inn restsensor som henter stasjoner fra json filen som ble linket til lenger oppe.

Tipset for å få den lett leselig er å legge den inn i en JSON formatter, da blir filen mye renere å lese.

Edit: Noen ganger når man går inn på JSON filen uten å bruka api-key, får man authorization denied. Da må man bruke Postman API explorer og X-API-KEY for å hente JSON filen. 

 

JSON filen ligger vedlagt.

 

Jeg bruker Notepad++ og brukte søkefunksjon for å finne stasjonene jeg vil ha inn i oppsettet.

 

For å legge til stasjonen du ønsker gjør du følgende:

 

1. Finner stasjonen i JSON filen

2. Kopierer DiscountInfo navnet som du finner i JSON filen

3. endrer 3 ting under rest-sensor i configuration.yaml

 - Name - Valgfritt navn, men legg merke til at navnet har bensin i seg. Det er fordi value_template henter bensin-prisen

 - json attributes path discount info må endres til stasjonsnavnet slik den står i JSON filen.

 - og value_template må endres til samme navnet som du valgte på øverste linje.

 

 

Under template sensor må du endre navn på sensor (valgfritt), men state_attr må henvise til sensor som du har laget under rest-sensor.

 

Shell bryne diesel henter altså dieselprisen fra sensoren som heter shell bryne bensin...

 

 

Nedenfor er YAMLkoden for REST og for template sensor. Begge skal i configuration.yaml (ihvertfall hos meg 🙂🙂 )

I RESTsensoren er det name: som sier hva sensoren skal hette, og value_template er verdien til sensoren som blir opprettet. Sensorene som ligger i restsensoren blir da bensinprisen (på grunn av [0] i value template). Hvis det ønskes diesel her så må du sjekke hva som står i JSON fila. [0] er øverste avsnitt, [1] blir neste osv.. Se utklipp nedenfor, kanskje det ga mer mening.

 

image.thumb.png.e57a83183c9e4c9de03a2bda3939b4bf.png

 

configuration.yaml

 
rest:
  - scan_interval: 600
    method: GET
    headers:
        Content-Type: application/json
        X-API-KEY: 2CD114509703F6E0A976C32FCB79C4F62966EEC6
        User-Agent: Drivstoffappen/1.3.8 (com.raskebiler.drivstoff.appen; build:130; iOS 15.2.1) Alamofire/5.4.4
        Accept-Language: nb-NO;q=1.0, en-GB;q=0.9
        Accept-Encoding: br;q=1.0, gzip;q=0.9, deflate;q=0.8
        Connection: keep-alive
    sensor:
      - name: "Shell Bryne Bensin"
        json_attributes_path: "$..[?(@.discountInfo=='Shell Bryne')]"
        value_template: "{{ state_attr('sensor.shell_bryne_bensin', 'stationDetails')[0].price }}"
        force_update: true
        json_attributes:
          - "id"
          - "location"
          - "latitude"
          - "longitude"
          - "pictureUrl"
          - "discountInfo"
          - "lastUpdated"
          - "stationDetails"
 
      - name: "Circle K Lagårdsveien Bensin"
        json_attributes_path: "$..[?(@.discountInfo=='Circle K Lagårdsveien')]"
        force_update: true
        value_template: "{{ state_attr('sensor.circle_k_lagardsveien_bensin', 'stationDetails')[0].price }}"
        json_attributes:
          - "id"
          - "location"
          - "latitude"
          - "longitude"
          - "pictureUrl"
          - "discountInfo"
          - "lastUpdated"
          - "stationDetails"
 
      - name: "Uno-X Bryne Bensin"
        json_attributes_path: "$..[?(@.discountInfo=='Uno-X Bryne')]"
        force_update: true
        value_template: "{{ state_attr('sensor.uno_x_bryne_bensin', 'stationDetails')[0].price }}"
        json_attributes:
          - "id"
          - "location"
          - "latitude"
          - "longitude"
          - "pictureUrl"
          - "discountInfo"
          - "lastUpdated"
          - "stationDetails"
 
      - name: "Esso Bryne Bensin"
        json_attributes_path: "$..[?(@.discountInfo=='Esso Bryne')]"
        force_update: true
        value_template: "{{ state_attr('sensor.esso_bryne_bensin', 'stationDetails')[0].price }}"
        json_attributes:
          - "id"
          - "location"
          - "latitude"
          - "longitude"
          - "pictureUrl"
          - "discountInfo"
          - "lastUpdated"
          - "stationDetails"
 
      - name: "Circle K Klepp Bensin"
        json_attributes_path: "$..[?(@.discountInfo=='Circle K Klepp')]"
        force_update: true
        value_template: "{{ state_attr('sensor.circle_k_klepp_bensin', 'stationDetails')[0].price }}"
        json_attributes:
          - "id"
          - "location"
          - "latitude"
          - "longitude"
          - "pictureUrl"
          - "discountInfo"
          - "lastUpdated"
          - "stationDetails"

 

 

For å lage diesel sensorene er det hentet samme sensor, men brukt neste avsnitt i JSON fila ( [1] ). Noen ganger har stasjonene avgiftsfri diesel eller 98 bensin på 2. avsnitt, så da må det brukes [2] eller [3] alt etter hvordan JSON ser ut på aktuell stasjon.

 

Merk at sensorene henter attribut fra sensor.shell_bryne_bensin. Det er fordi i restsensoren henter vi bensinprisen, og hele stasjonen som vi henter inn i HA blir da kalt for shell bryne bensin. For å hente dieselpris bruker vi altså attribute under bensinsensoren, hvis det ga mening.

 

Her er for å hente diesel på de samme stasjonene:

 

 
template:
  - sensor:
 
########## DIESELPRISER ############################
 
    - name: Shell Bryne Diesel
      state: "{{ state_attr('sensor.shell_bryne_bensin', 'stationDetails')[1].price }}"
      device_class: monetary
      unit_of_measurement: NOK
 
    - name: Circle K Lagårdsveien Diesel
      state:  "{{ state_attr('sensor.circle_k_lagardsveien_bensin', 'stationDetails')[1].price }}"
      device_class: monetary
      unit_of_measurement: NOK
 
    - name: Uno-X Bryne Diesel
      state: "{{ state_attr('sensor.uno_x_bryne_bensin', 'stationDetails')[1].price }}"
      device_class: monetary
      unit_of_measurement: NOK
 
    - name: Esso Bryne Diesel
      state:  "{{ state_attr('sensor.esso_bryne_bensin', 'stationDetails')[1].price }}"
      device_class: monetary
      unit_of_measurement: NOK
 
    - name: Circle K Klepp Diesel
      state:  "{{ state_attr('sensor.circle_k_klepp_bensin', 'stationDetails')[1].price }}"
      device_class: monetary
      unit_of_measurement: NOK

 

 

Blir altså mye manuelt arbeid, men er forholdsvis enkelt. Knotet en del med dette før jeg fikk det til. Håper det fungerer for dere også 🙂

 

Slik ser kortet ut i HA:

 

image.thumb.png.43952451c96383ed54e0b37f86d907ba.png

 

 

Hvor konfigurasjonen til auto-entities kortet for diesel ser slik ut:

 

type: custom:auto-entities
card:
  type: entities
  title: Diesel - sortert på pris
filter:
  include:
    - name: '*Diesel*'
  exclude: []
sort:
  method: state
  numeric: true
 

 

DS appen.json

Endret av MrE
  • Like 2
  • Thanks 1
Lenke til kommentar
Del på andre sider

MrE skrev (23 minutter siden):

Hei,

 

Her er slik jeg har gjort det, uten bruk av Node-Red etc. Jeg bruker Auto-Entities kortet i HA, og sorterer på pris lavest - høyest. Ett kort for bensin, og ett for diesel. Jeg hadde en del planer for hvordan jeg skulle ha dette, blant annet med bilde som ikon, kart som viste de forskjellige stasjonene, legge inn når den ble sist oppdatert etc.. Tiden strekker dessverre ikke til, så det har blitt lagt på is inntil videre. Anyways, her er det jeg har så langt:

FYI:

Har en ukvalifisert oppfatning av at Uno-X på Orstad / Øksnevad ville sortert høyt opp på listen din. Det er kanskje interessant siden den ligger i det samme området som de andre du har.

Endret av stigvi
  • Thanks 1
Lenke til kommentar
Del på andre sider

hjemmedude skrev (20 timer siden):

For øyeblikket ingen data, noen som opplever det samme?

"You are not authorized" 😛

Da antar jeg du må endre X-api-key. Du finner ny ved hjelp av Postman API explorer

 

2CD114509703F6E0A976C32FCB79C4F62966EEC6

 

Edit: X-API-KEY fungerer hos meg, så da tenker jeg den skal fungere hos deg også.

 

Edit2:

  

hjemmedude skrev (20 timer siden):

For øyeblikket ingen data, noen som opplever det samme?

"You are not authorized" 😛

hvor får du den feilmeldingen?

Endret av MrE
  • Like 1
Lenke til kommentar
Del på andre sider

Takk skal prøve med postman api explorer, har ikke brukt det før men har konto nå.

Når jeg trykker på linken til drivstoppappen.no/api så får jeg det som tilbakemelding, you are not authorized. 🙂

edit: Ok, la inn data i postman og da returneres informasjon som ønsket, så da er det kanskje bare hos meg det klusser.

La koden din rett i configuration.yaml og da spiller det fint, så er noe jeg klusser til, tydeligvis 🙂

 

Det blir opprettet flere _bensin sensorer ettervhert som tiden går, er oppe i 7 stk på Bryne per nå. Skjer dette hos deg?

Endret av hjemmedude
Lenke til kommentar
Del på andre sider

Jeg har redigert mitt innlegg noe, og har inkludert JSON filen.

 

@hjemmedude Nei du skal ikke få mange flere av samme sensor plutselig. REST sensor oppretter 1 sensor for 1 stasjon. Template sensor henter dieselpris fra samme stasjon. Har du utklipp av hvordan det ser ut hos deg?

 

Vedrørende not authorized har dette skjedd fra tid til annen, uten at jeg vet hvorfor. Jeg bruker Postman med api key, da kommer json fila med en gang 🙂

Lenke til kommentar
Del på andre sider

@MrEdet var kanskje i en testperiode at det ble generert nye sensorer for hver yaml restart, nå er det 2-3 sensorer (development tools -> states ) for hver stasjon, det er nok riktig 🙂

Takk for god hjelp! Nå kan jeg spore prisen og virkelig handle fuel på rett tid og sted 🙂

 

Lenke til kommentar
Del på andre sider

Det virker litt "overkill" å lage en sensor for hver eneste besinstasjon.

Jeg har isteden gjort alt ferdig i NodeRed med bruk av JavaScript og ender opp med kun en enkel sensor som jeg så sender til Home Assistant.

Enkelt, rent og ryddig.

Først trekkes alle de ønskede stasjonene ut og samles i en felles array (eksempelet her har kun 3 stasjoner):

 

var stasjoner = [];
var temp = msg.payload.filter(e => e.discountInfo == 'Shell Marienlyst');
temp[0].stationDetails = temp[0].stationDetails.filter(e => e.type == 'D');
temp[0].stationDetails = temp[0].stationDetails[0];
stasjoner[0] = temp[0];

var temp = msg.payload.filter(e => e.discountInfo == 'Shell Frogner');
temp[0].stationDetails = temp[0].stationDetails.filter(e => e.type == 'D');
temp[0].stationDetails = temp[0].stationDetails[0];
stasjoner[1] = temp[0];

var temp = msg.payload.filter(e => e.discountInfo == 'Shell Vinderen');
temp[0].stationDetails = temp[0].stationDetails.filter(e => e.type == 'D');
temp[0].stationDetails = temp[0].stationDetails[0];
stasjoner[2] = temp[0];

msg.payload = stasjoner;
return msg;

 

Deretter sorteres tabellen og den billigste trekkes ut:

 

var billigst = msg.payload[0];
msg.payload.forEach(FinnBilligst);

function FinnBilligst(stasjon){
    if(stasjon.stationDetails.price < billigst.stationDetails.price) {
        billigst = stasjon;
    }
}
msg.payload = billigst;
return msg;

 

Resultatet sendes til HA som én sensor:

image.png.88c64da45ed9a989863e8e5b86c1b4ec.png

 

Og presenteres i Lovelace:

image.png.ba07a3d05bc410e108c73af026524e84.png

Endret av VikingOy
Lenke til kommentar
Del på andre sider

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.