HomeAssistant ja sähköpörssiohjaus

heebo1974

Aktiivinen jäsen
Itse en ole vieläkään viitsinyt päivittää toimivaa HA:ta tuoreeseen ko. control factor toimimattomuuden takia. Odottavan aika on pitkä. :)
 

tk-

Aktiivinen jäsen
Itse korjailisin tuota yamlia seuraavaan tapaan. Oman käsitykseni mukaan tuo unique_id on tarpeeton sensoreissa jonka tilatietoa ei ole tarkoitus säilyttää historiatiedoksi. Lisäksi erikoismerkit jättäisin sensoreiden nimistä pois, ainakin miinusmerkki saattaa siellä kovastikin sotkea. Ja namespaceissa en käyttäisi muuttujan arvona "value".

Tämä ei ole semmoisenaan yhteensopiva tuon virallisen version kanssa, koska sensoreiden nimiä on muutettu ja unique-id:t puuttuu. Eli vanhat pitäisi ensin poistaa, ja kun tulee virallinen päivitys, niin sama homma on uudestaan edessä. Mutta itselläni nuo kaikki sensorit hakee arvot tällä tavalla.

Tekee vielä jonkin verran vikakoodeja logiin ennen jsonin hakua, kun en ihan tuota sensoreiden olemassaolon tarkistusta vienyt loppuun saakka. Lisäksi mielestäni tuosta puuttuu myös tarkistus, että hintatiedot on oikeasti päivittyneet, periaatteessa tuon helperin kanssa käytetään niin pitkään noita jälkimmäistä 24 hintaa kunnes uudet haetaan. Sinällään aika epätodennäköinen skenaario etteikö ne päivittyisi, mutta koodi ei sitä varmista. Sama homma on myös noissa control factoreissa, periaatteessa olisi hyvä luoda sensorin attribuutiksi dictionary, missä on 24 x 0 semmoisessa tilanteessa kun tuota oikeaa factoria ei saada laskettua, niin sitten sensori sinällään pystyisi antamaan arvon myös hintadatan puuttuessa eikä ohjaukset mene jumiin.

YAML:
# Start pack for Spot Price control.
# UNOFFICIAL VERSION
#
# This is a copy-paste approach in order to get Finnish Electricity Spot Prices to Home Assistant.
# Initial implementation by Temez but feel free to further develop this.
# Special thanks to Mikki who has created the API where data is fetched. For more information see https://spot-hinta.fi/

# This is just a loader for the data which is stored in sensor attributes. Template sensors present actual data.
sensor:
  - platform: rest
    resource: https://api.spot-hinta.fi/TodayAndDayForward?HomeAssistant=true
    name: "SHF electricity price"
    scan_interval: 604800 # 7 days, update logic is in the automation
    value_template: "OK" # static value as sensor is not updated regularly
    json_attributes:
      - "data"
  - platform: statistics
    name: "SHF Average Price 7 Days"
    entity_id: sensor.shf_electricity_price_now
    state_characteristic: mean
    unique_id: shf_average_7days
    precision: 4
    max_age:
      days: 7

