HomeAssistant ja sähköpörssiohjaus

Morjesta!

Noniin.. Ilmalämpöpumpun, home assistantin ja SHF:n, sekä jatkuvan kokeilun ja testailun avulla suorasähkötalon kulutus saatu tiputettua 24.000kWh:sta nyt alle 16.000kWh:n. Huoneistoala 128m2, sen lisäksi n. 70 neliötä autotallia sekä askartelutilaa. Kiitos myös tälle foorumille.

Nyt olis joillekin teistä varmasti simppeli kysymys.. haluaisin sensoriin lämpötilaennusteen esim. 1h, 3h, 6h sekä 12h päähän. Oletan että jotenkin state_attr komennolla tuo onnistuisi, mutta miten saan poimittua tarkan ajanhetken ennusteen, siinä loppuu kädet.

Tähän saakka olen päässyt:


Tämähän palauttaa pitkän stringin jonka sisällä lämpötilaennusteet. Mutta miten kaivan nuo yo. mainitut ennusteet x tunnin päähän? Vai olenko tässä ihan hakoteillä.

Kiitos,
-kake-
 

Kaimax

Jäsen
@Temez
Oliko SHF paketissa päivän sähkön hinnalle ns. muisti? Mulla katkesi internetti klo 12 ja oli poikki aina klo 15 asti, hinta tiedot katkesivat klo 14:05 ja samalla kaatuivat sensorit/ohjaukset, jotka käyttävät sähkön hintaa. Puuttuuko multa jokin "täppi" joka ottaisi muistista hinnan vai onko vaan yritettävä varmentaa internet yhteyttä, ettei jatkossa pääsi käymään näin?

Alla vielä kuvat datan puutteen ajan kohdasta

1705337331059.png


1705337463183.png
 

hanuri

Jäsen
Kiitos kaikille jotka tänne on vinkkejä antaneet! On helpottanut omaa osaamattomuutta ja ajan puutetta perehtyä kunnolla asiaan. Olisi kyssäri itselläkin, johon tarvitsisin apua.

Haluaisin laskea oman spotti keskiarvon kuukausitasolla, jota voisi verrata sen hetkiseen pörssisähkön hintaan ja täten lisätä kulutusvaikutusta.

Nordpool/shf käytössä ja sähkönkulutukselle oma entity/ kWh löytyy jo.
Jos jotakuta kiinnostaa tämä, niin löysin kysymykseeni vastauksen:

https://hyotynen.iki.fi/kotiautomaa...sahkosopimuksen-ja-porssisahkon-hyvat-puolet/
 

Temez

Aktiivinen jäsen
Mitenkäs ihmeellä saisi ostetun sähkön keskihinnan sensorin rakennettua? Vaikka päivälle ja kuukaudelle.
En ole toteuttanut, mutta voisi onnistua Utility Metereillä. Jos sinulla on jossain kokonaisteho, integroi se Rieman sum integralilla energiaksi. Sen jälkeen tuohon energiaan voisi kohdistaa Utility Meterin, joka laskisi päivän tai tunnin kulutuksen. Tästä saat kokonaisenergian kyseisellä jaksolla.

Kaveriksi Utility Meter tunnin jaksolle laskemaan kulutettua energiaa. Kerrot tuon template-sensorissa kuluvan tunnin sähkönhinnalla ja saat kuluvan tunnin energiasta syntyvän euromäärän. Tämä vielä kerran Utility Meteriin ja siitä saa vaikkapa kuukauden aikana syntyneen eurokulun.

Lopuksi kahden edellisen kappaleen sensoreista jakolasku (kauden euromääräinen lasku)/(kauden energia).

Soveltaen esimerkiksi täältä: https://github.com/mlauhalu/energy-...WJF8LpjMdka9HMzaF0LaD4odIyAb-7ZjyvETrlYlRtLpM

Ehkä jotain tämmöistä? Täällä taisi olla mainittuna myös jokin custom componentti, joka teki noita energialaskuja myös (olikohan @heebo1974 :llä käytössä). Jollei siinä ollut valmiina, niin ehkä sen kehittäjältä voisi kysyä, että haluaisiko ympätä sen mukaan.
 

Temez

Aktiivinen jäsen
Morjesta!

Noniin.. Ilmalämpöpumpun, home assistantin ja SHF:n, sekä jatkuvan kokeilun ja testailun avulla suorasähkötalon kulutus saatu tiputettua 24.000kWh:sta nyt alle 16.000kWh:n. Huoneistoala 128m2, sen lisäksi n. 70 neliötä autotallia sekä askartelutilaa. Kiitos myös tälle foorumille.

Nyt olis joillekin teistä varmasti simppeli kysymys.. haluaisin sensoriin lämpötilaennusteen esim. 1h, 3h, 6h sekä 12h päähän. Oletan että jotenkin state_attr komennolla tuo onnistuisi, mutta miten saan poimittua tarkan ajanhetken ennusteen, siinä loppuu kädet.

Tähän saakka olen päässyt:


Tämähän palauttaa pitkän stringin jonka sisällä lämpötilaennusteet. Mutta miten kaivan nuo yo. mainitut ennusteet x tunnin päähän? Vai olenko tässä ihan hakoteillä.

Kiitos,
-kake-

Minulla ei tähän nyt ole suoraa esimerkkiä antaa, mutta tuo state_attr('weather.home', 'forecast') taitaa lakata toimimasta HomeAssistantin versiossa 2024.3: https://www.home-assistant.io/blog/2023/09/06/release-20239/#weather-forecast-service

With this change, the forecast attribute of the weather entity is deprecated, and will be removed in Home Assistant Core 2024.3.

Eli sitä toteutustapaa kannattanee varmaankin välttää. Tässä voisi olla vaihtoehto:

YAML:
template:
# My Weather Entities Hourly
  - trigger:
      - platform: state
        entity_id: [B]weather.my_weather[/B]
    action:
      - service: weather.get_forecasts
        data:
          type: hourly
        target:
          entity_id: [B]weather.my_weather[/B]
        response_variable: hourly
    sensor:
      - name: My Weather Forecast Hourly
        icon: mdi:weather-cloudy
        state: "{{ hourly['[B]weather.my_weather[/B]'].forecast[B][0].[/B]temperature}}"
        attributes:
          datetime: "{{ hourly['[B]weather.my_weather[/B]'].forecast[B][0].datetime[/B]}}"

Boldatut kohdat pitänee katsoa, että ovat oikein käyttötapaukseesi. Vaihdoin tuon nettisivun takaa löytyvän koodin tuntipohjaiseksi ja staten näyttämään lämpötilaa. Hakasulkeissa oleva nolla kertoo, että otetaan ensimmäinen ennuste, joka listalta löytyy. Tuolla varmaan helpoin lähteä liikkeelle. Laitoin attribuuttiin myös ennusteen ajankohdan, jotta pystyt paremmin tarkistamaan, että tuleehan ennuste "oikeasta kohtaa".

Täältä löytyy myös tietoa noita saatavilla olevista attribuuteista (jotka ehkä riippuvat osittain sääpalvelusta, että mitä on tarjolla): https://www.home-assistant.io/integrations/weather/
 

Temez

Aktiivinen jäsen
Mikä koodissa voi olla vikana, templatessa testatessa toimii oikein mutta kun laitaa yamliin niin antaa seuraavan herjan?

value_template: '{% if is_state("sun.sun", "above_horizon") %}laskee klo {{((as_timestamp(states.sun.sun.attributes.next_setting)) | timestamp_local) [11:16] }}{% else %}nousee klo {{((as_timestamp(states.sun.sun.attributes.next_rising)) | timestamp_local) [11:16] }}{% endif %}'icon_template: '{% if is_state("sun.sun", "above_horizon") %}mdi:weather-sunny{% else %}mdi:weather-night{% endif %}'
friendly_name: 'Aurinko'
katso liitettä 93433
Syynä taitaa olla se, että tuo "icon_template" on osunut väärälle riville. Pitäisi olla omalla rivillään. Template editorissa toimii, koska se ei välitä sisennyksistä tai muusta kuin että {% %} -merkkien ja {{ }} -merkkien välissä oleva osuus on oikein. Muu on Template Editorille vain tekstiä. Mutta HomeAssistantin konfiguraatiotiedostoissa tuolla on väliä.

