Integrar en Home Assistant mando Zigbee EGLO 99099

Hace unos días mirando por internet vi un mando a distancia zigbee bastante chulo y decidí comprarlo e integrarlo, el mando en cuestión es este

https://www.eglo.com/es/control-remoto-connect-z-99099.html

El mando viene con un soporte para la pared.

Y es alimentado por dos pilas AAA

Las especificaciones para integrarlo estan en https://www.zigbee2mqtt.io/devices/99099.html

El manual de instrucciones del equipo es este.

Según el manual para emparejarlo bastaba con pulsar el botón ON y el botón azul y se debía emparejar

Pero así no hay forma de emparejarlo , después de buscar un rato vi que hay una forma de previamente hacerle un reset de fabrica , pero antes baje la aplicación para Android y le actualice el firmware a la ultima versión.

Después de actualizar tampoco emparejaba , buscando en la web del fabricante encontre como hacer un reset de fabrica pulsando estos dos botones tres segundos .

Ahora al pulsar el botón ON y el botón azul y se emparejo correctamente con zigbee2mqtt

Al momento ya empezó a aparecer la información en MqttExplorer

Este el json que envia al pulsar el botón ON

{
  "action": "on",
  "action_group": 32780,
  "device": {
    "applicationVersion": 2,
    "friendlyName": "0xa4c13836ff794744",
    "hardwareVersion": 60,
    "ieeeAddr": "0xa4c13836ff794744",
    "manufacturerID": 4417,
    "manufacturerName": "AwoX",
    "model": "99099",
    "networkAddress": 32859,
    "powerSource": "Battery",
    "softwareBuildID": "2.7.3_1387",
    "stackVersion": 1,
    "type": "EndDevice",
    "zclVersion": 3
  },
  "last_seen": "2024-02-27T16:21:36+01:00",
  "linkquality": 25
}

Cambiaremos en el configuration.yaml de zigbee2mqtt el nombre del mando

  '0xa4c13836ff794744':
    friendly_name: '0xa4c13836ff794744'

y le añadiremos que simule el control de brillo

  '0xa4c13836ff794744':
    friendly_name: mando_zigbee
    simulated_brightness:
      delta: 20     # delta per interval, default = 20
      interval: 200 # interval in milliseconds, default = 200

Añadiremos los sensores del manto en el fichero configuration.yaml de nuestro home assistant

  ### MANDO ZIGBEE
  
    - state_topic: "zigbee2mqtt/mando_zigbee"
      availability_topic: "zigbee2mqtt/bridge/state"
      icon: "mdi:gesture-double-tap"
      value_template: "{{ value_json.action }}"
      name: "mando_zigbee_evento"
      
    - state_topic: "zigbee2mqtt/mando_zigbee"
      availability_topic: "zigbee2mqtt/bridge/state"
      unit_of_measurement: "%"
      device_class: "battery"
      value_template: "{{ value_json.battery }}"
      expire_after: 86400
      force_update: true
      name: "mando_zigbee_bateria"  
  
    - state_topic: "zigbee2mqtt/mando_zigbee"
      availability_topic: "zigbee2mqtt/bridge/state"
      icon: "mdi:signal"
      unit_of_measurement: "lqi"
      value_template: "{{ value_json.linkquality }}"
      name: "mando_zigbee_estado"  
      
    - state_topic: "zigbee2mqtt/mando_zigbee"
      availability_topic: "zigbee2mqtt/bridge/state"
      icon: "mdi:calendar-clock"
      value_template: "{{ value_json.last_seen }}"
      name: "mando_zigbee_ultima_conexion"   

Crearemos el sensor de disponibilidad

    - state_topic: "zigbee2mqtt/mando_zigbee/availability"       
      availability_topic:  "zigbee2mqtt/mando_zigbee/availability"     
      name: mando_zigbee_disponibilidad     
      device_class: "connectivity"      
      payload_on: "online"
      payload_off: "offline"  

Pondremos las etiquetas en el customize.yaml

binary_sensor.mando_zigbee_evento:
  friendly_name: Mando zigbee
sensor.mando_zigbee_bateria:
  friendly_name: Mando zigbee
sensor.mando_zigbeeestado:
  friendly_name: Mando zigbee
sensor.mando_zigbee_evento:
  friendly_name: Mando zigbee
binary_sensor.mando_zigbee_disponibilidad: 
  friendly_name: Mando zigbee

