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. 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.
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.
@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}]
Agradeço o feedback
Boa tarde,
Em relação às horas em que o preço é negativo, como são faturadas? A custo zero ou negativo?
Obrigado.
Corresponde a um crédito no teu saldo, já houve quem tenha recebido nota de crédito ao fim do mês.
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.