Tässä toimivaksi kokeiltu esimerkki ilman icon_templatea ja rivitettynä, jotta on vähän helppolukuisempi.
Koodi:
template:
  - sensor:
      - name: "Aurinko"
        state:  >-
          {% if is_state("sun.sun", "above_horizon") %}
            laskee klo {{((as_timestamp(states.sun.sun.attributes.next_setting)) | timestamp_local) [11:16] }}
          {% else %}
            nousee klo {{((as_timestamp(states.sun.sun.attributes.next_rising)) | timestamp_local) [11:16] }}
          {% endif %}
1705640771235.png
 

Temez

Aktiivinen jäsen
@Temez
Oliko SHF paketissa päivän sähkön hinnalle ns. muisti? Mulla katkesi internetti klo 12 ja oli poikki aina klo 15 asti, hinta tiedot katkesivat klo 14:05 ja samalla kaatuivat sensorit/ohjaukset, jotka käyttävät sähkön hintaa. Puuttuuko multa jokin "täppi" joka ottaisi muistista hinnan vai onko vaan yritettävä varmentaa internet yhteyttä, ettei jatkossa pääsi käymään näin?

Alla vielä kuvat datan puutteen ajan kohdasta

katso liitettä 93581

katso liitettä 93582
Pitäisi olla muisti olemassa juuri tuollaisia tilanteita varten, mutta ehkä se on mennyt jossain rytäkässä rikki. Mikäs versio sinulla on tällä hetkellä käytössä (löytyy spot-price.yaml tiedoston ylälaidasta)?

Pistän itselle ylös, mutta jos jaksat, niin tästä voisi tuonne Githubiin kirjata Issuen: https://github.com/T3m3z/spotprices2ha/issues
 

Temez

Aktiivinen jäsen
Jos jotakuta kiinnostaa tämä, niin löysin kysymykseeni vastauksen:

https://hyotynen.iki.fi/kotiautomaa...sahkosopimuksen-ja-porssisahkon-hyvat-puolet/
Pohdiskelin tässä aamukahvin ääressä tätä käyttötapausta. Ensin kävi mielessä, että onnistuisiko laskea Statistics-integraatiolla tuota kuukauden pörssisähkön keskihintaa. Mutta siinä ei taida saada leikkausta kuun vaihtuessa ja ei saisi eripituisia kuukausia huomioitua.

Pistin itselle kokeiluun Utility Meterin niin, että se summailee tuntikohtaisia hintoja yhteen kuluvan kuun osalta. Ja teen jossain vaiheessa rinnalle template-sensorin, jossa otetaan tuon Utility Meterin arvo ja jaetaan se kuukauden kuluneiden tuntien määrällä. Siitä pitäisi minun ymmärrykselläni tulla pörssisähkön keskihinta. En tosin ole varma, että mitä tuo tykkää restarteista tai vastaavista, että ynnäileekö Utility Meter liian usein hintoja sitten. Mutta katsotaan. Voisi saada simppelimmin aikaan kuin hyotynen.iki.fi:n esimerkissä.

Vai odotas nyt: onkos tässä semmoinen, että esimerkiksi loppupäivän hintojen (eli tulevien hintojen) ymppääminen keskiarvoon olisi hyödyllistä jo etukäteen, jotta voisi ohjata tarkemmin jo ennen kyseisen hinnan "kohtaamista" sensorin "sensor.shf_electricity_price_now" kautta. Kofeiini imeytyy näemmä hitaasti ja univelka muutenkin rasittaa, niin ei nyt ihan ajatus tuon suhteen luistanut.
 
Itseä kiinnostaa nuo maksetut keskihinnat, koska en oikein ole keksinyt että miten mittaisi "optimointien" seurauksia. Tosin ei keskihintakaan kaikkea kerro, mutta edes joku johtolanka, miten säädöt vaikuttavat sähkölaskuun. Kiitos taas @Temez että jaksat ymmärtämätöntä täällä opastaa. Laitan tähän alle raakaversion minkä vinkkisi perusteella kyhäsin, kuvittelisin että suunnilleen näin menisi että pääsee alkuun...

Olen törmännyt tosiaan jo täällä esiteltyyn Hyötysen hommeliin, joka vertailee toteutunutta keskikustannusta kuukauden keskihintaan ja tähän energy-cost-saving-calculatoriin, joka taas vertailee kiinteähintaista sopimusta pörssisähkösopimukseen.
Mielenkiintoinen paketti on myös https://github.com/knudsvik/EnergyScore joka kertoo potentiaaliset säästöt jos laitteen kaikki energia olisi kulutettu halvimpien tuntien aikaan. Tämä sopii varmaan useammallekin laitteelle, mutta ei niin hyvin esim lämmityksen optimointiin.

En oikein ollut varma noiden utility meterien toiminnasta, niin tein niin että riittää varmasti.:)


YAML:
sensor:
  - platform: template
    sensors:
      pz_tuntihinta:
        unit_of_measurement: "€/kWh"
        value_template: "{{ states('sensor.pz_sahkon_tuntikulutus') | float(0) * states('sensor.shf_electricity_price_now') | float(0) }}"
      pz_paivakeskikulu:
        unit_of_measurement: "c/kWh"
        value_template: "{{ ((states('sensor.pz_sahkon_paivahinta') | float(0) / states('sensor.pz_sahkon_paivakulutus') | float(0))*100)|round(2) }}"
      pz_viikkokeskikulu:
        unit_of_measurement: "c/kWh"
        value_template: "{{ ((states('sensor.pz_sahkon_viikkohinta') | float(0) / states('sensor.pz_sahkon_viikkokulutus') | float(0))*100)|round(2) }}"
      pz_kuukausikeskikulu:
        unit_of_measurement: "c/kWh"
        value_template: "{{ ((states('sensor.pz_sahkon_kuukausihinta') | float(0) / states('sensor.pz_sahkon_kuukausikulutus') | float(0))*100)|round(2) }}"
      pz_shf_average_today:
        unit_of_measurement: "c/kWh"
        value_template: "{{ (states('sensor.shf_average_price_today') | float(0)*100)|round(2) }}"
utility_meter:
  pz_sahkon_tuntikulutus:
    source: sensor.verkko_kokonaiskulutus_kwh
    cycle: hourly
  pz_sahkon_paivakulutus:
    source: sensor.verkko_kokonaiskulutus_kwh
    cycle: daily
  pz_sahkon_viikkokulutus:
    source: sensor.verkko_kokonaiskulutus_kwh
    cycle: weekly
  pz_sahkon_kuukausikulutus:
    source: sensor.verkko_kokonaiskulutus_kwh
    cycle: monthly
  pz_sahkon_paivahinta:
    source: sensor.pz_tuntihinta
    cycle: daily
  pz_sahkon_viikkohinta:
    source: sensor.pz_tuntihinta
    cycle: weekly
  pz_sahkon_kuukausihinta:
    source: sensor.pz_tuntihinta
    cycle: monthly
  pz_sahkon_paivakulu:
    source: sensor.pz_tuntihinta
    cycle: daily
  pz_sahkon_viikkokulu:
    source: sensor.pz_tuntihinta
    cycle: weekly
  pz_sahkon_kuukausikulu:
    source: sensor.pz_tuntihinta
    cycle: monthly
 
Viimeksi muokattu:
Käytännön esimerkki oli kun tuli kuuluisan kalliin pössipäivän aikaan ylilämmitettyä taloa edellisenä päivänä ja yönä, jotka nekään eivät olleet halpoja, että miten esim ylilämmityksen hyötyä saisi mitattua, vai onko asteen tai parin lämpötilan vaihtelu esim lattialämmityksessä aivan turhaa. Vai meneekö ihan yliajatteluksi?
 

Kaimax

