Integrar cualquier ventilador o aire acondicionado en Home Assistant

Sí, has leído bien, con esta guía puedes integrar CUALQUIER ventilador o aire acondicionado en Home Assistant por 30€ o menos.

Evidentemente, esta guía va dirigida a aquellos aparatos que no son inteligentes por si mismos, ni tienen una integración directa con Home Assistant.

Requisitos previos

Para poder integrar cualquier ventilador o aire acondicionado en Home Assistant sólo necesitas cumplir uno de los siguientes requisitos, dependiendo de cuál sea tu caso:

  • Si tu aire acondicionado o ventilador tiene un mando a distancia. En este caso lo vamos a integrar a través de un controlador de infrarrojos (en mi caso utilizo BroadLink). Esta es la mejor situación, ya que con un único dispositivo vamos a poder enviar tantas órdenes como botones tenga el mando a distancia. Además podremos controlar varios aparatos con el mismo dispositivo. En mi caso lo utilizo para controlar varios ventiladores de techo.
*Algún precio puede haber cambiado desde la última revisión
  • Si tu aire acondicionado o ventilador NO tiene un mando a distancia. Aquí nos encontramos con instalaciones más antiguas que se controlan oprimiendo botones en el propio aparato o un controlador de sala. En este caso vamos a utilizar un SwitchBot Bot, que es un pequeño dispositivo que sirve para pulsar físicamente cualquier tipo de botón. La desventaja es que solo nos va a permitir pulsar un único botón (por dispositivo), pero la ventaja es que nos va a permitir automatizar las instalaciones más antiguas.
Switchbot bot
*Algún precio puede haber cambiado desde la última revisión

Sea cual sea tu caso, vamos a estar realizando acciones físicas (encender, apagar, cambiar de temperatura…) que no tienen, a priori, reflejo en HA. Para compensar esta situación vamos a crear una serie de entidades virtuales que nos den información sobre el aparato.

Ten en cuenta que los códigos facilitados siguen la nomenclatura de los ejemplos, por lo que si cambias el nombre de las entidades creadas, también tendrás que adaptarlo en los códigos de creación de scripts y automatizaciones.

¿Necesitas ayuda? No te estreses, desde nuestro canal de Telegram te echamos una mano.

Control de encendido y apagado

Lo más importante que vamos a querer conocer es si el aparato está encendido o apagado.

Lovelace

Para ello vamos a crear un Ayudante que pueda tener estos dos valores (encendido / apagado). Ve a Ajustes > Dispositivos y servicios > Ayudantes y crea uno nuevo del tipo ‘Alternar’ (‘boolean’). Dale el nombre del aparato (por ejemplo, “Aire acondicionado”) y guárdalo. Esto crea la entidad ‘input_boolean.aire_acondicionado‘.

Ahora necesitamos que HA sea capaz de actualizar esta información en función de los eventos que sucedan. Como lo más habitual es que tengamos un mismo botón (‘power’) tanto para encender como para apagar el aparato, vamos a crear una automatización para que cuando se pulse dicho botón, HA alterne la situación de estado (es decir, si está apagado pasará a “encendido” y viceversa).

Crea una automatización y pega el código correspondiente a tu caso, sustituyendo en el mismo tus entidades, dispositivos y comandos:

  • Integración con controlador de infrarrojos. Aquí vamos a alternar el estado del aparato, cuando se llame al servicio correspondiente al comando “Power”.
alias: Ventilador - Actualizar estado
description: >-
  Si se llama al servicio Power, se alterna el estado de la entidad booleana del
  ventilador
trigger:
  - platform: event
    event_type: call_service
    event_data:
      domain: remote
      service: send_command
      service_data:
        device: Ventilador #Indica aquí el nombre de tu dispositivo
        command: Power #Indica aquí el nombre de tu comando de encendido/apagado
condition: []
action:
  - service: input_boolean.toggle
    data: {}
    target:
      entity_id: input_boolean.ventilador 
mode: single
  • Integración con SwitchBot Bot. En este caso vamos a vincular el cambio de estado del SwitchBot Bot con el cambio de estado del aparato.
alias: Aire acondicionado - Actualizar estado
description: >-
  Si cambia el estado del SwitchBot Bot, se alterna el estado de la entidad
  booleana del aire acondicionado
trigger:
  - platform: state
    entity_id:
      - switch.bot #Selecciona aquí la entidad de tu dispositivo SwitchBot Bot
condition: []
action:
  - service: input_boolean.toggle
    data: {}
    target:
      entity_id: input_boolean.aire_acondicionado 
mode: single

Función de temporizador

Una de las funciones más interesantes que vamos a poder incorporar en nuestros aparatos al integrar cualquier ventilador o aire acondicionado en Home Assistant es la de un temporizador, que apague el aparato transcurrido el periodo que nosotros indiquemos.

