[ZHA] Inovelli Blue Series Switch for Dimmer (VZM-31), Fan (VZM-35), and On/Off (VZM-30) switches

This is an adaptation of @fxlt’s fantastic [ZHA] Inovelli VZM31-SN Blue Series 2-1 Switch blueprint to support the new Inovelli Blue Series Fan Switch (VZM35-SN), codenamed “Zephyr.” As with the original blueprint, it supports ZHA.

Update 12/20/24: Now supports all Inovelli Blue switches per @rohankapoorcom’s suggestion, including the upcoming VZM-30.

blueprint:
  name: "Inovelli Blue Series Switches (ZHA)"
  description: Create automations for the Inovelli Blue switches using ZHA.
  domain: automation
  input:
    inovelli_switch:
      name: Inovelli Blue switch
      description: "List of available Inovelli Blue switches."
      selector:
        device:
          integration: zha
          manufacturer: Inovelli
    ## Pressed Once
    button_1:
      name: Down paddle pressed
      description: "Action to run when down paddle is pressed once."
      default: []
      selector:
        action:
    button_2:
      name: Up paddle pressed
      description: "Action to run when up paddle is pressed once."
      default: []
      selector:
        action:
    button_3:
      name: Config button pressed
      description: "Action to run when config button is pressed once."
      default: []
      selector:
        action:
    ## Held
    button_1_hold:
      name: Down paddle held
      description: "Action to run when down paddle is held."
      default: []
      selector:
        action:
    button_2_hold:
      name: Up paddle held
      description: "Action to run when up paddle is held."
      default: []
      selector:
        action:
    button_3_hold:
      name: Config button held
      description: "Action to run when config button is held."
      default: []
      selector:
        action:
    ## Released
    button_1_release:
      name: Down paddle released
      description: "Action to run when down paddle is released."
      default: []
      selector:
        action:
    button_2_release:
      name: Up paddle released
      description: "Action to run when up paddle is released."
      default: []
      selector:
        action:
    button_3_release:
      name: Config button released
      description: "Action to run when config button is released."
      default: []
      selector:
        action:
    ## Pressed Twice
    button_1_double:
      name: Down paddle pressed twice
      description: "Action to run when down paddle is pressed twice."
      default: []
      selector:
        action:
    button_2_double:
      name: Up paddle pressed twice
      description: "Action to run when up paddle is pressed twice."
      default: []
      selector:
        action:
    button_3_double:
      name: Config button pressed twice
      description: "Action to run when config button is pressed twice."
      default: []
      selector:
        action:
    ## Pressed Thrice
    button_1_triple:
      name: Down paddle pressed three times
      description: "Action to run when down paddle is pressed three times."
      default: []
      selector:
        action:
    button_2_triple:
      name: Up paddle pressed three times
      description: "Action to run when up paddle is pressed three times."
      default: []
      selector:
        action:
    button_3_triple:
      name: Config button pressed three times
      description: "Action to run when config button is pressed three times."
      default: []
      selector:
        action:
    ## Pressed Four Times
    button_1_quadruple:
      name: Down paddle pressed four times
      description: "Action to run when down paddle is pressed four times."
      default: []
      selector:
        action:
    button_2_quadruple:
      name: Up paddle pressed four times
      description: "Action to run when up paddle is pressed four times."
      default: []
      selector:
        action:
    button_3_quadruple:
      name: Config button pressed four times
      description: "Action to run when config button is pressed four times."
      default: []
      selector:
        action:
    ## Pressed Five Times
    button_1_quintuple:
      name: Down paddle pressed five times
      description: "Action to run when down paddle is pressed five times."
      default: []
      selector:
        action:
    button_2_quintuple:
      name: Up paddle pressed five times
      description: "Action to run when up paddle is pressed five times."
      default: []
      selector:
        action:
    button_3_quintuple:
      name: Config button pressed five times
      description: "Action to run when config button is pressed five times."
      default: []
      selector:
        action:
mode: single
max_exceeded: silent
variables:
  device_id: !input "inovelli_switch"
trigger:
  - platform: event
    event_type: zha_event
condition: "{{ trigger.event.data.device_id == device_id }}"
action:
  - variables:
      command: '{{ trigger.event.data.command }}'
  - service: "logbook.log"
    data:
      name: 'ZHA'
      message: 'received event: {{ command }}'
  - choose:
      ### Button 1 (Down Paddle)
      - conditions: "{{ command == 'button_1_press' }}"
        sequence: !input button_1
      - conditions: "{{ command == 'button_1_hold' }}"
        sequence: !input button_1_hold
      - conditions: "{{ command == 'button_1_release' }}"
        sequence: !input button_1_release
      - conditions: "{{ command == 'button_1_double' }}"
        sequence: !input button_1_double
      - conditions: "{{ command == 'button_1_triple' }}"
        sequence: !input button_1_triple
      - conditions: "{{ command == 'button_1_quadruple' }}"
        sequence: !input button_1_quadruple
      - conditions: "{{ command == 'button_1_quintuple' }}"
        sequence: !input button_1_quintuple
      ### Button 2 (Upper Paddle)
      - conditions: "{{ command == 'button_2_press' }}"
        sequence: !input button_2
      - conditions: "{{ command == 'button_2_hold' }}"
        sequence: !input button_2_hold
      - conditions: "{{ command == 'button_2_release' }}"
        sequence: !input button_2_release
      - conditions: "{{ command == 'button_2_double' }}"
        sequence: !input button_2_double
      - conditions: "{{ command == 'button_2_triple' }}"
        sequence: !input button_2_triple
      - conditions: "{{ command == 'button_2_quadruple' }}"
        sequence: !input button_2_quadruple
      - conditions: "{{ command == 'button_2_quintuple' }}"
        sequence: !input button_2_quintuple
      ### Button 3 (Config Button)
      - conditions: "{{ command == 'button_3_press' }}"
        sequence: !input button_3
      - conditions: "{{ command == 'button_3_hold' }}"
        sequence: !input button_3_hold
      - conditions: "{{ command == 'button_3_release' }}"
        sequence: !input button_3_release
      - conditions: "{{ command == 'button_3_double' }}"
        sequence: !input button_3_double
      - conditions: "{{ command == 'button_3_triple' }}"
        sequence: !input button_3_triple
      - conditions: "{{ command == 'button_3_quadruple' }}"
        sequence: !input button_3_quadruple
      - conditions: "{{ command == 'button_3_quintuple' }}"
        sequence: !input button_3_quintuple

Open your Home Assistant instance and show the blueprint import dialog with a specific blueprint pre-filled.

1 Like

Don’t both switches support the same scenes? Seems like it would be better to extend the same blueprint to support both rather than making a new one.

1 Like

Great point @rohankapoorcom. I’ve updated the blueprint to support multiple models now.

For folks already using this blueprint, you can use Home Assistant’s new re-import blueprint feature to update it.

Hello William Devereux,

Thanks for contributing to the community with a new Blueprint.

I have a suggestion for you. Many people who are not familiar with directory structures may have problems installing this without the Home Assistant MY tools.

Adding a MY link for this Blueprint to your top post would help them a lot.
Here is the link to make that.

Create a link – My Home Assistant

1 Like

Amazing, thank you! I didn’t know how to create those. I’ve added it to my original post.

1 Like