Jäsen
Pitäisi olla muisti olemassa juuri tuollaisia tilanteita varten, mutta ehkä se on mennyt jossain rytäkässä rikki. Mikäs versio sinulla on tällä hetkellä käytössä (löytyy spot-price.yaml tiedoston ylälaidasta)?

Pistän itselle ylös, mutta jos jaksat, niin tästä voisi tuonne Githubiin kirjata Issuen: https://github.com/T3m3z/spotprices2ha/issues
Versio 0.2.3

Voisin kyl muuten kirjata issuen, mut englanti ei taivu että onnistuisin kirjaamisessa :(
 
Viimeksi muokattu:

pahapaha

Jäsen
Osaisiko joku auttaa HA Automaatiossa tai sitten node-redillä:

"Kukaan tehnyt ILP ohjausta HA/nodered combolla jossa olisi:

  • Valinta kuinka monena halvimpana tuntina lämmitetään
  • Lovelacessa hinnan määrittely sähkönhinnan raja-arvoille jolloin lämmitys ei menisikään päälle paitsi jos
  • minimilämpötilalle jolloin lämmitys pamahtaa päälle hinnasta riippumatta.

  • Nordpool integraatio HA:ssa on jo olemassa."

    ILPpiä ohjaillaan Sensibo Skyllä.
 
Tässäpä muuten Plotlylla tehty lovelacekortti jonka koodin jostain lainasin. Tykkään enemmän kuin Apexchartista. Pystyy zoomailemaan ja muuttamaan näkymää suoraan kortista. Koodi jakoon jos jotakuta kiinnostaapi.

Screenshot 2024-01-20 125313.jpg

YAML:
type: custom:plotly-graph
time_offset: 1.5d
refresh_interval: 300
hours_to_show: 84
layout:
  xaxis:
    rangeselector:
      'y': 1.2
      buttons:
        - count: 2
          step: day
        - count: 7
          step: day
        - count: 14
          step: day
        - count: 30
          step: day
  yaxis:
    rangemode: tozero
    tickformat: .1f
  yaxis2:
    rangemode: tozero
    tickformat: .2f
    fixrange: true
  yaxis9:
    visible: false
    fixedrange: true
round: 2
default: null
entities:
  - entity: sensor.verkko_kokonaiskulutus_kwh
    name: Energy consumption
    type: bar
    marker:
      color: rgba(165,165,0,0.6)
    texttemplate: ' %{y:.2f} c/kWh'
    statistic: state
    period: hour
    filters:
      - fn: |-
          (params) => {
            const ys = [];
            ys.push(0);
            for (let i = 1; i < params.statistics.length; i++){
              ys.push(params.statistics[i].state-params.statistics[i-1].state);
            }
            return { ys };
          }
  - entity: sensor.nordpool_kwh_fi_eur_3_10_024
    name: Electricity price
    yaxis: y2
    unit_of_measurement: c/kWh
    line:
      color: rgba(255, 165, 0, 1)
      width: 1
    filters:
      - store_var: electricity_price
      - exponential_moving_average:
          alpha: 1
    show_value: true
    texttemplate: ' %{y:.2f} c/kWh'
  - entity: sensor.nordpool_kwh_fi_eur_3_10_024
    yaxis: y2
    name: Future price
    fill: tozeroy
    fillcolor: rgba(255, 165, 0,.1)
    line:
      color: rgba(255, 165, 0, 1)
      width: 1
      dash: dot
    filters:
      - fn: |-
          ({ meta, vars }) => ({
            xs: [vars.electricity_price.xs.slice(-1)[0],...meta.raw_today.concat(...meta.raw_tomorrow).map(({ start }) => new Date(start))],
            ys: [vars.electricity_price.ys.slice(-1)[0],...meta.raw_today.concat(...meta.raw_tomorrow).map(({ value }) => value)],
          })
      - exponential_moving_average:
          alpha: 1
  - entity: ''
    name: Now
    yaxis: y9
    showlegend: false
    line:
      width: 1
      dash: dot
      color: deepskyblue
    x: $fn () => [Date.now(), Date.now()]
    'y': $fn () => [0,1]
 
Osaisiko joku auttaa HA Automaatiossa tai sitten node-redillä:

"Kukaan tehnyt ILP ohjausta HA/nodered combolla jossa olisi:

  • Valinta kuinka monena halvimpana tuntina lämmitetään
  • Lovelacessa hinnan määrittely sähkönhinnan raja-arvoille jolloin lämmitys ei menisikään päälle paitsi jos
  • minimilämpötilalle jolloin lämmitys pamahtaa päälle hinnasta riippumatta.

  • Nordpool integraatio HA:ssa on jo olemassa."

    ILPpiä ohjaillaan Sensibo Skyllä.
Onhan sinulla jo Temezin tekemä spotprices2ha käytössä? Saat sillä tuon kaiken helposti tehtyä. Mukana myös valmiita blueprinttejä. En ole blueprintteihin itse perehtynyt mitä kaikkea saa tehtyä.
 

amnk

Jäsen
Tässäpä muuten Plotlylla tehty lovelacekortti jonka koodin jostain lainasin. Tykkään enemmän kuin Apexchartista. Pystyy zoomailemaan ja muuttamaan näkymää suoraan kortista. Koodi jakoon jos jotakuta kiinnostaapi.
Plotlylla saa kyllä mukavan näköistä jälkeä omastakin mielestä.
Koodia en edes kehtaa jakaa, kun siinä on niin paljon säätöä helppereillä yms. (syystä että osaaminen ja ymmärrys ei vaan riitä), mutta kuvasta saa jotain käsitystä. Huomatkaa erityisesti, miten huomisen keskihinnassa on huomioitu kausisähkön sunnuntaivähennys, mutta päivän palkeissa ei. Saisikohan sellaista mitenkään näkymään jo aina huomisen hinnoissa? Vuorokauden vaihtuessa palkitkin päivittyvät oikeaan näköön ja kokoon, mutta vuorokauden vaihtumiseen asti joka paikassa näkyy aina ne normaalit hinnat. Hieman häiritsevää muttei kuitenkaan kamalan.

Screenshot 2024-01-20 230942.png
 

Kaimax

Jäsen
Tässäpä muuten Plotlylla tehty lovelacekortti jonka koodin jostain lainasin. Tykkään enemmän kuin Apexchartista. Pystyy zoomailemaan ja muuttamaan näkymää suoraan kortista. Koodi jakoon jos jotakuta kiinnostaapi.

katso liitettä 93832
YAML:
type: custom:plotly-graph
time_offset: 1.5d
refresh_interval: 300
hours_to_show: 84
layout:
  xaxis:
    rangeselector:
      'y': 1.2
      buttons:
        - count: 2
          step: day
        - count: 7
          step: day
        - count: 14
          step: day
        - count: 30
          step: day
  yaxis:
    rangemode: tozero
    tickformat: .1f
  yaxis2:
    rangemode: tozero
    tickformat: .2f
    fixrange: true
  yaxis9:
    visible: false
    fixedrange: true
round: 2
default: null
entities:
  - entity: sensor.verkko_kokonaiskulutus_kwh
    name: Energy consumption
    type: bar
    marker:
      color: rgba(165,165,0,0.6)
    texttemplate: ' %{y:.2f} c/kWh'
    statistic: state
    period: hour
    filters:
      - fn: |-
          (params) => {
            const ys = [];
            ys.push(0);
            for (let i = 1; i < params.statistics.length; i++){
              ys.push(params.statistics[i].state-params.statistics[i-1].state);
            }
            return { ys };
          }
  - entity: sensor.nordpool_kwh_fi_eur_3_10_024
    name: Electricity price
    yaxis: y2
    unit_of_measurement: c/kWh
    line:
      color: rgba(255, 165, 0, 1)
      width: 1
    filters:
      - store_var: electricity_price
      - exponential_moving_average:
          alpha: 1
    show_value: true
    texttemplate: ' %{y:.2f} c/kWh'
  - entity: sensor.nordpool_kwh_fi_eur_3_10_024
    yaxis: y2
    name: Future price
    fill: tozeroy
    fillcolor: rgba(255, 165, 0,.1)
    line:
      color: rgba(255, 165, 0, 1)
      width: 1
      dash: dot
    filters:
      - fn: |-
          ({ meta, vars }) => ({
            xs: [vars.electricity_price.xs.slice(-1)[0],...meta.raw_today.concat(...meta.raw_tomorrow).map(({ start }) => new Date(start))],
            ys: [vars.electricity_price.ys.slice(-1)[0],...meta.raw_today.concat(...meta.raw_tomorrow).map(({ value }) => value)],
          })
      - exponential_moving_average:
          alpha: 1
  - entity: ''
    name: Now
    yaxis: y9
    showlegend: false
    line:
      width: 1
      dash: dot
      color: deepskyblue
    x: $fn () => [Date.now(), Date.now()]
    'y': $fn () => [0,1]
Mitä kortteja sulla on tässä käytössä, mulla ei tule kWh tietoja näkyviin ja antaa alla olevan herjan?

1705824937561.png

1705824913497.png
 

HakkiKoira

Tulokas
Tervehdys,

Onko joku saanut automaation "rank-automation.yaml" toimimaan? Toimii itsellä käänteisesti, eli "on" kun pitäisi mennä "off" ja
off:iin ei mene vaikka rank ja hinta kumpikaan ei valiidi.

Halvimmat tunnit pelittää hyvin ja käytän 6/12/24 rajoilla.
Siis kaikilla toimii automaatio?
 

Temez

Aktiivinen jäsen
Kiitokset tsekkaan... ei ole tuota käytössä vain nordpool integration...
Mielestäni pitäisi kyllä onnistua Nordpool-integraatiolla. Nordpoolin integraatiosta taitaa puuttua Rank-ajatus, joka tänne tulee Mikin API:n kautta.
Osaisiko joku auttaa HA Automaatiossa tai sitten node-redillä:

"Kukaan tehnyt ILP ohjausta HA/nodered combolla jossa olisi:

  • Valinta kuinka monena halvimpana tuntina lämmitetään
  • Lovelacessa hinnan määrittely sähkönhinnan raja-arvoille jolloin lämmitys ei menisikään päälle paitsi jos
  • minimilämpötilalle jolloin lämmitys pamahtaa päälle hinnasta riippumatta.

  • Nordpool integraatio HA:ssa on jo olemassa."

    ILPpiä ohjaillaan Sensibo Skyllä.
Kuulostaa siltä, että sinulla tulee olla seuraavat helperit (niitä voi luoda Settings->Devices & services -> Helpers -> Create helper -> Number:
  • Lämmitystuntien määrä
  • Hintaraja
  • Minimilämpötila
Lämmitystuntien määrästä voisi sitten Nordpoolin sensorin hinnoista selvittää, että mikä on valitun tuntimäärän "rajahinta" eli jos halutaan lämmittää 6h, niin etsitään kuudenneksi halvin tunti ja lämmitetään aina, jos hinta alle tai yhtä suuri tuon kuudenneksi halvimman tunnin hinta.

Sitten automaatio, joka lähtisi päälle esimerkiksi joka tunti (Time Pattern, tuntikohtaan /1, mikä tarkoittaa, että "joka tunti) tai jos lämpötila alle helperissä asetetun. Automaatiossa tarkistetaan: lämpötila alle minimirajan TAI (ollaan lämmitystuntien puolella JA nykyinen hinta alle asetetun maksimihinnan -> lämmitin päälle. Muutoin pois päältä.

Kuitenkin yli-insinööröinnin puolelle saattaisi mennä tuo ylläkuvattu. Helpommalla ja nopeammin tuloksiin (varmaan 80% tuloksista 20% vaivalla) varmaan pääsee, jos koetat rakentaa logiikan, jossa tunneittan vaihdetaan ILPin lämpötilapyyntiä johonkin hintarajaan nojaten (manuaalinen tai laskettu päivän hinnoista). Jos hinta alle kipurajan -> lämpötilapyynti 21C. Jos hinta yli kipurajan -> lämpötilapyynti 16C. Pumppu todennäköisesti menee pois päältä tai invertteripumppu tiputtaa tehot todella alas. Näin saisit pumpulla itsellään tehtyä tuon minimilämpötilarajan eikä tarvitsisi miettiä tilanteita, joissa pumpun päällekytkentä ei syystä tai toisesta toimisikaan - pumppu olisi aina vähintään 16C:n pyynnissä, jotta talo ei jäähdy sen enempää vaikka HomeAssistant olisi jumissa.
 

haraldh

Vakionaama
Minä vaihdan 20/22°C välillä, silläkin saa siirrettyä kustannuksia hyvin kalliilta tunneilta. Riippuu tietenkin siitä miten hyvin rakennus pitää lämpöä sisällä.
 

Cmour

Tulokas
Moikka,

Aloittelin Home Assistantin käytön viime viikolla ja sain tänään asenneltua ketjun alussa mainitut pörssisähkön haun ja näkymät. Mietin, että miten saisin määriteltyä pörssisähkölle alennuksen? Siis myynnin osuudelle, ei siirrolle. Saamme sähkön myyntihinnoista aina alennusta ja tällä hetkellä siirtoyhtiömme alueella alennus on 30%.

Huikean hienolta ja ilmeisen toimivalta vaikuttaa nuo ohjausmahdollisuudet. Itse olen vielä kiinteän sopparin jäsen, mutta rakentelen jo tulevaisuuden kyvykkyyksiä, minkä lisäksi on tietysti hyödyllistä tasata kuormaa halvoille tunneille.
 

jtapio

Jäsen
Kiitos Temezille ja muille avusta, ollaan privalla vähän aihetta lähestytty ja uskaltaudun nyt tässä jatkaaan keskustelua :)

eli Gebwellin Aries 12 MLP ohjaus ModbusTCP:llä kyseessä ja tuohon on nyt tehty Temezin avustuksella automaatiolla ohjausta käyttäen https://github.com/T3m3z/spotprices2ha kilkkeitä.
Laitettiin tuohon ennakkoa hieman, koska ohjauksen muuttaminen vie aina hieman aikaa niin laitettiin 10min ennakko pumpun ohjaukselle

Lisäksi tein pienen muutoksen tuonne Temezin spot-price.yamliin ja lisäsin yhden binary sensorin jota voi nyt sliderilla muuttaa näkymistä tai muuten automaatiolla.

Nimet saattaa olla hassuja koodissa.. "input_number.shf_map_number" jäi toisesta testistä ja käytin sitä tuossa automaatiossa. On perussäätö lämmölle, jota ei käsin suoraan muuteta vaan toisen kilkkeen kautta tarvittaessa.

Koodi:
 spot-price.yaml
 - binary_sensor:
    - name: "SHF Rank too high"
      unique_id: shf_rank_toohigh
      device_class: power
      availability: '{{ has_value("sensor.shf_rank_now") }}'
      state: '{{ states("sensor.shf_rank_now")| int >= states("input_number.rank_slider_highprice") | int }}'

Koodi:
alias: Tarkista etukäteen seuraavan tunnin Rank ja tee toimenpide siihen perustuen
description: ""
trigger:
  - platform: time_pattern
    minutes: "50"
condition: []
action:
  - variables:
      rank_next_hour: >-
        {{ (state_attr("sensor.shf_data", "data") | selectattr("Timestamp",
        "eq", now().replace(minute=0, second=0, microsecond=0)| as_timestamp +
        3600) | first)["Rank"]}}
      rank_limit: "{{ states('input_number.shf_rank_slider') }}"
      rank_limit_highprice: "{{ states('input_number.rank_slider_highprice') }}"
  - if:
      - condition: template
        value_template: "{{ rank_next_hour <= rank_limit }}"
    then:
      - service: persistent_notification.create
        metadata: {}
        data:
          message: Halvat tunnit. Nostetaan pyyntiä +1
      - service: input_number.set_value
        data:
          value: "{{ states('input_number.shf_map_number') | float + 1 }}"
        target:
          entity_id: input_number.mlp_boost_temp
      - service: mqtt.publish
        data:
          topic: modbus/gebwell/control/targettemp
          payload_template: "{\"huoneasetusarvo\": {{ states(\"input_number.mlp_boost_temp\") }} }"
    else:
      - if:
          - condition: template
            value_template: "{{ rank_next_hour >= rank_limit_highprice }}"
          - condition: template
            value_template: "{{ is_state('binary_sensor.shf_price_acceptable','off') }}"
        then:
          - service: persistent_notification.create
            metadata: {}
            data:
              message: Kalleimmat x tuntia, laske lämpötilapyyntiä.
          - service: input_number.set_value
            data:
              value: "{{ states('input_number.shf_map_number') | float - 2 }}"
            target:
              entity_id: input_number.mlp_boost_temp
          - service: mqtt.publish
            data:
              topic: modbus/gebwell/control/targettemp
              payload_template: >-
                {"huoneasetusarvo": {{ states("input_number.mlp_boost_temp") }}
                }
        else:
          - service: persistent_notification.create
            metadata: {}
            data:
              message: Normaalitunnit
          - service: input_number.set_value
            data:
              value: "{{ states('input_number.shf_map_number') | float }}"
            target:
              entity_id: input_number.mlp_boost_temp
          - service: mqtt.publish
            data:
              topic: modbus/gebwell/control/targettemp
              payload_template: >-
                {"huoneasetusarvo": {{ states("input_number.mlp_boost_temp") }}
                }
mode: single

HA puolella tein tuollaisen pikaisen väsäyksen graafeille. Hinta ei nyt bugin takia tuossa näy oikein otsikossa.

HA_pörssi.PNG


HA_pörssi_2.PNG


Sit muutama ajatus ilmoille, että onko joku jo keksinyt vai onko noissa mitään järkeä ylipäätään.

- Ohjausta tuossa miettinyt että, miten jos tekisi logiikan jossa olisi jokin keskihinnan mukaan säätyvä rank laskenta siten että siinä annetaan X hinta (-/+ keskihinnasta) jonka sisällä ollaan normaaliohjauksessa ja sitten ylimenevistä lasketaan - ja + rank tunnit? Oma taito ei tosin tuohon nyt ihan keksi koodia heti :)

Toinen mitä mietin että saisiko tuota ohjausta jotenkin hillittyä, kuten tuossa kuvassa näkyy että tulee rank arvojen mukaisesti tunneittain ohjausta mahdollisesti useasti peräkkäin.

Edit: lisäsin tuohon kalliiden tuntien osioon tuon hintarajan ehdoksi. Jos ollaan alle kipurajan ei miinusteta pyyntiä ollenkaan.

Lisäksi tein pörssinäkymään dummy buttonin jonka taustaväriä muutetaan halpa=vihreä, ei ohjausta=normaali ja kallis = pinkki. Tuo ei siis ohjaa mitään mutta tuo vähän tähän testailuihin näkyvyyttä arvoille. Tuohon etsin ideaa millä voisi tuon tekstinkin muuttaa tilan mukaan, mutten vielä löytänyt.

Koodi:
 /homeassistant/ui-lovelace.yaml     
- type: button
        tap_action:
          action: none
        entity: switch.autoroikka
        name: Pörssiohjaus Vihr=halpa Viol=kallis
        show_icon: false
        show_state: false
        show_name: true
        hold_action:
          action: none
        icon_height: 65px
        card_mod:
          style: |
            {% if is_state('binary_sensor.shf_rank_acceptable','on') %}
            ha-card { --ha-card-background: green }
            {% endif %}
            {% if is_state('binary_sensor.shf_rank_too_high','on') %}
            ha-card { --ha-card-background: purple }
            {% endif %}
            }

