Spot-hinta.fi - Yksinkertainen pörssiohjaus API ja sitä käyttävät automaatioskriptit

tet

Hyperaktiivi
Tuossa on vain se ero tavalliseen päivään että on 25 tuntia. Tosi rasittava loppujenlopuksi kun tuohon koodailee logiikan miten se kellonaika vaihtuu. Murr.... Olisi pikkuisen fiksumpi kun tuossa "position" kohdassa olisi kellonaika eikä typerä juokseva numero.
Kellonaikojen käsittely ei oikeastaan ole kovinkaan haastavaa, kunhan sen muistaa aina tehdä UTC-ajassa. Eli kun käyttäjä syöttää järjestelmään kellonajan, se muunnetaan heti käyttäjärajapinnassa UTC-ajaksi. Softassa sitten kaikki aikojen laskennat, vertailut ja haut UTC-ajoilla, ja tietokannassa data tietenkin myös UTC-aikaleimoin. Kun oikeat tulokset on saatu, käyttäjälle lähetettävä data muunnetaan ihan lopuksi paikallisaikaan. Tällä lailla homma ei oikein voi mennä pieleen, koska UTC-aika on lineaarinen, se ei koskaan pompi taaksepäin.

Tämän sanottuani huominen varmaan pudottaa minut taas maan pinnalle. Olen itse tuon saman XML-parserin koodannut asiakkaalle, huomenna täytyy töissä ensi töikseen katsoa, miten oma koodi on kellon käännöstä suoriutunut. :p
 

Mikki

Hyperaktiivi
Tämän sanottuani huominen varmaan pudottaa minut taas maan pinnalle. Olen itse tuon saman XML-parserin koodannut asiakkaalle, huomenna täytyy töissä ensi töikseen katsoa, miten oma koodi on kellon käännöstä suoriutunut. :p

Minun täytyy vielä ajatuksella tuo käydä läpi, kun vähän hakkeroinnilla sen korjasin.

Homma kusahti jotenkin siinä että oli hinnat haettu cacheen jo eilen.
 

Tome-

Tulokas
Ja tässä hengessä syntyi nyt uusi rajapinta: /JustNowRank/{rank}/{price}

Eli jos haluaa ohjata lämmitystä sekä "Rankin" mukaan että hintarajan mukaan, niin se onnistuu tällä yhdellä rajapinnalla. Rajapinta palauttaa "200" jos Rank tai hinta on riittävän alhainen. Ja "400" jos kumpikaan ehto ei täyty.

Ideana siis on, että voi ohjata lämmityksen päälle vaikkapa 3 halvimmalle tunnille ja sitten kaikille muillekkin tunneille, joissa verollinen hinta on alle 10 senttiä/kWh. Näin: /JustNowRank/3/10
Onkos tässä aloittelevalle Home Assistant käyttäjälle antaa vinkkejä.. Sain lisättyä configurations.yaml tiedostoon sen verran dataa, että saan "jotain" ulos :D Eli saan sen tuntikohtaisen tekstin nostettua entityn kautta. Mutta sieltähän nyt kai pitäisi tulla tuo "200" tai "400"? Eli saan tämän tekstin ulos: "Virrat pois! (rank: 24, verollinen hinta: 0.19805280)"

Ilmeisesti haen nyt juurikin tuon tekstin, kun ilmeisesti mulle riittäisi päälle/pois tieto ilman noita lisäinfoja..

Eli toisin sanoen, onko jollain laittaa tähän koodia/vinkkiä miten tuota saan ajettua niin, että esim. mulla tämä toimisi: https://api.spot-hinta.fi/justNowRank/4/10 Ensitilassa nyt testaan yhtä pistoketta päälle/pois ja myös yhtä zigbee-polttimoa.
 

Mikki

Hyperaktiivi
Onkos tässä aloittelevalle Home Assistant käyttäjälle antaa vinkkejä.. Sain lisättyä configurations.yaml tiedostoon sen verran dataa, että saan "jotain" ulos :D Eli saan sen tuntikohtaisen tekstin nostettua entityn kautta. Mutta sieltähän nyt kai pitäisi tulla tuo "200" tai "400"? Eli saan tämän tekstin ulos: "Virrat pois! (rank: 24, verollinen hinta: 0.19805280)"

Ilmeisesti haen nyt juurikin tuon tekstin, kun ilmeisesti mulle riittäisi päälle/pois tieto ilman noita lisäinfoja.
Tuo on siis HTTP statustieto, joko 200 fai 400. Ei tarvitse välittää paluussa olevasta tekstistä, se on vain selvennykseksi mikä tila on.

Selain ei suoraan statuskoodia näytä. Developer työkalulla toki.

Mutta hetkinen... Eikös tuo HomeAssistant todellakaan tue HTTP statuksen hakua? Google kertoo että asiaa on manattu. Mitenkä tuolla sitten virhetilanteet hanskataan? Joku HA guru voisi selventää....

