Skip to content

Commit

Permalink
support floors and labels, add default settings, use device id
Browse files Browse the repository at this point in the history
- Add support for Floors and Labels
- Use device identifier instead of device name for Z2M
  - This should fix needing to use command path map for oddly named devices
  - Command path map is still available if needed
- Add Command base path
  - This is used when the base MQTT path for Z2M has been changed
- Command base path and command path map are available as blueprint inputs
  - This allows setting a "default" value for these settings
  • Loading branch information
zanix committed Apr 5, 2024
1 parent 3a2cc81 commit 145b53e
Show file tree
Hide file tree
Showing 3 changed files with 154 additions and 28 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/linters.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,16 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: 📥 Check out repository
uses: actions/checkout@v4.1.1
uses: actions/checkout@v4
- name: 🚀 Run YAMLlint
uses: frenck/action-yamllint@v1.4.1
uses: frenck/action-yamllint@v1

remarklint:
name: 🧹 Remark Lint
runs-on: ubuntu-latest
steps:
- name: 📥 Check out repository
uses: actions/checkout@v4.1.1
uses: actions/checkout@v4
- name: 🚀 Run Remark lint
uses: "docker://pipelinecomponents/remark-lint:latest"
continue-on-error: true
Expand Down
37 changes: 24 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
# Zanix's Home Assistant Blueprints

| zanix/home-assistant-blueprints | Home Assistant Community |
| :---: | :---: |
| [![Last Commit][github-last-commit]][github-main] [![Github Linter Status][github-linter-status-shield]][github-linter-status] | [![Home Assistant Community Forum][forum-shield]][forum] |
| [![GitHub Activity][commits-shield]][commits] | [![Discord][discord-shield]][discord] |
| ----- | ----- |
| [![GitHub issues][issues-shield]][issues] [![GitHub pull requests][pull-requests-shield]][pull-requests] [![GitHub forks][forks-shield]][forks] [![GitHub stars][stars-shield]][stars]<br>[![Linter Status][linter-status-shield]][linter-status] [![Last Commit][last-commit-shield]][last-commit] [![Commits][commits-shield]][commits] | [![Home Assistant Community Forum][forum-shield]][forum]<br>[![Discord][discord-shield]][discord]

## Current Blueprints

### Script

#### Inovelli Blue LED (Zigbee2MQTT)

Set LED effects for Inovelli VZM31-SN Blue Series 2-1 Switches
Set LED effects for Inovelli Blue Series 2-1 Switches (VZM31-SN, VZM35-SN)