pörssi_nappula.PNG
 
Viimeksi muokattu:
Mitä kortteja sulla on tässä käytössä, mulla ei tule kWh tietoja näkyviin ja antaa alla olevan herjan?

katso liitettä 93886
katso liitettä 93885
Tuo error tulee näemmä lähestulkoon aina. Alussa lukee Visual editor not supported, mutta lopussa You can still edit your config in YAML.
Kaikki kuitenkin toimii kuten kuuluukin jos koodi muuten kunnossa. Enpä tiedä onko joku Plotlyn vai editorin ongelma. Vai molempien.

Sulla on tuossa joku hourly_energy sensor. Vaihda tilalle jatkuvasti kertyvä.
 
Toinen mitä mietin että saisiko tuota ohjausta jotenkin hillittyä, kuten tuossa kuvassa näkyy että tulee rank arvojen mukaisesti tunneittain ohjausta mahdollisesti useasti peräkkäin.
Olen noissa omissa automaatioissa miettinyt samaa miten sen saisi tehtyä. Tämä oli testissä.
Ilpin ohjaus on IR blasterilla. Ja ILP piippaa nyt joka tunti. Automaation pitäisi toimia ainoastaan kun asetusarvo muuttuu.

YAML:
alias: "SHF ILP Control factor 0-1 "
description: >-
  The automation trigger is any state change on the sensor and the condition
  measures changes greater than 0.5 (+ or -)
