Integração OMIE: preços horários, diários, mecanismo de ajuste

Queres partilhar o teu card q está impecável?

Claro que sim!

Vou estar fora até domingo e isto no telemóvel não dá jeito nenhum.
Quando estiver na minha workstation, faço isso.

1 Curtiu

Segundo a Coopérnico “A hora apresentada nos gráficos do site do OMIE corresponde ao horário espanhol, sendo que a hora 1 diz respeito ao período das 23:00 às 23:59 hora portuguesa”.

Lá vou eu ter de actualizar isto.

O meu excedente na Energia Simples tem sido pago pelo horário português.
Ou seja, ao valor de Portugal da hora 1, corresponde o excedente (se houvesse) das 00:00 às 00:59 da hora Portuguesa.
Indo para uma hora em que efetivamente há excedente, ao valor de Portugal da hora 12, corresponde o excedente das 11:00 às 11:59 da hora Portuguesa.
Depois de ver esta tua mensagem, fui reconfirmar, e simulei o meu excedente com esse critério da Coopérnico, e os meus valores a receber subiriam e deixavam de corresponder aos que me foram faturados.

Parece-me que cada empresa tem a sua interpretação no que diz respeito ao fuso horario dos valores… (o que não deveria de acontecer)
Ja varri o site de ponta a ponta a tentar identificar o verdadeira periodo que é indicado pela entidade que gere a coisa (OMIE e ERSE) mas… para variar não se encontra nada concreto que não seja prontamente contradito 2 clicks depois.

É um bocado isso. Também tenho pensado em como implementar e chego à conclusão que ia resultar tanto em dores de cabeça para mim, ao implementar e calcular as médias no sensor tendo em conta este aspecto, como para os utilizadores, pois as médias e isso não iriam bater certo com o que está no OMIE.

Se calhar por essa razão e pela diferença ser diminuta (então se forem médias diárias ou mensais) o melhor é deixar como está.

pode-se sempre tentar fazre uma levantamento das empresas e calculos e adicionas uma variavel adicional na configuracao, se for empresa X o fuso horario é A, se for empresa Y escolhe o B.
é so mais trabalho para o teu lado mas se fores um mega perfeccionista… :stuck_out_tongue:

Só fará diferença a compra ou vende com base horária.
No meu caso vendo com base horária, mas a interpretação que a empresa faz é a mesma que a minha, por isso tudo ok.

Peço desculpa pela demora.

Aqui vai o cartão, mas tem em atenção que eu de facto não percebo muito disto e ando numa de tentativa/erro, pelo que o código não estará certamente “limpo”.

Já agora, aceito e agradeço algumas dicas.

type: custom:button-card
styles:
  card:
    - height: 750px
    - width: 550px
    - background: transparent
    - border: none
    - border-radius: 10px
  grid:
    - position: relative
  custom_fields:
    spot_d:
      - position: absolute
      - top: 5%
      - left: 30%
    amanha:
      - position: absolute
      - top: 45%
      - left: 75%
    media_d:
      - position: absolute
      - top: 45%
      - left: 10%
    delta:
      - position: absolute
      - left: 75%
      - top: 40%
    hourly:
      - position: absolute
      - top: 65%
      - left: 2%