Lovelace

Para ello sigue estos pasos:

  1. Ve a Ajustes > Dispositivos y servicios > Ayudantes y crea uno nuevo del tipo ‘Temporizador’ (‘timer’). Dale el nombre del aparato (por ejemplo, “Aire acondicionado”) y guárdalo. Esto creará el ayudante ‘timer.aire_acondicionado’ que funcionará como temporizador.
  2. Ahora crea otro ayudante del tipo ‘Número’ y dale el nombre del aparato seguido de timer (por ejemplo, “Aire acondicionado timer”). En este caso indica como valor mínimo y tamaño del paso 30 (máximo el que quieras), y minutos como unidad de medida. Esto creará el ayudante ‘input_number.aire_acondicionado_timer’ que indicará al temporizador cuánto tiempo tiene que durar.
  3. Crea un script que alterne el estado del temporizador. Es decir, que inicie el temporizador con el valor guardado en el segundo ayudante creado, si el timer está inactivo (si ya está activo, servirá para finalizarlo). Esto nos va a permitir tener un valor “favorito” guardado. Para ello crea un nuevo script y pega el siguiente código:
alias: Aire acondicionado - Temporizador
sequence:
  - if:
      - condition: state
        entity_id: timer.aire_acondicionado 
        state: active
    then:
      - service: timer.finish
        data: {}
        target:
          entity_id: timer.aire_acondicionado 
    else:
      - service: timer.start
        data:
          duration: "{{states('input_number.aire_acondicionado_timer') | int *60}}" 
        target:
          entity_id: timer.aire_acondicionado 
mode: single
icon: mdi:air-conditioner
  1. Crea una automatización que, cuando haya un temporizador en curso y se modifique el tiempo que tiene que durar, se reinicie con el nuevo valor. Esto nos va a permitir modificar la duración del temporizador fácilmente. Para ello crea una automatización y pega el siguiente código:
alias: Aire acondicionado - Actualización timer
description: "Actualiza el timer cuando se indica un nuevo valor, mientras está en funcionamiento"
trigger:
  - platform: state
    entity_id:
      - input_number.aire_acondicionado_timer
condition:
  - condition: state
    entity_id: timer.aire_acondicionado 
    state: active
action:
  - service: timer.start
    data:
      duration: "{{states('input_number.aire_acondicionado_timer') | int *60}}" 
    target:
      entity_id: timer.aire_acondicionado #Selecciona aquí la entidad del temporizador creado
mode: single
  1. Por último vamos a crear una automatización que encienda el aparato cuando se active el temporizador (si es que está apagado), configurándola de la siguiente manera:
    • Desencadenantes. Selecciona “Estado”, escoge el timer creado en el paso 1 (‘timer.aire_acondicionaro’) e indica, únicamente, en el apartado “A” el valor “Activo”.
    • Condiciones. Selecciona “Estado”, busca la entidad de estado de tu aparato (‘input_boolean.aire_acondicionado’) creada en el apartado “Control de encendido y apagado”, y en estado selecciona “Apagado”.
    • Acciones. Aqui tienes que indicar la acción que encienda el aparato. En caso de la integración con controlador de infrarrojos será llamar al servicio que lanza comando “Power”, y en el caso de la integración con SwitchBot Bot tendrás que seleccionar el dispositivo correspondiente e indicar como acción “Encender”.
  2. De forma inversa, vamos a crear otra automatización que apague el aparato y finalice el temporizador cuando acabe el tiempo o desactivemos el temporizador manualmente (o que simplemente finalice el temporizador cuando apaguemos el aparato manualmente). Adicionalmente vamos a añadir como condición que la función del “modo temperatura” esté apagada (ver apartado siguiente), para que no entren en conflicto. Crea una automatización y configúrala de la siguiente manera:
    • Desencadenantes. Selecciona “Estado”, escoge el timer creado en el paso 1 (‘timer.aire_acondicionado’) e indica, únicamente, en el apartado “A” = “Inactivo”. Añade un segundo desencadenante seleccionando “Estado”, busca la entidad de estado de tu aparato (‘input_boolean.aire_acondicionado’) creada en el apartado “Control de encendido y apagado”, y en el campo “A” selecciona “Apagado”.
    • Condiciones. Selecciona “Estado”, busca la entidad de estado del modo temperatura de tu aparato (‘input_boolean.aire_acondicionado_modo_temperatura’) que vas a crear en el apartado siguiente, y en el campo “Estado” selecciona “Apagado”. Si no creas un modo temperatura, no es necesario que añadas esta condición.
    • Acciones. Aqui tienes que indicar la acción que apague el aparato. En caso de la integración con controlador de infrarrojos será llamar al servicio que lanza comando “Power”, y en el caso de la integración con SwitchBot Bot tendrás que seleccionar el dispositivo correspondiente e indicar como acción “Apagar”. Añade una segunda acción, selecciona “Llamar servicio”, y busca ‘timer.finish”. Elige como entidad el temporizador de tu aparato (‘timer.aire_acondicionado’).