trigger:
  - platform: state
    entity_id:
      - sensor.shf_electricity_price_now
      - input_number.lammitys_ilp_hysteresis
      - input_number.lammitys_ilp_asetusarvo
    for:
      hours: 0
      minutes: 0
      seconds: 10
    enabled: true
    to: null
  - platform: state
    entity_id:
      - sensor.shf_electricity_price_now
    enabled: false
condition:
  - condition: template
    value_template: >-
      "{{ (trigger.from_state.state | float - trigger.to_state.state | float) |
      abs > 0.5 }}"
    enabled: false
action:
  - service: climate.set_temperature
    data:
      temperature: >-
        {{ ((states('input_number.lammitys_ilp_asetusarvo') | float) +
        (states('input_number.lammitys_ilp_hintahysteresis') |
        float)*states('sensor.shf_control_factor_0_1') | float) | round(0) }}
    target:
      entity_id: climate.ilp
mode: single
 

Temez

Aktiivinen jäsen
Olen noissa omissa automaatioissa miettinyt samaa miten sen saisi tehtyä. Tämä oli testissä.
Ilpin ohjaus on IR blasterilla. Ja ILP piippaa nyt joka tunti. Automaation pitäisi toimia ainoastaan kun asetusarvo muuttuu.

Tässä pikainen yritys minulta. Tein kaksi helperiä nimeltä "setpoint" ja "output", joilla tätä kokeilin. Ajatuksena se, että triggeriin kaikki mahdolliset sensorit, joita käytetään laskennassa (for:in 10s oli varmaan sinulla siksi, ettei asetusarvoa säätäessä koko ajan lähetellä ilpille komentoja - se kannattanee varmaan lisätä takaisin alla olevaan esimerkkiin). Sitten lasketaan uusi asetusarvo ja "muuttoiko arvo riittävästi" variableen. Sitten IF-blockin sisään voi laittaa haluamansa toiminnot, jotka haluaa ajaa.

Pikatestauksella tuntui toimivan.

YAML:
alias: Update value only if change is large enough
description: ""
trigger:
  - platform: state
    entity_id:
      - input_number.setpoint
    for:
      hours: 0
      minutes: 0
      seconds: 0
    enabled: true
    to: null
condition: []
action:
  - variables:
      new_value: >
        {{ states("input_number.setpoint") | float * 10  }}
      set_needed: >
        {{ (new_value - states("input_number.output") | float) | abs > 25}}
  - if:
      - condition: template
        value_template: "{{ set_needed }}"
    then:
      - service: input_number.set_value
        metadata: {}
        data:
          value: "{{ new_value }}"
        target:
          entity_id: input_number.output
      - service: persistent_notification.create
        metadata: {}
        data:
          message: LARGE CHANGE NOTICED!
mode: single