custom_fields:
  spot_d:
    card:
      type: custom:button-card
      entity: sensor.omie_spot_price_pt
      show_units: false
      show_icon: false
      name: SPOT
      label: €/MWh
      show_label: true
      show_state: true
      styles:
        card:
          - background: transparent
          - border-radius: 50%
          - aspect-ratio: 1/1
          - height: 250px
          - border: none
          - box-shadow: |
              [[[
                var prec=states['sensor.omie_spot_price_pt'].state
                if (prec >= 180) return '0px 0px 60px green';
                else if (prec >= 140) return '0px 0px 60px #FFFF00';
                else if (prec >= 100) return '0px 0px 60px #FFC000';
                else if (prec >= 60) return '0px 0px 60px  #FA7000';
                else return '0px 0px 60px rgb(247,13,26)';
              ]]]
        state:
          - padding-top: 40px
          - font-size: 36px
        name:
          - padding-top: 85px
          - font-size: 46px
          - color: |
              [[[
                var prec=states['sensor.omie_spot_price_pt'].state
                if (prec >= 180) return 'green';
                else if (prec >= 140) return '#FFFF00';
                else if (prec >= 100) return '#FFC000';
                else if (prec >= 60) return '#FA7000';
                else return 'rgb(247,13,26)';
              ]]]
        label:
          - font-size: 15px
          - padding-top: 0px
  amanha:
    card:
      type: custom:button-card
      position: absolute
      entity: sensor.omie_spot_price_pt.attributes.day_average
      attribute: day_average
      label: |
        [[[
          return states['sensor.omie_spot_price_pt_tomorrow'].attributes.day_average            
        ]]]
      show_units: false
      show_icon: false
      name: AMANHÃ
      show_label: true
      show_state: false
      styles:
        card:
          - background: transparent
          - border-radius: 50%
          - aspect-ratio: 1/1
          - height: 100px
          - border: none
          - box-shadow: |
              [[[
                var prec=states['sensor.omie_spot_price_pt'].state
                if (prec >= 180) return '0px 0px 10px green';
                else if (prec >= 140) return '0px 0px 10px #FFFF00';
                else if (prec >= 100) return '0px 0px 10px #FFC000';
                else if (prec >= 60) return '0px 0px 10px #FA7000';
                else return '0px 0px 10px rgb(247,13,26)';
              ]]]
          - animation: |
              [[[
                var ajusteam=states['sensor.omie_adjustment_price_pt_tomorrow'].attributes.day_average
                if (ajusteam > 0) return 'blink 2s infinite';
                else return 'none'
              ]]]
        name:
          - padding-bottom: 6px
          - padding-right: 2px
          - font-size: 18px
          - color: |
              [[[
                var prec=states['sensor.omie_spot_price_pt'].state
                if (prec >= 180) return 'green';
                else if (prec >= 140) return '#FFFF00';
                else if (prec >= 100) return '#FFC000';
                else if (prec >= 60) return '#FA7000';
                else return 'rgb(247,13,26)';
              ]]]
        label:
          - font-size: 18px
          - padding-top: px
          - position: absolute
          - bottom: 54%
        grid:
          - position: relative
        custom_fields:
          unit:
            - position: absolute
            - top: 73%
            - left: 30.5%
            - font-size: 11px
      custom_fields:
        unit: €/MWh
  media_d:
    card:
      type: custom:button-card
      position: absolute
      entity: sensor.omie_spot_price_pt.attributes.day_average
      attribute: day_average
      label: |
        [[[
          return states['sensor.omie_spot_price_pt'].attributes.day_average            
        ]]]
      show_units: false
      show_icon: false
      name: MÉDIA
      show_label: true
      show_state: false
      styles:
        card:
          - background: transparent
          - border-radius: 50%
          - aspect-ratio: 1/1
          - height: 100px
          - border: none
          - box-shadow: |
              [[[
                var prec=states['sensor.omie_spot_price_pt'].state
                if (prec >= 180) return '0px 0px 10px green';
                else if (prec >= 140) return '0px 0px 10px #FFFF00';
                else if (prec >= 100) return '0px 0px 10px #FFC000';
                else if (prec >= 60) return '0px 0px 10px  #FA7000';
                else return '0px 0px 10px rgb(247,13,26)';
              ]]]
          - animation: |
              [[[
                var ajuste=states['sensor.omie_adjustment_price_pt'].attributes.day_average
                if (ajuste > 0) return 'blink 2s ease-in-out infinite';
                else return 'none'
              ]]]
        name:
          - padding-bottom: 6px
          - font-size: 18px
          - color: |
              [[[
                var prec=states['sensor.omie_spot_price_pt'].state
                if (prec >= 180) return 'green';
                else if (prec >= 140) return '#FFFF00';
                else if (prec >= 100) return '#FFC000';
                else if (prec >= 60) return '#FA7000';
                else return 'rgb(247,13,26)';
              ]]]
        label:
          - font-size: 18px
          - padding-top: px
          - position: absolute
          - bottom: 54%
        grid:
          - position: relative
        custom_fields:
          unit:
            - position: absolute
            - top: 73%
            - left: 31%
            - font-size: 11px
      custom_fields:
        unit: €/MWh
  delta:
    card:
      type: custom:button-card
      layout: icon_state
      entity: sensor.omie_delta
      show_name: false
      show_state: true
      icon: |
        [[[ 
          var delta=states['sensor.omie_delta'].state;
          if (delta <0) return 'mdi:arrow-down-bold-outline';
          if (delta >0) return 'mdi:arrow-up-bold-outline';
          else return 'mdi:arrow-right-bold-outline'
        ]]]
      styles:
        card:
          - border: none
          - background: transparent
          - width: 90px
        state:
          - font-size: 14px
        icon:
          - color: |
              [[[ 
                var delta=states['sensor.omie_delta'].state;
                if (delta <0) return 'rgb(247,13,26)';
                if (delta >0) return 'green';
                else return 'orange';
              ]]]
          - aspect-ratio: 1/1
          - width: 25px
          - padding-bottom: 2px
  hourly:
    card:
      type: custom:apexcharts-card
      card_mod:
        style: |
          ha-card {
            width: 550px;
            border: none;
            background: transparent
          }
      update_interval: 10m
      now:
        show: true
      span:
        end: day
      graph_span: 24h
      series:
        - entity: sensor.omie_spot_price_pt
          name: Hourly price
          yaxis_id: price
          stroke_width: 1
          type: column
          color: '#FA7000'
          group_by:
            func: last
            duration: 1h
          show:
            extremas: true
            legend_value: true
          data_generator: >
            return ((hs) => hs.map((price, hour) => [ new Date(new
            Date().setHours(hour, 0, 0, 0)), price
            ]))(entity.attributes.day_hours)
        - entity: sensor.2_2_2_geral_channel_1_energy_returned
          name: Injeção
          yaxis_id: injeção
          type: line
          stroke_width: 3
          group_by:
            fill: zero
            func: diff
            duration: 1h
            start_with_last: false
          color: green
      yaxis:
        - id: injeção
          max: 9
          opposite: true
          show: true
          decimals: 2
          apex_config:
            forceNiceScale: 'yes'
            labels:
              show: true
              style:
                colors: '#ffffff'
                fontSize: 10px
              offsetX: 0
              offsetY: 0
            axisBorder:
              show: false
              color: '#78909C'
        - id: price
          show: true
          decimals: 1
          apex_config:
            forceNiceScale: 'yes'
            labels:
              show: true
              formatter: |
                EVAL:function(value) {
                let text = parseFloat(value).toFixed(2);
                let result = "€" +text.replace(".", ",");
                return result;
                }
              style:
                colors: '#ffffff'
                fontSize: 10px
              offsetX: 0
              offsetY: 0
            axisBorder:
              show: false
              color: '#78909C'
      apex_config:
        tooltip:
          enabled: true
          shared: true
          followCursor: false
          intersect: false
          inverseOrder: false
          fillSeriesColor: true
          theme: false
          onDatasetHover:
            highlightDataSeries: false
          x:
            show: false
        legend:
          show: false
          position: top
        annotations:
          position: back
        chart:
          height: 250
          type: bar
        grid:
          show: true
          strokeDashArray: '0'
          borderColor: '#666666'
