← Volver al sitio
Nota técnica · Domótica

Perilla Zigbee como dimmer en Home Assistant (ZHA): por qué parpadea y cómo resolverlo

Fernando Bergami · Ingeniero de Sonido · 9 de noviembre de 2026

Una perilla Zigbee barata puede ser un excelente dimmer físico para Home Assistant, pero la primera automatización que uno escribe casi nunca funciona bien: la luz parpadea, se apaga sola o ignora toques. Esta nota resume qué eventos manda realmente el dispositivo y cómo armé dos automatizaciones que lo resuelven.

Alcance. Probado en mi instalación el 16 de septiembre de 2026, con Home Assistant, la integración ZHA y una perilla rotativa Tuya (variante rotativa del TS004F). Otras versiones de ZHA o de firmware pueden reportar los eventos de forma distinta: la forma de averiguarlo está en la sección 2.

1. El problema

La perilla se empareja sin dificultad, pero el selector de dispositivos de Home Assistant (Agregar disparador → Dispositivo) no ofrece disparadores de giro ni de toque para este modelo: solo los genéricos de batería. Hay que escribir los disparadores a mano, escuchando eventos de ZHA, y para eso hace falta saber qué evento llega con cada gesto.

2. Qué eventos manda en realidad

La forma más directa de averiguarlo es Herramientas para desarrolladores → Eventos, escuchando zha_event mientras se usa la perilla. En mi caso:

GestoEvento zha_eventDetalle
Girarcommand: stepLos datos con nombre están en params: step_mode (0 sube, 1 baja) y step_size (unos 13 por detente, hasta unos 39 girando rápido). En args llega la misma información como lista posicional.
Toque simplecommand: attribute_updatedCon attribute_name: on_off. El value alterna con cada toque, pero no sirve como filtro.
Doble toquecommand: remote_button_double_pressAdemás llegan dos attribute_updated, uno por cada toque. El orden entre ellos no es fijo.

3. Por qué fallan las primeras automatizaciones

4. La solución: dos automatizaciones

La idea es una automatización para el botón (toque y doble toque juntos, en modo single, para que el primer evento bloquee a los rezagados) y otra aparte para el giro (modo queued, para no perder pasos cuando se gira rápido). Reemplazá la dirección IEEE y light.dimmer_lamp por los de tu instalación.

Botón:

alias: Perilla - boton
mode: single
max_exceeded: silent
triggers:
  - trigger: event
    event_type: zha_event
    event_data:
      device_ieee: "AA:BB:CC:DD:EE:FF:00:11"
      command: remote_button_double_press
    id: doble
  - trigger: event
    event_type: zha_event
    event_data:
      device_ieee: "AA:BB:CC:DD:EE:FF:00:11"
      command: attribute_updated
      args:
        attribute_name: on_off
    id: click
actions:
  - if:
      - condition: trigger
        id: doble
    then:
      - action: light.turn_on
        target: { entity_id: light.dimmer_lamp }
        data: { brightness_pct: 100 }
    else:
      - wait_for_trigger:
          - trigger: event
            event_type: zha_event
            event_data:
              device_ieee: "AA:BB:CC:DD:EE:FF:00:11"
              command: remote_button_double_press
        timeout: { milliseconds: 400 }
      - if:
          - condition: template
            value_template: "{{ wait.trigger is none }}"
        then:
          - action: light.toggle
            target: { entity_id: light.dimmer_lamp }
        else:
          - action: light.turn_on
            target: { entity_id: light.dimmer_lamp }
            data: { brightness_pct: 100 }
  - delay: { milliseconds: 600 }

Giro:

alias: Perilla - giro
mode: queued
max: 25
triggers:
  - trigger: event
    event_type: zha_event
    event_data:
      device_ieee: "AA:BB:CC:DD:EE:FF:00:11"
      command: step
conditions:
  - condition: template
    value_template: >
      {{ is_state('light.dimmer_lamp', 'on')
         or trigger.event.data.params.step_mode == 0 }}
actions:
  - action: light.turn_on
    target: { entity_id: light.dimmer_lamp }
    data:
      brightness_step: >
        {{ (trigger.event.data.params.step_size * 2.5) | round(0)
           * (1 if trigger.event.data.params.step_mode == 0 else -1) }}
      transition: 0.2

El factor 2,5 ajusta la sensibilidad. La condición hace que, con la lámpara apagada, girar hacia arriba la encienda y girar hacia abajo no haga nada.

Con esta configuración, en mi instalación girar sube y baja el brillo, el toque simple alterna la luz sin parpadeo y el doble toque la lleva al 100 %.

5. Limitaciones

¿Querés automatizar tu casa, oficina o establecimiento?

Diseño e integración de domótica con Home Assistant, Zigbee y ESP32. Contanos qué querés controlar y te proponemos un esquema simple y mantenible.

Escribir por mail

Más sobre el trabajo de desarrollo a medida: IoT, sistemas embebidos y domótica.

Fernando Bergami
Fernando BergamiIngeniero de Sonido (UNTREF). Diseño sistemas embebidos y telemetría desde 2012. Vive y trabaja en Salta.