You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The `trigger.message` block only exposed two single-value channel filters
(`On channel (name)` and `On channel #`), so matching "channel A OR channel C"
required a separate automation per channel.
Add an `On channels` multi-select (`channelMulti`) to the message trigger — an
OR-list that fires when the message's resolved channel name matches ANY selected
entry. It mirrors the existing `action.sendMessage` `channels` field (name-based,
unified across sources) and works for both Meshtastic and MeshCore messages.
- catalog: add `channels` (channelMulti) to `trigger.message`, alongside the
legacy scalar `channelName`/`channel` fields (kept for backward compat).
- builder: no change needed — the trigger already receives the shared `channels`
prop, so the existing channelMulti renderer wires up automatically.
- triggerContext: all four matchers (messageMatchesFilter,
meshCoreMessageMatchesFilter, describeMessageFilterMiss,
describeMeshCoreFilterMiss) treat a populated `channels` array as an OR-list,
taking precedence over the legacy scalar checks; empty/absent falls back to
legacy behavior. New helpers messageFilterChannelNames /
messageFilterUsesChannelName.
- engine: onMessage/onMeshCoreMessage resolve the per-source slot→name when a
channels array is present (not just the scalar channelName).
No DB migration — saved automations keep working unchanged.
Claude-Session: https://claude.ai/code/session_015AFBA76hsjqhsXe1BdnYub
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
{name: 'textContains',label: 'Text contains',kind: 'text',placeholder: 'e.g. ping',help: 'Case-insensitive substring match. Leave blank to match any text.'},
49
49
{name: 'regex',label: 'Text matches regex',kind: 'text',placeholder: 'e.g. ^(test|ping)',advanced: true,help: 'A regular expression matched against the message text.'},
50
-
{name: 'channelName',label: 'On channel (name)',kind: 'text',placeholder: 'any',advanced: true,help: 'Match by channel name (case-insensitive) — portable across sources where the same channel sits in a different slot. Preferred over the channel # below.'},
51
-
{name: 'channel',label: 'On channel #',kind: 'number',placeholder: 'any',advanced: true,help: 'Match by raw channel index. Note: the same channel can be a different index on different sources — use the name above for cross-source automations.'},
50
+
{name: 'channels',label: 'On channels',kind: 'channelMulti',advanced: true,help: 'Match messages that arrive on ANY of these channels (unified by name across your sources). An OR-list — leave none to match any channel. When set, this overrides the single-channel fields below.'},
51
+
{name: 'channelName',label: 'On channel (name)',kind: 'text',placeholder: 'any',advanced: true,help: 'Match by channel name (case-insensitive) — portable across sources where the same channel sits in a different slot. Preferred over the channel # below. Ignored when "On channels" above is set.'},
52
+
{name: 'channel',label: 'On channel #',kind: 'number',placeholder: 'any',advanced: true,help: 'Match by raw channel index. Note: the same channel can be a different index on different sources — use the name above for cross-source automations. Ignored when "On channels" above is set.'},
52
53
{name: 'from',label: 'From node #',kind: 'number',placeholder: 'any',advanced: true,help: 'Only fire for messages from this node number.'},
0 commit comments