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 on
  alias: mando zigbee comando on
  trigger:
    - platform: state
      entity_id: sensor.mando_zigbee_evento
      to: "on"
  condition:
  action:
    - service: light.toggle
      data:
        entity_id: light.luz_sofa
    
- 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_cocina 

Y con esto y un bizcocho ……

Integrar en Home Assistant la regleta Gosund P1

Hace unas semanas compre un par de regletas diferentes para jugar un poco con ellas en integrarlas en Home Assistant , la segunda de ellas es la Gosund P1

Es una regleta wifi con tres enchufes y tres salidas USB

Este serian las señales que irían al ESP

Lo primero que vamos a hacer será abrirlas quitando los tapones de goma que lleva en la parte inferior

Allí veremos unos tornillos triangulares de 2.3 que quitaremos para poder acceder al interior de la regleta.

Una vez abierta podemos ver la placa con el ESP

La parte del ESP queda en la izquierda

Aquí tenemos cada una de las señales a las que tendremos que conectar nuestro adaptador FTDI USB a TTL

Yo personalmente prefiero soldar GPIO0 directo al adaptador me resulta mas cómodo para llevar esta señal a cero y que entre en modo de programación

TRABAJAREMOS SIEMPRE SIN CONECTAR LA REGLETA A 220Vac , YA QUE LA ALIMENTACION LA COGERA DIRECTAMENTE DEL ADAPTADOR FTDI USB A TTL , SI ENCHUFAMOS EL ADAPTADOR CON 220Vac ES POSIBLE QUE FRIAMOS ALGO.

Soldaremos los cables con cuidado teniendo en cuenta que Rx y Tx van cruzados

Todo el invento quedaria mas o menos así , con este alargo usb puedo conectar y desconectar muy fácilmente

Descargaremos este firmware para flashear el modulo con el

Por facilidad últimamente suelo usar tasmotizer , pero antes de flashear el nuevo firmware siempre saco una copia del dispositivo

Marcaremos “save original firmware” y elegimos el fichero previamente descargado , en este caso tenemos que desmarcar el auto reset , y siempre “erase before flashing” así evitaremos problemas de corrupción.

Una vez pulsemos Tasmotize empezara a leer y guardar el firmware original del dispositivo

Lo quitaremos del alargo usb y pulsamos OK

Empieza a borrar las flash del dispositivo y a escribir el nuevo firmware

Si todo es correcto reiniciaremos el dispositivo pero antes debemos quitar la señal GPIO0 de masa

Al arrancar deberemos ver que aparece una nueva wifi

Una vez comprobado esto podemos proceder a montar de nuevo la regleta

Al conectarla después de unos segundos nos aparecerá la wifi que hemos comentado previamente , al conectarnos nos debería llevar directamente a la dirección 192.168.4.1 , si no es así pondremos esta ip en el navegador.

Nos debe aparecer esta configuración inicial

Elegiremos la wifi primaria a la que queremos que se conecte , y también si queremos podemos configurar una wifi alternativa.

Lo siguiente será definir toda la parte de MQTT

Y después de reiniciarse el dispositivo nos debería aparecer en nuestro servidor MQTT

Configuraremos la plantilla del modulo para que podamos acceder a todas las funciones del dispositivo

{"NAME":"Gosund_P1","GPIO":[0,3072,544,3104,0,259,0,0,225,226,224,0,35,4704],"FLAG":0,"BASE":18}

En este enlace tendremos mas información https://templates.blakadder.com/gosund_P1.html

Una vez reiniciado nos aparecerán las cuatro salidas

Desde la consola de tasmota añadiremos esta regla para que al pulsar el botón de la regleta se activen las salidas USB y luego en función de cada uno de los botones la salida correspondiente

Rule1 ON Button1#State DO Power4 2 ENDON
Rule2 ON Analog#A0div10<30 DO Power3 2 BREAK ON Analog#A0div10<60 DO Power2 2 BREAK ON Analog#A0div10<80 DO Power1 2 ENDON
Backlog Rule1 1; Rule2 1; Rule2 5

Desde la consola podremos ver toda la mensajería mqtt del dispositivo

En Home Assistant podremos configurarla con algo similar a esto

	- name: "regleta_comedor_1"
      state_topic: "stat/tasmota_5DF2B9/POWER1"
      command_topic: "stat/tasmota_5DF2B9/cmnd/POWER1"
      availability_topic: "stat/tasmota_5DF2B9/LWT"
      qos: 1
      payload_on: "ON"
      payload_off: "OFF"
      payload_available: "Online"
      payload_not_available: "Offline"
      retain: false
  
    - name: "regleta_comedor_2"
      state_topic: "stat/tasmota_5DF2B9/POWER2"
      command_topic: "stat/tasmota_5DF2B9/cmnd/POWER2"
      availability_topic: "stat/tasmota_5DF2B9/LWT"
      qos: 1
      payload_on: "ON"
      payload_off: "OFF"
      payload_available: "Online"
      payload_not_available: "Offline"
      retain: false
  
    - name: "regleta_comedor_3"
      state_topic: "stat/tasmota_5DF2B9/POWER3"
      command_topic: "stat/tasmota_5DF2B9/cmnd/POWER3"
      availability_topic: "stat/tasmota_5DF2B9/LWT"
      qos: 1
      payload_on: "ON"
      payload_off: "OFF"
      payload_available: "Online"
      payload_not_available: "Offline"
      retain: false
            
    - name: "regleta_comedor_usb"
      state_topic: "stat/tasmota_5DF2B9/POWER4"
      command_topic: "stat/tasmota_5DF2B9/cmnd/POWER4"
      availability_topic: "stat/tasmota_5DF2B9/LWT"
      qos: 1
      payload_on: "ON"
      payload_off: "OFF"
      payload_available: "Online"
      payload_not_available: "Offline"
      retain: false

Para calibrar la tensión y el consumo seguiremos los pasos de este enlace https://tasmota.github.io/docs/Power-Monitoring-Calibration/

Y con esto y un bizcocho ………