template:
  - sensor:
      - name: "SHF Idx" # Helper for other sensors to get correct price/rank from array
        state: >
          {% if state_attr("sensor.shf_electricity_price_now", "data") %}
            {% if state_attr("sensor.shf_electricity_price_now", "data")[0]["DateTime"][8:10] | int == now().day %}
              {{ 0 }}
            {% else %}
              {{ 24 }}
            {% endif %}
          {% endif %}
  - sensor:
      - name: "SHF Rank now"
        unit_of_measurement: Rank
        state: >
          {% if state_attr("sensor.shf_electricity_price_now", "data") %}
            {% set json_key = states("sensor.shf_idx") | int + now().hour %}
            {{ state_attr("sensor.shf_electricity_price_now", "data")[json_key]["Rank"] }}
          {% else %}
            {{ 0 }}
          {% endif %}
  - sensor:
      - name: "SHF Electricity price now"
        unit_of_measurement: "snt/kWh"
        device_class: monetary
        state: >
          {% if state_attr("sensor.shf_electricity_price_now", "today_prices") %}
            {{ state_attr("sensor.shf_electricity_price_now", "today_prices")[now().hour] | float }}
          {% else %}
            {{ 0 }}
          {% endif %}
        attributes:
          data: >
            {{ state_attr("sensor.shf_electricity_price", "data") if state_attr("sensor.shf_electricity_price", "data") else state_attr("sensor.shf_electricity_price_now", "data") }}
          all_prices: >
            {% if state_attr("sensor.shf_electricity_price_now", "data") %}
              {% set output = namespace(prices=[]) %}
              {% for value in state_attr("sensor.shf_electricity_price_now", "data") | map(attribute="PriceWithTax") | list %}
                {% if ((loop.index - 1) % 24) >= state_attr("input_datetime.shf_price2_start", "hour") and ((loop.index - 1) % 24) < state_attr("input_datetime.shf_price2_stop", "hour") %}
                  {% set output.prices = output.prices + [ value + states('input_number.shf_price2_slider') | float] %}
                {% else %}
                  {% set output.prices = output.prices + [ value + states('input_number.shf_price1_slider') | float] %}
                {% endif %}
              {% endfor %}
              {{ output.prices if output.prices | length > 0 else state_attr("sensor.shf_electricity_price_now", "all_prices") }}
            {% else %}
              {{ 0 }}
            {% endif %}
          today_prices: >
            {% if state_attr("sensor.shf_electricity_price_now", "all_prices") %}
              {{ state_attr("sensor.shf_electricity_price_now", "all_prices")[states("sensor.shf_idx")|int:states("sensor.shf_idx")|int+24] | list }}
            {% else %}
              {{ 0 }}
            {% endif %}
          tomorrow_prices: >
            {% if state_attr("sensor.shf_electricity_price_now", "all_prices") %}
              {{ (state_attr("sensor.shf_electricity_price_now", "all_prices"))[states("sensor.shf_idx")|int+24:] | list }}
            {% else %}
              {{ 0 }}
            {% endif %}
          today_min: >
            {% if state_attr("sensor.shf_electricity_price_now", "today_prices") %}
              {{ state_attr("sensor.shf_electricity_price_now", "today_prices") | min }}
            {% else %}
              {{ 0 }}
            {% endif %}
          today_avg: >
            {% if state_attr("sensor.shf_electricity_price_now", "today_prices") %}
              {{ state_attr("sensor.shf_electricity_price_now", "today_prices") | average | round(4) }}
            {% else %}
              {{ 0 }}
            {% endif %}
          today_max: >
            {% if state_attr("sensor.shf_electricity_price_now", "today_prices") %}
              {{ state_attr("sensor.shf_electricity_price_now", "today_prices") | max }}
            {% else %}
              {{ 0 }}
            {% endif %}
          tomorrow_min: >
            {% if state_attr("sensor.shf_electricity_price_now", "tomorrow_prices") %}
              {{ state_attr("sensor.shf_electricity_price_now", "tomorrow_prices") | min }}
            {% else %}
              {{ 0 }}
            {% endif %}
          tomorrow_avg: >
            {% if state_attr("sensor.shf_electricity_price_now", "tomorrow_prices") %}
              {{ state_attr("sensor.shf_electricity_price_now", "tomorrow_prices") | average }}
            {% else %}
              {{ 0 }}
            {% endif %}
          tomorrow_max: >
            {% if state_attr("sensor.shf_electricity_price_now", "tomorrow_prices") %}
              {{ state_attr("sensor.shf_electricity_price_now", "tomorrow_prices") | max }}
            {% else %}
              {{ 0 }}
            {% endif %}
  - sensor:
      - name: "SHF Average price today"
        unit_of_measurement: "€/kWh"
        device_class: monetary
        state: >
          {% if state_attr("sensor.shf_electricity_price_now", "today_avg") %}
            {{ state_attr("sensor.shf_electricity_price_now", "today_avg") }}
          {% else %}
            {{ 0 }}
          {% endif %}
  - sensor:
      - name: "SHF Average price next hours"
        unit_of_measurement: "€/kWh"
        device_class: monetary
        state: >
          {% if state_attr("sensor.shf_electricity_price_now", "all_prices") %}
            {% set idx = states("sensor.shf_idx")|int + now().hour + 1 %}
            {{ state_attr("sensor.shf_electricity_price_now", "all_prices")[idx:idx+states("input_number.shf_price_avg_slider")|int] | average | round(3) }}
          {% else %}
            {{ 0 }}
          {% endif %}
  - sensor:
      - name: "SHF Cheapest period start helper"
        state: >
          {% if state_attr("sensor.shf_electricity_price_now", "all_prices") %}
            {% set output = namespace(prices=[], period=[]) %}
            {% set data = state_attr("sensor.shf_electricity_price_now", "all_prices")[15:39] %}
            {% set hours = states("input_number.shf_cheapest_period_slider") | int %}
            {% for inval in data[:min(-hours+1, -1)] %}
              {% set j = loop.index -1 %}
              {% for i in range(hours) %}
                {% set output.prices = output.prices + [data[j+i]] %}
              {% endfor %}
              {% set output.period = output.period + [output.prices | average] %}
            {% endfor %}
            {% set data2 = state_attr("sensor.shf_electricity_price_now", "data")[15:39] %}
            {{ data2[output.period.index(output.period|min)]["DateTime"] }}
          {% else %}
            {{ 0 }}
          {% endif %}
  - sensor:
      - name: "SHF Control Factor zero to one"
        unit_of_measurement: factor
        icon: mdi:gauge
        state: >
          {% if state_attr("sensor.shf_control_factor_zero_to_one", "today_values") %}
            {{ state_attr("sensor.shf_control_factor_zero_to_one", "today_values")[now().hour] }}
          {% else %}
            {{ 0 }}
          {% endif %}
        attributes:
          today_values: >
            {% if state_attr("sensor.shf_control_factor_negative_one_to_one", "today_values") %}
              {% set output = namespace(factors=[]) %}
              {% for value in state_attr("sensor.shf_control_factor_negative_one_to_one", "today_values") %}
                {% set newValue = value | float / 2 + 0.5 %}
                {% set output.factors = output.factors + [ newValue ] %}
              {% endfor %}
              {{ output.factors }}
            {% else %}
              {{ 0 }}
            {% endif %}
  - sensor:
      - name: "SHF Control Factor negative one to one"
        unit_of_measurement: factor
        icon: mdi:gauge
        state: >
          {% if state_attr("sensor.shf_control_factor_negative_one_to_one", "today_values") %}
            {{ state_attr("sensor.shf_control_factor_negative_one_to_one", "today_values")[now().hour] }}
          {% else %}
            {{ 0 }}
          {% endif %}
        attributes:
          today_values: >
            {% set output = namespace(factors=[]) %}
            {% for pnow in state_attr("sensor.shf_electricity_price_now", "today_prices") %}
              {% set pmin = state_attr("sensor.shf_electricity_price_now", "today_min") | float %}
              {% set pmax = state_attr("sensor.shf_electricity_price_now", "today_max") | float %}
              {% set value = max(min((2*(pmax - pnow) / (pmax - pmin)-1) * states('input_number.shf_control_function_factor') | float,1),-1) %}
              {% if states("input_select.shf_control_function" ) == "Linear"  %}
                {% set output.factors = output.factors + [value | round(2)] %}
              {% else %}
                {% set output.factors = output.factors + [sin(value*pi/2) | round(2)] %}
              {% endif %}
            {% endfor %}
            {{ output.factors }}
  - binary_sensor:
      - name: "SHF Rank acceptable"
        device_class: power
        state: >
          {% set value = state_attr("sensor.shf_electricity_price_now", "data")[states("sensor.shf_idx")|int+now().hour] %}
          {{ value["Rank"] <= states("input_number.shf_rank_slider") | int }}
  - binary_sensor:
      - name: "SHF Price acceptable"
        device_class: power
        state: >
          {% set value = state_attr("sensor.shf_electricity_price_now", "today_prices")[ now().hour ] %}
          {{ value <= states("input_number.shf_price_slider") | float }}
  - binary_sensor:
      - name: "SHF Price or Rank acceptable"
        device_class: power
        state: '{{ is_state("binary_sensor.shf_rank_acceptable", "on") or is_state("binary_sensor.shf_price_acceptable", "on") }}'