Minä voisin muuttaa toki rajapinnan palauttamaan nykytekstin sijasta statuskoodin pelkästään tekstinä. Ehkä tuo olisi muutenkin fiksua kun teksti on vähän "naivi". Auttaisko tuo?

Silti tosian jää virhetilanteet kun vaikka nettiyhteys ei toimi. Miten tuo on tarkoitus Homeassistanttiin tehdä?
 
Viimeksi muokattu:

Temez

Aktiivinen jäsen
Jos haluaa vain tuota true/false-tyyppistä tietoa, niin sitten varmaan onnistuisi näin configuration.yamlissa (testaamaton koodi, täytyy soveltaa varmaan):
Koodi:
sensor:
  - platform: command_line
    command: python3 -c "import requests; print(requests.get('https://api.spot-hinta.fi/JustNowRank/4/10').status_code == 200)"
    name: ON or OFF

Mutta jos jotain monimutkaisempia automaatioita haluaa tehdä ja katsoa hintoja eteenpäin, niin helpointa joko käyttää Nordpoolin custom componenttia tai sitten haeskella omiin sensoreihinsa Restful Sensor -integraatiolla dataa tästä Mikin API:sta (tai jokin kolmas tapa, mitä en nyt tullut ajatelleeksi?).
 

tet

Hyperaktiivi
Tämän sanottuani huominen varmaan pudottaa minut taas maan pinnalle. Olen itse tuon saman XML-parserin koodannut asiakkaalle, huomenna täytyy töissä ensi töikseen katsoa, miten oma koodi on kellon käännöstä suoriutunut. :p
Hiphei, koodihan oli toiminut ja aikaleimat oikein. :hattu: Tosin olin näemmä perinteisesti toiminut toisin, kuin kehotin muita toimimaan. Olinkin jättänyt aikeleiman parseroinnin .NET-systeemikirjaston hoidettavaksi, ja mikkisofta oli onnistunut täydellisesti.
 

Arnold

Amatöörimäinen puuhastelija
Lisäsin viikonloppupuhteena oman RasPin web-hallintanäkymään API:sta saadun datan plottauksen, että on käyrät kätevästi samassa paikassa yhdellä silmäyksellä eikä tarvitse käydä selaamassa eri sivuilta. Nyt kun plottauskirjasto (Oxyplot, ainoa jonka sain toimimaan Mono / RasPi -alustalla) tuli näillä harjoiteltua niin on jatkossa helpohko lisätä myös lämmitysdatan, sähkönkulutuksen yms. käppyröiden piirto.
1667207954083.png
 

Mikki

Hyperaktiivi
Onko ihan by design, että sama tunti tulee kahteen kertaan kutsulla https://api.spot-hinta.fi/TodayAndDayForward ?Mistä johtuu kaksi eri hintaa ?

Ei toki... tuokin voi olla haiku tuosta kellonkäännöstö... douh... täytyy käydä koodi kunnolla läpi vielä ettei joka kerta tule tämmöisiä sählinkejä.
EDIT: tuolla onkin Entso-E alhaalla, varayhteyden kautta haetuissa tiedoista ehkä tuo ongelma.

Korjautunee pian.
 
Viimeksi muokattu:

Arnold

Amatöörimäinen puuhastelija
- Sademäärä millimetreinä
Mites tämä muuten menee, kun ennusteen resoluutio vaihtuu pidemmälle tulevaisuuteen mennessä 1 h -> 6 h?
Onko PrecipitationAmountMm koko jakson sademäärä eli se pitäisi laskea jotenkin TimeStamppien perusteella jakaen koko jaksolle, että olisi verrannollinen yhden tunnin resoluution sademääriin? Jos näin niin onko se edeltävän 6 h jakson sademäärä vai ehkä tulevan tai keskitetysti ±3h timestampin ympärillä?
Esim. tämänhetkisestä ennusteesta resoluution muuttumiskohta:

Koodi:
{
    "TimeStamp": "2022-11-03T19:00:00+02:00",
    "Temperature": 7.1,
    "CloudinessPercentage": 100,
    "PrecipitationAmountMm": 0
  },
  {
    "TimeStamp": "2022-11-03T20:00:00+02:00",
    "Temperature": 7.1,
    "CloudinessPercentage": 100,
    "PrecipitationAmountMm": 0
  },
  {
    "TimeStamp": "2022-11-04T02:00:00+02:00",
    "Temperature": 8,
    "CloudinessPercentage": 100,
    "PrecipitationAmountMm": 0
  },
  {
    "TimeStamp": "2022-11-04T08:00:00+02:00",
    "Temperature": 7.4,
    "CloudinessPercentage": 100,
    "PrecipitationAmountMm": 0
  },

Olisin hifistellyt tuota sademäärääkin samaan käppyrään mutta tuo pisti miettimään. En ainakaan haulla löytänyt oliko tähän jo vastausta enkä myöskään yr.no sivuilta löytänyt oikeaa lähdeaineistoa jossa se olisi mahdollisesti selitetty.
 

