I’m excited to share a stable and fully featured blueprint to control up to 8 independent zones using the MiBoxer FUT089Z remote via Zigbee2MQTT.
This blueprint allows you to map each zone to any set of lights, switches, or scenes, with support for:
ON / OFF per zone
Brightness control
Color temperature
Hue & Saturation
Automatic zone detection from MQTT payload
Optional debug notifications (friendly zone name used only in notifications)
Note: This is the MVP version — stable and focused on lights, switches, and scenes only.
TVs, amplifiers, and optional script calls are planned for future versions.
Install & Use
It’s my first blueprint, so please be kind — your feedback is a gift!
Hello thanks to use this bleuprint,
can you share your automation please ?
And the the Mqtt config if your rc, you may found it at device level, Mqtt entry on the left
Cheers
To avoid notifications becoming too long and cluttering the screen or database, the easiest solution is to turn off Debug mode in the blueprint.
Here’s what you should do:
1. Open the blueprint configuration in Home Assistant.
2. Set the Debug option to Off.
3. Reload the automation so the change takes effect.
This way, the remote control will work normally, and you won’t get massive notifications.
When you need to test or diagnose an issue, you can temporarily turn Debug back on.
Hi @Canaletto@Khzd
It looks like you’re running into the same issue I had — the action_group values range from 101 to 108, and they don’t come through as part of trigger.payload_json.action, but instead appear under trigger.payload_json.action_group.
I’ve gone ahead and modified Khzd’s code so that it works for me. I’m sharing it here in the hope that it will help you as well, and that Khzd might adapt it for our devices too.
@Khzd Thanks for your blueprint, awesome job! Makes setting up automations with the FUT089Z way easier.
blueprint:
name: FUT089Z – MVP Zone Control Custom
description:
"Control lights, switches and scenes zone-by-zone using the MiBoxer
FUT089Z remote via Zigbee2MQTT. Includes full zone mapping, color & brightness
support, and a clean debug mode. Version MVP stable.
"
domain: automation
input:
trigger:
name: Trigger *
icon: mdi:cog-outline
collapsed: true
input:
debug:
name: Debug Mode
description: Enable debug notifications only.
default: false
selector:
boolean: {}
fut089_topic:
name: Zigbee2MQTT Topic
description: MQTT topic used by your FUT089Z remote.
default: zigbee2mqtt/XYZ
selector:
text:
multiline: false
multiple: false
zone8:
name: Zone 8 – What This Zone Controls
icon: mdi:numeric-8-circle
collapsed: true
input:
zone_8_name:
name: Zone 8 Name – Used Only In Notifications
default: ""
selector:
text:
multiline: false
multiple: false
zone_8_targets:
name: Zone 8 – What Devices Does This Zone Control?
default: []
selector:
target:
entity:
- domain:
- light
- domain:
- switch
- domain:
- scene
zone1:
name: Zone 1 – What This Zone Controls
icon: mdi:numeric-1-circle
collapsed: true
input:
zone_1_name:
name: Zone 1 Name – Used Only In Notifications
default: ""
selector:
text:
multiline: false
multiple: false
zone_1_targets:
name: Zone 1 – What Devices Does This Zone Control?
default: []
selector:
target:
entity:
- domain:
- light
- domain:
- switch
- domain:
- scene
zone2:
name: Zone 2 – What This Zone Controls
icon: mdi:numeric-2-circle
collapsed: true
input:
zone_2_name:
name: Zone 2 Name – Used Only In Notifications
default: ""
selector:
text:
multiline: false
multiple: false
zone_2_targets:
name: Zone 2 – What Devices Does This Zone Control?
default: []
selector:
target:
entity:
- domain:
- light
- domain:
- switch
- domain:
- scene
zone3:
name: Zone 3 – What This Zone Controls
icon: mdi:numeric-3-circle
collapsed: true
input:
zone_3_name:
name: Zone 3 Name – Used Only In Notifications
default: ""
selector:
text:
multiline: false
multiple: false
zone_3_targets:
name: Zone 3 – What Devices Does This Zone Control?
default: []
selector:
target:
entity:
- domain:
- light
- domain:
- switch
- domain:
- scene
zone4:
name: Zone 4 – What This Zone Controls
icon: mdi:numeric-4-circle
collapsed: true
input:
zone_4_name:
name: Zone 4 Name – Used Only In Notifications
default: ""
selector:
text:
multiline: false
multiple: false
zone_4_targets:
name: Zone 4 – What Devices Does This Zone Control?
default: []
selector:
target:
entity:
- domain:
- light
- domain:
- switch
- domain:
- scene
zone5:
name: Zone 5 – What This Zone Controls
icon: mdi:numeric-5-circle
collapsed: true
input:
zone_5_name:
name: Zone 5 Name – Used Only In Notifications
default: ""
selector:
text:
multiline: false
multiple: false
zone_5_targets:
name: Zone 5 – What Devices Does This Zone Control?
default: []
selector:
target:
entity:
- domain:
- light
- domain:
- switch
- domain:
- scene
zone6:
name: Zone 6 – What This Zone Controls
icon: mdi:numeric-6-circle
collapsed: true
input:
zone_6_name:
name: Zone 6 Name – Used Only In Notifications
default: ""
selector:
text:
multiline: false
multiple: false
zone_6_targets:
name: Zone 6 – What Devices Does This Zone Control?
default: []
selector:
target:
entity:
- domain:
- light
- domain:
- switch
- domain:
- scene
zone7:
name: Zone 7 – What This Zone Controls
icon: mdi:numeric-7-circle
collapsed: true
input:
zone_7_name:
name: Zone 7 Name – Used Only In Notifications
default: ""
selector:
text:
multiline: false
multiple: false
zone_7_targets:
name: Zone 7 – What Devices Does This Zone Control?
default: []
selector:
target:
entity:
- domain:
- light
- domain:
- switch
- domain:
- scene
variables:
debug: !input debug
zones_targets:
1: !input zone_1_targets
2: !input zone_2_targets
3: !input zone_3_targets
4: !input zone_4_targets
5: !input zone_5_targets
6: !input zone_6_targets
7: !input zone_7_targets
8: !input zone_8_targets
zones_names:
1: !input zone_1_name
2: !input zone_2_name
3: !input zone_3_name
4: !input zone_4_name
5: !input zone_5_name
6: !input zone_6_name
7: !input zone_7_name
8: !input zone_8_name
trace:
stored_traces: 20
mode: queued
trigger:
- platform: mqtt
topic: !input fut089_topic
action:
- variables:
lvl: "{{ trigger.payload_json.action_level | default(None) }}"
hue: "{{ trigger.payload_json.action_hue | default(None) }}"
sat: "{{ trigger.payload_json.action_saturation | default(None) }}"
ct: "{{ trigger.payload_json.action_color_temperature | default(None) }}"
action_group: "{{ trigger.payload_json.action_group | default(None) }}"
triggered_zone: "{{ action_group | default(None) | string | last }}"
action:
"{% set raw_action = trigger.payload_json.action | default('') %}\n
{% set zone = triggered_zone | default('') %}\n
{{ raw_action ~ '_zone_' ~ zone if raw_action and zone else '' }}\n"
ztargets:
"{% set raw = zones_targets.get(triggered_zone) %} {% if raw is string
%}\n {{ [raw] }}\n{% elif raw is mapping and raw.entity_id is string %}\n {{
[raw.entity_id] }}\n{% elif raw is mapping and raw.entity_id is iterable %}\n
\ {{ raw.entity_id }}\n{% else %}\n []\n{% endif %} \n"
zname: "{{ zones_names.get(triggered_zone, {}) | default('No Name') }}"
light_entities: '{{ ztargets | select(''match'',''^light\.'') | list }}
'
switch_entities: '{{ ztargets | select(''match'',''^switch\.'') | list }}
'
scene_entities: '{{ ztargets | select(''match'',''^scene\.'') | list }}
'
lights_to_use: "{{ light_entities }}"
switches_to_use: "{{ switch_entities }}"
scenes_to_use: "{{ scene_entities }}"
light_data:
"{% set d = {} %} {% if action.startswith('brightness_') %}\n {%
set d = d | combine({'brightness': lvl}) %}\n{% elif action.startswith('color_temperature_')
%}\n {% set d = d | combine({'color_temp': ct}) %}\n{% elif action.startswith('move_to_hue_and_saturation')
%}\n {% set d = d | combine({'hs_color': [(hue*360/254)|int, ((sat-170)/84*100)|int]})
%}\n{% endif %} {{ d }}\n"
- choose:
- conditions: "{{ action == 'on_zone_' ~ triggered_zone }}"
sequence:
- action: light.turn_on
target:
entity_id: "{{ light_entities }}"
- action: switch.turn_on
target:
entity_id: "{{ switch_entities }}"
- action: scene.turn_on
target:
entity_id: "{{ scene_entities }}"
- conditions: "{{ action == 'off_zone_' ~ triggered_zone }}"
sequence:
- action: light.turn_off
target:
entity_id: "{{ light_entities }}"
- action: switch.turn_off
target:
entity_id: "{{ switch_entities }}"
- action: scene.turn_on
target:
entity_id: "{{ scene_entities }}"
- conditions:
"{{ action == 'brightness_move_to_level_zone_' ~ triggered_zone
}}"
sequence:
- action: light.turn_on
target:
entity_id: "{{ lights_to_use }}"
data: "{{ light_data }}"
- conditions: "{{ action == 'color_temperature_move_zone_' ~ triggered_zone }}"
sequence:
- action: light.turn_on
target:
entity_id: "{{ lights_to_use }}"
data: "{{ light_data }}"
- conditions:
"{{ action == 'move_to_hue_and_saturation_zone_' ~ triggered_zone
}}"
sequence:
- action: light.turn_on
target:
entity_id: "{{ lights_to_use }}"
data: "{{ light_data }}"
- choose:
- conditions: "{{ debug }}"
sequence:
- service: persistent_notification.create
data:
title: DEBUG FUT089Z
message:
"Raw payload: {{ trigger.payload_json }}\n{% if action %}\n Detected
action: {{ action }}\n Zone: {{ triggered_zone }}\n Associated targets:
{{ selected_targets if selected_targets else 'None' }}\n{% else %}\n No
\"action\" field detected , telemetry reported \n(this is probably a battery/voltage/linkquality
report) {% endif %}"
So I have in both action and action_group the zone, do you notice the same from your remote ? Sure we have different release of the rc, I got mine recently , what about yours ?
Sorry Lionel I didn’t get your issue. Looking to your log, it’s sure that we have different release of the the remote.
I can adapt the code to cover both releases?
Quick update about the MiBoxer remote and the blueprint:
The situation:
• In Z2M → Devices → Specific Parameters, there’s a toggle “Publish zone-specific actions with zone IDs”.
• If this toggle is ON, action is normalized like on_zone_1, off_zone_2, etc.
• If the toggle is OFF, action stays pure (on / off / brightness_move_to_level…), and the zone is only available via action_group.
What we did in the new blueprint version:
• We always normalize the action (act) so it’s consistent: on, off, brightness_move_to_level, color_temperature_move, etc.
• The triggered zone is reliably determined from action_group, which works regardless of the toggle.
• Debug mode is kept for testing, giving clear logs for actions and zones.
So now, whatever your Z2M toggle setting, the blueprint handles actions and zones consistently, including brightness and color changes.
Thanks for your feedback—it helped us simplify and make everything more robust
The new release is published soon and cover both cases