input_select:
  shf_control_function:
    name: SHF Control Function
    options:
      - Linear
      - Sinusoidal
    icon: mdi:gauge

input_number:
  shf_control_function_factor:
    name: SHF Control Function Factor
    min: 1
    max: 3
    step: 0.01
    icon: mdi:gauge
    mode: box
  shf_rank_slider:
    name: SHF Max Rank allowed
    min: 1
    max: 24
    step: 1
  shf_price_slider:
    name: SHF Max Price allowed
    min: 0
    max: 4
    step: 0.01
    unit_of_measurement: €/kWh
    icon: mdi:cash-lock
    mode: box
  shf_price_avg_slider:
    name: SHF Average price hours
    min: 1
    max: 24
    step: 1
    unit_of_measurement: h
    icon: mdi:cash-clock
  shf_cheapest_period_slider:
    name: SHF Cheapest period hours
    min: 1
    max: 24
    step: 1
    unit_of_measurement: h
    icon: mdi:cash-clock
  shf_control_factor:
    name: SHF Control Factor
    min: 0
    max: 1000
    mode: box
  shf_price1_slider:
    name: SHF Price1
    min: 0
    max: 1000
    step: 0.0001
    unit_of_measurement: €
    icon: mdi:cash-lock
    mode: box
  shf_price2_slider:
    name: SHF Price2
    min: 0
    max: 1000
    step: 0.0001
    unit_of_measurement: €
    icon: mdi:cash-lock
    mode: box

input_datetime:
  shf_cheapest_period_start:
    name: SHF Cheapest period start
    has_date: true
    has_time: true
  shf_price2_start:
    name: SHF Price2 start
    has_date: false
    has_time: true
  shf_price2_stop:
    name: SHF Price2 stop
    has_date: false
    has_time: true

#Automation for automatic updating of the sensor. Tries to reduce API load.
automation:
  - id: "1669453089221"
    alias: Intelligent update of electricity price sensor
    description: "Tries to fetch new data every 15mins after 14 oclock local time. Condition stops unnecessary requests. Random delay disperses API calls."
    trigger:
      - platform: time_pattern
        minutes: /15
        alias: Trigger every 15mins
    condition:
      - condition: template
        value_template: '{{ is_state("sensor.shf_electricity_price", "unavailable") or is_state("sensor.shf_idx", "unavailable") or (now().hour >= 14 and (states("sensor.shf_idx") | int > 0 or state_attr("sensor.shf_electricity_price", "data") | length <= 24)) }}'
        alias: Check if there isn't data for tomorrow and time is after 14 o'clock
    action:
      - delay: "{{ range(60, 600)|random }}"
        alias: Random delay in order to reduce API congestion
      - service: homeassistant.update_entity
        alias: Trigger the update of the sensor
        target:
          entity_id: sensor.shf_electricity_price
    mode: single
  - id: "1669453089222"
    alias: "Copy cheapest period to datetime sensor"
    description: "Copies cheapest period start from helper to datetime sensor for easier automations."
    mode: single
    trigger:
      - platform: state
        entity_id:
          - sensor.shf_cheapest_period_start_helper
    condition: []
    action:
      - service: input_datetime.set_datetime
        data:
          datetime: '{{ states("sensor.shf_cheapest_period_start_helper")[:19] | replace("T", " ") }}'
        target:
          entity_id: input_datetime.shf_cheapest_period_start
 
Viimeksi muokattu:

-Teme-

Vakionaama
hmm.. Itsellä SHF Control Factor 0-1 toimii seuraavalla muutoksella, jossa unknown korvataan none:lle
Koodi:
state: '{{ (states("sensor.shf_control_factor_1") | float /2 + 0.5) | default(none) }}'
# state: '{{ (states("sensor.shf_control_factor_1") | float /2 + 0.5) | default("Unknown") }}'
ja SHF Control Factor +-1 samalla muutoksella
Koodi:
state: '{{ state_attr("sensor.shf_control_factor_1", "today_values")[now().hour] | default(none) }}'
# state: '{{ state_attr("sensor.shf_control_factor_1", "today_values")[now().hour] | default("Unknown") }}'
 