Función de temperatura objetivo

En este caso vamos a buscar que el aparato esté encendido hasta que la temperatura de la estancia alcance unos grados determinados, bien sea porque el aparato ha conseguido rebajar la temperatura, o porque ha bajado la temperatura ambiental (por ejemplo, por la noche).

Lovelace

Para ello necesitas un sensor de temperatura en la estancia donde tengas el aparato, para poder medir la temperatura ambiente. Hay dispositivos como termostatos, altavoces inteligentes o controladores de infrarrojos, entre muchos otros, que cuentan con un sensor de temperatura incorporado, por lo que puedes revisar si puedes aprovechar alguno de los que ya tienes. En mi caso tengo este tipo de sensores de temperatura / humedad de Tuya integrados con zigbee2mqtt, además del sensor de temperatura del termostato tadoº.

*Algún precio puede haber cambiado desde la última revisión

Para crear la función sigue estos pasos:

  1. Ve a Ajustes > Dispositivos y servicios > Ayudantes y crea un Ayudante del tipo ‘Alternar’ (‘boolean’). Dale el nombre del aparato seguido de “modo temperatura” (por ejemplo, “Aire acondicionado modo temperatura”) y guárdalo. Esto creará el ayudante ‘input_boolean.aire_acondicionado_modo_temperatura’ que nos va a informar de si el “modo temperatura” está activo o no.
  2. Crea otro Ayudante del tipo ‘Número’ y dale el nombre del aparato seguido de target (por ejemplo, “Aire acondicionado target”). En este caso indica como valor mínimo y máximo indica el rango entre las que estaría tu temperatura objetivo (por ejemplo, entre 20 y 28). Como tamaño del paso indica ‘1’, y “grados” como unidad de medida. Esto creará el ayudante ‘input_number.aire_acondicionado_target’ que nos va a servir para marcar cuál es la temperatura objetivo que queremos conseguir.
  3. Pega el siguiente código en tu fichero ‘sensors.yaml, para crear un sensor (‘sensor.diferencia_temperatura_target‘) que calcule la diferencia entre la temperatura real de la estancia y la temperatura objetivo. No olvides sustituir en el código tu sensor de temperatura.
- platform: template
  sensors:
    diferencia_temperatura_target:
      friendly_name: "Diferencia temperatura (target)"
      value_template: >
        {{ (states('sensor.TU-SENSOR-DE-TEMPERATURA') | int) - (states('input_number.aire_acondicionado_target') | int) }} # Indica aquí tu sensor de temperatura
      icon_template: mdi:thermometer-alert
      unit_of_measurement: "grados"
  1. A continuación vamos a crear un script que alterne el estado del primer ayudante creado (‘input_boolean.aire_acondicionado_modo_temperatura’). Es decir, lo cambiará a encendido si su estado actual es apagado (y si por lo contrario el estado actual es encendido, apagará el modo temperatura). Para ello crea un nuevo script y pega el siguiente código:
alias: Aire acondicionado - Modo temperatura
sequence:
  - if:
      - condition: state
        entity_id: input_boolean.aire_acondicionado_modo_temperatura 
        state: "on"
    then:
      - service: input_boolean.turn_off
        data: {}
        target:
          entity_id: input_boolean.aire_acondicionado_modo_temperatura
    else:
      - service: input_boolean.turn_on
        data: {}
        target:
          entity_id: input_boolean.aire_acondicionado_modo_temperatura
