azogue / aiopvpc

Simple aio library to download Spanish electricity hourly prices (PVPC) from esios.ree.es
MIT License
41 stars 10 forks source link

Atributo para obtener el precio actual #20

Closed djmuerteitm closed 3 years ago

djmuerteitm commented 3 years ago

Hola! Estoy intentando crear una automatización en HA de forma que pueda utilizar el precio actual como condicionante para disparar acciones.

Por ejemplo, que cuando el precio sea >0.15, apague un interruptor, y que cuando el valor sea inferior, vuelva a encenderlo.

Para ello tendría que poder "leer" el "precio actual" como un atributo, pero ahora mismo tendría que crear una condición por cada uno de los atributos "Price 00h", "Price 01h"... etc. para que la automatización pueda leer las variaciones de precio, lo cual es bastante tedioso.

Sería posible leer el precio actual de un único atributo, de forma que solo sea necesario crear un condicionante de estado numérico?

Un saludo y gran trabajo. Gracias de antemano.

ajtudela commented 3 years ago

Buenas, antes del cambio de tarifa tenia un script para encender un termo eléctrico las tres horas antes de cambiar a punta. Ahora no sé cómo lo haré, la verdad. Pero te lo dejo por aquí por si te vale.

Primero con este script guardo en una entidad de tiempo la hora a la que encenderlo:

data_template:
  entity_id: input_datetime.waterheater_turn_on_hour
  time: >-
    {% set data = namespace(prices = [], average = 0, hour = 0) %}
    {% for i in range(0,10) %}
      {% set data.prices = data.prices + [state_attr("sensor.pvpc_dha","price_0" ~ i ~ "h")] %}
    {% endfor %}
    {% for i in range(10,24) %}
      {% set data.prices = data.prices + [state_attr("sensor.pvpc_dha","price_" ~ i ~ "h")] %}
    {% endfor %}
    {% set data.average = data.prices|sum / 24 %} 
    {% for price in data.prices %}
      {% if 9 < loop.index0 < 20 and price < data.average %}
        {%set data.hour = loop.index0 %}
      {% endif %}
    {% endfor %}
    {%set data.hour = data.hour * 3600 %}
    {% if is_state("binary_sensor.dst", "on") %}
      {{(data.hour-state_attr('input_datetime.waterheater_duration_summer','timestamp'))|timestamp_custom('%H:%M:%S', True)}}
    {% else %}
      {{(data.hour-state_attr('input_datetime.waterheater_duration_winter','timestamp'))|timestamp_custom('%H:%M:%S', True)}}
    {% endif %}
service: input_datetime.set_datetime

Con este segundo script guardo la hora de apagado:

data_template:
  entity_id: input_datetime.waterheater_turn_off_hour
  time: |-
    {% if is_state("binary_sensor.dst", "on")%}
      {{(state_attr('input_datetime.waterheater_turn_on_hour','timestamp') + state_attr('input_datetime.waterheater_duration_summer','timestamp'))|timestamp_custom('%H:%M:%S', False)}}
    {% else %}
      {{(state_attr('input_datetime.waterheater_turn_on_hour','timestamp') + state_attr('input_datetime.waterheater_duration_winter','timestamp'))|timestamp_custom('%H:%M:%S', False)}}
    {% endif %}
service: input_datetime.set_datetime
djmuerteitm commented 3 years ago

Muchisimas gracias, voy a probarlo y te cuento, es precisamente para eso mismo para lo que lo quiero, para que el grueso del consumo del termo lo haga en las horas más baratas. Mil gracias :D

ajtudela commented 3 years ago

De nada!

Si lo adaptas a la nueva tarifa, compártelo. Yo aún no sé en qué horario lo pondré :S

azogue commented 3 years ago

Hola @djmuerteitm,

Hola! Estoy intentando crear una automatización en HA de forma que pueda utilizar el precio actual como condicionante para disparar acciones

Perdona, no entiendo el problema, el precio actual es, precisamente, el state del sensor! ¿por qué tienes q recurrir a un oscuro atributo de un sensor para coger el {{states.sensor.pvpc.state}} ??

Edit: para triggers o conditions de automatizaciones tienes triggers de estado, de estado numérico, y de plantilla. Puedes hacer el disparo de 1000 maneras :)

pove commented 3 years ago

Yo, aprovechando que tuve que poner el custom_component con el parche para la 2.0TD, he añadido un estado con el periodo de tarifa, y ahora puedo crear automatizaciones con un trigger basado en este periodo, que saltaría en Valle, Llana o Punta. Por ejemplo: para apagar el termo en punta (luego se puede encender en Valle o en periodos Llana):

platform: state
entity_id: sensor.pvpc
attribute: current_period
to: peak

@azogue, de hecho subí el código como pull-request, pero no consigo pasar los checks :sweat_smile:

djmuerteitm commented 3 years ago

Perdona, no entiendo el problema, el precio actual es, precisamente, el state del sensor! ¿por qué tienes q recurrir a un oscuro atributo de un sensor para coger el {{states.sensor.pvpc.state}} ??

Edit: para triggers o conditions de automatizaciones tienes triggers de estado, de estado numérico, y de plantilla. Puedes hacer el disparo de 1000 maneras :)

Buenas:

Te pego la automatización que tengo por si me estoy colando en algo, aunque la he copiado de otra que tengo para racionalizar el consumo, leyendo el contador de energia y apagando un relé, es decir, que es basada en estado numerico también y por algún motivo con el pvpc no me funciona:

Esta es la que trato de crear en base al precio del PVPC, que cuando esté por encima de cierto precio, apague el termo, y no funciona:

alias: Termo control-apagar description: '' trigger:

Es exactamente igual que otra que tengo para racionalizar el consumo y esa si que funciona.

azogue commented 3 years ago

@djmuerteitm,

por algún motivo con el pvpc no me funciona:

Creo q sé qué puede estar pasando, ya que, aparentemente, en ese YAML para la automatización del switch no veo nada raro.

El sensor PVPC se actualiza únicamente en los cambios de hora, es decir, no emite ningún evento "STATE_CHANGED" en otros momentos.

Los triggers de estado o estado numérico sobre sensor.pvpc escuchan esos eventos, por lo que sólo pueden saltar en las horas en punto...

Por otro lado, los triggers numeric_state, creo, sólo se activan en los momentos donde el estado pasa de un lado al otro del threshold, por lo que, en el ejemplo, la automatización sólo puede saltar en la hora en punto donde el precio pase de <= 0,12 a > 0,12, y hasta que no vuelva a bajar de 0,12 y vuelva a subir no saltará otra vez... No sé si es la mejor manera de controlar ese termo :)

azogue commented 3 years ago

cerrando este issue, dado que no está relacionada con la librería, sino con cómo componer automatizaciones con disparo en cambios de estado 😝