Lo añadiremos al sensor general de fallo de cualquier dispositivo zigbee

  - platform: template
    sensors:
      sensor_fallo_dispositivos_zigbee:
        #ON cuando cualquiera falla en la comunicacion
        friendly_name: 'Sensor fallo algun dispositivo zigbee'
        value_template: >
            {% if 
            is_state('binary_sensor.temperatura_balcon_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_agua_lavabo_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_puerta_entrada_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_movimiento_recibidor_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_proximidad_timbre_disponibilidad', 'off') or 
            is_state('binary_sensor.temperatura_comedor_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_movimiento_comedor_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_balcon_comedor_derecho_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_balcon_comedor_izquierdo_disponibilidad', 'off') or 
            is_state('binary_sensor.movimiento_3_disponibilidad', 'off') or 
            is_state('binary_sensor.pulsador_luz_sofa_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_balcon_matrimonio_izquierdo_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_balcon_matrimonio_derecho_disponibilidad', 'off') or 
            is_state('binary_sensor.puls_conmut_entrada_matrimonio_disponibilidad', 'off') or 
            is_state('binary_sensor.puls_conmut_tere_matrimonio_disponibilidad', 'off') or 
            is_state('binary_sensor.puls_conmut_antonio_matrimonio_disponibilidad', 'off') or 
            is_state('binary_sensor.temperatura_matrimonio_disponibilidad', 'off') or 
            is_state('binary_sensor.temperatura_congelador_disponibilidad', 'off') or 
            is_state('binary_sensor.temperatura_nevera_disponibilidad', 'off') or  
            is_state('binary_sensor.mando_zigbee_disponibilidad', 'off') or  
            is_state('binary_sensor.ikea_mando_1_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_trastero_disponibilidad', 'off') or 
            is_state('binary_sensor.temperatura_trastero_disponibilidad', 'off') or 
            is_state('binary_sensor.temperatura_oriol_disponibilidad', 'off') or 
            is_state('binary_sensor.puls_leds_oriol_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_oriol_izquierdo_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_oriol_derecho_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_puerta_armario_oriol_disponibilidad', 'off') or 
            is_state('binary_sensor.ikea_mando_2_disponibilidad', 'off') or 
            is_state('binary_sensor.puls_conmut_1_oriol_disponibilidad', 'off') or 
            is_state('binary_sensor.puls_conmut_2_oriol_disponibilidad', 'off') or  
            is_state('binary_sensor.enchufe_zb_1_disponibilidad', 'off') or 
            is_state('binary_sensor.enchufe_zb_2_tv_matrimonio_disponibilidad', 'off') or 
            is_state('binary_sensor.enchufe_zb_3_balcon_disponibilidad', 'off') or 
            is_state('binary_sensor.ikea_mando_4_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_movimiento_cocina_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_agua_cocina_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_agua_lavadero_disponibilidad', 'off')         
            %}
            on
            {% else %}
            off
            {% endif %}   
        icon_template: >            
            {% if 
            is_state('binary_sensor.temperatura_balcon_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_agua_lavabo_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_puerta_entrada_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_movimiento_recibidor_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_proximidad_timbre_disponibilidad', 'off') or 
            is_state('binary_sensor.temperatura_comedor_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_movimiento_comedor_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_balcon_comedor_derecho_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_balcon_comedor_izquierdo_disponibilidad', 'off') or 
            is_state('binary_sensor.movimiento_3_disponibilidad', 'off') or 
            is_state('binary_sensor.pulsador_luz_sofa_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_balcon_matrimonio_izquierdo_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_balcon_matrimonio_derecho_disponibilidad', 'off') or 
            is_state('binary_sensor.puls_conmut_entrada_matrimonio_disponibilidad', 'off') or 
            is_state('binary_sensor.puls_conmut_tere_matrimonio_disponibilidad', 'off') or 
            is_state('binary_sensor.puls_conmut_antonio_matrimonio_disponibilidad', 'off') or 
            is_state('binary_sensor.temperatura_matrimonio_disponibilidad', 'off') or 
            is_state('binary_sensor.temperatura_congelador_disponibilidad', 'off') or 
            is_state('binary_sensor.temperatura_nevera_disponibilidad', 'off') or  
            is_state('binary_sensor.mando_zigbee_disponibilidad', 'off') or  
            is_state('binary_sensor.ikea_mando_1_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_trastero_disponibilidad', 'off') or 
            is_state('binary_sensor.temperatura_trastero_disponibilidad', 'off') or 
            is_state('binary_sensor.temperatura_oriol_disponibilidad', 'off') or 
            is_state('binary_sensor.puls_leds_oriol_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_oriol_izquierdo_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_oriol_derecho_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_puerta_armario_oriol_disponibilidad', 'off') or 
            is_state('binary_sensor.ikea_mando_2_disponibilidad', 'off') or 
            is_state('binary_sensor.puls_conmut_1_oriol_disponibilidad', 'off') or 
            is_state('binary_sensor.puls_conmut_2_oriol_disponibilidad', 'off') or  
            is_state('binary_sensor.enchufe_zb_1_disponibilidad', 'off') or 
            is_state('binary_sensor.enchufe_zb_2_tv_matrimonio_disponibilidad', 'off') or 
            is_state('binary_sensor.enchufe_zb_3_balcon_disponibilidad', 'off') or 
            is_state('binary_sensor.ikea_mando_4_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_movimiento_cocina_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_agua_cocina_disponibilidad', 'off') or 
            is_state('binary_sensor.sensor_agua_lavadero_disponibilidad', 'off')              %}
            mdi:signal-off
            {% else %}
            mdi:signal
            {% endif %}            