mode: single
icon: mdi:air-conditioner
  1. Ahora, vamos a crear una automatización que encienda el aparato cuando se active el modo temperatura (tras comprobar que el aparato está apagado), configurándola de la siguiente manera:
    • Desencadenantes. Selecciona “Estado”, escoge el ayudante creado en el paso 1 (‘input_boolean.aire_acondicionado_modo_temperatura’) e indica, únicamente, en el apartado “A” = “Encendido”.
    • Condiciones. Selecciona “Estado”, busca la entidad de estado de tu aparato (‘input_boolean.aire_acondicionado’) creada en el apartado “Control de encendido y apagado”, y en estado selecciona “Apagado”.
    • Acciones. Aqui tienes que indicar la acción que encienda el aparato. En caso de la integración con controlador de infrarrojos será llamar al servicio que lanza comando “Power”, y en el caso de la integración con SwitchBot Bot tendrás que seleccionar el dispositivo correspondiente e indicar como acción “Encender”.
  2. De forma inversa, vamos a crear otra automatización que apague el aparato y desactive el modo temperatura cuando se alcance la temperatura objetivo (tras comprobar que ambos están encendidos), configurándola de la siguiente manera:
    • Desencadenantes. Selecciona “Estado numérico”, escoge el sensor creado en el paso 3 (‘sensor.diferencia_temperatura_target’) y selecciona en el apartado “Modo por debajo de” la opción de “Número fijo”, e introduce ‘1’ en el campo “Por debajo de”.
    • Condiciones. Selecciona “Estado”, busca la entidad de estado de tu aparato (‘input_boolean.aire_acondicionado’) creada en el apartado “Control de encendido y apagado”, y en estado selecciona “Encendido”. Añade una segunda condición y selecciona “Estado”, escoge el ayudante creado en el paso 1 (‘input_boolean.aire_acondicionado_modo_temperatura’) y en el campo “Estado” selecciona “Encendido”.
    • Acciones. Aqui tienes que indicar la acción que apague el aparato. En caso de la integración con controlador de infrarrojos será llamar al servicio que lanza comando “Power”, y en el caso de la integración con SwitchBot Bot tendrás que seleccionar el dispositivo correspondiente e indicar como acción “Apagar”. Añade como acción adicional “Llamar servicio”, indica “Entrada booleana: Apagar” y selecciona como entidad el ayudante creado en el paso 1 (‘input_boolean.aire_acondicionado_modo_temperatura’).
  3. Tenemos que crear tra automatización que apague el aparato si desactivamos manualmente el modo temperatura (tras comprobar que el aparato está encendido). Adicionalmente vamos a añadir como condición que el temporizador esté inactivo (ver apartado anterior), para que no entren en conflicto. Crea una automatización y configúrala de la siguiente manera:
    • Desencadenantes. Selecciona “Estado”, escoge el ayudante creado en el paso 1 (‘input_boolean.aire_acondicionado_modo_temperatura’) y en el campo “A” selecciona “Apagado”.
    • Condiciones. Selecciona “Estado”, busca la entidad de estado de tu aparato (‘input_boolean.aire_acondicionado’) creada en el apartado “Control de encendido y apagado”, y en estado selecciona “Encendido”. Añade una segunda condición y selecciona “Estado”, escoge el temporizador creado en el apartado anterior (‘timer.aire_acondicionado’) y en el campo “Estado” selecciona “Inactivo”.
    • Acciones. Aqui tienes que indicar la acción que apague el aparato. En caso de la integración con controlador de infrarrojos será llamar al servicio que lanza comando “Power”, y en el caso de la integración con SwitchBot Bot tendrás que seleccionar el dispositivo correspondiente e indicar como acción “Apagar”.
  4. Muy parecida a las anteriores, vamos a crear otra automatización que desactive el modo temperatura si apagamos manualmente el aparato (tras comprobar que el modo temperatura está activo), configurándola de la siguiente manera:
    • Desencadenantes. Selecciona “Estado”, busca la entidad de estado de tu aparato (por ejemplo, “input_boolean.aire_acondicionado”) creada en el apartado “Control de encendido y apagado”, y en el campo “A” selecciona “Apagado”.
    • Condiciones. Selecciona “Estado”, busca la entidad creada en el paso 1 (‘input_boolean.aire_acondicionado_modo_temperatura’), y en estado selecciona “Encendido”.
    • Acciones. Selecciona “Llamar servicio”, indica “Entrada booleana: Apagar” y selecciona como entidad el ayudante creado en el paso 1 (“Aire acondicionado modo temperatura”).
  5. Para prevenir conflictos, vamos a crear dos últimas automatizaciones. La primera hará que, si está activo el modo temperatura y se activa el temporizador, desactive el modo temperatura. La segunda hará que, si el temporizador está activo y se activa el modo temperatura, finalice el temporizador. Crea dos automatizaciones y copia estos códigos:
alias: Aire acondicionado - Modo temperatura + Temporizador (on)
description: >-
  Si está activo el modo temperatura y se activa el temporizador, desactiva el
  modo temperatura
trigger:
  - platform: state
    entity_id:
      - timer.aire_acondicionado
    to: active
condition:
  - condition: state
    entity_id: input_boolean.aire_acondicionado_modo_temperatura
    state: "on"
action:
  - service: input_boolean.turn_off
    data: {}
    target:
      entity_id: input_boolean.aire_acondicionado_modo_temperatura
mode: single
alias: Aire acondicionado - Temporizador + Modo temperatura (on)
description: >-
  Si el temporizador está activo y se activa el modo temperatura, finaliza el
  temporizador
trigger:
  - platform: state
    entity_id:
      - input_boolean.aire_acondicionado_modo_temperatura
    to: "on"
condition:
  - condition: state
    entity_id: timer.aire_acondicionado
    state: active
action:
  - service: timer.finish
    data: {}
    target:
      entity_id: timer.aire_acondicionado
mode: single

Funciones de ahorro de energía

Conocer la temperatura ambiental es de utilidad para valorar la temperatura relativa en nuestra casa, y para el ahorro energético. Si la temperatura exterior es inferior a la interior, a lo mejor basta con abrir la ventana en lugar de encender el aire acondicionado. Esto lo podemos conseguir fácilmente integrando la información de algún servicio meteorológico como OpenWeather.

Lovelace

Del mismo modo, si la temperatura ambiental es superior nos interesa cerrar todas las ventanas mientras esté funcionando nuestro aparato para no perder eficiencia energética. Por lo que si dispones de algún sensor de este tipo utilízalos para que Home Assistant te avise cuando haya ventanas abiertas.

Función de control remoto

Una de las mayores ventajas de integrar cualquier ventilador o aire acondicionado en Home Assistant es poder encenderlo desde fuera de casa para que este “fresquita” cuando llegues. Esto lo puedes hacer fácilmente desde tu teléfono, pero primero necesitas habilitar el acceso a Home Assistant desde el exterior.

Tarjeta Lovelace

Si has seguido la guía para integrar cualquier ventilador o aire acondicionado en Home Assistant, puedes usar la tarjeta mostrada en los ejemplos para controlar tu nueva instalación. Antes necesitas disponer de las tarjetas Stack in card, Mushroom Cards, Card Mod, Timer Bar Card y Bar Card, que puedes instalar a través de HACS. Hecho esto crea una nueva tarjeta y copia el código que corresponde a tu caso, revisando que has adaptado en el código tus sensores, dispositivos, entidades y comandos (especialmente si no has seguido la nomenclatura de ejemplo).

  • Integración con SwitchBot Bot
