Convertir Interruptor SIMON en pulsador inteligente e integrarlo en Home Assistant

Hoy os explicare como cambie mis interruptores y conmutadores Simon 75101 a pulsadores sin tener que cambiar prácticamente nada y luego les agregue a cada uno un Xiaomi switch para conectarlos a Home Assistant

Lo primero será abrir el interior del mecanismo , para ello usaremos un destornillador pequeño plano y sacaremos con sumo cuidado el eje central soltándolo de los lados , hay que tener cuidado porque en el interior lleva unas pequeñas piezas metálicas que en caso de moverse o girarse hará que no funcione , pero con cuidado ya veréis que es bien fácil.

Al abrirlo veréis cuatro agujeros en los que cabe perfectamente un muelle , en uno de los lados , ya sea en la parte de las teclas rojas o las blancas insertaremos un par de muelles para que recupere y pase de ser interruptor/conmutador a pulsador , yo después de varias pruebas encontré estos en aliexpress que van perfectos , son de 3 mms de ancho , por 10 mms de largo y la espira de 0,3 mms.

Ahora ya tenemos lista la parte mecánica y procedemos a modificar el Xiaomi switch para ser usado con nuestro nuevo flamante pulsador tuneado , desmontaremos con cuidado toda la estructura del switch hasta quedarnos solamente con el circuito impreso.

Soldaremos con cuidado dos cablecitos en los puntos que os muestro que son los del pulsador original

Y dejaremos los extremos estañados con un centímetro y medio mas o menos para que entren bien el pulsador Simon

Una vez alimentado lo emparejamos en zigbee2mqtt siguiendo el procedimiento habitual , aquí podréis encontrar mas información : https://www.zigbee2mqtt.io/devices/WXKG01LM.html

Conectado a zigbee2mqtt expone mas modos que mediante el gateway de Xiaomi , los modos son : single,  double,  triple,  quadruplehold,  release,  many que nos vendrán de maravilla para las automatizaciones

Crearemos los sensores de entrada

### CONMUTADOR 1 ORIOL

  - platform: "mqtt"
    state_topic: "zigbee2mqtt/puls_conmut_1_oriol"
    availability_topic: "zigbee2mqtt/bridge/state"
    icon: "mdi:toggle-switch"
    value_template: "{{ value_json.action }}"
    name: "puls_conmut_1_oriol_evento"

  - platform: "mqtt"
    state_topic: "zigbee2mqtt/puls_conmut_1_oriol"
    availability_topic: "zigbee2mqtt/bridge/state"
    unit_of_measurement: "%"
    icon: "mdi:battery"
    device_class: "battery"
    value_template: "{{ (((value_json.voltage | float(0) | round(5,default=0))-2800)/5)| int(0)  }}"
    expire_after: 21600
    force_update: true    
    name: "puls_conmut_1_oriol_bateria"

  - platform: "mqtt"
    state_topic: "zigbee2mqtt/puls_conmut_1_oriol"
    availability_topic: "zigbee2mqtt/bridge/state"
    icon: "mdi:signal"
    unit_of_measurement: "lqi"
    value_template: "{{ value_json.linkquality }}"    
    name: "puls_conmut_1_oriol_estado"

El sensor de batería lo recalculo para que sea lo mas aproximado a la realidad y le asignaremos el icono en función del porcentaje de batería restante

      conmutador_1_oriol_battery_level:
        friendly_name: Conmutador 1 Oriol
        value_template: "{{ states.sensor.puls_conmut_1_oriol_bateria.state |default(-1)| int(0)  if states.sensor.puls_conmut_1_oriol_bateria is not none }}"
        unit_of_measurement: '%'
        icon_template: '{% if states.sensor.puls_conmut_1_oriol_bateria.state| int(0)   == 100 %}
                          mdi:battery
                       {% elif states.sensor.puls_conmut_1_oriol_bateria.state| int(0)   >= 90 %}
                          mdi:battery-90
                       {% elif states.sensor.puls_conmut_1_oriol_bateria.state| int(0)   >= 80 %}
                          mdi:battery-80
                       {% elif states.sensor.puls_conmut_1_oriol_bateria.state| int(0)   >= 70 %}
                          mdi:battery-70
                       {% elif states.sensor.puls_conmut_1_oriol_bateria.state| int(0)   >= 60 %}
                          mdi:battery-60
                       {% elif states.sensor.puls_conmut_1_oriol_bateria.state| int(0)   >= 50 %}
                          mdi:battery-50
                       {% elif states.sensor.puls_conmut_1_oriol_bateria.state| int(0)   >= 40 %}
                          mdi:battery-40
                       {% elif states.sensor.puls_conmut_1_oriol_bateria.state| int(0)   >= 30 %}
                          mdi:battery-30
                       {% elif states.sensor.puls_conmut_1_oriol_bateria.state| int(0)   >= 20 %}
                          mdi:battery-20
                       {% elif states.sensor.puls_conmut_1_oriol_bateria.state| int(0)   >= 10 %}
                          mdi:battery-10
                       {% else %}
                          mdi:battery-outline
                       {% endif %}' 

Pondremos los valores en el customize.yaml

sensor.puls_conmut_1_oriol_evento:
  friendly_name: Conmutador Oriol 1 
sensor.puls_conmut_1_oriol_bateria:
  friendly_name: Conmutador Oriol 1 