2 Curtiram

Assinei contrato de fornecimento de energia elétrica na passada sexta-feira com a Copérnico e não fazia ideia disso, o que faz até alguma diferença visto que há horários em que o consumo, num contrato indexado, fica a negativo com as Tarifas de Acesso às Redes. Ou seja, estão a pagar-me para eu consumir.

Alguém me sabe dizer como posso chamar o último valor do ‘sensor.omie_spot_price_pt’ para criar sensores template?

Até já tinha criado automações para ligar A/C e aquecimento de águas!
Estava bem enganado!!
Obrigado!

Viva,

Impecável, obg.

Que sensor é este: sensor.omie_delta ?

E este sensor - sensor.2_2_2_geral_channel_1_energy_returned - tb é teu de produção de energia, certo?

obg

Boas

sensor.omie_delta criei, para apresentar a variação da média diária.

sensor:
  - platform: template
    sensors:
      omie_delta:
        friendly_name: 'Variação Omie'
        value_template: "{{ (((state_attr('sensor.omie_spot_price_pt_tomorrow', 'day_average') / state_attr('sensor.omie_spot_price_pt', 'day_average')) -1) * 100) | round(2) }}"
        unit_of_measurement: '%'

o ‘sensor.2_2_2_geral_channel_1_energy_returned’ foi criado pelo shelly, mede a injeção na rede.

2 Curtiram

Desculpem chatear, mas quando faço paste do código, aparece a informação: “Custom element doesn’t exist: button-card.” O que me falta?

Temo que estejamos a ir um pouco off-topic!

Ainda assim, tens a integração do custom button card instalada?https://github.com/custom-cards/button-card

1 Curtiu

Não, deve ser isso! Muito obrigado e obrigado pelo cartão! Muito fixe!

Deves agradecer é a quem desenvolveu a integração do OMIE (luuuis). Está EXCELENTE!

De resto, aprendes a brincar com o ‘button-card’ e o limite é (quase) a imaginação!

Sim, sem dúvida, a integração está TOP! E depois o trabalho de equipa complementa! Muito obrigado à comunidade!

Peço desculpa por abusar, mas este código é para colocar no configuration.yaml?

Sim, podes colocar no configuration.yaml.

1 Curtiu

Alguém tem interesse em ter sensores para os outros dados do mercado Spot, como por exemplo fluxos de energia entre PT e ES, total de energia comercializado?


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade