Home Assistant – Control de potencia y apagado de equipos en función del consumo global de la instalación

Hace ya tiempo baje la potencia contratada a 3,45Kw/h , y la verdad que hasta el momento ningún problema , hasta que este año he decidido usar las bombas de calor de los aires en lugar de la caldera de gas natural , esto tiene el problema de que incrementa bastante el consumo eléctrico y hay muchas posibilidades de que el contador inteligente corte el suministro por exceder el consumo de la potencia contratada

Estos contadores inteligentes tienen un cierto margen de maniobra con dos variables , por un lado el tiempo y por el otro el consumo.

Esta es la teorica curva de salto de un contador inteligente
Y esta el la misma peor con una curva anexa que se aproxima mas a la realidad

El tema esta en que se puede llegar a consumir el doble de lo contratado durante un periodo de unos cinco minutos sin que la protección de contador actué.

Al tener el PZEM en el cuadro de entrada tengo lecturas cada seis segundos de como están todos los valores de la instalación eléctrica

Estos datos los voy grabando en influxdb para poder tener series históricas , por ejemplo este seria mi consumo instantáneo de los últimos seis meses

Y este el consumo instantáneo del ultimo mes

Se puede observar que en muchas ocasiones se pasa de los 3,45 contratados con la compañia

Así mismo también tengo los datos históricos de los consumos diarios

Consumo diario del ultimo mes

Consumo diario de los últimos seis meses

El objetivo es definir una serie de automatizaciones que nos permitan ir desconectando elementos cuando el consumo sea superior a la potencia contratada durante un determinado tiempo

Empezaremos creando un binary sensor que se ponga en ON cuando detecte que pasamos de la potencia contratada

  - platform: template
    sensors:
      exceso_consumo:
        friendly_name: "Exceso consumo"
        value_template: >-
            {% if ((states.sensor.pzem_potencia.state )| round(5,default=0) ) >= 3450  %}
            on
            {% else %}
            off
            {% endif %} 
        icon_template: mdi:gauge-full  

Como dos de elementos que vamos a apagar son dos televisiones controlaremos si están encendidas o no por su consumo , crearemos un par mas de binary sensors para que nos digan su estado

  - platform: template
    sensors:
      tv_matrimonio_encendida:
        friendly_name: "TV Matrimonio encendida"
        value_template: >-
            {% if (states.sensor.enchufe_tv_matrimonio_power.state | int(0) | round(0,default=0))  >= 50  %}
            on
            {% else %}
            off
            {% endif %}   
        icon_template: mdi:television      

  - platform: template
    sensors:
      tv_comedor_encendida:
        friendly_name: "TV Comedor encendida"
        value_template: >-
            {% if (states.sensor.enchufe_mueble_tv_power.state | int(0) | round(0,default=0))  >= 60  %}
            on
            {% else %}
            off
            {% endif %}   
        icon_template: mdi:television    

Empezaremos con las automatizaciones , primero definimos un aviso a los cinco minutos , enviamos una grafica del consumo eléctrico de la ultima media hora , informamos dos veces con un espacio de tiempo entre las lecturas del consumo actual , y a los diez minutos enviamos una grafica actualizada del consumo actual

A los siete minutos de exceso de consumo aprovechando que el otro día integre ambos aires con climate.set_hvac_mode paramos uno de los aires y enviamos el consumo antes y después de la puesta en off del aire.

A los ocho minutos si el televisor esta funcionando ( consumiendo ) lo para enviando el código IR de poweroff y enviamos el consumo antes y después del apagado

A los nueve minutos para el otro aire y a los diez la otra televisión , la automatización debería quedar algo similar a esto

##########################################################################################################################    
#  Automatizaciones por exceso de consumo
##########################################################################################################################

- alias: alerta de sobreconsumo eléctrico
  initial_state: True
  trigger:
    - platform: state
      entity_id: binary_sensor.exceso_consumo
      to: 'on'
      for:
        minutes: 5
  action:
    - service: notify.notif_telegram_bot
      data:
        message: "*Alerta por exceso de consumo* , actual : {{states.sensor.pzem_potencia.state}} W." 
        
    - service: shell_command.consumo_media_hora        
    - delay: 00:00:15
    - service: notify.notif_telegram_bot
      data:
        title: Enviar imagenes
        message: Consumo ultima media hora
        data:
          photo:
          - file: "/config/www/graficas/grafica_consumo_total_ultima_media_hora.png"  
            capture: Snapshoot
            caption: Consumo ultima media hora
            
    - delay: 00:00:40
    
    - service: notify.notif_telegram_bot
      data:
        message: "*Alerta por exceso de consumo* , actual : {{states.sensor.pzem_potencia.state}} W." 
    - delay: 00:00:55
    - service: notify.notif_telegram_bot
      data:
        message: "*Alerta por exceso de consumo* , actual : {{states.sensor.pzem_potencia.state}} W." 
    
    # Enviamos el consumo una vez ya apagados los equipos
    
    - delay: 00:10:00    
    - service: shell_command.consumo_media_hora        
    - delay: 00:00:15
    - service: notify.notif_telegram_bot
      data:
        title: Enviar imagenes
        message: Consumo ultima media hora
        data:
          photo:
          - file: "/config/www/graficas/grafica_consumo_total_ultima_media_hora.png"  
            capture: Snapshoot
            caption: Consumo ultima media hora
    - service: notify.notif_telegram_bot
      data:
        message: "*Alerta por exceso de consumo* , actual : {{states.sensor.pzem_potencia.state}} W." 