EDIT: tätä joutuu siis vähän soveltamaan, mutta perusidea kuitenkin tässä, että miten voisi tsekata, että onko uusi laskettu arvo muuttunut riittävästi siitä, mikä outputissa juuri nyt jo on asetettu.
 

amnk

Jäsen
Tässä pikainen yritys minulta. Tein kaksi helperiä nimeltä "setpoint" ja "output", joilla tätä kokeilin. Ajatuksena se, että triggeriin kaikki mahdolliset sensorit, joita käytetään laskennassa (for:in 10s oli varmaan sinulla siksi, ettei asetusarvoa säätäessä koko ajan lähetellä ilpille komentoja - se kannattanee varmaan lisätä takaisin alla olevaan esimerkkiin). Sitten lasketaan uusi asetusarvo ja "muuttoiko arvo riittävästi" variableen. Sitten IF-blockin sisään voi laittaa haluamansa toiminnot, jotka haluaa ajaa.
Itse olen tehnyt vastaavan niin, että itse automaation rungossa kaikki komennot menee input text -helperiin ja vasta lopuksi sen sisältö remote: send commandiin. Automaation ensimmäisessä vaiheessa helpperin vanha arvo kirjataan muistiin ja sitten ennen suorittamista (eli siis kaukosäätimeen lähettämistä) katsotaan, onko se muuttunut vai ei.
 
Viimeksi muokattu:

Mikki

Hyperaktiivi

Tämä Temezin paketti pollaa tuolta rajapinnasta osoitetta mitä ei ole tuolla Swaggerissa, niin mitä meinaa tuo etusivun kommentti "Muut mahdolliset tekniset keinot hakea tietoa palvelusta eivät ole osa spot-hinta.fi palvelua."? Saako niitä kuitenkin hakea?

Älä ihmeessä käytä tätä skriptiä jos homma epäilyttää. Mutta muutoin asiassa ei ole mitään ongelmaa. Eikä tiettävästi mitään ongelmia olekkaan ollut, vaan skripti toimii hienosti.
 
Viimeksi muokattu:

jtapio

Jäsen
Ei pysty näemmä muokkaamaan vanhoja viestejä, mutta tuossa aiemmin laittamassa oli käpy automaatiossa, ei laskenut seuraavan tunnin hinnan mukaan vaan kuluvan tunnin mukaan. Muokkasin tuon nyt kuntoon.
YAML:
alias: Tarkista etukäteen seuraavan tunnin Rank ja tee toimenpide siihen perustuen
description: ""
trigger:
  - platform: time_pattern
    minutes: "50"
condition: []
action:
  - variables:
      max_price: "{{ states('input_number.shf_price_slider') }}"
      rank_next_hour: >-
        {{ (state_attr("sensor.shf_data", "data") | selectattr("Timestamp",
        "eq", now().replace(minute=0, second=0, microsecond=0)| as_timestamp +
        3600) | first)["Rank"]}}
      rank_limit: "{{ states('input_number.shf_rank_slider') }}"
      rank_limit_highprice: "{{ states('input_number.rank_slider_highprice') }}"
      price_next_hour: >-
        {{ (state_attr("sensor.shf_data", "data") | selectattr("Timestamp",
        "eq", now().replace(minute=0, second=0, microsecond=0)| as_timestamp +
        3600) | first)["TotalPrice"]}}
  - if:
      - condition: template
        value_template: "{{ rank_next_hour <= rank_limit }}"
    then:
      - service: persistent_notification.create
        metadata: {}
        data:
          message: Halvat tunnit. Nostetaan pyyntiä +1
      - service: input_number.set_value
        data:
          value: "{{ states('input_number.shf_map_number') | float + 1 }}"
        target:
          entity_id: input_number.mlp_boost_temp
      - service: mqtt.publish
        data:
          topic: modbus/gebwell/control/targettemp
          payload_template: "{\"huoneasetusarvo\": {{ states(\"input_number.mlp_boost_temp\") }} }"
    else:
      - if:
          - condition: template
            value_template: "{{ rank_next_hour >= rank_limit_highprice }}"
          - condition: template
            value_template: "{{ price_next_hour >= max_price }}"
        then:
          - service: persistent_notification.create
            metadata: {}
            data:
              message: Kalleimmat x tuntia, laske lämpötilapyyntiä.
          - service: input_number.set_value
            data:
              value: "{{ states('input_number.shf_map_number') | float - 2 }}"
            target:
              entity_id: input_number.mlp_boost_temp
          - service: mqtt.publish
            data:
              topic: modbus/gebwell/control/targettemp
              payload_template: >-
                {"huoneasetusarvo": {{ states("input_number.mlp_boost_temp") }}
                }
        else:
          - service: persistent_notification.create
            metadata: {}
            data:
              message: Normaalitunnit
          - service: input_number.set_value
            data:
              value: "{{ states('input_number.shf_map_number') | float }}"
            target:
              entity_id: input_number.mlp_boost_temp
          - service: mqtt.publish
            data:
              topic: modbus/gebwell/control/targettemp
              payload_template: >-
                {"huoneasetusarvo": {{ states("input_number.mlp_boost_temp") }}
                }
mode: single
 
Viimeksi muokattu:

jkk_

Tulokas
Itse yritin saada näkymää, jossa näkisi eri kustannusten osuudet järkevästi eroteltuna, kuitenkin tuo stackays ei näytä nyt toimivan oikein, mahtaisiko täältä kukaan bongata missä mulla on virhe?

spot-price.yamlia päivitin, jotta saan helpommin mukaan sähkösiirron, sähköveron sekä sähkömarginaalit ja ne sieltä sitten Apexchartsin data_generation vaiheessa:

Koodi:
  - sensor:
    - name: SHF Electricity price now
      unique_id: shf_electricity_price_now
      unit_of_measurement: "€/kWh"
      device_class: monetary
      state: '{{ (state_attr("sensor.shf_data", "data") | selectattr("Timestamp", "lt", now() | as_timestamp) | list)[-1]["TotalPrice"] | round(4) }}'
      availability: '{{ state_attr("sensor.shf_data", "data") | selectattr("Timestamp", "ge", now() | as_timestamp ) | list | length > 0 }}'
      attributes:
        data: '{{ state_attr("sensor.shf_data", "data") }}'
        all_prices: '{{ state_attr("sensor.shf_data", "data") | selectattr("Timestamp", "ge", today_at("0:00") | as_timestamp) | map(attribute="TotalPrice") |list }}'
        today_prices: '{{ state_attr("sensor.shf_data", "data") | selectattr("Timestamp", "ge", today_at("0:00") | as_timestamp) | selectattr("Timestamp", "lt", today_at("23:59") | as_timestamp) | map(attribute="TotalPrice") |list }}'
        tomorrow_prices: '{{ state_attr("sensor.shf_data", "data") | selectattr("Timestamp", "ge", today_at("23:59") | as_timestamp) | map(attribute="TotalPrice") |list }}'
        today_min: '{{ this.attributes.today_prices | default([0]) | min }}'
        today_avg: '{{ this.attributes.today_prices | default([0]) | average | round(4) }}'
        today_max: '{{ this.attributes.today_prices | default([0]) | max }}'
        tomorrow_min: '{{ this.attributes.tomorrow_prices | default([0], true) | min }}'
        tomorrow_avg: '{{ this.attributes.tomorrow_prices | default([0], true) | average | round(4) }}'
        tomorrow_max: '{{ this.attributes.tomorrow_prices | default([0], true) | max }}'
        transmission_price: '{{ (states("input_number.sahko_siirto"))  }}'
        electricity_tax: '{{ (states("input_number.sahko_vero"))  }}'
        electricity_margin: '{{ (states("input_number.sahko_marginaali"))  }}'

Apexchartsin koodi on puolestaan seuraava:
Koodi:
type: custom:apexcharts-card
graph_span: 48h
stacked: true
experimental:
  color_threshold: true
show:
  last_updated: true
header:
  title: Electricity price
  show: true
  show_states: true
  colorize_states: true
span:
  start: day
yaxis:
  - min: 0
    decimals: 2
    apex_config:
      forceNiceScale: true
