[Blueprint] MiBoxer FUT089Z – Full Zone Control (Lights / Switches / Scenes)

Hello Home Assistant community :wave:

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:

  • :white_check_mark: ON / OFF per zone
  • :white_check_mark: Brightness control
  • :white_check_mark: Color temperature
  • :white_check_mark: Hue & Saturation
  • :white_check_mark: Automatic zone detection from MQTT payload
  • :white_check_mark: 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 :blush: — your feedback is a gift!

Hello,
I have configured several lamps, and regardless of which button I press, the result is the same and nothing happens.

Unknown trigger

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 :slight_smile:
Cheers

Nb
My auto for info

  • id: ‘1764179822762’
    alias: Office FUT089Z - MVP Zone Control
    description: ‘’
    use_blueprint:
    path: gist.githubusercontent.com/fut089z_mvp_zone_control.yaml
    input:
    zone_1_name: Office
    zone_1_targets:
    entity_id:
    - light.staircase_light
    - switch.office_light_center
    debug: true
alias: BP - Mi Boxer FUT089Z
description: ""
use_blueprint:
  path: gist.githubusercontent.com/fut089z_mvp_zone_control.yaml
  input:
    zone_6_targets:
      entity_id: light.shelly_bulb_1
    zone_6_name: Lampe sur pied
    fut089_topic: zigbee2mqtt/Mi Boxer
    zone_4_targets:
      entity_id: light.lidl_bulb_1
    zone_3_name: Lid
    debug: true
    zone_8_targets:
      entity_id: light.lidl_bulb_1
    zone_1_name: "1"
    zone_1_targets:
      entity_id: light.lidl_bulb_1
    zone_8_name: "8"

Text[wrap=“justify”]

Text

Hello Lionel,
Found a bug in the bleuprint and correct it , test it like your case
Please reload the bleuprint ( same path)

Your feedback is a gift

Thanks, but…

Hi Lionel,

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.

Thanks!

Thank you, but I pasted this screenshot because it doesn’t work…

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 %}"
1 Like

Thank you @P.M and @Khzd
I’m so happy to see this remote finally working properly!!

Hello thanks for clarification
I see this
30

{
“action”: “on_zone_8”,
“action_group”: 108,
“battery”: 100,
“color_temperature”: 184,
“hue”: 189,
“last_seen”: “2025-12-10T01:05:30+01:00”,
“level”: 236,
“linkquality”: 134,
“saturation”: 254,
“voltage”: 3000
}

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 ?

In z2m I have this release
Modèle Zigbee

TS1002

_TZ3000_xwh1e22x (RGB+CCT Remote)

On mine is working perfectly lol

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?

Cheers

Don’t be sorry!
However, it seems that my remote control is identical:

TS1002
_TZ3000_xwh1e22x (RGB+CCT Remote)

Hi all

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

Your feedback is a gift :wink:

Cheers

1 Like

Base config…

Hello

So probably you didn’t change it, this is default behavior, for my side I did change the option.

Did you reload the blueprint, what is your feed back ?

Cheers

Good evening,
I tried to re-import it without much success…

Hello
Thanks for your feed back

I checked again and have a difference with my local version, I update the git with mine ( which upload without error )

Please give a try
Text
[/wrap]

Hello,
I can confirm that the update is working well and that the configuration is now OK.
Thank you for your work!

PS: You should put a version number on the Blueprint…

1 Like

Thanks Lionel for your feedback

Author and version included.

Enjoy
Khaled

1 Like