Samppa

Ylläpitäjä
Ylläpidon jäsen
Yllä oleva korjaus palautti viimeisetkin rikki olleet toiminnallisuudet tähän sähköpörssiohjaukseen. Uskaltaisin väittää että tämä on taas kunnossa. Toki "virallista" korjausta ei ole. Nyt tuli taas coreen 5.4 päivitys. Se näytti korjaavan mm. Airthingsin antureiden kanssa 5.0 versiosta lähtien olleita ongelmia. Ehkä tämä HA alkaa nyt kokonaisuutena olemaan taas pääosin toimiva, kunnes seuraava vähän isompi päivitys tämän taas rikkoo...

edit: ei sittenkään korjannut kuin osan. Yhteys pätkii jatkuvasti edelleen. Mutta tämä nyt ei liity ketjun aiheeseen. SHF komponentit pelaa nyt moitteetta.
 

Mikki

Hyperaktiivi
HomeAssistantin kehityksessä taitaa olla nyt liian hoppu ja ominaisuuksia menee rikki vaikkei rikkoneessa versiossa ollut mitään varoituksia että tämä tai tuo muuttuu.
 

heebo1974

Aktiivinen jäsen
Hmm. Mitkä kaikki korjaukset nyt tulee tehdä, että uskaltaa päivittää HA:n ? Voisiko joku kerätä yhteen postaukseen kaikki "pätsit" ? :)
Ajelen siis edelleen HA versiolla 2023.4.6
 

Ville-Veikko

Aktiivinen jäsen
Hmm. Mitkä kaikki korjaukset nyt tulee tehdä, että uskaltaa päivittää HA:n ? Voisiko joku kerätä yhteen postaukseen kaikki "pätsit" ? :)
Ajelen siis edelleen HA versiolla 2023.4.6
MIe otin tuon TK:n viestin YAML:n ja viskasin koneeseen. No se loi duplikaatit kaisiksta sensoreista kun ei ollut enää unique_id -arvoja. Vähän aikaa ihmettelin tuota ja hoksasin ettei tuo TK:n parsima versio toimi vanhemmassa HA -versiossa. Joten tapani mukaan ammuin norsupyssyllä ja pistin uusiksi koko setupin tähän tyyliin:

  1. Päivitin HAn versioon 2023.5.4
  2. Poistin väliaikaisesti viittauksen spot-price.yaml tiedostoon Kommentoi nuo punaisessa lootassa olevat rivit
    1685029354586.png
  3. Restarttasin HA:n
  4. Delasin kaikki SHF jutut -entities -listalta. Helppo löytää kun niiden perässä on nyt punainen huutomerkki.
  5. Ylikirjotin spot-price.yaml TK:n koodilla
  6. Palautin kommentoidut rivit configuration.yaml -tiedostossa
  7. Restarttasin HA:n toisen kerran
  8. Ihaile toimivaa SHF -koodia
Jotenkin noin se meni, ei tietenkään tullut kirjoitettua dokumenttia tehdessä, mut ehkä mä vielä puolen päivän jälkeen muistan mitä tein...
 
Viimeksi muokattu:

tk-

Aktiivinen jäsen
MIe otin tuon TK:n viestin YAML:n ja viskasin koneeseen. No se loi duplikaatit kaisiksta sensoreista kun ei ollut enää unique_id -arvoja. Vähän aikaa ihmettelin tuota ja hoksasin ettei tuo TK:n parsima versio toimi vanhemmassa HA -versiossa. Joten tapani mukaan ammuin norsupyssyllä ja pistin uusiksi koko setupin tähän tyyliin:

  1. Päivitin HAn versioon 2023.5.4
  2. Poistin väliaikaisesti viittauksen spot-price.yaml tiedostoon Kommentoi nuo punaisessa lootassa olevat rivitkatso liitettä 86913
  3. Restarttasin HA:n
  4. Delaasin kaikki SHF jutut -entities -listalta. Helppo löytää kun niiden perässä on nyt punainen huutomerkki.
  5. Ylikirjoiin spot-price.yaml TK:n koodilla
  6. Palautin kommentoidur rivit configuration.yaml -tiedostossa
  7. Restarttasin HA:n toisen kerran
  8. Ihaile toimivaa SHF -koodia
Jotenkin noin se meni, ei tietenkään tullut kirjoitettua dokumenttia tehdessä, mut ehkä mä vielä puolen päivän jälkeen muistan mitä tein...
Joo kirjoitinkin tuohon, että ei ole semmoisenaan yhteensopiva, mutta juuri tuollalailla ”tyhjästä asennettuna” se toimii ihan ok ottaen huomioon ne edellisen postauksen puutteet. Toki poistaa kaiken historiatiedon, mutta toisaalta en kyllä itse välttämättä keksi syytä tallentaa sähkön hintatietoja omaan tietokantaan kun ne saa aina haettua virallisista lähteistä vuosikausia taaksepäin.

Toki sama homma on sitten taas edessä kun tuohon tulee virallinen korjaus. Mutta tuo on hyvä keino, että kommentoi tuon pois käytöstä ja poistaa huutomerkillä flägätyt sensorit.
 

-Teme-

Vakionaama
Hmm. Mitkä kaikki korjaukset nyt tulee tehdä, että uskaltaa päivittää HA:n ? Voisiko joku kerätä yhteen postaukseen kaikki "pätsit" ? :)
Ajelen siis edelleen HA versiolla 2023.4.6
Nämä seuraavat:
Sales julkaisi paremman korjauksen SHF sensoriin.
YAML:
# state: '{{ state_attr("sensor.shf_electricity_price_now", "today_prices")[now().hour] }}'
state: '{{ state_attr("sensor.shf_electricity_price_now", "today_prices")[now().hour] | default(none) }}'
kts: https://github.com/T3m3z/spotprices2ha/issues/15#issuecomment-1538883956

hmm.. Itsellä SHF Control Factor 0-1 toimii seuraavalla muutoksella, jossa unknown korvataan none:lle
Koodi:
state: '{{ (states("sensor.shf_control_factor_1") | float /2 + 0.5) | default(none) }}'
# state: '{{ (states("sensor.shf_control_factor_1") | float /2 + 0.5) | default("Unknown") }}'
ja SHF Control Factor +-1 samalla muutoksella
Koodi:
state: '{{ state_attr("sensor.shf_control_factor_1", "today_values")[now().hour] | default(none) }}'
# state: '{{ state_attr("sensor.shf_control_factor_1", "today_values")[now().hour] | default("Unknown") }}'
 

heebo1974

Aktiivinen jäsen
Osaisiko joku auttaa automaationi kanssa, koska se kyllä hajosi tuon control factorin takia. :(

Eli minulla on tällainen rimpsu joka ohjaa lattialämmitystä:

YAML:
            data:
              temperature: >-
                {{ (17 + 3*states('sensor.shf_control_factor_0_1') | float) |
                round(0) }}
            target:
              device_id:

Huomasin nyt, ettei lattilämmöt enää säädy ja kokeilin ajaa manuaalisesti tuota komentoa, niin tulee tällainen herja:
1685097134581.png


Ei olisi sittenkään pitänyt päivittää HA:ta. :)
 

tk-

Aktiivinen jäsen
Osaisiko joku auttaa automaationi kanssa, koska se kyllä hajosi tuon control factorin takia. :(

Eli minulla on tällainen rimpsu joka ohjaa lattialämmitystä:

YAML:
            data:
              temperature: >-
                {{ (17 + 3*states('sensor.shf_control_factor_0_1') | float) |
                round(0) }}
            target:
              device_id:

Huomasin nyt, ettei lattilämmöt enää säädy ja kokeilin ajaa manuaalisesti tuota komentoa, niin tulee tällainen herja:
katso liitettä 86932

Ei olisi sittenkään pitänyt päivittää HA:ta. :)
Tuo virhe viittaa siihen, että tuo control_factor-sensori ei sisällä mitään oikeaa arvoa, vaan siellä on arvona ”unknown”. Eli vika ei ole tuossa automaatiossa. Se korjaantuu kun tuon templaatin korjaa niin, että tuo control_factor -sensori saa arvon.
 

heebo1974

Aktiivinen jäsen
Tuo virhe viittaa siihen, että tuo control_factor-sensori ei sisällä mitään oikeaa arvoa, vaan siellä on arvona ”unknown”. Eli vika ei ole tuossa automaatiossa. Se korjaantuu kun tuon templaatin korjaa niin, että tuo control_factor -sensori saa arvon.
Kappas, en tajunnut että tuolla oli toinen control factor rivi joka piti myös korjata ! Kiitos!

YAML:
      state: '{{ state_attr("sensor.shf_control_factor_1", "today_values")[now().hour] | default(none) }}'
#      state: '{{ state_attr("sensor.shf_control_factor_1", "today_values")[now().hour] | default("Unknown") }}'
 
  • Tykkää
Reactions: tk-

tk-

Aktiivinen jäsen
Lainaanpa vielä tätä ketjua kun kokeilen lisätä tuota Control factoria myös tuohon Pörssärin Home assistantiin. Sain tungettua sen yksittäiseen sensoriin, tuossa sitten erillisellä input_selectillä valitaan tuo arvoalue samaan tapaan kuin linear/sinusoidal. Koodi menisi kutakuinkin näin:
YAML:
 # Control factor based on relative difference of current price from daily max price
 # Original functionality based on SHF Control factor in spotprices2ha delevoped by Temez
  - sensor:
    - name: porssari_control_factor
      unit_of_measurement: factor
      icon: mdi:gauge
      state: >
        {% if is_state('binary_sensor.porssari_json_prices', 'on') %}
          {% set ns = namespace(factor=[]) %}
          {% set pnow = states("sensor.porssari_price_now") | float %}
          {% set pmin = states("sensor.porssari_min_today") | float %}
          {% set pmax = states("sensor.porssari_max_today") | float %}
          {% set val = max(min((2*(pmax - pnow) / (pmax - pmin)-1) * states('input_number.porssari_control_function_factor') | float,1),-1) %}
          {% if states("input_select.porssari_control_function" ) == "Linear" %}
            {% set ns.factor = val | round(2) %}
          {% else %}
            {% set ns.factor = sin(val*pi/2) | round(2) %}
          {% endif %}
          {% if states("input_select.porssari_control_function_output" ) == "Negative one to one" %}
            {{ ns.factor }}
          {% else %}
            {{ ns.factor | float /2 + 0.5 }}
          {% endif %}
        {% else %}
          {{ 0 }}
        {% endif %}