[Forum](https://community.home-assistant.io/t/z2m-inovelli-blue-series-switch-led-notification-script-vzm31-sn-vzm35-sn/489620)
| [YAML](https://github.com/zanix/home-assistant-blueprints/blob/main/script/inovelli_blue_led_zigbee2mqtt.yaml)

[![Import Blueprint][blueprint-import]](https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https%3A%2F%2Fgithub.com%2Fzanix%2Fhome-assistant-blueprints%2Fblob%2Fmain%2Fscript%2Finovelli_blue_led_zigbee2mqtt.yaml)
[![Import Blueprint][blueprint-import-button]](https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https%3A%2F%2Fgithub.com%2Fzanix%2Fhome-assistant-blueprints%2Fblob%2Fmain%2Fscript%2Finovelli_blue_led_zigbee2mqtt.yaml)

## Thanks

Expand All @@ -29,19 +28,31 @@ Set LED effects for Inovelli VZM31-SN Blue Series 2-1 Switches

**All files are edited with [Visual Studio Code](https://code.visualstudio.com).**

[github-linter-status-shield]: https://img.shields.io/github/actions/workflow/status/zanix/home-assistant-blueprints/linters.yaml?branch=main&style=flat-square&label=linters&logo=github-actions&logoColor=838B95
[github-linter-status]: https://github.com/zanix/home-assistant-blueprints/actions/workflows/linters.yaml
[issues]: https://github.com/zanix/home-assistant-blueprints/issues
[issues-shield]: https://img.shields.io/github/issues/zanix/home-assistant-blueprints?style=flat-square

[github-last-commit]: https://img.shields.io/github/last-commit/zanix/home-assistant-blueprints/main?style=flat-square&logo=github&logoColor=838B95
[github-main]: https://github.com/zanix/home-assistant-blueprints/commits/main
[pull-requests]: https://github.com/zanix/home-assistant-blueprints/pulls
[pull-requests-shield]: https://img.shields.io/github/issues-pr/zanix/home-assistant-blueprints?style=flat-square

[forks]: https://github.com/zanix/home-assistant-blueprints/network
[forks-shield]: https://img.shields.io/github/forks/zanix/home-assistant-blueprints?style=flat-square

[stars]: https://github.com/zanix/home-assistant-blueprints/stargazers
[stars-shield]: https://img.shields.io/github/stars/zanix/home-assistant-blueprints?style=flat-square

[linter-status]: https://github.com/zanix/home-assistant-blueprints/actions/workflows/linters.yaml
[linter-status-shield]: https://img.shields.io/github/actions/workflow/status/zanix/home-assistant-blueprints/linters.yaml?branch=main&style=flat-square&label=linters&logo=github-actions&logoColor=838B95

[last-commit]: https://github.com/zanix/home-assistant-blueprints/commits/main
[last-commit-shield]: https://img.shields.io/github/last-commit/zanix/home-assistant-blueprints/main?style=flat-square&logo=github&logoColor=838B95

[commits-shield]: https://img.shields.io/github/commit-activity/m/zanix/home-assistant-blueprints/main?style=flat-square&logo=github&logoColor=838B95
[commits]: https://github.com/zanix/home-assistant-blueprints/commits/main
[commits-shield]: https://img.shields.io/github/commit-activity/m/zanix/home-assistant-blueprints/main?style=flat-square&logo=github&logoColor=838B95

[forum-shield]: https://img.shields.io/discourse/topics?style=flat-square&label=community&logo=discourse&color=46B4ED&logoColor=46B4ED&server=https%3A%2F%2Fcommunity.home-assistant.io
[forum]: https://community.home-assistant.io
[forum-shield]: https://img.shields.io/discourse/topics?style=flat-square&label=community&logo=discourse&color=46B4ED&logoColor=46B4ED&server=https%3A%2F%2Fcommunity.home-assistant.io

[discord-shield]: https://img.shields.io/discord/330944238910963714?style=flat-square&color=7289da&label=discord&logo=discord
[discord]: https://discord.gg/c5DvZ4e
[discord-shield]: https://img.shields.io/discord/330944238910963714?style=flat-square&color=7289da&label=discord&logo=discord

[blueprint-import]: https://my.home-assistant.io/badges/blueprint_import.svg
[blueprint-import-button]: https://my.home-assistant.io/badges/blueprint_import.svg
139 changes: 127 additions & 12 deletions script/inovelli_blue_led_zigbee2mqtt.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,64 @@ blueprint:
description: |
Set LED effects for Inovelli Blue Series Switches using Zigbee2MQTT.
Features:
ℹ️ Version: 2024.4.0
- Select one or multiple devices, entities, or areas with Inovelli switches
To update this blueprint, read [Re-importing a blueprint](https://www.home-assistant.io/docs/automation/using_blueprints/#re-importing-a-blueprint)

Check warning on line 8 in script/inovelli_blue_led_zigbee2mqtt.yaml

View workflow job for this annotation

GitHub Actions / 🧹 YAML Lint

line too long
✨ Features:
- Select one or multiple devices, entities, floors, labels, or areas with Inovelli switches
- Selectors for LED Number, Color, Brightness Level, Effect, and Duration
- LED Number, Color, Effect, and Duration can accept direct values or the “friendly name” listed in the dropdown
- Debug info to diagnose issues
- Warning: Debug mode will create a persistent message for every entity called in the script plus 1
Supported Models:
Supported Models:
- Inovelli 2-in-1 switch + dimmer (VZM31-SN)
- Inovelli Fan Controller (VZM35-SN)
Forum: https://community.home-assistant.io/t/z2m-inovelli-blue-series-switch-led-notification-script-vzm31-sn-vzm35-sn/489620
💬 Forum: https://community.home-assistant.io/t/z2m-inovelli-blue-series-switch-led-notification-script-vzm31-sn-vzm35-sn/489620
📜 GitHub: https://github.com/zanix/home-assistant-blueprints
## Using this Blueprint
See [Using the Blueprint](https://community.home-assistant.io/t/z2m-inovelli-blue-series-switch-led-notification-script-vzm31-sn-vzm35-sn/489620#using-the-blueprint-13) in the forum topic.

Check warning on line 29 in script/inovelli_blue_led_zigbee2mqtt.yaml

View workflow job for this annotation

GitHub Actions / 🧹 YAML Lint

line too long
> The main idea is you set the LED values when you call the script, the inputs below are for default values.
GitHub: https://github.com/zanix/home-assistant-blueprints
## Default Values
The fields below are set as defaults for the instance of the script created from this blueprint.
ℹ️ Version: 2023.10.3
domain: script
author: zanixmechanix
homeassistant:
min_version: 2024.4.0
source_url: https://github.com/zanix/home-assistant-blueprints/blob/main/script/inovelli_blue_led_zigbee2mqtt.yaml

input:
command_path_base:
name: Default Command Path Base
description: Set the base path for the MQTT command path. This is `zigbee2mqtt` by default.
default: zigbee2mqtt
selector:
text:
command_path_map:
name: Default Command Path Map
description: |
Map of Entity IDs with a MQTT command path map when HA and Z2M do not match up.
Enter a new row for each mapping:
```
light.entity_name: "zigbee2mqtt/path/to/device/set"
```
default: ""
selector:
object:

fields:
target:
name: Target
Expand Down Expand Up @@ -181,12 +218,20 @@ fields:
constant:
value: true
label: Enabled
command_path_base:
name: Command Path Base
description: |
Set the base path for the MQTT command path. This is 'zigbee2mqtt' by default.
This overrides the Blueprint input `command_path_base`.
selector:
text:
command_path_map:
name: Command Path Map
description: |
Map of Entity IDs with a MQTT command path map when HA and Z2M do not match up.
Enter a new row for each mapping: light.entity_name: "zigbee2mqtt/path/to/device/set"'.
You can also use a template but you need to use YAML mode to do so.
Enter a new row for each mapping: `light.entity_name: "zigbee2mqtt/path/to/device/set"`.
You can use a template but you need to use YAML mode to do so.
This overrides the Blueprint input `command_path_map`.
selector:
object:

Expand All @@ -202,15 +247,53 @@ variables:
- VZM31-SN
- VZM35-SN

# Create a list of provided targets (areas, devices, entities)
# Create a list of provided targets (floors, areas, labels, devices, entities)
target: '{{ target|default([])|map(lower) }}'
floor: '{{ target.floor_id|default([])|lower }}'
area: '{{ target.area_id|default([])|lower }}'
device: '{{ target.device_id|default([])|lower }}'
entity: '{{ target.entity_id|default([])|lower }}'
command_path_map: '{{ command_path_map|default([]) }}'
label: '{{ target.label_id|default([])|lower }}'

# Get default values set in the blueprint.
input_command_path_base: !input command_path_base
command_path_base: '{{ command_path_base|default(input_command_path_base|default("zigbee2mqtt")) }}'
input_command_path_map: !input command_path_map
command_path_map: '{{ command_path_map|default(input_command_path_map|default([])) }}'

# Parse target selector for entities
entity_list: >
{% set switch = namespace(entities=[]) %}
{# Floors #}
{% set floors = namespace(floors=[]) %}
{% if floor %}
{# Convert to a list #}
{% if ',' in floor %}
{% set floornum = floor.split(',') | count %}
{% for i in range(0, floornum) %}
{% set floors.floors = floors.floors + [floor.split(',')[i]|string|trim ] %}
{% endfor %}
{% elif floor[0]|count == 1 %}
{# if the first item in the list has only a single character, it can't be a valid entity #}
{% set floors.floors = floors.floors + [floor|string|trim] %}
{% else %}
{% set floors.floors = floor %}
{% endif %}
{# Detect switches #}
{% for floor in floors.floors %}
{% for area in floor_areas(floor) %}
{% for ent in area_entities(area) %}
{% for model in models %}
{% if model in device_attr(ent, 'model') | default('', true) and ent.split('.')[0] in domains %}
{% set switch.entities = switch.entities + [ent|string|trim] %}
{% endif %}
{% endfor %}
{% endfor %}
{% endfor %}
{% endfor %}
{% endif %}
{# Areas #}
{% set areas = namespace(areas=[]) %}
{% if area %}
Expand Down Expand Up @@ -288,6 +371,33 @@ variables:
{% endfor %}
{% endif %}
{# Labels #}
{% set labels = namespace(labels=[]) %}
{% if label %}
{# Convert to a list #}
{% if ',' in label %}
{% set labelnum = label.split(',') | count %}
{% for i in range(0, labelnum) %}
{% set labels.labels = labels.labels + [label.split(',')[i]|string|trim ] %}
{% endfor %}
{% elif label[0]|count == 1 %}
{# if the first item in the list has only a single character, it can't be a valid entity #}
{% set labels.labels = labels.labels + [label|string|trim] %}
{% else %}
{% set labels.labels = label %}
{% endif %}
{# Detect switches #}
{% for label in labels.labels %}
{% for ent in label_entities(label) %}
{% for model in models %}
{% if model in device_attr(ent, 'model') | default('', true) and ent.split('.')[0] in domains %}
{% set switch.entities = switch.entities + [ent|string|trim] %}
{% endif %}
{% endfor %}
{% endfor %}
{% endfor %}
{% endif %}
{# Output #}
{{ switch.entities|unique|list|lower }}
Expand Down Expand Up @@ -453,6 +563,7 @@ sequence:
level: {{ level }}
effect: {{ effect }} ({{ effect_value }})
duration: {{ duration }} ({{ duration_value }})
command_path_base: {{ command_path_base }}
command_path_map: {{ command_path_map }}
- alias: "Check for an empty entity list"
Expand Down Expand Up @@ -488,12 +599,15 @@ sequence:
for_each: '{{ entity_list }}'
sequence:
- variables:
# Check for a command_path override.
device_identifier: >-
{% set identifiers = device_attr(repeat.item, "identifiers") | first %}
{{ identifiers[1].split('_')[1] }}
# Check for command_path override.
command_path: >-
{% if repeat.item in command_path_map %}
{{ command_path_map[repeat.item] }}
{% else %}
zigbee2mqtt/{{ device_attr(repeat.item, "name") }}/set
{{ command_path_base }}/{{ device_identifier }}/set
{% endif %}
- alias: "Debug: Send notification"
Expand All @@ -508,6 +622,7 @@ sequence:
message: |-
entity: {{ repeat.item }}
device name: {{ device_attr(repeat.item, "name") }}
device identifier: {{ device_identifier }}
topic: {{ command_path }}
payload: {{ payload }}
Expand Down

0 comments on commit 145b53e

Please sign in to comment.