Liitteet

  • Saaennuste.png
    Saaennuste.png
    26,4 KB · Katsottu: 113

Mikki

Hyperaktiivi
Joo YR.NO palauttaa eri resoluutiolla tiedot kun mennään pidemmälle. Tokihan "epätieteellisesti" tuon jakson voisi pilkkoa tunneiksi ja jakaa sitten ennustetun sademäärän tasan tunneille, muuten samat lämpötilat jne.... Mutta onko se liian epätieteellistä....

Jos katsot tuota niiden rajapintaspeksiä, niin sielläkin näkyy se resoluutio pidemmille aikajänteille.

Mikäli joku taho kertoo tuntitarkkuudella vaikka ylihuomiselle paikallissään, niin joko se arvaa tai valehtelee tietävänsä. Missään nimessä mitään tieteellistä faktaa se ei kuitenkaan ole. :)
 
Viimeksi muokattu:

Arnold

Amatöörimäinen puuhastelija
Jos katsot tuota niiden rajapintaspeksiä, niin sielläkin näkyy se resoluutio pidemmille aikajänteille.

Kiitos, eli tuo on se mistä API hakee ne tiedot alunperin. Ilmeisesti /compact tai /complete?
PrecipitationAmountMm on siis kaiketi "next_1_hours" -> "details" alta 1 tunnin välein olevissa datapisteissä ja "next_6_hours" -> "details" alta 6 tunnin välein olevissa datapisteissä. Siis tulkitsisisin, että se aina viittaa ajanjaksoon TimeStampista eteenpäin.

Vaatii vain vähän pyörittelyä softassa että saadaan timestampeista pääteltyä se ajanjakso johon kulloisenkin datapisteen kenttä viittaa.
Olisiko API:n temperatureDataModeliin mahdollista helposti lisätä kenttä, joka kertoisi suoraan tuon tiedon, esim. precipitationAmountNextHours tjsp. joka olisi sitten 1 tai 6 riippuen kummasta kenttä precipitationAmountMm on haettu? (Tämähän olisi myös future-proof sikäli jos yr.no joskus muuttaisi noita ennusteiden tuntimääriä.)


Mikäli joku taho kertoo tuntitarkkuudella vaikka ylihuomiselle paikallissään, niin joko se arvaa tai valehtelee tietävänsä. Missään nimessä mitään tieteellistä faktaa se ei kuitenkaan ole. :)

Näinhän se on :) Oman harjoitukseni tarkoitus olisi vain saada käyrään sademäärät näkymään jotenkin yhteismitallisesti. Jos nyt teoreettisesti ajatellaan tilannetta että sataisi 10 vrk putkeen täysin tasaisesti vaikka 0,1 mm/h niin silloin käyrässä sademäärän pitäisi näkyä tasaisena vaakaviivana riippumatta datapisteiden aikaresoluutiosta.
Edit: Selvennyksenä vielä, että nythän käsittääkseni esimerkissä kävisi niin, että alkuun API:n antamassa ennusteessa olisi arvo 0,1 ja resoluution vaihtuessa se pomppaisi 0,6:teen, joka käyrän piirrossa pitäisi osata jakaa kuudella että viivasta tulee tasainen.
 
Viimeksi muokattu:

Hotwater

Jäsen
Ensin isot kiitokset heille, jotka tietoa ja osaamistaan täällä jakavat.
Itsellekin lähti tämän foorumin innoittamana Shellyn Pro 1 ja kontaktori tilaukseen. Ehkä menee kalenteriajolla ja/tai kännykällä halpoja tunteja käyttämällä, kun noi koodaamiset menee 'pikkaisen' yli hilseen. Mutta kyllä noita valmiita lupaan yrittää kokeilla.
Tämä talvi kun menee niin, että joutuu varaajaa pääasiassa vastuksilla lämmittämään(vesi-ilpo rikki) niin sellainen jäi mietityttämään, että jos haetaan niitä halvimpia tunteja niin onko siinä joku rajoitus ettei niitä voi olla kuin kaksitoista? Tällaiseen ainakin jossain koodissa törmäsin.
 

mobbe

Vakionaama
Ensin isot kiitokset heille, jotka tietoa ja osaamistaan täällä jakavat.
Itsellekin lähti tämän foorumin innoittamana Shellyn Pro 1 ja kontaktori tilaukseen. Ehkä menee kalenteriajolla ja/tai kännykällä halpoja tunteja käyttämällä, kun noi koodaamiset menee 'pikkaisen' yli hilseen. Mutta kyllä noita valmiita lupaan yrittää kokeilla.
Tämä talvi kun menee niin, että joutuu varaajaa pääasiassa vastuksilla lämmittämään(vesi-ilpo rikki) niin sellainen jäi mietityttämään, että jos haetaan niitä halvimpia tunteja niin onko siinä joku rajoitus ettei niitä voi olla kuin kaksitoista? Tällaiseen ainakin jossain koodissa törmäsin.
12 on max jos haluaa että on peräkkäisiä tunteja https://api.spot-hinta.fi/CheapestPeriod/12 mutta esim. https://api.spot-hinta.fi/JustNowRank/15 jos haluaa viisitoista halvinta tuntia mutta ne eivät ole peräkkäisiä ja vaikka https://api.spot-hinta.fi/JustNowRank/19 viisi kalleinta tuntia ei päällä jne...