type: custom:stack-in-card
cards:
  - square: false
    type: grid
    columns: 2
    cards:
      - type: custom:mushroom-template-card
        primary: Climatizador
        secondary: |
          Interior {{ states('sensor.TU-SENSOR-DE-TEMPERATURA') | int }}ºC # Indica aquí tu sensor de temperatura
        icon: mdi:fan
        icon_color: |
          {% if states('input_boolean.aire_acondicionado') == 'on' %}teal
          {% endif %}
        badge_icon: >
          {% if states('sensor.openweathermap_temperature')| int <=
          states('sensor.TU-SENSOR-DE-TEMPERATURA') | int %} # Indica aquí tu sensor de temperatura

          mdi:snowflake

          {% endif %}
        badge_color: >
          {% if states('sensor.openweathermap_temperature')| int <=
          states('sensor.TU-SENSOR-DE-TEMPERATURA') | int %} # Indica aquí tu sensor de temperatura

          blue

          {% endif %}
        entity: switch.bot # Selecciona aquí tu dispositivo
        tap_action:
          action: toggle
        card_mod:
          style: |-
            ha-card {
            border: 0px;
            }
            {% if states('input_boolean.aire_acondicionado') == 'on' %}
            ha-state-icon {
              animation: spin 1.4s linear infinite;
            }
            {% endif %}
      - type: custom:mushroom-chips-card
        alignment: end
        card_mod:
          style: |
            ha-card {
              margin-top: 15px;
              margin-right: 10px;
              border: 0px !important;
              --chip-box-shadow: 0px;
              --chip-spacing: 0px;
            }
        chips:
          - type: template
            icon: mdi:clock
            icon_color: |
              {% if states('timer.aire_acondicionado') == 'active' %}
              white
              {% endif %}
            content: ''
            tap_action:
              action: call-service
              service: script.aire_acondicionado_temporizador
            card_mod:
              style: |
                ha-card {
                border: 0px;
                {% if states('timer.aire_acondicionado') == 'active' %}
                  background-color: teal !important;
                {% endif %}
                }
          - type: template
            icon: mdi:thermometer-alert
            icon_color: >
              {% if states('input_boolean.aire_acondicionado_modo_temperatura')
              == 'on' %}

              white

              {% endif %}
            content: ''
            tap_action:
              action: call-service
              service: script.aire_acondicionado_modo_temperatura
            card_mod:
              style: >
                ha-card { border: 0px; {% if
                states('input_boolean.aire_acondicionado_modo_temperatura') ==
                'on' %}
                  background-color: teal !important;
                {% endif %} }
  - type: conditional
    conditions:
      - entity: timer.aire_acondicionado
        state: active
    card:
      type: custom:timer-bar-card
      entity: timer.aire_acondicionado
      layout: full_row
      bar_background: '#1e4343'
      bar_foreground: '#008080'
      bar_height: 38px
      text_width: 0px
      sync_issues: ignore
  - type: conditional
    conditions:
      - entity: timer.aire_acondicionado
        state: active
    card:
      type: custom:mushroom-chips-card
      card_mod:
        style: |
          ha-card {
            margin-top: -36px;
            margin-left: 15px;
            border: 0px !important;
            --chip-box-shadow: 0px;
            --chip-spacing: 0px;
            --primary-text-color: white;
          }
      chips:
        - type: template
          content: >
            Encendido hasta las   

            {{ (as_datetime(state_attr('timer.aire_acondicionado',
            'finishes_at')) | as_local).strftime("%H:%M") }}

            {% set time = states('input_number.aire_acondicionado_timer') | int
            %} {% set horas = (time | int /60) | int %} {% set minutos = time -
            (horas*60) %}

            {% if horas > 0 %}({{ horas }}h{% if minutos > 0 %} y {{ minutos
            }}'){% else %}){% endif %} {% else %}{% if minutos > 0 %}({{ minutos
            }}'{% endif %}) {% endif %}
          card_mod:
            style: |
              ha-card {
                border:0px;
                background-color: transparent !important;
              }
  - type: conditional
    conditions:
      - entity: timer.aire_acondicionado
        state: active
    card:
      type: custom:mushroom-chips-card
      alignment: end
      card_mod:
        style: |
          ha-card {
            margin-top: -36px;
            margin-right: 10px;
            border: 0px !important;
            --chip-box-shadow: 0px;
            --chip-spacing: 0px;
          }
      chips:
        - type: template
          icon: mdi:clock-minus
          icon_color: white
          card_mod:
            style: |
              ha-card {
                border:0px;
                background-color: transparent !important;
              }
          tap_action:
            action: call-service
            service: input_number.decrement
            target:
              entity_id: input_number.aire_acondicionado_timer
            data: {}
        - type: template
          icon: mdi:clock-plus
          icon_color: white
          card_mod:
            style: |
              ha-card {
                border:0px;
                background-color: transparent !important;
              }
          tap_action:
            action: call-service
            service: input_number.increment
            target:
              entity_id: input_number.aire_acondicionado_timer
            data: {}
  - type: conditional
    conditions:
      - entity: input_boolean.aire_acondicionado_modo_temperatura
        state: 'on'
    card:
      type: custom:bar-card
      card_mod:
        style: |-
          ha-card {
            border: 0px;
            margin-top: -10px;
            margin-bottom: -16px;
            margin-left: -16px;
            margin-right: -16px;
          }
          bar-card-currentbar {
            border-radius: 0px !important;
          }
          bar-card-backgroundbar {
            background-color: #378b8b !important;
            border-radius: 0px !important;
            opacity: 0.9
          }
      entities:
        - entity: sensor.diferencia_temperatura_target_aire_acondicionado
          direction: left-reverse
          color: teal
          height: 38px
          max: 5
          positions:
            icon: 'off'
            name: 'off'
            value: 'off'
  - type: conditional
    conditions:
      - entity: input_boolean.aire_acondicionado_modo_temperatura
        state: 'on'
    card:
      type: custom:mushroom-chips-card
      card_mod:
        style: |
          ha-card {
            margin-top: -36px;
            margin-left: 15px;
            border: 0px !important;
            --chip-box-shadow: 0px;
            --chip-spacing: 0px;
            --primary-text-color: white;
          }
      chips:
        - type: template
          content: >
            Encendido hasta los    {{
            states('input_number.aire_acondicionado_target') | int }}ºC
          card_mod:
            style: |
              ha-card {
                border: 0px;
                background-color: transparent !important;
              }
  - type: conditional
    conditions:
      - entity: input_boolean.aire_acondicionado_modo_temperatura
        state: 'on'
    card:
      type: custom:mushroom-chips-card
      alignment: end
      card_mod:
        style: |
          ha-card {
            margin-top: -36px;
            margin-right: 10px;
            border: 0px !important;
            --chip-box-shadow: 0px;
            --chip-spacing: 0px;
          }
      chips:
        - type: template
          icon: mdi:thermometer-minus
          icon_color: white
          card_mod:
            style: |
              ha-card {
                border: 0px;
                background-color: transparent !important;
              }
          tap_action:
            action: call-service
            service: input_number.decrement
            target:
              entity_id: input_number.aire_acondicionado_target
            data: {}
        - type: template
          icon: mdi:thermometer-plus
          icon_color: white
          card_mod:
            style: |
              ha-card {
                border: 0px;
                background-color: transparent !important;
              }
          tap_action:
            action: call-service
            service: input_number.increment
            target:
              entity_id: input_number.aire_acondicionado_target
            data: {}
  • Integración con controlador de infrarrojos. Esta versión de la tarjeta incorpora además dos iconos para aumentar o disminuir la potencia en una instancia.