Los valores en action que nos devolverá son : onoffredrefreshrefresh_coloredblue,  yellowgreen brightness_step_up brightness_step_downbrightness_move_up brightness_move_downbrightness_stop recall_1color_temperature_step_upcolor_temperature_step_down

Los botones 1, 2 ,3 y recall_2 no funcionan ya que son para emparejar directamente a dispositivos , mas información aquí : https://github.com/Koenkk/zigbee2mqtt/issues/14786#issuecomment-1304827843

Empezaremos a crear automatizaciones según nuestras necesidades

####################################################################################################################
# MANDO ZIGBEE
####################################################################################################################  

####################################################################################################################
# on, off, red, refresh, refresh_colored, blue, yellow, green, brightness_step_up, brightness_step_down, 
# brightness_move_up, brightness_move_down, brightness_stop, recall_1, color_temperature_step_up, 
# color_temperature_step_down
####################################################################################################################

- id: mando zigbee comando off
  alias: mando zigbee comando off
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "off"
  condition:
  action:
    - service: light.turn_off
      data:
        entity_id: light.luz_matrimonio 
    - service: light.turn_off
      data:
        entity_id: light.luz_matrimonio_ambilight 
  mode: single  
        
- id: mando zigbee comando refresh
  alias: mando zigbee comando refresh
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "refresh"
  condition:
  action:
    - service: light.toggle
      data:
        entity_id: light.luz_matrimonio 
    - service: light.toggle
      data:
        entity_id: light.luz_matrimonio_ambilight   
  mode: single  

- id: mando zigbee comando brightness_step_up
  alias: mando zigbee comando brightness_step_up
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "brightness_step_up"
  condition:
  action:
    - data_template:
        entity_id: light.luz_matrimonio
        brightness: 255
      service: light.turn_on
  mode: single  

- id: mando zigbee comando brightness_step_down
  alias: mando zigbee comando brightness_step_down
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "brightness_step_down"
  condition:
  action:
    - data_template:
        entity_id: light.luz_matrimonio
        brightness: 1
      service: light.turn_on
  mode: single  
      
- id: mando zigbee comando color_temperature_step_up
  alias: mando zigbee comando color_temperature_step_up
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "color_temperature_step_up"
  condition:
  action:
    - data_template:
        entity_id: light.luz_matrimonio_ambilight
        brightness: 255
      service: light.turn_on
  mode: single  

- id: mando zigbee comando color_temperature_step_down
  alias: mando zigbee comando color_temperature_step_down
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "color_temperature_step_down"
  condition:
  action:
    - data_template:
        entity_id: light.luz_matrimonio_ambilight
        brightness: 1
      service: light.turn_on
  mode: single        
      
- id: mando zigbee comando recall_1
  alias: mando zigbee comando recall_1
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "recall_1"
  condition:
  action:
    - service: light.toggle
      data:
        entity_id: light.luz_matrimonio 
  mode: single  
       
- id: mando zigbee comando recall_2
  alias: mando zigbee comando recall_2
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "recall_2"
  condition:
  action:
    - service: light.toggle
      data:
        entity_id: light.luz_matrimonio_ambilight 
  mode: single       
           
- id: mando zigbee comando refresh_colored
  alias: mando zigbee comando refresh_colored
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "refresh_colored"
  condition:
  action:
    - service: light.toggle
      data:
        entity_id: light.luz_matrimonio_ambilight 
    - service: light.turn_off
      data:
        entity_id: light.luz_matrimonio 
  mode: single         
          
- id: mando zigbee comando refresh_colored
  alias: mando zigbee comando refresh_colored
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "refresh_colored"
  condition:
  action:
    - service: light.toggle
      data:
        entity_id: light.luz_matrimonio_ambilight 
    - service: light.turn_off
      data:
        entity_id: light.luz_matrimonio 
  mode: single         
      
- id: mando zigbee comando red
  alias: mando zigbee comando red
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "red"
  condition:
  action:
    - service: light.turn_on
      entity_id: light.luz_matrimonio_ambilight     
      data:
        brightness: 255
        rgb_color: [255,0,0]      
    - service: light.turn_off
      data:
        entity_id: light.luz_matrimonio 
  mode: single          
      
- id: mando zigbee comando blue
  alias: mando zigbee comando blue
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "blue"
  condition:
  action:
    - service: light.turn_on
      entity_id: light.luz_matrimonio_ambilight     
      data:
        brightness: 255
        rgb_color: [0,0,255]      
    - service: light.turn_off
      data:
        entity_id: light.luz_matrimonio 
  mode: single          

- id: mando zigbee comando green
  alias: mando zigbee comando green
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "green"
  condition:
  action:
    - service: light.turn_on
      entity_id: light.luz_matrimonio_ambilight     
      data:
        brightness: 255
        rgb_color: [63,255,0]      
    - service: light.turn_off
      data:
        entity_id: light.luz_matrimonio 
  mode: single    

Y con esto y un bizcocho ……