e. tuossa ketjussa esiintyy scriptit shellyyn se vielä että rajapinnat eivät ole tekemisissä yhdenkään sähköyhtiön kanssa eikä edellytä edes pörssisähköä ja pörssisähköä en voi suositella kun eräs osmo niin kehoitti jos oma sähkösopimus tuntuu kalliilta sillä olen sen ukon kanssa vahvasti eri mieltä lähes asiasta kuin asiasta
 
Viimeksi muokattu:

Hotwater

Jäsen
12 on max jos haluaa että on peräkkäisiä tunteja https://api.spot-hinta.fi/CheapestPeriod/12 mutta esim. https://api.spot-hinta.fi/JustNowRank/15 jos haluaa viisitoista halvinta tuntia mutta ne eivät ole peräkkäisiä ja vaikka https://api.spot-hinta.fi/JustNowRank/19 viisi kalleinta tuntia ei päällä jne...
Kiitoksia. Nyt ymmärrän etten pari tuntia sitten ymmärtänyt edes sen vertaa kuin kuvittelin, mutta tämä selvensi asiaa.
En pyydä ketään tekemään, mutta onko mahdollista että olisi sellainen scripti joka pystyisi hakemaan seuraavan vuorokauden keskilämpötilan ja sen mukaan 'päättämään' kuinka monta halvinta tuntia ko. vuorokautena pidetään virrat päällä? Esim. keskilämpötila -7C -> https://api.spot-hinta.fi/JustNowRank/15
-18C -> https://api.spot-hinta.fi/JustNowRank/20
 

Arnold

Amatöörimäinen puuhastelija
En pyydä ketään tekemään, mutta onko mahdollista että olisi sellainen scripti joka pystyisi hakemaan seuraavan vuorokauden keskilämpötilan ja sen mukaan 'päättämään' kuinka monta halvinta tuntia ko. vuorokautena pidetään virrat päällä?
Juuri tällaista on tarkoitukseni tehdä, ei tosin Shellyllä. Mahdollista pitäisi olla. Tein jo funktion joka laskee API:n antamasta sääennusteesta annetun tuntivälin (esim. kuluvasta tunnista +1...+24 h) keskimääräisen lämpötilan, mutta en vielä ehtinyt soveltaa sitä rankin valintaan. Ajatus oli tehdä se lineaarisesti liukuen tyyliin -15 asteessa IVLP:n poispudotus 0 h päivässä ->+15 asteessa 12 h päivässä.
 

Mikki

Hyperaktiivi
Älkääs nyt heitelkö ideoita kun edelleen olen sitä mieltä että kaikki automaatio client päässä pitää hoitua yhdellä API kutsulla. No nyt mä sitten jumituin tätä miettimään ... Murrrrr.... :)
 

JonYamL

Tulokas
Just aloitin tämmöset. Ensin sain ton toimimaan, sit lisäsin Yaml Nordpoolin vastaava (oranssi), mut siitä puuttuu Rank. mut nyt kun kopion noi koodipätkät (vihreät) takaisin Yamliin niin tulee virheitä, mikä pilkku puuttuu ?

Zori tää on ihan newbie hommia, mut ei mene jakeluun ku se eka toimi ja nyt tulee varoituksia...

# Loads default set of integrations. Do not remove.
default_config:

sensor:
- platform: rest
name: "Energy Price Now"
resource: https://api.spot-hinta.fi/JustNow
method: GET
device_class: monetary
force_update: true
json_attributes:
- DateTime
- PriceWithTax
- PriceNoTax
- Rank
state_class: measurement


- platform: template
sensors:
el_price:
friendly_name: "Sähkön hinta nyt"
unit_of_measurement: "c/kWh"
value_template: "{{ state_attr('sensor.sahkon_hinta', 'PriceWithTax') | float * 100 }}"
el_price_rank:
friendly_name: "Sähkön hinnan järjestysluku"
value_template: "{{ state_attr('sensor.sahkon_hinta', 'Rank') | int }}"



# NORDPOOL
#
nordpool:

sensor:
- platform: nordpool

# Should the prices include vat? Default True
VAT: True

# What currency the api fetches the prices in
# this is only need if you want a sensor in a non local currency
currency: "EUR"

# Option to show prices in cents (or the equivalent in local currency)
price_in_cents: false

# Helper so you can set your "low" price
# low_price = hour_price < average * low_price_cutoff
low_price_cutoff: 0.95