Lovelace
type: custom:stack-in-card
cards:
  - square: false
    type: grid
    columns: 2
    cards:
      - type: custom:mushroom-template-card
        primary: Dormitorio
        secondary: >
          Temp {{ states('sensor.TU-SENSOR-DE-TEMPERATURA') |
          int }}ºC # Indica aquí tu sensor de temperatura
        icon: mdi:fan
        icon_color: |
          {% if states('input_boolean.ventilador') == 'on' %}teal
          {% endif %}
        badge_icon: >
          {% if states('sensor.openweathermap_temperature')| int <=
          states('sensor.TU-SENSOR-DE-TEMPERATURA') | int %} # Indica aquí tu sensor de temperatura

          mdi:snowflake

          {% endif %}
        badge_color: >
          {% if states('sensor.openweathermap_temperature')| int <=
          states('sensor.TU-SENSOR-DE-TEMPERATURA') | int %} # Indica aquí tu sensor de temperatura

          blue

          {% endif %}
        tap_action:
          action: call-service
          service: remote.send_command
          target:
            entity_id: remote.broadlink # Selecciona aquí tu dispositivo de infrarrojo
          data:
            device: Ventilador # Indica aquí tu dispositivo
            command: Power # Indica aquí tu comando de encendido/apagado
        entity: input_boolean.ventilador
        card_mod:
          style: |-
            ha-card {
            border: 0px;
            }
            {% if states('input_boolean.ventilador') == 'on' %}
            ha-state-icon {
              animation: spin 1.4s linear infinite;
            }
            {% endif %}
      - type: custom:mushroom-chips-card
        alignment: end
        card_mod:
          style: |
            ha-card {
              margin-top: 15px;
              margin-right: 10px;
              border: 0px !important;
              --chip-box-shadow: 0px;
              --chip-spacing: 0px;
            }
        chips:
          - type: template
            icon: mdi:fan-minus
            content: ''
            tap_action:
              action: call-service
              service: remote.send_command
              target:
                entity_id: remote.broadlink # Selecciona aquí tu dispositivo de infrarrojo
              data:
                device: Ventilador # Indica aquí tu dispositivo
                command: Viento_menos # Indica aquí tu comando de disminuir intensidad
            card_mod:
              style: |
                ha-card {
                border: 0px;
                }
          - type: template
            icon: mdi:fan-plus
            content: ''
            tap_action:
              action: call-service
              service: remote.send_command
              target:
                entity_id: remote.broadlink # Selecciona aquí tu dispositivo de infrarrojo
              data:
                device: Ventilador # Indica aquí tu dispositivo 
                command: Viento_mas # Indica aquí tu comando de aumentar intensidad
            card_mod:
              style: |
                ha-card {
                border: 0px;
                }
          - type: template
            icon: mdi:clock
            icon_color: |
              {% if states('timer.ventilador') == 'active' %}
              white
              {% endif %}
            content: ''
            tap_action:
              action: call-service
              service: script.ventilador_temporizador
            card_mod:
              style: |
                ha-card {
                border: 0px;
                {% if states('timer.ventilador') == 'active' %}
                  background-color: teal !important;
                {% endif %}
                }
          - type: template
            icon: mdi:thermometer-alert
            icon_color: >
              {% if states('input_boolean.ventilador_modo_temperatura') == 'on'
              %}

              white

              {% endif %}
            content: ''
            tap_action:
              action: call-service
              service: script.ventilador_modo_temperatura
            card_mod:
              style: >
                ha-card { border: 0px; {% if
                states('input_boolean.ventilador_modo_temperatura') == 'on' %}
                  background-color: teal !important;
                {% endif %} }
  - type: conditional
    conditions:
      - entity: timer.ventilador
        state: active
    card:
      type: custom:timer-bar-card
      entity: timer.ventilador
      layout: full_row
      bar_background: '#1e4343'
      bar_foreground: '#008080'
      bar_height: 38px
      text_width: 0px
      sync_issues: ignore
  - type: conditional
    conditions:
      - entity: timer.ventilador
        state: active
    card:
      type: custom:mushroom-chips-card
      card_mod:
        style: |
          ha-card {
            margin-top: -36px;
            margin-left: 15px;
            border: 0px !important;
            --chip-box-shadow: 0px;
            --chip-spacing: 0px;
            --primary-text-color: white;
          }
      chips:
        - type: template
          content: >
            Encendido hasta las   

            {{ (as_datetime(state_attr('timer.ventilador', 'finishes_at')) |
            as_local).strftime("%H:%M") }}

            {% set time = states('input_number.ventilador_timer') | int %} {%
            set horas = (time | int /60) | int %} {% set minutos = time -
            (horas*60) %}

            {% if horas > 0 %}({{ horas }}h{% if minutos > 0 %} y {{ minutos
            }}'){% else %}){% endif %} {% else %}{% if minutos > 0 %}({{ minutos
            }}'{% endif %}) {% endif %}
          card_mod:
            style: |
              ha-card {
                border:0px;
                background-color: transparent !important;
              }
  - type: conditional
    conditions:
      - entity: timer.ventilador
        state: active
    card:
      type: custom:mushroom-chips-card
      alignment: end
      card_mod:
        style: |
          ha-card {
            margin-top: -36px;
            margin-right: 10px;
            border: 0px !important;
            --chip-box-shadow: 0px;
            --chip-spacing: 0px;
          }
      chips:
        - type: template
          icon: mdi:clock-minus
          icon_color: white
          card_mod:
            style: |
              ha-card {
                border:0px;
                background-color: transparent !important;
              }
          tap_action:
            action: call-service
            service: input_number.decrement
            target:
              entity_id: input_number.ventilador_timer
            data: {}
        - type: template
          icon: mdi:clock-plus
          icon_color: white
          card_mod:
            style: |
              ha-card {
                border:0px;
                background-color: transparent !important;
              }
          tap_action:
            action: call-service
            service: input_number.increment
            target:
              entity_id: input_number.ventilador_timer
            data: {}
  - type: conditional
    conditions:
      - entity: input_boolean.ventilador_modo_temperatura
        state: 'on'
    card:
      type: custom:bar-card
      card_mod:
        style: |-
          ha-card {
            border: 0px;
            margin-top: -10px;
            margin-bottom: -16px;
            margin-left: -16px;
            margin-right: -16px;
          }
          bar-card-currentbar {
            border-radius: 0px !important;
          }
          bar-card-backgroundbar {
            background-color: #378b8b !important;
            border-radius: 0px !important;
            opacity: 0.9
          }
      entities:
        - entity: sensor.diferencia_temperatura_target_ventilador
          direction: left-reverse
          color: teal
          height: 38px
          max: 5
          positions:
            icon: 'off'
            name: 'off'
            value: 'off'
  - type: conditional
    conditions:
      - entity: input_boolean.ventilador_modo_temperatura
        state: 'on'
    card:
      type: custom:mushroom-chips-card
      card_mod:
        style: |
          ha-card {
            margin-top: -36px;
            margin-left: 15px;
            border: 0px !important;
            --chip-box-shadow: 0px;
            --chip-spacing: 0px;
            --primary-text-color: white;
          }
      chips:
        - type: template
          content: >
            Encendido hasta los    {{ states('input_number.ventilador_target') |
            int }}ºC
          card_mod:
            style: |
              ha-card {
                border: 0px;
                background-color: transparent !important;
              }
  - type: conditional
    conditions:
      - entity: input_boolean.ventilador_modo_temperatura
        state: 'on'
    card:
      type: custom:mushroom-chips-card
      alignment: end
      card_mod:
        style: |
          ha-card {
            margin-top: -36px;
            margin-right: 10px;
            border: 0px !important;
            --chip-box-shadow: 0px;
            --chip-spacing: 0px;
          }
      chips:
        - type: template
          icon: mdi:thermometer-minus
          icon_color: white
          card_mod:
            style: |
              ha-card {
                border: 0px;
                background-color: transparent !important;
              }
          tap_action:
            action: call-service
            service: input_number.decrement
            target:
              entity_id: input_number.ventilador_target
            data: {}
        - type: template
          icon: mdi:thermometer-plus
          icon_color: white
          card_mod:
            style: |
              ha-card {
                border: 0px;
                background-color: transparent !important;
              }
          tap_action:
            action: call-service
            service: input_number.increment
            target:
              entity_id: input_number.ventilador_target
            data: {}

