Kirjoittaja Aihe: fingrid tuntihinta  (Luettu 5253 kertaa)

pere

  • Käyttäjä
  • Viestejä: 79
    • Profiili
fingrid tuntihinta
« : 04.11.22 - klo:07.48 »
tuntihinta sovellus kännykkään on hyvä. Onko tietoa miten saman tiedon voisi hakea  sähköisesti kerran vuorokaudessa johonkin esim json formaattiin? Sitten sitä voisi käyttää automaattisesti kulutuksen ohjaukseen.

AimoE

  • Käyttäjä
  • Viestejä: 2783
    • Profiili
Vs: fingrid tuntihinta
« Vastaus #1 : 04.11.22 - klo:08.10 »
Kuten Fingrid kertoo, avoin data on tarjolla osoitteessa https://data.fingrid.fi/.

pere

  • Käyttäjä
  • Viestejä: 79
    • Profiili
Vs: fingrid tuntihinta
« Vastaus #2 : 04.11.22 - klo:10.33 »
Kuten Fingrid kertoo, avoin data on tarjolla osoitteessa https://data.fingrid.fi/.
Minun osaamisella en saanut tuolta mitään tolkkua.

nm

  • Käyttäjä
  • Viestejä: 16436
    • Profiili
Vs: fingrid tuntihinta
« Vastaus #3 : 04.11.22 - klo:16.18 »
Fingridin rajapinnan kautta ei taida saada spot-hintoja:

https://data.fingrid.fi/fi/pages/faq
Lainaus
Miksi palvelussa ei ole tarjolla sähkön vuorokausimarkkinoiden aluehintaa?

Fingrid ei valitettavasti voi julkaista tuntihintaa avoimessa datassa jaettavaksi, sillä hintatieto ei ole Fingridin omistamaa. Hintatiedot löytyvät eurooppalaisten kantaverkkoyhtiöiden ylläpitämältä sähkömarkkinatietoalustalta, joka perustuu eurooppalaiseen sähkömarkkinoiden läpinäkyvyyttä edistävään asetukseen. Suomen hinta löytyy  https://transparency.entsoe.eu/  --> Transmission --> Day-ahead Prices --> Finland.

Palveluun on myös API: https://transparency.entsoe.eu/content/static_content/Static%20content/web%20api/Guide.html

Sähkön vuorokausimarkkinoiden hintoja saa selattua myös esimerkiksi sähköpörssi Nord Poolin sivuilta: https://www.nordpoolgroup.com/en/Market-data1/Dayahead/

Kannattaa siis suunnata Entso-E:n palveluun. API vaatii rekisteröitymisen, mutta on ilmainen.

Datan lukemiseen on olemassa myös valmis Python-kirjasto: https://github.com/EnergieID/entsoe-py
« Viimeksi muokattu: 04.11.22 - klo:16.21 kirjoittanut nm »

Mistofelees

  • Käyttäjä
  • Viestejä: 664
    • Profiili
Vs: fingrid tuntihinta. Toimivaa ohjelmakoodia
« Vastaus #4 : 21.11.22 - klo:19.04 »
Kirjoitin php:llä ohjelman, joka kaivaa spottihinnan esille.
Ohjelma näyttää pitkältä, koska lisäsin siihen reilusti kommentteja
Jos testaat tätä, pistä tähän viestiketjuun kommentti, niin tiedän lisätä kommentteja.

Päivämäärien käsittely on vielä työn alla.

Koodia: [Valitse]
#!/usr/bin/php
<?php
/*******************************************************************************
 261122 PTMusta, "Mistofeles", cordite(at)outlook.com
 Jos jaat ohjelmaa eteenpäin, toivon, että yllä oleva puumerkkini säilyisi
 If you copy and modify this program, I hope you don&#39;t remove my namestamp above

 Ohjelma on tässä muodossaan testattu 
 Linux Mint 20.3 Una, 5.4.0-132-generic, php 7.4
 Ubuntu 22.04.1 LTS, 5.15.0-53-generic, php 8.1
 Toimii varmasti muissaskin Linux-versioissa ainakin pienin muutoksin
 M$:n käyttöjärjestelmäyritelmä on kokeilijan vastuulla

 Ohjelma hakee ENTSO-E-palvelimelta sähkön spot-hinnan
 Tätä varten pitää rekisteröityä ENTSO-E -järjestelmään ja anoa [u]security tagia[/u] ohjeiden mukaan sähköpostilla
 OHJEITA:
 https://transparency.entsoe.eu/content/static_content/Static%20content/web%20api/Guide.html#_parameters
 https://transparency.entsoe.eu/content/static_content/download?path=/Static%20content/web%20api/RestfulAPI_IG.pdf
******************************************************************************************\
// Tulostetaan tämä ja huomispäivä
// Kellonajat ovat UTC

$alkaa=date(&#39;Ymd0000&&#39;);

$huominen = new DateTime(&#39;tomorrow&#39;);
$loppuu=$huominen->format(&#39;Ymd0000&&#39;);

//********OHJELMAN YDIN***************/
/
// Rakennetaan http-osoiterivi:
// (MUOKKAA riveille tuodaan päivämäärä)
$d1="https://transparency.entsoe.eu/api?";
// Pistä tähän oma Security tagisi (ota hakaset pois):
$d2="securityToken=[b]<Security Tagi>[/b]";  
// DocumentType A44: pricedocument:
$d3="documentType=A44&";        
// Maakoodit löytyvät:
// https://eepublicdownloads.entsoe.eu/clean-documents/EDI/Library/Market_Areas_v2.1.pdf
$d4="In_Domain=10YFI-1--------U&";
$d5="out_Domain=10YFI-1--------U&";
$d6="periodStart=".$alkaa;
$d7="periodEnd=".$loppuu;
$data=$d1.$d2.$d3.$d4.$d5.$d6.$d7;

// Lähetetään pyyntö, talletetaan muuttujaan:
$contents file_get_contents($datafalse);