# What power regions your are interested in.
# Possible values: "DK1", "DK2", "FI", "LT", "LV", "Oslo", "Kr.sand", "Bergen", "Molde", "Tr.heim", "Tromsø", "SE1", "SE2", "SE3","SE4", "SYS", "EE"
region: "FI"

# How many decimals to use in the display of the price
precision: 3

# What the price should be displayed in default
# Possible values: MWh, kWh and Wh
# default: kWh
price_type: kWh

# This option allows the usage of a template to add a tariff.
# now() always refers start of the hour of that price.
# this way we can calculate the correct costs add that to graphs etc.
# The price result of the additional_costs template expects this additional cost to be in kWh and not cents as a float
# default {{0.0|float}}
additional_costs: "{{0.0|float}}"
 

Temez

Aktiivinen jäsen
Ensin sain ton toimimaan, sit lisäsin Yaml Nordpoolin vastaava (oranssi), mut siitä puuttuu Rank.
Toivottavasti saat toimimaan tavalla tai toisella, tärkeintähän on, että se toimii.

Nordpoolin sensoriin saat rankin mukaan tekemällä Template-sensorin ja siihen seuraava pätkä (testasin templaten HomeAssistantin UI:ssa mutta muuten koodi testaamatta ja jotain sisennysvirheitä voi olla, kun puhelimella bussissa kirjoittelen):
YAML:
template:
  - sensor:
      - name: "Rank"
        state: >
             {{ (state_attr('sensor.nordpool_kwh_fi_eur_3_10_0', 'today') | sort).index(state_attr('sensor.nordpool_kwh_fi_eur_3_10_0', 'current_price'))+1}}

Pitäisi antaa lukuja 1-24, jossa 1 on halvin tunti. Voi sekoilla, jos sattuisi olemaan kahdella tunnilla täsmälleen sama hinta, mutta se taitaa olla harvinaista, jos ottaa 3:n desimaalin tarkkuudella Nordpoolista hinnat. Vaihdat vain koodiin sensor.nodrpool... kohtiin oman Nordpool-sensorisi nimen.

Tai vaihtoehtoisesti myös toki tämä Mikin mahtava API! Hieno projekti ja arvostan efforttia vaikka itse käytänkin HA:n kanssa tuota Nordpoolin komponenttia. Vaikutat ison käyttäjämäärän sähkönkäyttöön positiivisella tavalla sekä ympäristön kannalta (kulutus "vihreämpien" tuntien aikana) että yleisesti sähköverkon toimivuuden/vakauden kannalta ja tietenkin vielä käyttäjien lompakossahan tämä tuntuu - jos ei voi sanoa positiivisesti, niin ilman tätä olisi huonommin. Harva saa tehtyä tämmöistä vaikutusta.
 

mobbe

Vakionaama
Toivottavasti saat toimimaan tavalla tai toisella, tärkeintähän on, että se toimii.

Nordpoolin sensoriin saat rankin mukaan tekemällä Template-sensorin ja siihen seuraava pätkä (testasin templaten HomeAssistantin UI:ssa mutta muuten koodi testaamatta ja jotain sisennysvirheitä voi olla, kun puhelimella bussissa kirjoittelen):
YAML:
template:
  - sensor:
      - name: "Rank"
        state: >
             {{ (state_attr('sensor.nordpool_kwh_fi_eur_3_10_0', 'today') | sort).index(state_attr('sensor.nordpool_kwh_fi_eur_3_10_0', 'current_price'))+1}}

Pitäisi antaa lukuja 1-24, jossa 1 on halvin tunti. Voi sekoilla, jos sattuisi olemaan kahdella tunnilla täsmälleen sama hinta, mutta se taitaa olla harvinaista, jos ottaa 3:n desimaalin tarkkuudella Nordpoolista hinnat. Vaihdat vain koodiin sensor.nodrpool... kohtiin oman Nordpool-sensorisi nimen.

Tai vaihtoehtoisesti myös toki tämä Mikin mahtava API! Hieno projekti ja arvostan efforttia vaikka itse käytänkin HA:n kanssa tuota Nordpoolin komponenttia. Vaikutat ison käyttäjämäärän sähkönkäyttöön positiivisella tavalla sekä ympäristön kannalta (kulutus "vihreämpien" tuntien aikana) että yleisesti sähköverkon toimivuuden/vakauden kannalta ja tietenkin vielä käyttäjien lompakossahan tämä tuntuu - jos ei voi sanoa positiivisesti, niin ilman tätä olisi huonommin. Harva saa tehtyä tämmöistä vaikutusta.
HA:sta ja mistään koodaamisesta en ymmärrä mutta tästä huolimatta foorumin ja loistavaa duunia tehneen Mikin ansiosta täällä vaan releet toimii spotin ja API:n tahtiin ,Mikille on joku vuoden ekoteko -palkinto on paikallaan.Uskaltaako kysyä kuinka paljon on käyttäjiä eli monestako ip-osoitteesta ?
 

Mikki

Hyperaktiivi
Kiitos kiitos. En ole itsekkään vielä laskenut kuinka monesta eri IP:stä tulee kyselyitä. Mutta tahti on nyt noin 160 000 kyselyä päivässä.
Azure on tehnyt tosiaan IP osoite homman vähän hankalaksi GDBR syistä: tehtävissä kyllä, mutta en ole kerinnyt koodata.
 

Nikko

Tulokas
Ensinnäkin iso kiitos että jaksatte väsätä näitä scriptejä! Scripti taidot vähän ruostuneet vuosien varrella mutta täältä saanut hyvin palautettua ainakin osan muistiin.
Käyttänyt Mikkin api rajapintaa nyt mutta jotenkin tarvitsisi vielä saada sellainen "kipuraja" hinta laitettua eli jos ajatellaan että ohjataan tuolla https://api.spot-hinta.fi/JustNowRank/5/6" kyselyllä niin saisi siihen laitettua vielä maksimi hinnan. Eli jos tulee kallis päivä ja nuo 5 halvintakin tuntia on esim. yli asetetun 25snt "kipurajan" niin ei ohjaisi relettä ollenkaan paitsi manuaalisella pakotuksella.
Miten tämä olisi helpoin toteuttaa?
 

Mikki

Hyperaktiivi
Tuon rajapinnan voisi tehdä aika heloostikkin että se palauttaa aina kipurajan yli "bad request".

Mutta mutta... Tuo käsinohjaus ei niin vain onnistu ellei sulje skriptiä. Se nimittäin uskollisesti sulkisi relettä.

Eli vähän manuaalista kun tavoite on automatisoida.
 

mobbe

Vakionaama
Ensinnäkin iso kiitos että jaksatte väsätä näitä scriptejä! Scripti taidot vähän ruostuneet vuosien varrella mutta täältä saanut hyvin palautettua ainakin osan muistiin.
Käyttänyt Mikkin api rajapintaa nyt mutta jotenkin tarvitsisi vielä saada sellainen "kipuraja" hinta laitettua eli jos ajatellaan että ohjataan tuolla https://api.spot-hinta.fi/JustNowRank/5/6" kyselyllä niin saisi siihen laitettua vielä maksimi hinnan. Eli jos tulee kallis päivä ja nuo 5 halvintakin tuntia on esim. yli asetetun 25snt "kipurajan" niin ei ohjaisi relettä ollenkaan paitsi manuaalisella pakotuksella.
Miten tämä olisi helpoin toteuttaa?
Se ehkä onnistuisi kahdella scriptillä ensimmäinen https://api.spot-hinta.fi/JustNowRank/25" true/false käynnistää/pysäyttää toisen scriptin https://api.spot-hinta.fi/JustNowRank/5/6"
 

Mikki

Hyperaktiivi
Selvennykseksi... ei ole sellaista rajapintaa vielä, mikä palauttaisi "200" jos hinta on alle halutun tai "400" jos yli sen. Mutta ideana tuo Mobben juttu oli hyvä. Pohdintaan menee
 

Mikki

Hyperaktiivi
Olkaattes hyvä: https://api.spot-hinta.fi/JustNow/14

Rajapinta palauttaa siis "200" statuskoodin, jos hinta nyt on alle annetun senttihinnan tai "400" jos yli sen. Toimii "Get" ja "Head" requesteilla. Laitoin myös Get paluuseen bodyksi 200 tai 400 tekstin HomeAssistanttia varten.

Jossain välissä muutan nuo muutkin 200/400 rajapinnat niin, että bodyssä on tuo 200/400 teksti. Saa sitten parsittua bodystä statuskoodin, eikä tarvitse mitään stringiä varsinaisesti parsia.
 

Mikki

Hyperaktiivi
Tässä olisi kolmen skriptin kokonaisuus, jossa ensimmäinen skripti on varsinainen "äly". Keskimmäinen skripti on paniikkinappi jos on hirmuhinnat. Ja kolmas skripti valvoo että paniikkinappi pyörii. Ja paniikkinappi taas pitää ensimmäisen käynnissä.

EDIT: Skriptit on nyt testatty Shelly Plus 1 releessä ja tuntuvat toimivilta.


SKRIPTI 1: PÖRSSIHINTAHAKU
********************************

let CONFIG = { Paivitystaajuus: 2 * 60000, }; // kaksi minuuttia

function Ohjaus(){
Shelly.call("HTTP.GET", { url: "https://api.spot-hinta.fi/JustNowRank/6/3"},
function (res, error_code, error_msg, ud)
{
if (res.code === 200){
Shelly.call("Switch.Set","{ id:0, on:true}", null,null); // Rele päälle. Huom! id:0 on rele. Jos useampi rele niin Id:1..3.
}
else if (res.code === 400) {
Shelly.call("Switch.Set","{ id:0, on:false}", null,null); // Rele pois päältä
}
else {
Shelly.call("Switch.Set","{ id:0, on:false}", null,null); // Virhetilanne. Mitä tehdään?
};
}, null);
}

Timer.set(CONFIG.Paivitystaajuus, true, function (ud) { Ohjaus(); }, null);



SKRIPTI 2: PANIIKKINAPPI karmeiden hintojen varalta
********************************************************

let CONFIG = { Paivitystaajuus: 2 * 60000, }; // kaksi minuuttia

function Ohjaus(){
Shelly.call("HTTP.GET", { url: "https://api.spot-hinta.fi/JustNow/30"},
function (res, error_code, error_msg, ud)
{
if (res.code === 200){
Shelly.call("Script.Start", { id:"1"}, null, null); // Käynnistä pörssihinta-skripti.
}
else if (res.code === 400) {
Shelly.call("Script.Stop", { id:"1"}, null, null); // Pysäytä pörssihinta-skripti.
Shelly.call("Switch.Set","{ id:0, on:false}", null,null); // Suljetaan rele
}
else {
Shelly.call("Switch.Set","{ id:0, on:true}", null,null); // Virhetilanne. Mitä tehdään?
};
}, null);
}

Timer.set(CONFIG.Paivitystaajuus, true, function (ud) { Ohjaus(); }, null);



SKRIPTI 3: VALVO ETTÄ PANIIKKINAPPI toimii
************************************************

let CONFIG = {
Paivitystaajuus: 1 * 60000,
};
function Valvonta(){
Shelly.call("Script.GetStatus", { id:"2"},
function (res, error_code, error_msg, ud)

{
if (res.running === true){
print("Scripti toimii");
}
else {
print("Scripti EI toimi");
Shelly.call("Script.Start", { id:"2"}, null, null);

};
},
null); }

Timer.set(
CONFIG.Paivitystaajuus,
true,
function (ud) {
Valvonta();
},
null
);
 
Viimeksi muokattu:

JonYamL

Tulokas
Kokeileppa vaikka tätä
Kiitoksia. toi oli nopeampi ja turvallisempo tapa testata. Eihän tää ihan helppoa ole. Virhe oli yksi välilyönti liikaa ennen -platform sanaa :) , Nordpolin rank en saanut toimimaan ... ainakaan vielä ... tolla esimerkkikoodilla, ehkä siinäkin joku välilyönti hässäkkä, mutta Mikin Api lähti toimimaan. eli nyt on stage one valmis. lattialämmitys päällä halvimpina tunteina. Sit pitäisi aloittaa hionsäädön tutkimalla huomsien hintoja ja sääennustuksia. Onko joku jo muuten tehnyt "oikean" arvion että paljon tällaisella fiilistelyllä oikeesti voi säästää. Uskon että tolla hienosäädöllä on loppupeleissä aika marginaalinen merkitys, mutta hauska harrastus. Löytyykö muuten joltain nyt esimerkkikoodia miten ton /today ja /Dayforward saa nätisti purettua, esimerkiksi graafiksi ja sit vielä arvoihin kiinni... Ettei tartte taas välimerkkejä metsästellä. :)
 

mobbe

Vakionaama
Älä vaan sano ettei siinä ollut typoja tai bugeja? Kirjoitin tosiaan Notepadilla sen :)
on sittenkin ongelma, scripti3 ei käynnistä scripti2 paniikkinappia mutta se paniikkinappihinta toimii jos se on käynnistetty kerran manuaalisesti.

ja tuo valvontascripti on tärkeä siksi että suorittaa mahdollisen verkkokatkon jälkeisen käynnistyksen pörssihintahakuun automaattisesti eli "alkuperäisessä"
muodossaan näin se on

let CONFIG = {
Paivitystaajuus: 1 * 60000,
};
function Valvonta(){
Shelly.call("Script.GetStatus", { id:"1"},
function (res, error_code, error_msg, ud)

{
if (res.running === true){
print("Scripti toimii");
}
else {
print("Scripti EI toimi");
Shelly.call("Script.Start", { id:"1"}, null, null);

};
},
null); }

Timer.set(
CONFIG.Paivitystaajuus,
true,
function (ud) {
Valvonta();
},
null
);
 
Viimeksi muokattu:

Mikki

Hyperaktiivi
Kun ne skriptit kerran käynnisti käsin, lähti pelaamaan. Sammutin ohjurin ja se käynnistyi ja sama Paniikkinapin kanssa.
On tämä Shelly kyllä melkoinen vempain ollakseen parinkympin vehje.

Ylläolevat kolme skriptiä siis ladattuna Shellyyn ja kyllä tuntuu rele napsuvan kuten on tarkoitus. Hintarajat maun mukaan... jos "Paniikkinappia" (eli pakkosammuttaa releen hintarajan ylityttyä) ei huvita käyttää, niin asian voi kiertää nostamalla hintarajan riittävän ylös. Sitten se ei sulje pörssihintaohjuria.

Boottasin vehkeen virtapiuhasta ja virtojen palautuksen jälkeen kaikki skriptit käynnistyi nätisti.