Notificaciones de Home Assistant

Para dar soporte a las funciones creadas, podemos pedirle a HA que nos envíe notificaciones a través de Telegram. Aquí algunas ideas:

  • Batería baja del controlador. Tanto si tenemos un SwitchBot Bot como un controlador por infrarrojos a batería, nos va a interesar que HA nos avise antes de que nos quedemos sin pilas y se nos venga a bajo la instalación.
  • Fin del temporizador. Podemos pedir a HA que nos avise unos minutos antes de que finalice el temporizador, y nos permita enviar un comando para alargar el tiempo de funcionamiento, o ignorarlo para que se apague.
  • Fin del modo temperatura. Igual que en el caso anterior, podemos pedir a HA que nos avise cuando se alcance la temperatura objetivo, y nos permita enviar un comando para disminuir la temperatura objetivo, o ignorarlo para que se apague.
  • Temperatura ambiente inferior. Pídele a HA que te avise cuando enciendas tu aparato si la temperatura exterior es inferior, de forma que puedas decidir si prefieres mantener el aparato encendido o apagarlo y abrir las ventanas.
  • Ventanas abiertas. Haz que HA esté pendiente de las ventanas, de forma que te avise cuando enciendas un aparato y haya alguna ventana abierta, para incrementar la eficiencia energética.

¿Dudas?¿necesitas ayuda? entra aquí
Y si te ha gustado, compártelo! 🙂
Send this to a friend