// Pannaan raakadatatalteen siltä varalta, että halutaan tutkia:
// Ei välttämätön
$fp=fopen("raakadata",&#39;w&#39;);
fwrite($fp,$contents);
fclose($fp);
//************************************//
// Tästä eteenpäin haetun datan muokkausta ja tiivistystä
// Haettavat rivit:
// <start>2022-08-25T22:00Z</start>
// <end>2022-08-26T22:00Z</end>
// <position>1</position>
// <price.amount>206.93</price.amount>

// Käsitellään muuttuja rivi kerrallaan
// Irroitetaan <start><position> ja <price.amount>

// Talletetaan vain tämän ja huomisen tiedot:
$fd=fopen("loppudata.txt",&#39;w&#39;);

// Linuxissa rivin loppumerkiksi riittää "\n"
// M$Wintoosasta en halua tietää mitään
$separator "\n";

$rivi strtok($contents$separator);
while (
$rivi !== false) {
    
// Rivin alusta roskat pois:
    
$rivi=trim($rivi," \n\r\t\v\x00");
    
// onko etsittävä merkkiono tällä rivillä
    
$needle="start>";
    
$pos=strpos($rivi,$needle);
    if (
$pos != false){
        
// Rivin lopusta ja alusta tagit pois
        
$start=str_replace("</start>","",$rivi);
        
$start=str_replace("<start>","",$start);
        echo
"START:$start,";
        
// Poimitaan tunti
        
$hour=substr($start,11,2); 
        
// echo"HOUR:$hour\n";
    
}
    
   
//<end> on meille turha  
    
$needle="end>";
    
$pos=strpos($rivi,$needle);
    if (
$pos != false){
        
$endo=str_replace("</end>","",$rivi);
        
$endo=str_replace("<end>","",$endo);
        
// echo"END: $endo\n";
    

    
// <position> on tasatunti startsta alkaen       
    
$needle="position>";
    
$pos=strpos($rivi,$needle);
     if (
$pos != false){
            
$posi=str_replace("</position>","",$rivi);
            
$posi=str_replace("<position>","",$posi);
     }        
    
     
// Vihdoinkin se oleellisin: hinta
     
$needle="amount>";
     
$pos=strpos($rivi,$needle);
     if (
$pos != false){
         
$price=str_replace("</price.amount>","",$rivi);
         
$price=str_replace("<price.amount>","",$price);
         
$price/=10;

         
// Lasketaan hinnan kellonaika
         
$hetki=$hour+$posi;
        
// Vuorokausi vaihtuu:
        
if($hetki==24){
            
$hour-=24;
            
$hetki=&#39;00&#39;;
            
$day+=1// $day -arvon laskennassa on virhe:
         
}
         echo
"$day $hetki:00,   $price\n";
         
fwrite($fd,$posi.",".$price."\n");
         
    }
    
// Poimitaan seuraava rivi käsittelyyn:
    
$rivi=strtok($separator);
}

« Viimeksi muokattu: 27.11.22 - klo:02.26 kirjoittanut Mistofelees »

pere

  • Käyttäjä
  • Viestejä: 79
    • Profiili
Vs: fingrid tuntihinta
« Vastaus #5 : 11.12.22 - klo:07.43 »
pertti@IdeaCentre:~/src/php$ php --version
PHP 8.1.2-1ubuntu2.9 (cli) (built: Oct 19 2022 14:58:09) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2-1ubuntu2.9, Copyright (c), by Zend Technologies


php -f tuntih.php
PHP Parse error:  syntax error, unexpected token "/", expecting end of file in /home/pertti/src/php/tuntih.php on line 28

pere

  • Käyttäjä
  • Viestejä: 79
    • Profiili
Vs: fingrid tuntihinta
« Vastaus #6 : 11.12.22 - klo:08.13 »
en osaa php ohjelmointia, kommenti virheet sain korjattu mutta muitakin virheitä tulee?

PHP Parse error:  syntax error, unexpected token "&" in tuntih.php on line 24
Errors parsing tuntih.php

$alkaa=date(&#39;Ymd0000&&#39;);

tuota en enää tajua??

kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
Vs: fingrid tuntihinta
« Vastaus #7 : 11.12.22 - klo:08.28 »
$alkaa=date(&#39;Ymd0000&&#39;);

tuota en enää tajua??

Itsellenikin on kysymysmerkki, mutta valistunut arvaus olisi tällainen...
Koodia: [Valitse]
$alkaa=date('Ymd0000&');

tai
Koodia: [Valitse]
$alkaa=date('Ymd0000');

tai
Koodia: [Valitse]
$alkaa=date('Ymd');

todennäköisesti kaikki esittämäni kelpaa, mutta viimeinen lienee suurimmalla(, mutta sekin on veikkausta,) todennäköisyydellä toimii parhaiten ...

pere

  • Käyttäjä
  • Viestejä: 79
    • Profiili
Vs: fingrid tuntihinta
« Vastaus #8 : 12.12.22 - klo:06.52 »
// Pistä tähän oma Security tagisi (ota hakaset pois):
mitä nuo security tagit 0n? käyttäjätunnus, salasana ? vai jotain muuta?

ilkant

  • Käyttäjä
  • Viestejä: 1383
  • Kubuntu
    • Profiili
Vs: fingrid tuntihinta. Toimivaa ohjelmakoodia
« Vastaus #9 : 18.12.22 - klo:00.45 »
Kirjoitin php:llä ohjelman, joka kaivaa spottihinnan esille.

Väänsin tuon Pythoniksi. Koodissa ei ole funktiota strtok eikä contents tietorakenteen/muuttujan kuvausta. Vääntäminen oli mukavaa harjoitusta. Ei ole Security tagia eikä tuntihintasopparia sähköyhtiön kanssa.

pere

  • Käyttäjä
  • Viestejä: 79
    • Profiili
Vs: fingrid tuntihinta. Toimivaa ohjelmakoodia
« Vastaus #10 : 18.12.22 - klo:07.02 »
Kirjoitin php:llä ohjelman, joka kaivaa spottihinnan esille.

Väänsin tuon Pythoniksi. Koodissa ei ole funktiota strtok eikä contents tietorakenteen/muuttujan kuvausta. Vääntäminen oli mukavaa harjoitusta. Ei ole Security tagia eikä tuntihintasopparia sähköyhtiön kanssa.
voisiko sen tekemäsi koodin saada tänne?

ilkant

  • Käyttäjä
  • Viestejä: 1383
  • Kubuntu
    • Profiili
Vs: fingrid tuntihinta. Toimivaa ohjelmakoodia
« Vastaus #11 : 23.12.22 - klo:07.32 »
voisiko sen tekemäsi koodin saada tänne?

Tässähän se. Sitä ei ole testattu kummemmin kun siitä puuttuu oleellisia osia: strtok ja file_get_contents . Ja joku saattaisi abstrahoida enemmän. Tuo on ihan perusväännetty.
Koodia: [Valitse]
# *******************************************************************************
# 261122 PTMusta, "Mistofeles", cordite(at)outlook.com
# Jos jaat ohjelmaa eteenpäin, toivon, että yllä oleva puumerkkini säilyisi
# If you copy and modify this program, I hope you don&#39;t remove my namestamp above##
#
# Ohjelma on tässä muodossaan testattu
# Linux Mint 20.3 Una, 5.4.0-132-generic, php 7.4
# Ubuntu 22.04.1 LTS, 5.15.0-53-generic, php 8.1
# Toimii varmasti muissaskin Linux-versioissa ainakin pienin muutoksin
# M$:n käyttöjärjestelmäyritelmä on kokeilijan vastuulla
#
# Ohjelma hakee ENTSO-E-palvelimelta sähkön spot-hinnan
# Tätä varten pitää rekisteröityä ENTSO-E -järjestelmään ja anoa [u]security tagia[/u] ohjeiden mukaan sähköpostilla
# OHJEITA:
# https://transparency.entsoe.eu/content/static_content/Static%20content/web%20api/Guide.html#_parameters
# https://transparency.entsoe.eu/content/static_content/download?path=/Static%20content/web%20api/RestfulAPI_IG.pdf
# ******************************************************************************************\
# Tulostetaan tämä ja huomispäivä. Kellonajat ovat UTC

import datetime

def strtok(con=None, sep="\n") -> str:
    return con

def file_get_contents(data, boo=False) -> str:
    return data


if __name__ == "__main__":
    alkaa = datetime.date.today()                               # alkaa=date(&#39;Ymd0000&&#39;);
    huominen = alkaa + datetime.timedelta(days=1)               # huominen = new DateTime(&#39;tomorrow&#39;)
    loppuu = huominen                                           # loppuu = huominen->format(&#39;Ymd0000&&#39;)

    # *******OHJELMAN YDIN***************//
    d1 = "https://transparency.entsoe.eu/api?"                  # Rakennetaan http-osoiterivi: (MUOKKAA riveille tuodaan päivämäärä)
    d2 = "securityToken=[b]<Security Tagi>[/b]"                 # Pistä tähän oma Security tagisi (ota hakaset pois):
    d3 = "documentType=A44&"                                    # DocumentType A44: pricedocument:
    d4 = "In_Domain=10YFI-1--------U&"                          # Maakoodit löytyvät: https://eepublicdownloads.entsoe.eu/clean-documents/EDI/Library/Market_Areas_v2.1.pdf
    d5 = "out_Domain=10YFI-1--------U&"
    d6 = "periodStart=" + alkaa.strftime("%y%m%d")
    d7 = "periodEnd=" + loppuu.strftime("%y%m%d")
    data = d1 + d2 + d3 + d4 + d5 + d6 + d7

    contents = "<start>2022-08-25T22:00Z</start> <end>2022-08-26T22:00Z</end> <position>1</position> <price.amount>206.93</price.amount>" # !!! !!! !!!
   
    s = file_get_contents(data, False)                          # Lähetetään pyyntö, talletetaan muuttujaan: s tyyppi on contents
    fp = open("raakadata", "w")                                 # Pannaan raakadatatalteen siltä varalta, että halutaan tutkia: Ei välttämätön
    fp.write(contents)
    fp.close()

    # ************************************//
    # Tästä eteenpäin haetun datan muokkausta ja tiivistystä. Haettavat rivit:
    # <start>2022-08-25T22:00Z</start> <end>2022-08-26T22:00Z</end> <position>1</position> <price.amount>206.93</price.amount>

    # Käsitellään muuttuja rivi kerrallaan. Irroitetaan <start><position> ja <price.amount>
    fd= open("loppudata.txt", "w")                               # Talletetaan vain tämän ja huomisen tiedot:

    rivi = strtok(contents)
    while (rivi != False):
        rivi = rivi.trim()  # (rivi, " \n\r\t\v\x00")                 # Rivin alusta roskat pois        !!! !!! !!!

        pos = rivi.index("start>")                              # onko etsittävä merkkiono tällä rivillä
        if (pos != False):
            start = rivi.replace("</start>","")                 # Rivin lopusta ja alusta tagit pois
            start = start.replace("<start>","")
            print('START:', start)
            hour = substr(start,11,2)                             # Poimitaan tunti
            # echo"HOUR:$hour\n";
   
        pos = rivi.index("end>")
        if (pos != False):
            endo = rivi.replace("</end>","")
            endo = endo.replace("<end>","")
            # print('END:', endo\n')

        pos = rivi.index("position>")                           # <position> on tasatunti startsta alkaen       
        if (pos != False):
            posi = rivi.replace("</position>","");
            posi = posi.replace("<position>","");
   
        pos = rivi.index("amount>");                            # Vihdoinkin se oleellisin: hinta
        if (pos != False):
            price = rivi.replace("</price.amount>","");
            price = price.replace("<price.amount>","");
            price /= 10;

           # Lasketaan hinnan kellonaika
        hetki = hour + posi
        if(hetki == 24):                                    # Vuorokausi vaihtuu:
            hour-=24;
            hetki += 1                                      # &#39;00&#39;
            day +=1                                         # $day -arvon laskennassa on virhe:

        print(day, ' ', hetki, ' ', price)                  # hetki:00hetki:00
        fwrite(fd, posi + price)                              # fwrite(fd, posi.",". price."\n")

    rivi=strtok()                                           # Poimitaan seuraava rivi käsittelyyn:
« Viimeksi muokattu: 23.12.22 - klo:08.09 kirjoittanut ilkant »

ilkant

  • Käyttäjä
  • Viestejä: 1383
  • Kubuntu
    • Profiili
Vs: fingrid tuntihinta
« Vastaus #12 : 23.12.22 - klo:17.18 »
Jos joku haluaa koodata, niin tuota koodia voisi lyhentää muuttamalla nuo loppuosan if-lausekkeet funktiokutsuiksi ja se palauttaisi sitten halutun arvon haluttuun muuttujaan. Ei mikään vaikea homma.  ;D

ilkant

  • Käyttäjä
  • Viestejä: 1383
  • Kubuntu
    • Profiili
Vs: fingrid tuntihinta
« Vastaus #13 : 23.12.22 - klo:22.27 »
Tässä on se funktio. Voi hyvällä onnella jopa toimia. Pienillä muutoksilla ainakin.

Koodia: [Valitse]
def prepare(source, search="") -> str:
        pos = rivi.index(search)
        if (pos != False):
            korvaus = "</" + search + ">"
            dest = rivi.replace("</" + search + ">","")
            dest = dest.replace("<" + search + ">","")
            return dest
        else:
            return None

Vastaavat pääohjelman rivit:

Koodia: [Valitse]
    while (rivi != False):
        rivi = rivi.trim()                                                  # (rivi, " \n\r\t\v\x00")  Rivin alusta roskat pois        !!! !!! !!!

        start = prepare(rivi, "start")
        print('START:', start)
        hour = substr(start,11,2)                             # Poimitaan tunti
        # print('HOUR:', hour, '\n')

        end = prepare(rivi, "end")
        # print('END:', end, '\n')

        pos = prepare(rivi, "position")                           # <position> on tasatunti startsta alkaen       
   
        price = prepare(rivi "amount");                            # Vihdoinkin se oleellisin: hinta
        price /= 10;