Skip to content

Instantly share code, notes, and snippets.

@firstof9
Last active August 7, 2021 18:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save firstof9/b88d072a81c54b314fe7ddb901fc5c29 to your computer and use it in GitHub Desktop.
Save firstof9/b88d072a81c54b314fe7ddb901fc5c29 to your computer and use it in GitHub Desktop.
inovelli_led_modified.yaml
# Calculation References:
# https://nathanfiscus.github.io/inovelli-notification-calc/
# https://community.inovelli.com/t/home-assistant-2nd-gen-switch-rgb-working/168/62
# https://docs.google.com/spreadsheets/d/1bEpujdvBPZY9Fl61PZLUWuHanD2VAkRORFZ5D9xjLzA/edit?usp=sharing
#
# Changes:
# July 22, 2020: Incorporating changes from Kevin Schlichter.
# https://github.com/kschlichter/Home-Assistant-Inovelli-Red-Dimmer-Switch
#
# September 17, 2020: There are some massive improvements to my version of this code. Here are the highlights:
# 1. Choose - using the recently added choose: feature a separate call has been created for the Z-wave and OZW
# versions of the service call.
# 2. Variables - using 0.115’s new variables: feature the variables sent each service call only have to be
# calculated once.
# 3. Supported Features - I realized that I could probably tell the difference between modules using the
# “supported_features” attribute of each switch. For example my dimmer’s supported features is “33”.
#
# September 18, 2020: Added "model" parameter with options of dimmer, switch, combo_light, combo_fan. This replaces
# supported_features as the combo fan/light switch also had the same supported_features value.
#
# February 24, 2021: Added support for Z-Wave JS in place of OpenZwave (ozw).
# The ozw code is remarked out for those that still need it.
#
# February 27, 2021:
# 1. Added zwave_integration at top of "variables:" section to allow users to define which integration is
# installed ("zwave", "ozw", "zwave_js"). I just don't see a simple way to auto-detect this.
# 2. Added a comment describing the "model" variable.
# 3. Replaced personal "script.debug" service call with universal "persistent_notification.create".
# Unremarking these lines could help you troubleshoot why something isn't working as expeceted.
# 4. Updated broken spreadsheet link with public copy stored in my Google Docs account.
# Thanks for the heads up Kevin Schlichter!
#
inovelli_led:
mode: parallel
variables:
# REQUIRED to be one of these options: "zwave", "ozw", "zwave_js"
zwave_integration: "zwave_js"
# * Strongly recommended -> Use the passed model type ("dimmer", "switch", "combo_light") when present.
# * If not present, then attempt to identify the type using the "product_name" attribute (which is only
# unfortunately only available in the original zwave integration).
# * Finally, assume the model type is "dimmer".
model: |
{% if model is string %}
{{ model }}
{%- elif state_attr(entity_id, 'product_name') is string %}
{%- if 'LZW31' in state_attr(entity_id, 'product_name') %}
dimmer
{%- elif 'LZW36' in state_attr(entity_id, 'product_name') %}
combo_light
{%- else %}
switch
{%- endif %}
{%- else %}
dimmer
{%- endif %}
parameters:
dimmer: 16
combo_light: 24
combo_fan: 25
switch: 8
node_id: '{{ state_attr(entity_id,"node_id") }}'
color: |
{%- if color is not number %}
{{ color|default("Yellow")|title }}
{%- else %}
{{ color|int }}
{% endif %}
# 1-10
level: "{{ level|default(4)|int }}"
duration: '{{ duration|default("Indefinitely")|title }}'
effect: '{{ effect|default("Blink")|title }}'
colors:
"Off": 0
"Red": 1
"Orange": 21
"Yellow": 42
"Green": 85
"Cyan": 127
"Teal": 145
"Blue": 170
"Purple": 195
"Light Pink": 220
"Pink": 234
durations:
"Off": 0
"1 Second": 1
"2 Seconds": 2
"3 Seconds": 3
"4 Seconds": 4
"5 Seconds": 5
"6 Seconds": 6
"7 Seconds": 7
"8 Seconds": 8
"9 Seconds": 9
"10 Seconds": 10
"15 Seconds": 15
"20 Seconds": 20
"25 Seconds": 25
"30 Seconds": 30
"35 Seconds": 35
"40 Seconds": 40
"45 Seconds": 45
"50 Seconds": 50
"55 Seconds": 55
"60 Seconds": 60
"2 Minutes": 62
"3 Minutes": 63
"4 Minutes": 64
"10 Minutes": 70
"15 Minutes": 75
"30 Minutes": 90
"45 Minutes": 105
"1 Hour": 120
"2 Hours": 122
"Indefinitely": 255
effects_dimmer:
"Off": 0
"Solid": 1
"Chase": 2
"Fast Blink": 3
"Slow Blink": 4
"Blink": 4
"Pulse": 5
"Breath": 5
effects_switch:
"Off": 0
"Solid": 1
"Fast Blink": 2
"Slow Blink": 3
"Blink": 3
"Pulse": 4
"Breath": 4
sequence:
# Preform the Inovelli math.
- variables:
parameter: "{{ parameters[model|lower] }}"
color: "{{ colors[color|title]|int }}"
duration: "{{ durations[duration|title] }}"
effect: |
{% if model == "switch" %}
{{- effects_switch[effect|title] }}
{%- else %}
{{- effects_dimmer[effect|title] }}
{% endif %}
inovelli_math: |
{%- if effect|int > 0 %}
{{ color|int + (level|int * 256) + (duration|int * 65536) + (effect|int * 16777216) }}
{%- else %}
0
{% endif %}
# Unremark to provide an notification with troubleshooting information.
# - service: persistent_notification.create
# data:
# title: "DEBUG: script.inovelli_led"
# notification_id: "inovelli_led"
# message: |
# zwave_integration: {{ zwave_integration }}
# model: {{ model }}
# color: '{{ color|title }}'
# level: '{{ level }}'
# duration: '{{ duration|title }}'
# effect: '{{ effect|title }}'
# node_id: '{{ node_id }}'
# parameter: '{{ parameter }}'
# value: '{{ inovelli_math }}'
- choose:
# The Z-Wave JS integration requires this service call.
- conditions:
- '{{ zwave_integration == "zwave_js" }}'
sequence:
# Clear the previous effect.
- service: zwave_js.bulk_set_partial_config_parameters
target:
entity_id: "{{ entity_id }}"
data:
parameter: "{{ parameter }}"
value: 0
# Start the new effect.
- service: zwave_js.bulk_set_partial_config_parameters
target:
entity_id: "{{ entity_id }}"
data:
parameter: "{{ parameter }}"
value: "{{ inovelli_math }}"
# The OZW integration requires this service call.
- conditions:
- '{{ zwave_integration == "ozw" }}'
sequence:
# Clear the previous effect.
- service: ozw.set_config_parameter
data:
node_id: "{{ node_id }}"
parameter: "{{ parameter }}"
value: 0
# Start the new effect.
- service: ozw.set_config_parameter
data:
node_id: "{{ node_id }}"
parameter: "{{ parameter }}"
value: "{{ inovelli_math }}"
# The Z-wave integration requires this service call.
default:
# Clear the previous effect.
- service: zwave.set_config_parameter
data:
node_id: "{{ node_id }}"
parameter: "{{ parameter }}"
size: 4
value: 0
# Start the new effect.
- service: zwave.set_config_parameter
data:
node_id: "{{ node_id }}"
parameter: "{{ parameter }}"
size: 4
value: "{{ inovelli_math }}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment