mirror of
https://github.com/Koenkk/zigbee2mqtt.git
synced 2026-07-20 02:21:20 +00:00
fix: Home Assistant: template errors when action key is missing or empty in state payload (#24931)
This commit is contained in:
@@ -2270,9 +2270,10 @@ export default class HomeAssistant extends Extension {
|
||||
|
||||
const value_template =
|
||||
`{% set patterns = [\n${patterns}\n] %}\n` +
|
||||
`{% set ns = namespace(r=[('event_type', value_json.action)]) %}\n` +
|
||||
`{% set action_value = value_json.action|default(None) %}\n` +
|
||||
`{% set ns = namespace(r=[('action', action_value)]) %}\n` +
|
||||
`{% for p in patterns %}\n` +
|
||||
` {% set m = value_json.action|regex_findall(p.pattern) %}\n` +
|
||||
` {% set m = action_value|regex_findall(p.pattern) %}\n` +
|
||||
` {% if m[0] is undefined %}{% continue %}{% endif %}\n` +
|
||||
` {% for key, value in zip(p.groups, m[0]) %}\n` +
|
||||
` {% set ns.r = ns.r + [(key, value)] %}\n` +
|
||||
|
||||
@@ -428,7 +428,7 @@ describe('HomeAssistant extension', () => {
|
||||
unique_id: '0x0017880104e45520_action_zigbee2mqtt',
|
||||
// Needs to be updated whenever one of the ACTION_*_PATTERN constants changes.
|
||||
value_template:
|
||||
'{% set patterns = [\n{"pattern": \'^(?P<button>(?:button_)?[a-z0-9]+)_(?P<action>(?:press|hold)(?:_release)?)$\', "groups": ["button", "action"]},\n{"pattern": \'^(?P<action>recall|scene)_(?P<scene>[0-2][0-9]{0,2})$\', "groups": ["action", "scene"]},\n{"pattern": \'^(?P<actionPrefix>region_)(?P<region>[1-9]|10)_(?P<action>enter|leave|occupied|unoccupied)$\', "groups": ["actionPrefix", "region", "action"]},\n{"pattern": \'^(?P<action>dial_rotate)_(?P<direction>left|right)_(?P<speed>step|slow|fast)$\', "groups": ["action", "direction", "speed"]},\n{"pattern": \'^(?P<action>brightness_step)(?:_(?P<direction>up|down))?$\', "groups": ["action", "direction"]}\n] %}\n{% set ns = namespace(r=[(\'event_type\', value_json.action)]) %}\n{% for p in patterns %}\n {% set m = value_json.action|regex_findall(p.pattern) %}\n {% if m[0] is undefined %}{% continue %}{% endif %}\n {% for key, value in zip(p.groups, m[0]) %}\n {% set ns.r = ns.r + [(key, value)] %}\n {% endfor %}\n{% endfor %}\n{% if ns.r|selectattr(0, \'eq\', \'actionPrefix\')|first is defined %}\n {% set ns.r = ns.r|rejectattr(0, \'eq\', \'action\')|list + [(\'action\', ns.r|selectattr(0, \'eq\', \'actionPrefix\')|map(attribute=1)|first + ns.r|selectattr(0, \'eq\', \'action\')|map(attribute=1)|first)] %}\n{% endif %}\n{% set ns.r = ns.r + [(\'event_type\', ns.r|selectattr(0, \'eq\', \'action\')|map(attribute=1)|first)] %}\n{{dict.from_keys(ns.r|rejectattr(0, \'in\', \'action, actionPrefix\'))|to_json}}',
|
||||
'{% set patterns = [\n{"pattern": \'^(?P<button>(?:button_)?[a-z0-9]+)_(?P<action>(?:press|hold)(?:_release)?)$\', "groups": ["button", "action"]},\n{"pattern": \'^(?P<action>recall|scene)_(?P<scene>[0-2][0-9]{0,2})$\', "groups": ["action", "scene"]},\n{"pattern": \'^(?P<actionPrefix>region_)(?P<region>[1-9]|10)_(?P<action>enter|leave|occupied|unoccupied)$\', "groups": ["actionPrefix", "region", "action"]},\n{"pattern": \'^(?P<action>dial_rotate)_(?P<direction>left|right)_(?P<speed>step|slow|fast)$\', "groups": ["action", "direction", "speed"]},\n{"pattern": \'^(?P<action>brightness_step)(?:_(?P<direction>up|down))?$\', "groups": ["action", "direction"]}\n] %}\n{% set action_value = value_json.action|default(None) %}\n{% set ns = namespace(r=[(\'action\', action_value)]) %}\n{% for p in patterns %}\n {% set m = action_value|regex_findall(p.pattern) %}\n {% if m[0] is undefined %}{% continue %}{% endif %}\n {% for key, value in zip(p.groups, m[0]) %}\n {% set ns.r = ns.r + [(key, value)] %}\n {% endfor %}\n{% endfor %}\n{% if ns.r|selectattr(0, \'eq\', \'actionPrefix\')|first is defined %}\n {% set ns.r = ns.r|rejectattr(0, \'eq\', \'action\')|list + [(\'action\', ns.r|selectattr(0, \'eq\', \'actionPrefix\')|map(attribute=1)|first + ns.r|selectattr(0, \'eq\', \'action\')|map(attribute=1)|first)] %}\n{% endif %}\n{% set ns.r = ns.r + [(\'event_type\', ns.r|selectattr(0, \'eq\', \'action\')|map(attribute=1)|first)] %}\n{{dict.from_keys(ns.r|rejectattr(0, \'in\', \'action, actionPrefix\'))|to_json}}',
|
||||
};
|
||||
|
||||
expect(MQTT.publish).toHaveBeenCalledWith(
|
||||
@@ -1998,7 +1998,7 @@ describe('HomeAssistant extension', () => {
|
||||
unique_id: '0x0017880104e45520_action_zigbee2mqtt',
|
||||
// Needs to be updated whenever one of the ACTION_*_PATTERN constants changes.
|
||||
value_template:
|
||||
'{% set patterns = [\n{"pattern": \'^(?P<button>(?:button_)?[a-z0-9]+)_(?P<action>(?:press|hold)(?:_release)?)$\', "groups": ["button", "action"]},\n{"pattern": \'^(?P<action>recall|scene)_(?P<scene>[0-2][0-9]{0,2})$\', "groups": ["action", "scene"]},\n{"pattern": \'^(?P<actionPrefix>region_)(?P<region>[1-9]|10)_(?P<action>enter|leave|occupied|unoccupied)$\', "groups": ["actionPrefix", "region", "action"]},\n{"pattern": \'^(?P<action>dial_rotate)_(?P<direction>left|right)_(?P<speed>step|slow|fast)$\', "groups": ["action", "direction", "speed"]},\n{"pattern": \'^(?P<action>brightness_step)(?:_(?P<direction>up|down))?$\', "groups": ["action", "direction"]}\n] %}\n{% set ns = namespace(r=[(\'event_type\', value_json.action)]) %}\n{% for p in patterns %}\n {% set m = value_json.action|regex_findall(p.pattern) %}\n {% if m[0] is undefined %}{% continue %}{% endif %}\n {% for key, value in zip(p.groups, m[0]) %}\n {% set ns.r = ns.r + [(key, value)] %}\n {% endfor %}\n{% endfor %}\n{% if ns.r|selectattr(0, \'eq\', \'actionPrefix\')|first is defined %}\n {% set ns.r = ns.r|rejectattr(0, \'eq\', \'action\')|list + [(\'action\', ns.r|selectattr(0, \'eq\', \'actionPrefix\')|map(attribute=1)|first + ns.r|selectattr(0, \'eq\', \'action\')|map(attribute=1)|first)] %}\n{% endif %}\n{% set ns.r = ns.r + [(\'event_type\', ns.r|selectattr(0, \'eq\', \'action\')|map(attribute=1)|first)] %}\n{{dict.from_keys(ns.r|rejectattr(0, \'in\', \'action, actionPrefix\'))|to_json}}',
|
||||
'{% set patterns = [\n{"pattern": \'^(?P<button>(?:button_)?[a-z0-9]+)_(?P<action>(?:press|hold)(?:_release)?)$\', "groups": ["button", "action"]},\n{"pattern": \'^(?P<action>recall|scene)_(?P<scene>[0-2][0-9]{0,2})$\', "groups": ["action", "scene"]},\n{"pattern": \'^(?P<actionPrefix>region_)(?P<region>[1-9]|10)_(?P<action>enter|leave|occupied|unoccupied)$\', "groups": ["actionPrefix", "region", "action"]},\n{"pattern": \'^(?P<action>dial_rotate)_(?P<direction>left|right)_(?P<speed>step|slow|fast)$\', "groups": ["action", "direction", "speed"]},\n{"pattern": \'^(?P<action>brightness_step)(?:_(?P<direction>up|down))?$\', "groups": ["action", "direction"]}\n] %}\n{% set action_value = value_json.action|default(None) %}\n{% set ns = namespace(r=[(\'action\', action_value)]) %}\n{% for p in patterns %}\n {% set m = action_value|regex_findall(p.pattern) %}\n {% if m[0] is undefined %}{% continue %}{% endif %}\n {% for key, value in zip(p.groups, m[0]) %}\n {% set ns.r = ns.r + [(key, value)] %}\n {% endfor %}\n{% endfor %}\n{% if ns.r|selectattr(0, \'eq\', \'actionPrefix\')|first is defined %}\n {% set ns.r = ns.r|rejectattr(0, \'eq\', \'action\')|list + [(\'action\', ns.r|selectattr(0, \'eq\', \'actionPrefix\')|map(attribute=1)|first + ns.r|selectattr(0, \'eq\', \'action\')|map(attribute=1)|first)] %}\n{% endif %}\n{% set ns.r = ns.r + [(\'event_type\', ns.r|selectattr(0, \'eq\', \'action\')|map(attribute=1)|first)] %}\n{{dict.from_keys(ns.r|rejectattr(0, \'in\', \'action, actionPrefix\'))|to_json}}',
|
||||
};
|
||||
|
||||
expect(MQTT.publish).toHaveBeenCalledWith(
|
||||
|
||||
Reference in New Issue
Block a user