1667507851725.png
 
Viimeksi muokattu:

Hotwater

Jäsen
Kun ne skriptit kerran käynnisti käsin, lähti pelaamaan. Sammutin ohjurin ja se käynnistyi ja sama Paniikkinapin kanssa.
On tämä Shelly kyllä melkoinen vempain ollakseen parinkympin vehje.

Ylläolevat kolme skriptiä siis ladattuna Shellyyn ja kyllä tuntuu rele napsuvan kuten on tarkoitus. Hintarajat maun mukaan... jos "Paniikkinappia" (eli pakkosammuttaa releen hintarajan ylityttyä) ei huvita käyttää, niin asian voi kiertää nostamalla hintarajan riittävän ylös. Sitten se ei sulje pörssihintaohjuria.

Boottasin vehkeen virtapiuhasta ja virtojen palautuksen jälkeen kaikki skriptit käynnistyi nätisti.

katso liitettä 81627
Eli tässä Valvontakomissio valvoo vain Paniikkinapin toimintaa? Kannattaako/voiko tuohon scriptilistaan vielä lisätä tuon mobben viestissä olevan valvontascriptin? Sekoittaako jotain tai onko turha?
 

Mikki

Hyperaktiivi
Eli tässä Valvontakomissio valvoo vain Paniikkinapin toimintaa? Kannattaako/voiko tuohon scriptilistaan vielä lisätä tuon mobben viestissä olevan valvontascriptin? Sekoittaako jotain tai onko turha?
Periaatteessa pitäisi olla turha (ja sekoittaa kolmen skriptin toiminnan). Tuo "valvontakomissio" ei tee Internettiin kutsuja, eli pitäisi ainakin olla suhteellisen varma ajastin (niin varma kuin Shelly ylipäätänsä on).

Ja se katsoo että tuo Paniikkinappi on käynnissä. Paniikkinappi on tässä siis "pääsulake", joka pistää pelin poikki kokonaan jos hinta on liian kova. Mutta samalla tuo Paniikkinappi siis toimii varsinaisen pörssihintaohjurin valvojana. Eli käynnistää skriptin jos sen pitäisi olla käynnissä tai sulkee jos hinta on liian kova.
 
Viimeksi muokattu:

Sammypiru

Vakionaama
Laitanpa tähän ihan esimerkin eiliseltä, jossa tässä ketjussa ollut scripti "10 halvinta ja <10c/kWh" käytössä talossani. Kokonaiskulutus 24 kWh ja hinnaksi muodostui 10,12 c/kWh. Ei lainkaan huonoa vaikkakin optimointia kyllä vielä löytyy. Esim. tulistusvaraaja pitää vielä erottaa tästä ohjauksesta toiseen säännöllä "5 halvinta ja <5c/kWh", ehkä pakastinkin voisi olla jälkimmäisen scriptin takana tyyliin: "Kun halpaa lämpötilatavoite -20, kun kallista lämpötilatavoite -16" :sille: (pakastin oli muuten -26 kun tarkistusmittasin sisälämpötilan).

MicrosoftTeams-image.png
 

jengstro

Tulokas
Jänniä lukuja tulee Nordpoolista... ihmettelin miks oma backend ei saanut parsittua numeroa.
Sähkön hintaennuste on "-" (pelkkä miinus) :confused:.
Onko joku löytänyt Finngridistä, miten sieltä saa sähkön hinnan ennusteen ulos? ettei tätä tarvii raapia tälläisillä kikkavitosilla...

},
{
"Index": 0,
"Scale": 0,
"SecondaryValue": null,
"IsDominatingDirection": false,
"IsValid": false,
"IsAdditionalData": false,
"Behavior": 0,
"Name": "04-11-2022",
"Value": "-",
"GroupHeader": null,
"DisplayNegativeValueInBlue": false,
"CombinedName": "04-11-2022",
"DateTimeForData": "0001-01-01T00:00:00",
"DisplayName": "-_True",
"DisplayNameOrDominatingDirection": "-",
"IsOfficial": true,
"UseDashDisplayStyle": false
},
 

Mikki

Hyperaktiivi
Jänniä lukuja tulee Nordpoolista... ihmettelin miks oma backend ei saanut parsittua numeroa.
Sähkön hintaennuste on "-" (pelkkä miinus) :confused:.
Onko joku löytänyt Finngridistä, miten sieltä saa sähkön hinnan ennusteen ulos? ettei tätä tarvii raapia tälläisillä kikkavitosilla...

Jaa'a... mutta ei liity sinänsä tähän APiin. Se kuitenkin, ettei huomisia hintoja ole vielä tullut jos niitä odotat nyt löytyvän?
Siirry käyttämään tämän ketjun koodaaja-ystävällistä APIa, niin ei tarvitse tapella monimutkaisten rajapintojen kanssa.

Täältä infor: https://api.spot-hinta.fi/swagger/ui
 
Back
Ylös Bottom