# Primero el aire de la habitacion de matrimonio
- alias: exceso consumo electrico apagado aire matrimonio
  initial_state: True
  trigger:
    - platform: state
      entity_id: binary_sensor.exceso_consumo
      to: 'on'
      for:
        minutes: 7
  action:
    - service: notify.notif_telegram_bot
      data:
        message: "Exceso de consumo , *apagado aire matrimonio* , actual : {{states.sensor.pzem_potencia.state}} W." 

    - service: climate.set_hvac_mode
      entity_id: climate.ac_daikin
      data:
        hvac_mode: "off"
      
    - delay: 00:00:55
      
    - service: notify.notif_telegram_bot
      data:
        message: "*Consumo actual* : {{states.sensor.pzem_potencia.state}} W." 
      
    - delay: 00:05:40
    - service: shell_command.consumo_media_hora        
    - delay: 00:00:15
    - service: notify.notif_telegram_bot
      data:
        title: Enviar imagenes
        message: Consumo ultima media hora
        data:
          photo:
          - file: "/config/www/graficas/grafica_consumo_total_ultima_media_hora.png"  
            capture: Snapshoot
            caption: Consumo ultima media hora
            
    - service: notify.notif_telegram_bot
      data:
        message: "*Consumo actual* : {{states.sensor.pzem_potencia.state}} W." 

#Luego la television de la habitacion de matrimonio
- alias: exceso consumo electrico apagado tv matrimonio
  initial_state: True
  trigger:
    - platform: state
      entity_id: binary_sensor.exceso_consumo
      to: 'on'
      for:
        minutes: 8
  condition:
    - condition: state
      entity_id: binary_sensor.tv_matrimonio_encendida
      state: 'on'           
  action:
    - service: notify.notif_telegram_bot
      data:
        message: "Exceso de consumo , *apagada TV matrimonio* , actual : {{states.sensor.pzem_potencia.state}} W." 
        
    - service: media_player.turn_off
      entity_id: media_player.tv_samsung_matrimonio
  
    # - service: script.turn_on
      # entity_id: script.remote_tv_matrimonio_power    

    - delay: 00:00:55 
      
    - service: notify.notif_telegram_bot
      data:
        message: "*Consumo actual* : {{states.sensor.pzem_potencia.state}} W." 

#Luego el aire del comedor
- alias: exceso consumo electrico apagado aire comedor
  initial_state: True
  trigger:
    - platform: state
      entity_id: binary_sensor.exceso_consumo
      to: 'on'
      for:
        minutes: 9
  action:
    - service: notify.notif_telegram_bot
      data:
        message: "Exceso de consumo , *apagado aire comedor* , actual : {{states.sensor.pzem_potencia.state}} W." 

    - service: climate.set_hvac_mode
      entity_id: climate.ac_general
      data:
        hvac_mode: "off"    

    - delay: 00:00:55
            
    - service: notify.notif_telegram_bot
      data:
        message: "*Consumo actual* : {{states.sensor.pzem_potencia.state}} W." 

#Por ultimo la television del comedor
- alias: exceso consumo electrico apagado tv comedor
  initial_state: True
  trigger:
    - platform: state
      entity_id: binary_sensor.exceso_consumo
      to: 'on'
      for:
        minutes: 10
  condition:
    - condition: state
      entity_id: binary_sensor.tv_comedor_encendida 
      state: 'on'           
  action:
    - service: notify.notif_telegram_bot
      data:
        message: "Exceso de consumo , *apagada TV comedor* , actual : {{states.sensor.pzem_potencia.state}} W." 

    - service: script.turn_on    
      entity_id: script.remote_tv_comedor_power    
      
    - delay: 00:00:55
                  
    - service: notify.notif_telegram_bot
      data:
        message: "*Consumo actual* : {{states.sensor.pzem_potencia.state}} W." 

Este seria el comando para actualizar la grafica de consumos

shell_command:
  
  consumo_media_hora: "curl -s -H 'Authorization: Bearer eyJrIjoid0RrZ3232EIzVjlosdbkJhRfsdhzVqaW154554V0NyQ1FTalcifsfLCJuIwjoiSEwerwerfsdfEyIiwiafsWQiOjF9' 'http://192.168.1.20:3000/render/d-solo/iZBnH5iMz/consumo-electrico-diario?orgId=1&panelId=11&from=now-30m&to=now&width=500&height=500&tz=Europe%2FMadrid' > /config/www/graficas/grafica_consumo_total_ultima_media_hora.png"

Así se vería en telegram el resultado de esta automatización

Y con esto y un bizcocho …