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

Gratis åpent API for å få times-strømpris for de forskjellige sonene i norge


Anbefalte innlegg

funny0frank skrev (5 timer siden):

Da er kravet om "key" aktivert i API-et

Har du gjort noen endringer mot å hente euro kurs? Får feilmelding på morgendagenspriser.

 

["None 200 response code 404 from https://data.norges-bank.no/api/data/EXR/M.EUR.NOK.SP?startPeriod=2022-01-10&endPeriod=2022-01-10:","<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r","<mes:Error xsi:schemaLocation=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message https://registry.sdmx.org/schemas/v2_1/SDMXMessage.xsd\" xmlns:mes=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><mes:ErrorMessage code=\"100\"><com:Text xmlns:com=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common\">No data for data query against the dataflow: urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=NB:EXR(1.0)</com:Text></mes:ErrorMessage></mes:Error>",""]

Lenke til kommentar
Del på andre sider

Hei igjen! Fikk melding fra google om feil når du gjorde den spørringen :), det var pga jeg forsøkte å få ut kurs for faktisk dagen du spørr etter og ikke bare dagen i dag. Men det gikk vist ikke.

 

Hvis noen her har tips til å få kursen for en gitt dato fra https://app.norges-bank.no/query/#/en/currency så setter jeg pris på hjelp her.

Undersøker også om https://openexchangerates.org kan brukes...

 

I mellomtiden så har jeg bare revertet tilbake til at kursen bare er for dagen i dag selv om du heter ut historiske data...

Lenke til kommentar
Del på andre sider

funny0frank skrev (34 minutter siden):

Hei igjen! Fikk melding fra google om feil når du gjorde den spørringen :), det var pga jeg forsøkte å få ut kurs for faktisk dagen du spørr etter og ikke bare dagen i dag. Men det gikk vist ikke.

 

Hvis noen her har tips til å få kursen for en gitt dato fra https://app.norges-bank.no/query/#/en/currency så setter jeg pris på hjelp her.

Undersøker også om https://openexchangerates.org kan brukes...

 

I mellomtiden så har jeg bare revertet tilbake til at kursen bare er for dagen i dag selv om du heter ut historiske data...

Etter en kjapp kikk så ser jeg at det kommet nye kurser ca kl 16 på hverdager. Så dagens kurs er fra fredag, og man får derfor feilmelding hvis man spør om en dato som ikke er en hverdag, som feks i dag.

 

Norges bank sitt api så faktisk veldig kurrant ut, har ikke sett veldig nøye på det, men for å vite hvilken kurs du skal bruke for en hviss dato, så kan du hente ut de siste 7 dagene før ønsket dato og bruke den nyeste. Det vil bli mest korrekt her 😊

Hvis ikke api'et har en egen funksjon for sånt da 😅

Du kan også med god samvittighet buffre kursene i en database, så slipper du å spørre en ekstern part på hver spørring 😊

Lenke til kommentar
Del på andre sider

funny0frank skrev (På 5.1.2022 den 14.56):

Grunnen til at jeg gikk inn for å sjekke er at noen kaller API-et 16.000 ganger til dagen... Hvis ikke dette tar slutt så må jeg legge på API nøker på dette API-et. 

Det er alltid "noen" som poller... i dette tilfellet ser 79.160.6.188 ut til å være Lyse:

inetnum:        79.160.0.0 - 79.161.255.255
netname:        NO-LYSE-20070619

Dette finner man lett her: https://ipinfo.io/

...

Noen "plaget" for noen år siden mine websider.

Iflg ipinfo pekte ip adressene alltid på adresser meget sentralt i Moskva og Beijing... 

Ms. IIS server logget utallige forsøk med diverse kommandoer, Så vidt jeg kunne se kom de aldri noe lengre.

Lenke til kommentar
Del på andre sider

5 hours ago, Alexander Frøyseth said:

Etter en kjapp kikk så ser jeg at det kommet nye kurser ca kl 16 på hverdager. Så dagens kurs er fra fredag, og man får derfor feilmelding hvis man spør om en dato som ikke er en hverdag, som feks i dag.

 

Norges bank sitt api så faktisk veldig kurrant ut, har ikke sett veldig nøye på det, men for å vite hvilken kurs du skal bruke for en hviss dato, så kan du hente ut de siste 7 dagene før ønsket dato og bruke den nyeste. Det vil bli mest korrekt her 😊

Hvis ikke api'et har en egen funksjon for sånt da 😅

Du kan også med god samvittighet buffre kursene i en database, så slipper du å spørre en ekstern part på hver spørring 😊

@Alexander Frøyseth Da bruker jeg dato API-et til Norges bank: https://github.com/karl-gustav/power_price/blob/master/currency/currency.go

 

Trenger ikke å cache data-ene fra norges bank pga jeg cacher resulatet av pris*exchange rate (respons objektet jeg sender ut blir cachet til neste gang noen spør på samme dato/zone). Så maks 5 kall til norges bank pr dag uansett...

Lenke til kommentar
Del på andre sider

Hei, jeg er nokså ny til hjemmeautomasjon, og måtte nesten registrere meg her som bruker etter å ha benyttet meg av APIet ditt for strømpris siden begynnelsen av desember (takk @funny0frank!).

Selv har jeg nok benyttet meg av en litt for naiv/enkel konfigurasjon av REST sensor i Home Assistant, og jeg er redd at systemet mitt har pollet APIet hvert 30. sekund (om googlingen min stemmer [ ref, ref]).🤦‍♂️ Her kan jeg ikke skylde på noe annet enn min mangel på erfaring og kunnskap om hvordan Home Assistant og REST-sensorer fungerer. Beklager hvis mitt oppsett har bidratt til å skape problemer. Jeg håper inderlig ikke det er jeg som har pollet 16000 ganger til dagen og på fremtidige datoer, da min konfigurasjon kun skal ha pollet for dagens priser.

Jeg ser på dette som læring, og håper jeg allikevel kan få tildelt en API-nøkkel. 🙂

Videre skal jeg selvfølgelig finne en bedre løsning, som for eksempel kodesnuttene til @alge eller en mer gjennomtenkt egen implementasjon med bufring.

Det hadde kanskje ogå gitt mening at folk i tråden her delte sine konfigurasjoner til APIet i sine respektive smarthjem-oppsett, slik at vi sammen kan øke tilgjengeligheten til APIet mens vi fremdeles holder belastningen nede på et fornuftig nivå? Da kan vi potensielt slippe at folk gjør sånne flauser som meg med oppsettet sitt.

Lenke til kommentar
Del på andre sider

18 minutes ago, smart100 said:

Hei, jeg er nokså ny til hjemmeautomasjon, og måtte nesten registrere meg her som bruker etter å ha benyttet meg av APIet ditt for strømpris siden begynnelsen av desember (takk @funny0frank!).

Selv har jeg nok benyttet meg av en litt for naiv/enkel konfigurasjon av REST sensor i Home Assistant, og jeg er redd at systemet mitt har pollet APIet hvert 30. sekund (om googlingen min stemmer [ ref, ref]).🤦‍♂️ Her kan jeg ikke skylde på noe annet enn min mangel på erfaring og kunnskap om hvordan Home Assistant og REST-sensorer fungerer. Beklager hvis mitt oppsett har bidratt til å skape problemer. Jeg håper inderlig ikke det er jeg som har pollet 16000 ganger til dagen og på fremtidige datoer, da min konfigurasjon kun skal ha pollet for dagens priser.

Jeg ser på dette som læring, og håper jeg allikevel kan få tildelt en API-nøkkel. 🙂

Videre skal jeg selvfølgelig finne en bedre løsning, som for eksempel kodesnuttene til @alge eller en mer gjennomtenkt egen implementasjon med bufring.

Det hadde kanskje ogå gitt mening at folk i tråden her delte sine konfigurasjoner til APIet i sine respektive smarthjem-oppsett, slik at vi sammen kan øke tilgjengeligheten til APIet mens vi fremdeles holder belastningen nede på et fornuftig nivå? Da kan vi potensielt slippe at folk gjør sånne flauser som meg med oppsettet sitt.

En spørring hver 30 sek betyr:
2 spørringer pr 1min
60min i 1t

24t i døgnet

2*60*24=2 880 spørringer pr døgn.

 

Du kan få nøkkel, bare si ifra når du har fikset slik at du bare spør en gang i døgnet.

Lenke til kommentar
Del på andre sider

Hei. Jeg benyttet meg av API'en din, @funny0frank, til en liten strømpris statistikk som jeg har kjørt litt i desember og nå i januar. 

Oppdaget på søndag at du hadde satt på krav til nøkkel, men siste testen min i dag klokken 16:30 viser at det ikke lengre er krav til nøkkel. 

 

Dersom du innfører nøkkel krav igjen, kunne jeg fått tilgang? Så skal jeg vippse over en liten donasjon for å holde tjenesten i live. :) 

 

Jeg kjører kun 5 spørringer pr dag. Cirka klokken 13 kjører det en cron job på hver sone. Altså totalt 5 spørringer pr dag. Dersom det har blitt hoppet over en dag, vil den da spørre for manglende dager også. 

 

IP adresse på produksjonsserver er 3.64.242.151 (AWS i Frankfurt)

Og ved litt leking og testing på locahost er IP 85.167.215.87

 

Edit: Ser at nøkkelkravet forsvant en gang mellom 16:06:04 og 16:08:07 i dag. :)

 

 

Endret av teiker
Lenke til kommentar
Del på andre sider

funny0frank skrev (20 timer siden):

@Alexander Frøyseth Da bruker jeg dato API-et til Norges bank: https://github.com/karl-gustav/power_price/blob/master/currency/currency.go

 

Trenger ikke å cache data-ene fra norges bank pga jeg cacher resulatet av pris*exchange rate (respons objektet jeg sender ut blir cachet til neste gang noen spør på samme dato/zone). Så maks 5 kall til norges bank pr dag uansett...

Ser at jeg fikk en feilmelding på morgendagens priser 14:45 i dag. Glemte å ta kopi, men var norges bank feil.

16:30 så fungerte det.

Nå er ikke jeg en kløpper i go, men jeg mistenker at det er fordi du sjekker kurs på dagens dato når man spør om morgendagens priser, og siden prisen for i dag er cache med "gårsdagens" (fredags) kurs, så fikk jeg ikke feilmelding på den. (jeg henter både dagens og morgendagens priser).

 

Ser at du sjekker dato om det er helg, men det er også bevegelige helligdager der kursen ikke blir oppdatert som vil føre til at det krasjer.

 

Jeg har aldri programmert go, så jeg tør ikke gjøre noen endringer på github, men i psuedo kode så ville jeg endra GetExchangeRate() til å hente for de siste 7 dagene for valgt dato (så lenge det ikke er i framtiden), også plukke ut den nyeste kursen.

Når klokka er etter kl 16 så ville jeg tømt cachen for å hente oppdaterte priser og kurser.

Lenke til kommentar
Del på andre sider

funny0frank skrev (5 minutter siden):

@teiker Sleng en mail til [email protected] for å få API nøkkel (legges inn i url `?key=<insert key here>`)

 

@Alexander Frøyseth https://github.com/karl-gustav/power_price/commit/2e7dc04

Sendte deg en epost på søndag klokken 15:07 angående API nøkkel til Magic mirror prosjektet mitt. :) 
Kan du dobbelsjekke at du ikke har fått denne? 

Lenke til kommentar
Del på andre sider

@teiker Hvilken mail sender du fra? (fant ikke "teiker")

 

Grunnen til at "key" kravet forsvant var at jeg måtte reverte til en tidligere versjon fort pga feilhåndteringen til brukerne av API-et er ikke ideel... Virker som mesteparten har "hvis feil, prøv hvert sekund til det fungerer igjen" som er veldig problematisk hvis feilen ikke er deres eget nettverk. Skal prøve å få folk til å bruke Exponential backoff, i.e. prøv igjen etter 1sek, 2sek, 4sek, 8sek, 16sek, osv...

  • Sad 1
Lenke til kommentar
Del på andre sider

Hi there. Firstly, thanks to @funny0frankfor this excellent API. A real boon to the home automation community, kudos! I've recently switched providers from Tibber to Lyse (long story) and therefore no longer have access to the Tibber API. So, was looking for something precisely like this to be able to pull electricity rates for here in Stavanger into Home Assistant. Previously with the Tibber HA integration I had a card on my dashboard that would display whether the electricity rate at any particular time was some variation of "Very Cheap" to "Very Expensive" and that allowed us to know whether it was worth running the dishwasher/washing machine or not.

 

I'd like to recreate this (or some close-enough approximation) if possible, however, my code-fu is pretty abysmal - i can manage a bit of yaml but mostly i just crib from other people's work and tweak what I can figure out haha.

 

I've been trying to game it out in my head how to run it. I'm thinking I would need to:

  • poll the API, once a day at midnight, to get the electricity rates for the coming day
  • store that data somewhere
  • create a sensor in Home Assistant that then looks at that data every hour to display the relevant price for that hour
  • create a template sensor that changes the price into categories of "Very Cheap", "Cheap", "Normal", "Expensive", "Very Expensive" based on defined ranges

(The last part, while not necessary, would really give it that extra WAF that makes home automation popular in our household!)

 

Does that sound about right? I'd be interested to know if anyone here has managed to use @funny0frank's API in home assistant to create something similar?

 

Thanks, and apologies for the English - my Norwegian-fu is also not nearly solid enough to bust out in public...

 

Lenke til kommentar
Del på andre sider

Mike skrev (3 timer siden):

 

I've been trying to game it out in my head how to run it. I'm thinking I would need to:

  • poll the API, once a day at midnight, to get the electricity rates for the coming day
  • store that data somewhere
  • create a sensor in Home Assistant that then looks at that data every hour to display the relevant price for that hour
  • create a template sensor that changes the price into categories of "Very Cheap", "Cheap", "Normal", "Expensive", "Very Expensive" based on defined ranges

 

Jeg tipper du leser norsk selv om du skriver engelsk Mike! (= ... Du kan se på min appdaemon-greie over, den funker bra og gjøre "poll API på midnatt", "lagre dataene", "lager en sensor som viser strømprisen nå". Så det eneste som mangler er å kategorisere det i billig til dyrt, og det tror jeg er enkelt å gjøre med en template sensor i home assistant. Appdaemon var ikke trivielt å sette opp, så hvis man kan gjøre det samme rett i home assistant så hadde det vært lettere. Eneste mod'en jeg har gjort på koden i det siste er å legge inn en API-nøkkel i forespørselen.

Lenke til kommentar
Del på andre sider

ah ha, tusen takk! I'm not sure how I missed your original post but, as you said, it's basically 90% of what i'm trying to achieve. awesome. 

 

However, I have zero experience with AppDaemon, and it sounds like it's not exactly trivial to get up and running. I suppose there's never been a bette excuse to try haha. Maybe I can DM you if I have any struggles?

Lenke til kommentar
Del på andre sider

import DomoticzEvents as DE
import json
from datetime import datetime
from datetime import date
import sys

if '/usr/lib/python3/dist-packages/' not in sys.path :         #sjekker at path nødvendig for requests-modulen er tilstede og oppretter hvis nødvendig
    DE.Log('Path not found')
    sys.path.append('/usr/lib/python3/dist-packages/')
    DE.Log('Path added')
#else:
    #DE.Log('Pathfound')

import requests

currentDate = date.today()
currentTime = datetime.now()
currentHour = datetime.now().hour

priceLimit=1.4 #hvor du setter grensa mellom dyr og "billig" strøm

DE.Log("\nStrømpris-script kjørt\n")
#-------------SETUP COMPLETE-------------


def fetchPrices():
    DE.Log("FETCHING PRICES FROM SERVER - current price will be updated on next pass")
    response = requests.get(f"https://norway-power.ffail.win/?zone=NO1&date={currentDate}&key=SETT INN NØKKEL HER")
    priceList=[]
    
    for i in response.json():
        priceContainer=response.json()[i]
        priceList.append(priceContainer['NOK_per_kWh']) #henter ut den verdien jeg er interessert i og legger til lista
       
    priceList.append(datetime.now().isoformat()) #legger nedlastingstidspunkt til slutten av prislista
   
    with open("pricelist.json", 'w') as f:
        json.dump(priceList, f, indent=2)  #lagrer prislista til json-fil


#fetchPrices() #denne linja må kjøres kun én gang for å opprette json-fil, deretter kommenteres bort. VIKTIG at den kjøres kun én gang, ellers blir du fort blokkert fra serveren.
###------------Oppdater timepris fra lagret liste--------------------------


with open("pricelist.json", 'r') as f:   #henter lagrede priser fra lokal json-fil
    loadedPrices = json.load(f)

#DE.Log("loaded Prices:\n")
#DE.Log(loadedPrices)
hourPrice = loadedPrices[currentHour]

timeDelta= currentTime - datetime.fromisoformat(loadedPrices[24])
minutesDelta = round(timeDelta.total_seconds()/ 60)
DE.Log("Prisliste sist oppdatert")
DE.Log(str(minutesDelta))
DE.Log("minutter siden, det var nøyaktig:")
DE.Log(str(loadedPrices[24]))

DE.Log("\nPrisen denne timen er:")
DE.Log(str(hourPrice))


if currentHour == 0 and  minutesDelta > 61 :

    fetchPrices()


if hourPrice < priceLimit:
    DE.Log("strømmen er relativt billig")    
    DE.Command( 'Billig', "On")
elif hourPrice > priceLimit:
    DE.Log("strømmen er pissdyr, skru av ovnene")
    DE.Command( 'Billig', "Off")
else:
    DE.Log("her har det skjedd noe rart")
   


Koden til @alge gikk meg langt over hodet, så jeg laget min egen som jeg forstår. Sikkert veldig tungvint og barnslig kode, men det virker. Denne må lagres som en fil (for eksempel script_time_strømpris.py) og legges i domoticz/scripts/python - også må det opprettes en virtuell bryter som heter Billig. Den skrues av/på ut ifra om strømmen er billig eller dyr, og kan dermed brukes til å kontrollere andre ting uten å måtte surre noe mer med dette scriptet eller python om du ikke vil.

Knappen billig må opprettes, scriptet lagres på rett sted, legg inn din egen passkey, deretter må du fjerne en # foran første fetchprice() for at lokal json-fil skal opprettes. Viktig! Når skriptet er kjørt én gang må du sette # tilbake igjen å lagre, ellers vil den laste ned fra API en gang pr minutt - ikke bra. Alternativt kan du opprette filen manuelt, men jeg aner ikke hvor den skal ligge eller hvor filen blir opprettet....

Nye priser lastes ned hver dag rett over midnatt. Det første minuttet etter midnatt vil den kjøre på feil (gårsdagens) verdi - det kan jeg leve med. Hvis den ikke får svar eller noe galt skjer rundt nedlasting er jeg ikke sikker på hva som skjer. Mulig lokal json-fil blir korrupt og scriptet kræsjer. Eller kanskje den prøver igjen én gang pr minutt den første timen, for så å vente til neste dag. Dette er ikke helt som jeg skulle ønske (burde vært progressivt økende delay, men jeg har ikke kommet helt dit), men gitt at APIet virker henter den bare ut data én gang i døgnet.

Implementeringen/dokumentasjon av python for domoticz viste seg veldig mangelfull. Jeg har ikke klart å finne ut hvordan man sjekker status til en bryter, dermed blir "billig" skrevet til hvert minutt uansett status. Jeg ville normalt sjekket hvor den sto og bare flyttet den hvis i feil posisjon, men jeg har ikke klart å finne ut av det. Null problem om man bruker lua eller dzevents, men i python har jeg ikke klart å finne kommandoen for det. Også irriterende at kommandoen for å skrive til loggen ikke fungerer på samme måte som print. Den vil bare ha string og bare én om gangen. Så det blir noen ekstra linjeskift her og der, men det får gå. Jeg deler den her tilfelle det kan være til hjelp for noen.

Endret av AMelbye
Lenke til kommentar
Del på andre sider

funny0frank skrev (På 10.1.2022 den 20.26):

Grunnen til at "key" kravet forsvant var at jeg måtte reverte til en tidligere versjon fort pga feilhåndteringen til brukerne av API-et er ikke ideel... Virker som mesteparten har "hvis feil, prøv hvert sekund til det fungerer igjen" som er veldig problematisk hvis feilen ikke er deres eget nettverk. Skal prøve å få folk til å bruke Exponential backoff, i.e. prøv igjen etter 1sek, 2sek, 4sek, 8sek, 16sek, osv...

 

@funny0frank Landet du på Exponential backoff, eller rate limit? 

Tror jeg traff limit'en din da jeg forsøkte å hente ned en større mengde data på dev miljøet mitt. :(

 

HTTP/1.1 429 Too Many Requests

 

Kunne du inkludert i responsen hvor lenge til man kan gjøre ny spørring? 

Og evt sende meg melding her/epost når bannen er løftet? epost: phing....@.........

Lenke til kommentar
Del på andre sider

  • 4 uker senere...

@funny0frank Har gjort litt debug av appen min som henter spotpriser fra API'et ditt.  Etter en håndfull forsøk for å få fylt opp backlog'en, fikk jeg (fra app-loggen min):

Spot priser hentet for 2022-02-13
Spot priser hentet for 2022-02-14

Exception:
Request: https://norway-power.ffail.win//?key=<api-key>&zone=NO1&date=2022-02-15
Response: The remote server returned an error: (429) Too Many Requests.

 

Hvilken grense for "Too many requests" er satt opp på serveren?

Hvor lenge varer lockout'en, eller må den fjernes manuelt? 

Endret av SverreFR
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.