Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: pere - 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.
-
Kuten Fingrid kertoo (https://www.fingrid.fi/sahkomarkkinainformaatio/fingrid-avoin-data/), avoin data on tarjolla osoitteessa https://data.fingrid.fi/.
-
Kuten Fingrid kertoo (https://www.fingrid.fi/sahkomarkkinainformaatio/fingrid-avoin-data/), avoin data on tarjolla osoitteessa https://data.fingrid.fi/.
Minun osaamisella en saanut tuolta mitään tolkkua.
-
Fingridin rajapinnan kautta ei taida saada spot-hintoja:
https://data.fingrid.fi/fi/pages/faq
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
-
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.
#!/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'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('Ymd0000&');
$huominen = new DateTime('tomorrow');
$loppuu=$huominen->format('Ymd0000&');
//********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($data, false);
// Pannaan raakadatatalteen siltä varalta, että halutaan tutkia:
// Ei välttämätön
$fp=fopen("raakadata",'w');
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",'w');
// 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='00';
$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);
}
-
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
-
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('Ymd0000&');
tuota en enää tajua??
-
$alkaa=date('Ymd0000&');
tuota en enää tajua??
Itsellenikin on kysymysmerkki, mutta valistunut arvaus olisi tällainen...
$alkaa=date('Ymd0000&');
tai
$alkaa=date('Ymd0000');
tai
$alkaa=date('Ymd');
todennäköisesti kaikki esittämäni kelpaa, mutta viimeinen lienee suurimmalla(, mutta sekin on veikkausta,) todennäköisyydellä toimii parhaiten ...
-
// Pistä tähän oma Security tagisi (ota hakaset pois):
mitä nuo security tagit 0n? käyttäjätunnus, salasana ? vai jotain muuta?
-
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.
-
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?
-
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.
# *******************************************************************************
# 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'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('Ymd0000&');
huominen = alkaa + datetime.timedelta(days=1) # huominen = new DateTime('tomorrow')
loppuu = huominen # loppuu = huominen->format('Ymd0000&')
# *******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 # '00'
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:
-
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
-
Tässä on se funktio. Voi hyvällä onnella jopa toimia. Pienillä muutoksilla ainakin.
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:
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;