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

Na verdade, eu aderi à Luzboa por isso este - https://github.com/luuuis/hass_omie/wiki/Luzboa-SPOT-BTN-Simples - seria o mais interessante para mim. No entanto, não funciona. Queixa-se do “this”

Claro, contudo se pudermos minimizar andar a criar templates e mais templates.
Seria muito dificil por o valor em kwh em um atributo e quem tivesse interessado ir buscar o valor ao atributo?

Fiz um flow em nodered para converter o valor MHW para Kwh contudo, algo aqui me está a escapar, ou seja consigo ver que o novo atributo aparece no debug, ,mas no home assistant ele não actualiza o sensor com no novo atributo.

este é o código da função:

var sensorValue = msg.payload;

// Realize o cálculo
var resultado = (sensorValue / 1000) * 1.183 + 0.01002 - 0.0958;

// Arredonda o resultado para 3 casas decimais
resultado = resultado.toFixed(3);

// Atualiza o atributo "valor_khw" no objeto msg.data.new_state.attributes
msg.data.new_state.attributes.valor_kWh = resultado.toString();

return msg;

Na variavel, está a conta a ser feita para converter segundo uma fórmula simplificada da Luzboa.

Deixo aqui o flow completo, para quem quiser ajudar:

[{"id":"b959a3d6368b4dcb","type":"server-state-changed","z":"cd967ef81c14b84f","name":"preco mwh omie","server":"cd683d65.68ba9","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.omie_spot_price_pt","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":180,"y":680,"wires":[["709715810e2e557b"]]},{"id":"709715810e2e557b","type":"change","z":"cd967ef81c14b84f","name":"valor","rules":[{"t":"set","p":"data.new_state.attributes.today_average","pt":"msg","to":"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":350,"y":680,"wires":[["25f2395b85663b34"]]},{"id":"25f2395b85663b34","type":"function","z":"cd967ef81c14b84f","name":"Cálculo Matemático","func":"var sensorValue = msg.payload;\n\n// Realize o cálculo\nvar resultado = (sensorValue / 1000) * 1.183 + 0.01002 - 0.0958;\n\n// Arredonde o resultado para 3 casas decimais\nresultado = resultado.toFixed(3);\n\n// Atualize o atributo \"novo_atributo\" no objeto msg.data.new_state.attributes\nmsg.data.new_state.attributes.valor_kWh = resultado.toString();\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":680,"wires":[["60ee2b1d96b75fb3"]]},{"id":"60ee2b1d96b75fb3","type":"api-call-service","z":"cd967ef81c14b84f","name":"","server":"cd683d65.68ba9","version":5,"debugenabled":false,"domain":"homeassistant","service":"update_entity","areaId":[],"deviceId":[],"entityId":["sensor.omie_spot_price_pt"],"data":"{\"data\":{\"entity_id\":\"sensor.omie_spot_price_pt\",\"state\":\"{{payload}}\",\"attributes\":{\"valor_kWh\":\"{{data.new_state.attributes.valor_kWh}}\"}}}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":780,"y":680,"wires":[["22c770aeed473b57"]]},{"id":"cd683d65.68ba9","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]

Estou no telefone mas esse serviço dá ideia que só espoleta a actualização da entidade, não lhe atribui nenhum valor.

Em 2 linhas de YAML crias o template sensor que te dá o valor dessa fórmula. :upside_down_face: Futuramente vou ver o que se pode fazer, já vou tendo umas ideias acerca disso.

Estava a tentar evitar de andar a criar mais sensores, eu sei que esse caminho seria o mais simples, mas se pudermos brincar com os atributos é menos um sensor criado .

@JeffersM vamos continuar aqui a conversa do tópico de scrape.

Resposta: nos atributos do sensor está a informação relativa ao dia seguinte.

1 Curtiu

Acabei de modificar o custo do consumo líquido do bihorário da Coopérnico para reportar o trihorário utilizando o seguinte:

    {% set TAR_vazio = -118.5 -%}
    {% set TAR_ponta = -001.8 -%}
    {% set TAR_cheias = -106.9 -%}
    {% if is_state('sensor.edp_6_9_kva_tri_horaria_ciclo_diario', 'Vazio') %}
        {% set TAR = TAR_vazio %}
    {% elif is_state('sensor.edp_6_9_kva_tri_horaria_ciclo_diario', 'Ponta') %}
        {% set TAR = TAR_ponta %}
    {% elif is_state('sensor.edp_6_9_kva_tri_horaria_ciclo_diario', 'Cheias') %}
        {% set TAR = TAR_cheias %}         
    {% endif %}

Há alguma razão para não utilizar as variáveis de integração da ERSE?

Sim, é simplesmente para não obrigar à instalação do ERSE. A única dependência são os sensores do OMIE.

1 Curtiu

@luuuis com a ajuda do @bbaixo aqui fica:

Caso queiras tirar alguma ideia para uma nova versao da integração.
PS: Fórmula para luzboa

[{"id":"675b83a0c191fba5","type":"change","z":"cd967ef81c14b84f","name":"","rules":[{"t":"set","p":"url","pt":"msg","to":"https://cpha.cpha.teste:8123/api/states/sensor.omie_spot_price_pt","tot":"str"},{"t":"set","p":"headers[\"content-type\"]","pt":"msg","to":"application/json","tot":"str"},{"t":"set","p":"headers[\"Authorization\"]","pt":"msg","to":"Bearer eyJhbGciOiJIUxxxxxxxxInR5cCI6IkpXVCJ9.eyJpc3MiOiIzODQxNjAzYWEyYjQ0NGI2OWNlMzUxxxxxxjRkYjZhOCIsImlhdCI6MTY4NTQ4Mzk0MSwiZXhwIjoyMDAwODQzOTQxfQ.cA78Vllxxxxx-sf6qfLUGWF3LS_VHSUw4KEF3L9k","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"data","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":680,"y":420,"wires":[["b5762c1dfccd4bc6"]]},{"id":"b5762c1dfccd4bc6","type":"http request","z":"cd967ef81c14b84f","name":"POST","method":"POST","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":830,"y":420,"wires":[[]]},{"id":"e2e3fc27b68310b1","type":"change","z":"cd967ef81c14b84f","name":"Cálculo","rules":[{"t":"set","p":"data.attributes.valor_kWh","pt":"msg","to":"$number(payload) / 1000 * 1.183 + 0.01002 - 0.0958","tot":"jsonata"},{"t":"set","p":"data.attributes.valor_kWh","pt":"msg","to":"$round(data.attributes.valor_kWh * 1000) / 1000","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":460,"y":420,"wires":[["675b83a0c191fba5"]]},{"id":"bc87f03c36bac20b","type":"inject","z":"cd967ef81c14b84f","name":"hora em hora","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"3600","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":100,"y":420,"wires":[["d4875669ad0eb51f"]]},{"id":"d4875669ad0eb51f","type":"api-current-state","z":"cd967ef81c14b84f","name":"Spot Price PT","server":"cd683d65.68ba9","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.omie_spot_price_pt","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":280,"y":420,"wires":[["e2e3fc27b68310b1"]]},{"id":"cd683d65.68ba9","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]
1 Curtiu

Agradeço o feedback :+1:

Boa tarde,

Em relação às horas em que o preço é negativo, como são faturadas? A custo zero ou negativo?

Obrigado.

1 Curtiu

Corresponde a um crédito no teu saldo, já houve quem tenha recebido nota de crédito ao fim do mês.

1 Curtiu

Obrigado @luuuis ,

Era o meu entendimento!
É que na minha primeira fatura veio um valor 55% mais alto que a expectativa.

Tenho que refazer os calculos.

Bom dia a todos!

Por problemas de comunicação entre Coopérnico e E-Redes, as minhas primeiras 2 faturas vieram com preço médio e não de acordo com diagrama de cargas. Confirmei com eles e estou a aguardar a correção.

Recomendo que se os valores não estiverem de acordo com o expectável, contactem para confirmarem esta situação.

Parabéns ao @luuuis e aos restantes pela evolução da Integração.

E como é que reparaste nisso? Só pela diferença do preço por kWh relativamente ao esperado?

Sim. O HA dava-me um valor perto dos -0,01 €/KWh. Logo na primeira fatura recebi a 0,03€/KWh, liguei e confirmaram-me o que referi. Entretanto recebi a 2ª fatura ainda sem ser de acordo com o diagrama de cargas.

Disseram que reuniram com a E-Redes e esperam ter tudo normalizado em breve…

Boa tarde @luuuis ,

Para efeitos de cálculo dos tarifários, esta tabela da ERSE devia ser considerada.
Estou com dúvidas de qual a coluna a aplicar.

Já agora, em relação à Luzboa, aparentemente o SAJ atual é 6,5.

Mais uma vez, obrigado pela partilha do projeto.

Acabei de refazer o modelo trihorario sem a dependência da integração com a ERSE. Se os três modelos forem carregados, pode comparar visualmente os gráficos dos sensores:

  - binary_sensor:
    - name: "Is DST"
      state: "{{ now().timetuple().tm_isdst == True }}" 

 
  - sensor:        
    - unique_id: coopernico_spot_price_trihorario
      unit_of_measurement: '€/MWh'
      state_class: measurement
      state: >
        {% set PM = states('sensor.omie_spot_price_pt')|float -%}
        {% set MAJ = states('sensor.omie_adjustment_price_pt')|float -%}
        {% set CGS = 4 -%}
        {% set k = 10 -%}
        {% set FP = 0.15 -%}
        {% set TAR_vazio = -118.5 -%}
        {% set TAR_ponta = -001.8 -%}
        {% set TAR_cheias = -106.9 -%}

        {% set t = now().hour + (now().minute/60) | round(2) %}
          {% if t < 8 or t >= 22 %}
            {% set TAR = TAR_vazio %}
          {% else %}       
            {% if "Is DST" == False %}
              {% set TAR = TAR_ponta if (t >= 9 and t < 10.5) or (t >= 18 and t < 20.5) else TAR_cheias -%}
            {% else %}   
              {% set TAR = TAR_ponta if (t >= 10.5 and t < 13) or (t >= 19.5 and t < 21) else TAR_cheias -%}        
            {% endif %}
          {% endif %}

        {{ ((PM + CGS + k)*(1 + FP) + MAJ + TAR) | round(2) }}
        
      attributes:
        friendly_name: "Coopérnico Base (tarifário tri-horário)"
        formula: "(PM+CGS+K)*(1+FP)+MIBEL+TAR"
        PM: "{{ states('sensor.omie_spot_price_pt')|float }}"
        MIBEL: "{{ states('sensor.omie_adjustment_price_pt')|float }}"
        CGS: "{{ 4 | float }}"
        k: "{{ 10 | float }}"
        FP: "{{ 0.15 | float  }}"
        TAR_vazio: "{{ TAR_vazio | float }}"
        TAR_ponta: "{{ TAR_ponta | float }}"
        TAR_cheias: "{{ TAR_cheias | float }}"
        TAR: "{{ TAR | float }}"
        
        today_hours: >
            {% set CGS = 4 -%}
            {% set k = 10 -%}
            {% set FP = 0.15 -%}
            {% set TAR_vazio = -118.5 -%}
            {% set TAR_fora_vazio = -84.2 -%}
            
            {% set ns = namespace(hourly_data=[]) %}
            {% for h, PM in state_attr('sensor.omie_spot_price_pt', 'today_hours').items() -%}
              {% set MAJ = state_attr('sensor.omie_adjustment_price_pt', 'today_hours')[h] -%}
              {% set TAR = TAR_vazio if h.hour < 8 or h.hour > 21 else TAR_fora_vazio -%}
            
              {% if PM == None or MAJ == None %}
                {% set price=PM %}
              {% else %}
                {% set price=((PM + CGS + k)*(1 + FP) + MAJ + TAR) | round(2) %}
              {% endif %}
              {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}
            {% endfor -%}
            {{ dict(ns.hourly_data) }}
        tomorrow_hours: >
            {% set CGS = 4 -%}
            {% set k = 10 -%}
            {% set FP = 0.15 -%}
            {% set TAR_vazio = -118.5 -%}
            {% set TAR_fora_vazio = -84.2 -%}

            {% set ns = namespace(hourly_data=[]) %}
            {% for h, PM in state_attr('sensor.omie_spot_price_pt', 'tomorrow_hours').items() -%}
              {% set MAJ = state_attr('sensor.omie_adjustment_price_pt', 'tomorrow_hours')[h] -%}
              {% set TAR = TAR_vazio if h.hour < 8 or h.hour > 21 else TAR_fora_vazio -%}

              {% if PM == None or MAJ == None %}
                {% set price=PM %}
              {% else %}
                {% set price=((PM + CGS + k)*(1 + FP) + MAJ + TAR) | round(2) %}
              {% endif %}
              {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}
            {% endfor -%}
            {{ dict(ns.hourly_data) }}

Para electricidade em residências será o valor BT (Baixa Tensão) que importa.

@JeffersM porreiro, posso incluir esse sensor no Wiki?


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


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