Eli onko niin, että tällaisena päivänä kun sähkö on ollut muutaman tunnin huomattavan kallista, niin tuon kuuluukin saada lähes koko päivän arvo lähelle 1?
 

heebo1974

Aktiivinen jäsen
Eli onko niin, että tällaisena päivänä kun sähkö on ollut muutaman tunnin huomattavan kallista, niin tuon kuuluukin saada lähes koko päivän arvo lähelle 1?
Näinhän se taitaa tehdä. Muutenkin se on todella kovakourainen. :)
Hmm. pörssäri, pitää vissiin alkaa miettiä vaihtoehtoja tälle, kun taas kerran ollaan tilanteessa, että "lisäosat" eivät enää päivity. Enkä tässä ketään syyttele, koska kaikki perustuu vapaaehtoisuuteen. Josko pörssärissä olisi useampia ylläpitäjiä ? Parastahan olisi kun lisäosat yleensäkin olisivat sellasia, joissa olisi parviylläpitoa. :)

100% olen tähän ollut tyytyväinen, mutta mitä helpompaa päivitysten kanssa on, sen parempi. Ja onhan tässä ollut hyviä innovaatioita.
 

tk-

Aktiivinen jäsen
Näinhän se taitaa tehdä. Muutenkin se on todella kovakourainen. :)
Hmm. pörssäri, pitää vissiin alkaa miettiä vaihtoehtoja tälle, kun taas kerran ollaan tilanteessa, että "lisäosat" eivät enää päivity. Enkä tässä ketään syyttele, koska kaikki perustuu vapaaehtoisuuteen. Josko pörssärissä olisi useampia ylläpitäjiä ? Parastahan olisi kun lisäosat yleensäkin olisivat sellasia, joissa olisi parviylläpitoa. :)

100% olen tähän ollut tyytyväinen, mutta mitä helpompaa päivitysten kanssa on, sen parempi. Ja onhan tässä ollut hyviä innovaatioita.
Ei meitäkään toki ole kuin 2, ja itse olen enemmänkin harrastelijakoodari. Toinen meistä on sentään ihan sähköalalla työskentelevä automaatioinsinööri.

Pörssärihän on Home Assistantia ajatellen vähän hybridiratkaisu kun ohjauslogiikka ja asetukset sen muodostamiseksi sijaitsee tuolla palvelimella. Toki se taas tekee tuon HA-clientin ylläpitämisestä yksinkertaista, kun sinne jää lähinnä ohjaustiedon välitys noiden kanavasensoreiden avulla. Muutenkin tein tuon paketin niin, että tuohon varsinaiseen Coreen ei loppukäyttäjät tekisi muutoksia, eli palvelimelta dataa hakevat sensorit ja nuo ohjaussensorit olisi sillälailla toimintavarmat. Templaatit pitäisi olla standardien mukaan tehtynä ja niissä on tuo tarkistus attribuuttien olemassaolosta mukana. Mutta ymmärrän, että moni saattaa vierastaa tällaista ajatusta kun HA on itsessään se automaatiologiikan sisältävä ja mahdollistava ohjelmisto joka tarvitsisi vain tuon hintatiedon.

Toki tuota mukana tulevaa hintadataa voi sitten hyödyntää samaan tapaan kuin tuossa SHF-paketissa, esimerkiksi kuten tuo edellä oleva esimerkki tuosta Control factorista on. Asiaa helpottaa, että hintadata tuodaan suoraan käyttäjän omilla hinta-asetuksilla laskettuna jos ne on tuonne palvelimelle lisännyt. Ja yhteisöllisyyttä ajatellen, mielelläni lisäilen tuonne Githubiin esimerkkisensoreita erilaisista toiminnallisuuksista jatkossa tuon hintadatan/rankingien pohjalta.

Mutta ei tässä ketjussa aiheesta enempää, yritän pitää nämä höpinät tuolla omassa ketjussaan.. :D
 

mobbe

Vakionaama

tk-

Aktiivinen jäsen
Mikä tuossa Home Assistantissa on se pihvi että sitä kannattaa käyttää pörssiohjauksessa jos se on epäluotettava niin että väliin saa resetoida?
Tämänpäiväinen liittyy siihen, että nuo hintatiedot oli myöhässä kun markkinat avattiin uudelleen. Tuli ne sieltä noin 8h ennen seuraavaa vuorokautta, eli ei tuon kanssa hätää olisi ollut. Spot-hinta oli ensimmäisiä missä ne oli sitten saatavilla julkaisun jälkeen.

Paitsi sitten taas fb:ssa on porukka keskustellut siitä, että Nordpool-lisäosa ei päivity enää muuta kuin manuaalisesti jos hinnat tulee liian myöhään.

Itse virittelen tuota Pörssäriä eikä siinä ole kyllä ollut mitään ongelmia. Ja kunhan saadaan tuo meidän hintasivusto valmiiksi, niin teen vielä yamlin joka hakee vain nuo hinnat sivuston asetusten mukaan ja jättää nuo (suurelle?) osalle turhat ohjauskanavasensorit tekemättä.
 

jalih

Jäsen
Paitsi sitten taas fb:ssa on porukka keskustellut siitä, että Nordpool-lisäosa ei päivity enää muuta kuin manuaalisesti jos hinnat tulee liian myöhään.

Itse virittelen tuota Pörssäriä eikä siinä ole kyllä ollut mitään ongelmia. Ja kunhan saadaan tuo meidän hintasivusto valmiiksi, niin teen vielä yamlin joka hakee vain nuo hinnat sivuston asetusten mukaan ja jättää nuo (suurelle?) osalle turhat ohjauskanavasensorit tekemättä.
Omassa ohjelmassani päivitys säie kokeilee aina uudelleen pienen viiveen jälkeen ilta yhteentoista saakka, jolloin asettaa varaohjelmat käyttöön ja jää sitten nukkumaan siihen asti kunnes on aika hakea taas seuraavat eli ylihuomisen hinnat.

Onko Home Assistant kuinka raskas ohjelmisto käytössä? Itse olen omassa toteutuksessani pyrkinyt siihen, että kun resetoin ohjaimen niin graafinen Nuklear pohjainen hallintaliittymä olisi käytettävissä jokusen sekunnin päästä siitä.
 

tk-

Aktiivinen jäsen
Omassa ohjelmassani päivitys säie kokeilee aina uudelleen pienen viiveen jälkeen ilta yhteentoista saakka, jolloin asettaa varaohjelmat käyttöön ja jää sitten nukkumaan siihen asti kunnes on aika hakea taas seuraavat eli ylihuomisen hinnat.

Onko Home Assistant kuinka raskas ohjelmisto käytössä? Itse olen omassa toteutuksessani pyrkinyt siihen, että kun resetoin ohjaimen niin graafinen Nuklear pohjainen hallintaliittymä olisi käytettävissä jokusen sekunnin päästä siitä.
Ei se kai kovin raskas ole? Monellahan se pyörii Raspberryssä. Itsellä on unraidin virtuaalikoneena, rautana siinä pohjalla on mini-itx -emo integroidulla celeronilla ja ei tuo monta sekuntia tosiaan reboottaa. Toki järjestelmälevynä on nvme, ja varmaan asiaan vaikuttaa sekin paljonko erilaisia lisäosia tuossa Home Assistantissa pyörii.
 

Sukke

Aktiivinen jäsen
Siellä on jotain häikkää tietojen siirtymisessä, alla toisesta ketjusta lainattu viesti. En tiedä liittyykö puute tuohon samaan.

ENTSO-E:stäkään ei löydy tämän päivän tunteja.

Olin tehnyt jo hieman pohjaa tuntihintojen syöttämisestä manuaalisesti 24 h ajalle HA:n kautta. Nyt tuli sekin tehtyä loppuun ja kokeiltua sahko.tk:n hinnoilla. Eli vaihtoehtoina on nyt ENTSO-E, spot-hinta.fi tai manuaalisesti syötetyt hinnat. Näistä käytetään "laadukkainta" tietoa.

Täytyisi vielä varmistaa, että ohjaukset toimii jotenkin fiksusti, vaikka hintatieto puuttuisi. Ohjausten pitäisi mennä pääsääntöisesti normaalitilaan ilman ohjausta, mutta voi olla tarkastuksen paikka.


 

Mikki

Hyperaktiivi
Siellä on jotain häikkää tietojen siirtymisessä, alla toisesta ketjusta lainattu viesti. En tiedä liittyykö puute tuohon samaan.

ENTSO-E:stäkään ei löydy tämän päivän tunteja.

Olin tehnyt jo hieman pohjaa tuntihintojen syöttämisestä manuaalisesti 24 h ajalle HA:n kautta. Nyt tuli sekin tehtyä loppuun ja kokeiltua sahko.tk:n hinnoilla. Eli vaihtoehtoina on nyt ENTSO-E, spot-hinta.fi tai manuaalisesti syötetyt hinnat. Näistä käytetään "laadukkainta" tietoa.

Täytyisi vielä varmistaa, että ohjaukset toimii jotenkin fiksusti, vaikka hintatieto puuttuisi. Ohjausten pitäisi mennä pääsääntöisesti normaalitilaan ilman ohjausta, mutta voi olla tarkastuksen paikka.
Jaahas... On tosiaan outo ongelma että huomiset hinnat tulevat mutta ei tämänpäiväistä.

En ollut koodissa tähän varautunut joten se hukkas tämän päivän hinnat kun huomiset hinnat tuli.
 

Sukke

Aktiivinen jäsen
Jaahas... On tosiaan outo ongelma että huomiset hinnat tulevat mutta ei tämänpäiväistä.

En ollut koodissa tähän varautunut joten se hukkas tämän päivän hinnat kun huomiset hinnat tuli.

Juu, ei tähän osannut etukäteen varautua. Nyt on lisätarkastus tuntitietojen osalta ja jos ei rajapintojen kautta ole tunteja käytettävissä, tulee hälytys. Voi sitten käydä manuaalisesti syöttämässä tuntihinnat, jos ne on kuitenkin jostain saatavilla.

Minulle on kyllä hieman epäselvää, että oliko uusien tuntihintojen julkaisuun saakka minulla käytössä ENTSO-E vai spot-hinta.fi kautta tulleet tiedot. Ilmeisesti spot-hinta.fi, kun ilmeisesti ENTSO-E:stä on tämän päivän tunnit puuttuneet jo eilen.
 

jusba31

Jäsen
Mikähän pielessä kun rank now näyttää tunnin pieleen, mutta price now on kuitenkin ihan oikein?
 

Liitteet

  • Screenshot 2023-05-30 at 7.16.05.png
    Screenshot 2023-05-30 at 7.16.05.png
    107,2 KB · Katsottu: 80

heebo1974

Aktiivinen jäsen
Mikähän pielessä kun rank now näyttää tunnin pieleen, mutta price now on kuitenkin ihan oikein?
Samaa ihmettelen. Api.spot-hinta.fi kyllä palauttaa mielestäni oikeat hinnat, mutta jostain syystä HA on eri mieltä.
Nordpool integraatiolla hinnat on oikein. Nordpool on itselläni vain juuri tälläisiä tarkastuksia varten myös käytössä.

Edit: Minulla siis myös price now tunnin pielessä.
 
Viimeksi muokattu:

Mikki

Hyperaktiivi
Outo ongelma kun ainakin mitä katsoin tulisi rajapinnasta hinnat oikein.

Oletteko buutannut HAta jos se eilinen 00:00-01:00 tunnin puutos edelleen sotkee jotain.
 

jusba31

Jäsen
Outo ongelma kun ainakin mitä katsoin tulisi rajapinnasta hinnat oikein.

Oletteko buutannut HAta jos se eilinen 00:00-01:00 tunnin puutos edelleen sotkee jotain.
Eilen illalla buuttasin, mut pitääpä koittaa vielä tänään uudelleen.
 
Viimeksi muokattu:

tk-

Aktiivinen jäsen
Minkälaisilla automaatioilla tuota sensoritietoa kannattaa käyttää mikä triggeröi jonkin laitteen päälle kun vuorokauden halvin periodi alkaa? Päällekytkentä on toki selkeä, mutta miten poiskytkentä?

Jos laittaa automaatioon haluamansa viiveen ja sitten pois, jää laite päälle jos HA reboottaa.

Joku oli viritellyt counterin joka minuutin välein laskee numerolla, ja sitten kun se on nollassa, niin kytketään pois. Tämä counterin arvo säilyy bootatessa, eli silloin tuo laite joka tapauksessa kytketään pois kunhan HA on vaan päällä sen counterin ajan. Se äkkiseltään tuntuu tuota delayta paremmalta.

Vai sitten vielä kolmantena vaihtoehtona oma sensorinsa joka kytkee laitteen pois aikaleiman perusteella mikä lasketaan tuon ensimmäisen sensorin arvosta?

Onko tähän jollakulla vielä jotain järkevämpiä ratkaisuja käytössä?
 

Ilpo55

Jäsen
>Onko tähän jollakulla vielä jotain järkevämpiä ratkaisuja käytössä?

Minulla on helperit LVV On aika ja LVV Off aika.
LVV On aika asetetaan pörssisähkön hinnan mukaan. LVV Off aika on LVV On aika + 3 h.
Lisäksi on automaatio mikä kytkee LVV On ja toinen automaatio mikä kytkee LVV Off noiden helpereiden mukaisesti.
Lisäksi on helperi missä kerron kuinka pitkää (tuntia) halpaa jaksoa etsitään.
(Normaalisti tosin LVV lämpiää asetusarvoon ennen Off aikaa, jolloin LVV:n oma termostaatti kytkee sen Off.)

Hyvin on tuolla nyt puolivuotta toiminut.
 
Viimeksi muokattu:

tk-

Aktiivinen jäsen
>Onko tähän jollakulla vielä jotain järkevämpiä ratkaisuja käytössä?

Minulla on helperit LVV On aika ja LVV Off aika.
LVV On aika asetetaan pörssisähkön hinnan mukaan. LVV Off aika on LVV On aika + 3 h.
Lisäksi on automaatio mikä kytkee LVV On ja toinen automaatio mikä kytkee LVV Off noiden helpereiden mukaisesti.
Lisäksi on helperi missä kerron kuinka pitkää (tuntia) halpaa jaksoa etsitään.
(Normaalisti tosin LVV lämpiää asetusarvoon ennen Off aikaa, jolloin LVV:n oma termostaatti kytkee sen Off.)

Hyvin on tuolla nyt puolivuotta toiminut.
Joo ehkä tuo on se yksinkertaisin ratkaisu. Ja toisaalta se sopii taas sitten helpommin myös useamman laitteen triggeröintiin päälle ja pois. Aika epätodennäköinen skenaariohan se olisi, että juuri sen minuutin kun poiskytkentä pitäisi tapahtua, olisi HA boottaamassa ja siihen menisi se koko minuutti.

Pakko oli testata tuota counteriakin, ja on siinäkin joku kyllä keksinyt omalla tavallaan nerokkaan tavan hoitaa tuo asia. Mutta ehkä menee sitten jo vähän turhan kikkailuksi.

Näyttökuva 2023-5-31 kello 22.05.53.png
Näyttökuva 2023-5-31 kello 22.06.22.png
 

-Teme-

Vakionaama
Olen laittanut shellyyn counterin että laite itsessään sammuttaja itse itsensä 1h58min jälkeen siitä kun kytketty päälle. Automatian kautta tulee tunnin välein on/off tieto joten jos lämmitysjakso etenee, niin rele menee uusiksi päälle
 

MK01

Tulokas
Nuo viiveet pois kytkemiseen on vähän ongelmallisia. Meillä on ainakin melko usein sähkökatkoja. Minä olen käyttänyt tällaista:
 

Liitteet

  • Screenshot_20230531_231759_Home Assistant.jpg
    Screenshot_20230531_231759_Home Assistant.jpg
    50 KB · Katsottu: 101
Back
Ylös Bottom