now:
  show: true
  label: Now
series:
  - entity: sensor.shf_electricity_price_now
    name: sähkön hinta
    show:
      in_header: false
      extremas: true
      legend_value: false
    type: column
    color: lightgray
    float_precision: 4
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, d["PriceWithTax"]*100];
      });
    color_threshold:
      - value: 0
        color: 368f39
      - value: 10
        color: a3b34d
      - value: 20
        color: ffd57e
      - value: 30
        color: f18c56
      - value: 40
        color: de425b
  - entity: sensor.shf_electricity_price_now
    name: siirron hinta
    show:
      in_header: false
      extremas: true
      legend_value: false
    type: column
    color: orange
    float_precision: 4
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, entity.attributes.transmission_price*100];
      });
  - entity: sensor.shf_electricity_price_now
    name: marginaalin hinta
    show:
      in_header: false
      extremas: true
      legend_value: false
    type: column
    color: red
    float_precision: 4
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, entity.attributes.electricity_margin*100];
      });
  - entity: sensor.shf_electricity_price_now
    name: sähkövero
    show:
      in_header: false
      extremas: true
      legend_value: false
    type: column
    color: blue
    float_precision: 4
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, entity.attributes.electricity_tax*100];
      });

Mutta lopputulema näyttää sille, että päivän eka hinta on se arvo, johon kaikki skaalautuu:
1708074299619.png
 

jkk_

Tulokas
Itse yritin saada näkymää, jossa näkisi eri kustannusten osuudet järkevästi eroteltuna, kuitenkin tuo stackays ei näytä nyt toimivan oikein, mahtaisiko täältä kukaan bongata missä mulla on virhe?

spot-price.yamlia päivitin, jotta saan helpommin mukaan sähkösiirron, sähköveron sekä sähkömarginaalit ja ne sieltä sitten Apexchartsin data_generation vaiheessa:

Koodi:
  - sensor:
    - name: SHF Electricity price now
      unique_id: shf_electricity_price_now
      unit_of_measurement: "€/kWh"
      device_class: monetary
      state: '{{ (state_attr("sensor.shf_data", "data") | selectattr("Timestamp", "lt", now() | as_timestamp) | list)[-1]["TotalPrice"] | round(4) }}'
      availability: '{{ state_attr("sensor.shf_data", "data") | selectattr("Timestamp", "ge", now() | as_timestamp ) | list | length > 0 }}'
      attributes:
        data: '{{ state_attr("sensor.shf_data", "data") }}'
        all_prices: '{{ state_attr("sensor.shf_data", "data") | selectattr("Timestamp", "ge", today_at("0:00") | as_timestamp) | map(attribute="TotalPrice") |list }}'
        today_prices: '{{ state_attr("sensor.shf_data", "data") | selectattr("Timestamp", "ge", today_at("0:00") | as_timestamp) | selectattr("Timestamp", "lt", today_at("23:59") | as_timestamp) | map(attribute="TotalPrice") |list }}'
        tomorrow_prices: '{{ state_attr("sensor.shf_data", "data") | selectattr("Timestamp", "ge", today_at("23:59") | as_timestamp) | map(attribute="TotalPrice") |list }}'
        today_min: '{{ this.attributes.today_prices | default([0]) | min }}'
        today_avg: '{{ this.attributes.today_prices | default([0]) | average | round(4) }}'
        today_max: '{{ this.attributes.today_prices | default([0]) | max }}'
        tomorrow_min: '{{ this.attributes.tomorrow_prices | default([0], true) | min }}'
        tomorrow_avg: '{{ this.attributes.tomorrow_prices | default([0], true) | average | round(4) }}'
        tomorrow_max: '{{ this.attributes.tomorrow_prices | default([0], true) | max }}'
        transmission_price: '{{ (states("input_number.sahko_siirto"))  }}'
        electricity_tax: '{{ (states("input_number.sahko_vero"))  }}'
        electricity_margin: '{{ (states("input_number.sahko_marginaali"))  }}'

Apexchartsin koodi on puolestaan seuraava:
Koodi:
type: custom:apexcharts-card
graph_span: 48h
stacked: true
experimental:
  color_threshold: true
show:
  last_updated: true
header:
  title: Electricity price
  show: true
  show_states: true
  colorize_states: true
span:
  start: day
yaxis:
  - min: 0
    decimals: 2
    apex_config:
      forceNiceScale: true
now:
  show: true
  label: Now
series:
  - entity: sensor.shf_electricity_price_now
    name: sähkön hinta
    show:
      in_header: false
      extremas: true
      legend_value: false
    type: column
    color: lightgray
    float_precision: 4
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, d["PriceWithTax"]*100];
      });
    color_threshold:
      - value: 0
        color: 368f39
      - value: 10
        color: a3b34d
      - value: 20
        color: ffd57e
      - value: 30
        color: f18c56
      - value: 40
        color: de425b
  - entity: sensor.shf_electricity_price_now
    name: siirron hinta
    show:
      in_header: false
      extremas: true
      legend_value: false
    type: column
    color: orange
    float_precision: 4
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, entity.attributes.transmission_price*100];
      });
  - entity: sensor.shf_electricity_price_now
    name: marginaalin hinta
    show:
      in_header: false
      extremas: true
      legend_value: false
    type: column
    color: red
    float_precision: 4
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, entity.attributes.electricity_margin*100];
      });
  - entity: sensor.shf_electricity_price_now
    name: sähkövero
    show:
      in_header: false
      extremas: true
      legend_value: false
    type: column
    color: blue
    float_precision: 4
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, entity.attributes.electricity_tax*100];
      });

Mutta lopputulema näyttää sille, että päivän eka hinta on se arvo, johon kaikki skaalautuu:
katso liitettä 95316

Itse itselleni vastaten, näytti Apexcharts skaalaavan yhden elementin mukaan, sain hieman paranneltua tuota mutta vielä voisi kyllä hienosäätää:

Koodi:
type: custom:apexcharts-card
graph_span: 48h
stacked: true
experimental:
  color_threshold: true
show:
  last_updated: true
header:
  title: Electricity price
  show: true
  show_states: true
  colorize_states: true
span:
  start: day
yaxis:
  - min: 0
    decimals: 2
    apex_config:
      forceNiceScale: true
all_series_config:
  type: column
now:
  show: true
  label: Now
series:
  - entity: sensor.shf_electricity_price_now
    show:
      in_header: true
      header_color_threshold: true
      in_chart: false
    type: line
    color: lightgray
    float_precision: 2
    stroke_width: 0
    transform: return x*100
    unit: c/kWh
    color_threshold:
      - value: 0
        color: 368f39
      - value: 15
        color: a3b34d
      - value: 20
        color: ffd57e
      - value: 25
        color: f18c56
      - value: 30
        color: de425b
      - value: 40
        color: c40423
  - entity: sensor.shf_electricity_price_now
    name: siirron hinta
    opacity: 1
    show:
      in_header: false
      extremas: false
      legend_value: false
    type: column
    color: orange
    float_precision: 4
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, entity.attributes.transmission_price*100];
      });
  - entity: sensor.shf_electricity_price_now
    name: marginaalin hinta
    show:
      in_header: false
      extremas: false
      legend_value: false
    type: column
    color: eb2fdb
    float_precision: 4
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, entity.attributes.electricity_margin*100];
      });
  - entity: sensor.shf_electricity_price_now
    name: sähkövero
    show:
      in_header: false
      extremas: false
      legend_value: false
    type: column
    color: ffe92b
    float_precision: 4
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, entity.attributes.electricity_tax*100];
      });
  - entity: sensor.shf_electricity_price_now
    name: sähkön hinta
    show:
      in_header: false
      extremas: false
      legend_value: false
    type: column
    color: lightgray
    float_precision: 4
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, d["PriceWithTax"]*100];
      });
    color_threshold:
      - value: 0
        color: 368f39
      - value: 6
        color: a3b34d
      - value: 14
        color: ffd57e
      - value: 24
        color: f18c56
      - value: 34
        color: de425b
  - entity: sensor.shf_electricity_price_now
    name: ' '
    opacity: 0
    show:
      in_header: false
      extremas: true
      legend_value: false
    type: column
    color: lightgray
    float_precision: 2
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, d["TotalPrice"]*100];
      });
  - entity: sensor.shf_electricity_price_now
    name: Average Price
    unit: c/kWh
    show:
      in_header: false
      extremas: false
    type: line
    color: blue
    float_precision: 2
    stroke_width: 2
    data_generator: >
      return [[start, entity.attributes.today_avg*100], [moment(end).subtract(1,
      'days'), entity.attributes.today_avg*100], []];
1708088979301.png
 

haraldh

Vakionaama
Olenko ainoa jolla on SHF price ja rank acceptable: Unavailable? Onko jokin nurin mun päässä vai toisessa päässä?
 

haraldh

Vakionaama
Minulla on lokissa:
Koodi:
2024-02-24 14:08:30.279 ERROR (MainThread) [homeassistant.components.rest.data] Error fetching data: https://api.spot-hinta.fi/TodayAndDayForward?HomeAssistant=true failed with All connection attempts failed
Ehkä tuo oli joku ohimenevä juuri kahden aikoihin. Tai sitten mun pääässä. met.no eli norjan sää integraatio ei myöskään vastaa. Mut siis edelleen 15:38 olen ilman SHF-tietoja HA:ssa.'

Onko joku tapa ladata ne hintatiedot uudestaan käsin?
 

Mikki

Hyperaktiivi
Minulla on lokissa:
Koodi:
2024-02-24 14:08:30.279 ERROR (MainThread) [homeassistant.components.rest.data] Error fetching data: https://api.spot-hinta.fi/TodayAndDayForward?HomeAssistant=true failed with All connection attempts failed
Ehkä tuo oli joku ohimenevä juuri kahden aikoihin. Tai sitten mun pääässä. met.no eli norjan sää integraatio ei myöskään vastaa. Mut siis edelleen 15:38 olen ilman SHF-tietoja HA:ssa.'

Onko joku tapa ladata ne hintatiedot uudestaan käsin?

Käynnistä HA uudestaan? Mutta onkohan sinulla mikä DNS palvelu käytössä? CloudFlare tai Google toimii aika pomminvarmasti ja peittoaa mennen tullen esim. kotimaisten operaattoreiden DNS:t
 

haraldh

Vakionaama
Jep, mun päässä oli se ongelma. IPv4 puolella oli default reitti hävinnyt. Miten se nyt sitten on edes mahdollista. Minun pitää puhua pitkään tänään saunassa mun verkkoylläpitäjän kanssa (minä).

Kiitos ja anteeksi
 
Löysin toisaalta 5vrk sähkönhintaennusteen. Githubissa on apexkortille koodi, mutta ei ainakaan vielä sen kummempaa tukea HA:lle. Ennusteen tarkkuuskin historian mukaan melko hyvä. Mitenkähän tuosta saisi hintadatan HA:n käyttöön?

 

Temez

Aktiivinen jäsen
Jos haluaa HomeAssistantiin sensorin dataksi, niin tällä (aika räkäistyllä) koodipätkällä se vaikuttaisi onnistuvan:

YAML:
command_line:
  - sensor:
      name: Price Forecast
      command: 'echo {\"data\": ; curl -s https://raw.githubusercontent.com/vividfog/nordpool-predict-fi/main/deploy/prediction.json ; echo }'
      value_template: 'OK'
      json_attributes:
      - data
      command_timeout: 60
      scan_interval: 1:00:00

Tosin tuosta sitä saa vielä mankeloida hetken, että saa minnekään järkevästi käyttöön ennusteen.
YAML:
type: custom:apexcharts-card
graph_span: 120h
experimental:
  color_threshold: true
show:
  last_updated: true
header:
  title: Electricity price
  show: true
  show_states: true
  colorize_states: true
span:
  start: day
yaxis:
  - min: ~0
    decimals: 2
    apex_config:
      forceNiceScale: true
apex_config:
  forceNiceScale: true
  legend:
    show: false
  xaxis:
    tooltip:
      enabled: false
now:
  show: true
  label: Now
series:
  - entity: sensor.shf_electricity_price_now
    name: Average Price
    unit: c/kWh
    show:
      in_header: before_now
      extremas: false
    type: line
    color: blue
    float_precision: 2
    stroke_width: 2
    transform: return x*100
    curve: stepline
    extend_to: end
    fill_raw: zero
    group_by:
      func: avg
      duration: 24h
      fill: zero
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, d["PriceWithTax"]*100];
      });
  - entity: sensor.shf_electricity_price_now
    show:
      in_header: before_now
      extremas: false
      legend_value: false
    type: column
    color: lightgray
    float_precision: 2
    unit: c/kWh
    data_generator: |
      return entity.attributes.data.map((d, index) => {
        return [d["Timestamp"]*1000, d["PriceWithTax"]*100];
      });
    color_threshold:
      - value: -100
        color: 368f39
      - value: 5
        color: a3b34d
      - value: 10
        color: ffd57e
      - value: 15
        color: f18c56
      - value: 20
        color: de425b
  - entity: sensor.shf_electricity_price_now
    name: Prediction c/kWh
    type: column
    float_precision: 1
    stroke_width: 0
    opacity: 1
    unit: ¢/kWh
    show:
      in_header: false
      legend_value: false
      extremas: false
    color_threshold:
      - value: -100
        color: 368f39
      - value: 5
        color: a3b34d
      - value: 10
        color: ffd57e
      - value: 15
        color: f18c56
      - value: 20
        color: de425b
    data_generator: |
      const processData = async () => {
        const now = new Date();
        const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
        const todayTimestamp = today.getTime();
        const tomorrow = new Date(today);
        tomorrow.setDate(tomorrow.getDate() + 1);
        const tomorrowTimestamp = tomorrow.getTime();
        const dayAfterTomorrow = new Date(tomorrow);
        dayAfterTomorrow.setDate(dayAfterTomorrow.getDate() + 1);
        const dayAfterTomorrowTimestamp = dayAfterTomorrow.getTime();

        // Fetch prediction data
        //const response = await fetch('https://raw.githubusercontent.com/vividfog/nordpool-predict-fi/main/deploy/prediction.json');
        //const predictionData = await response.json();
        const predictionData = hass.states["sensor.price_forecast"].attributes.data;

        // Filter prediction data based on the logic
        const filteredPredictionData = predictionData.filter(([timestamp, value]) => {
          const dateTimestamp = new Date(timestamp).getTime();
          // Exclude today's data
          if (dateTimestamp >= todayTimestamp && dateTimestamp < tomorrowTimestamp) {
            return false;
          }
          // Conditionally include tomorrow's data based on current time
          if (dateTimestamp >= tomorrowTimestamp && dateTimestamp < dayAfterTomorrowTimestamp) {
            return now.getHours() < 14;
          }
          // Always include data from day after tomorrow onwards
          return dateTimestamp >= dayAfterTomorrowTimestamp;
        });

        // Sort by timestamp just in case
        filteredPredictionData.sort((a, b) => a[0] - b[0]);

        return filteredPredictionData.map(([timestamp, value]) => [parseInt(timestamp), value]);
      };
      return processData();

Ja yllä oleva ApexChart-koodi käyttää sitten tuota aiemman command_line-sensorin dataa, josta ulos tulisi jotain tämmöistä (keskiarvohinta nyt vähän tuossa höpöilee, mutta ei kaikkea jaksa kerralla säätää kuntoon :) ):
1709061070146.png


Saa käyttää pohjana, jos joku jaksaa tästä jatkokehittää jotain ja/tai on muuten vain hyötyä.

EDIT: yllä oleva ApexChart käyttää siis SHF-paketin ja tässä viestissä olevan Price Forecast -sensorin datoja ja yhdistää ne tuoksi graafiksi. Ei tarvitse Nordpool-integraatiota.
 
Viimeksi muokattu:
Back
Ylös Bottom