sensor.puls_conmut_1_oriol_estado:
  friendly_name: Conmutador Oriol 1 

Crearemos las automatizaciones para el evento single , en este caso para manejar un plafón de Xiaomi y dos tiras led en función del estado y controlando el brillo en función de la hora del día

- alias: luz Oriol single 1 y 2 ON Tramo 1 
  # Encendemos la luz ya que esta apagada y ponemos el brillo en funcion de noche o dia
  initial_state: 'on'
  trigger:
    - platform: state
      entity_id: sensor.puls_conmut_1_oriol_evento
      to: 'single'        
    - platform: state
      entity_id: sensor.puls_conmut_2_oriol_evento
      to: 'single'        
  condition:
    - condition: state
      entity_id: light.luz_oriol
      state: 'off'
    - condition: sun
      after: sunrise
      after_offset: "00:30:00"
    - condition: time
      before: "22:30:00"
  action: 
    - service: automation.turn_off
      entity_id: automation.Change_Brightness_oriol    
    - service: input_number.set_value
      entity_id: input_number.slider_lamp_oriol_bright
      data:
        value: 235
    - service: light.turn_on
      entity_id: light.luz_oriol
      data:
        brightness: 235
        rgb_color: [255,255,255]
        # color_temp: 1000
    - service: light.turn_on  
      data:
        entity_id: light.tira_led_cama_oriol
        brightness_pct: 100
        rgb_color: [0,0,0]
        white_value: 255  
    - service: light.turn_on  
      data:
        entity_id: light.tira_led_mesa_oriol
        brightness_pct: 100
        rgb_color: [0,0,0]
        white_value: 255  
    - service: automation.turn_on
      entity_id: automation.Change_Brightness_oriol  

- alias: luz Oriol single 1 y 2 ON Tramo 2
  # Encendemos la luz ya que esta apagada y ponemos el brillo en funcion de noche o dia
  initial_state: 'on'
  trigger:
    - platform: state
      entity_id: sensor.puls_conmut_1_oriol_evento
      to: 'single'        
    - platform: state
      entity_id: sensor.puls_conmut_2_oriol_evento
      to: 'single'        
  condition:
    - condition: state
      entity_id: light.luz_oriol
      state: 'off'
    - condition: time
      after: "22:30:00"
      before: "02:00:00"
  action: 
    - service: automation.turn_off
      entity_id: automation.Change_Brightness_oriol    
    - service: input_number.set_value
      entity_id: input_number.slider_lamp_oriol_bright
      data:
        value: 5
    - service: light.turn_on
      entity_id: light.luz_oriol
      data:
        brightness: 5
        rgb_color: [255,255,255]
    - service: light.turn_on  
      data:
        entity_id: light.tira_led_cama_oriol
        brightness_pct: 5
        rgb_color: [0,0,0]
        white_value: 255  
    - service: light.turn_off
      entity_id: light.tira_led_mesa_oriol 
    - service: automation.turn_on
      entity_id: automation.Change_Brightness_oriol  

- alias: luz Oriol single 1 y 2 ON Tramo 3
  # Encendemos la luz ya que esta apagada y ponemos el brillo en funcion de noche o dia
  initial_state: 'on'
  trigger:
    - platform: state
      entity_id: sensor.puls_conmut_1_oriol_evento
      to: 'single'        
    - platform: state
      entity_id: sensor.puls_conmut_2_oriol_evento
      to: 'single'        
  condition:
    - condition: state
      entity_id: light.luz_oriol
      state: 'off'
    - condition: time
      after: "02:00:00"
    - condition: sun
      before: sunrise
      before_offset: "00:30:00"      
  action: 
    - service: light.turn_off
      entity_id: light.luz_oriol   
    - service: light.turn_on  
      data:
        entity_id: light.tira_led_cama_oriol
        brightness_pct: 5
        rgb_color: [0,0,0]
        white_value: 255  
    - service: light.turn_off
      entity_id: light.tira_led_mesa_oriol 

- alias: luz Oriol single 1 y 2 OFF
  # Encendemos la luz ya que esta apagada y ponemos el brillo en funcion de noche o dia
  initial_state: 'on'
  trigger:
    - platform: state
      entity_id: sensor.puls_conmut_1_oriol_evento
      to: 'single'        
    - platform: state
      entity_id: sensor.puls_conmut_2_oriol_evento
      to: 'single'                
  condition:
    - condition: state
      entity_id: light.luz_oriol
      state: 'on'
  action: 
    - service: light.turn_off
      entity_id: light.luz_oriol   
    - service: light.turn_off
      entity_id: light.tira_led_cama_oriol 
    - service: light.turn_off
      entity_id: light.tira_led_mesa_oriol 

Ahora crearemos una automatización para que cuando se mantenga pulsado el pulsador Simon apague todo

- alias: luz Oriol long press 1 y 2 apagar todo
  initial_state: 'on'
  trigger:
    - platform: state
      entity_id: sensor.puls_conmut_1_oriol_evento
      to: 'long'        
    - platform: state
      entity_id: sensor.puls_conmut_2_oriol_evento
      to: 'long'          
  action: 
    - service: light.turn_off
      entity_id: light.luz_oriol
    - service: light.turn_off
      entity_id: light.tira_led_cama_oriol 
    - service: light.turn_off
      entity_id: light.tira_led_mesa_oriol