ZHA - Aqara Magic Cube (57 actions)

I am trying to use the rotation as a volume control, is there any way to increase the impact of each rotation? Increase or decrease the volume more for each rotation?
Thanks, awesome blueprint!!!

Here’s a light dimmer, should give you some ideas…

Hello Team,

I get follow error : : Error: UndefinedError: ‘dict object’ has no attribute ‘event’
The cube is available in HA with Sonoff Zigbee 3.0 USB Dongle Plus - Sonoff Zigbee 3.0 ‎ZBdongle-P
any idea ?

I know it’s an awfully long time since this was developed, however, I still use it because it’s simple, works and doesn’t need an extra input_boolean to keep track of the faces.

I thought I’d make sure other people know of a few little extras I’ve had to put in over time to keep it working.

Since things have changed in the Zigbee/HA world, I’ve had to do the following:

  1. All instances of “from_face” need to be replaced with “deactivated_face”.

  2. The blueprint is (inexplicably) missing code for the 90 degree flip from face one to four and from four to one.

Original Code:

- conditions:
    - '{{ flip_degrees == 90 and activated_face == 1 }}'
    sequence:
    - choose:
      - conditions: '{{ from_face == 2 }}'
        sequence: !input 'two_to_one'
      - conditions: '{{ from_face == 3 }}'
        sequence: !input 'three_to_one'
      - conditions: '{{ from_face == 5 }}'
        sequence: !input 'five_to_one'
      - conditions: '{{ from_face == 6 }}'
        sequence: !input 'six_to_one'

AND

- conditions:
    - '{{ flip_degrees == 90 and activated_face == 4 }}'
    sequence:
    - choose:
      - conditions: '{{ from_face == 2 }}'
        sequence: !input 'two_to_four'
      - conditions: '{{ from_face == 3 }}'
        sequence: !input 'three_to_four'
      - conditions: '{{ from_face == 5 }}'
        sequence: !input 'five_to_four'
      - conditions: '{{ from_face == 6 }}'
        sequence: !input 'six_to_four'

New Code:

- conditions:
    - '{{ flip_degrees == 90 and activated_face == 1 }}'
    sequence:
    - choose:
      - conditions: '{{ deactivated_face == 2 }}'
        sequence: !input 'two_to_one'
      - conditions: '{{ deactivated_face == 3 }}'
        sequence: !input 'three_to_one'
      - conditions: '{{ deactivated_face == 4 }}'
        sequence: !input 'four_to_one'
      - conditions: '{{ deactivated_face == 5 }}'
        sequence: !input 'five_to_one'
      - conditions: '{{ deactivated_face == 6 }}'
        sequence: !input 'six_to_one'

AND

- conditions:
    - '{{ flip_degrees == 90 and activated_face == 4 }}'
    sequence:
    - choose:
      - conditions: '{{ deactivated_face == 1 }}'
        sequence: !input 'one_to_four'
      - conditions: '{{ deactivated_face == 2 }}'
        sequence: !input 'two_to_four'
      - conditions: '{{ deactivated_face == 3 }}'
        sequence: !input 'three_to_four'
      - conditions: '{{ deactivated_face == 5 }}'
        sequence: !input 'five_to_four'
      - conditions: '{{ deactivated_face == 6 }}'
        sequence: !input 'six_to_four'

I’ve spelled it out this way in case Brent decides to edit the available blueprint to the new version and people can see where the changes are.

Total New Code is:

blueprint:
  name: Aqara Magic Cube
  description: Control anything using Aqara Magic Cube.
  domain: automation
  input:
    remote:
      name: Magic Cube
      description: Select the Aqara Magic Cube device
      selector:
        device:
          integration: zha
          manufacturer: LUMI
          multiple: false
    flip_90:
      name: Flip 90 degrees
      description: 'Actions to run when cube flips 90 degrees.

        This cancels all specific 90 degrees functions.

        e.g From side 1 to side 2 will be the same as from side 6 to side 2'
      default: false
      selector:
        boolean: {}
    cube_flip_90:
      name: Flip cube 90 degrees
      description: Action to run when cube flips 90 degrees. This only works if 'Flip
        90 degrees' is toggled
      default: []
      selector:
        action: {}
    flip_180:
      name: Flip 180 degrees
      description: 'Actions to run when cube flips 180 degrees.

        This cancels all specific 180 degrees functions

        e.g From side 1 to side 4 will be the same as from side 5 to side 2'
      default: false
      selector:
        boolean: {}
    cube_flip_180:
      name: Flip cube 180 degrees
      description: Action to run when cube flips 180 degrees. This only works if 'Flip
        180 degrees' is toggled
      default: []
      selector:
        action: {}
    flip_any:
      name: Flip to any side
      description: 'Actions to run when cube flips to any side.

        This cares about the end side, but cancels all specific flip functions.

        e.g From side 1 to side 2 will be the same as from side 6 to side 2

        but different than side 1 to side 5'
      default: false
      selector:
        boolean: {}
    cube_flip_1:
      name: Flip cube to side 1
      description: Action to run when cube flips to side 1. This only works if 'Flip
        any' is toggled
      default: []
      selector:
        action: {}
    cube_flip_2:
      name: Flip cube to side 2
      description: Action to run when cube flips to side 2. This only works if 'Flip
        any' is toggled
      default: []
      selector:
        action: {}
    cube_flip_3:
      name: Flip cube to side 3
      description: Action to run when cube flips to side 3. This only works if 'Flip
        any' is toggled
      default: []
      selector:
        action: {}
    cube_flip_4:
      name: Flip cube to side 4
      description: Action to run when cube flips to side 4. This only works if 'Flip
        any' is toggled
      default: []
      selector:
        action: {}
    cube_flip_5:
      name: Flip cube to side 5
      description: Action to run when cube flips to side 5. This only works if 'Flip
        any' is toggled
      default: []
      selector:
        action: {}
    cube_flip_6:
      name: Flip cube to side 6
      description: Action to run when cube flips to side 6. This only works if 'Flip
        any' is toggled
      default: []
      selector:
        action: {}
    slide_any_side:
      name: Slide any side
      description: 'Actions to run when cube slides on any side.

        This cancels all specific ''slide'' functions

        e.g Slide on side 1 will be the same as slide on side 2'
      default: false
      selector:
        boolean: {}
    cube_slide_any:
      name: Slide cube on any side
      description: Action to run when cube slides on any slide. This only works if
        'Slide any side' is toggled
      default: []
      selector:
        action: {}
    knock_any_side:
      name: Knock on any side
      description: 'Actions to run when knocking cube regardless of the side.

        This cancels all specific ''knock'' functions

        e.g Knock on side 1 will be the same as knocking side 2'
      default: false
      selector:
        boolean: {}
    cube_knock_any:
      name: Knock cube on any side
      description: Action to run when knocking cube on any side. This only works if
        'Knock on any side' is toggled
      default: []
      selector:
        action: {}
    one_to_two:
      name: From side 1 to side 2
      description: Action to run when cube goes from side 1 to side 2
      default: []
      selector:
        action: {}
    one_to_three:
      name: From side 1 to side 3
      description: Action to run when cube goes from side 1 to side 3
      default: []
      selector:
        action: {}
    one_to_four:
      name: From side 1 to side 4
      description: Action to run when cube goes from side 1 to side 4
      default: []
      selector:
        action: {}
    one_to_five:
      name: From side 1 to side 5
      description: Action to run when cube goes from side 1 to side 5
      default: []
      selector:
        action: {}
    one_to_six:
      name: From side 1 to side 6
      description: Action to run when cube goes from side 1 to side 6
      default: []
      selector:
        action: {}
    two_to_one:
      name: From side 2 to side 1
      description: Action to run when cube goes from side 2 to side 1
      default: []
      selector:
        action: {}
    two_to_three:
      name: From side 2 to side 3
      description: Action to run when cube goes from side 2 to side 3
      default: []
      selector:
        action: {}
    two_to_four:
      name: From side 2 to side 4
      description: Action to run when cube goes from side 2 to side 4
      default: []
      selector:
        action: {}
    two_to_five:
      name: From side 2 to side 5
      description: Action to run when cube goes from side 2 to side 5
      default: []
      selector:
        action: {}
    two_to_six:
      name: From side 2 to side 6
      description: Action to run when cube goes from side 2 to side 6
      default: []
      selector:
        action: {}
    three_to_one:
      name: From side 3 to side 1
      description: Action to run when cube goes from side 3 to side 1
      default: []
      selector:
        action: {}
    three_to_two:
      name: From side 3 to side 2
      description: Action to run when cube goes from side 3 to side 2
      default: []
      selector:
        action: {}
    three_to_four:
      name: From side 3 to side 4
      description: Action to run when cube goes from side 3 to side 4
      default: []
      selector:
        action: {}
    three_to_five:
      name: From side 3 to side 5
      description: Action to run when cube goes from side 3 to side 5
      default: []
      selector:
        action: {}
    three_to_six:
      name: From side 3 to side 6
      description: Action to run when cube goes from side 3 to side 6
      default: []
      selector:
        action: {}
    four_to_one:
      name: From side 4 to side 1
      description: Action to run when cube goes from side 4 to side 1
      default: []
      selector:
        action: {}
    four_to_two:
      name: From side 4 to side 2
      description: Action to run when cube goes from side 4 to side 2
      default: []
      selector:
        action: {}
    four_to_three:
      name: From side 4 to side 3
      description: Action to run when cube goes from side 4 to side 3
      default: []
      selector:
        action: {}
    four_to_five:
      name: From side 4 to side 5
      description: Action to run when cube goes from side 4 to side 5
      default: []
      selector:
        action: {}
    four_to_six:
      name: From side 4 to side 6
      description: Action to run when cube goes from side 4 to side 6
      default: []
      selector:
        action: {}
    five_to_one:
      name: From side 5 to side 1
      description: Action to run when cube goes from side 5 to side 1
      default: []
      selector:
        action: {}
    five_to_two:
      name: From side 5 to side 2
      description: Action to run when cube goes from side 5 to side 2
      default: []
      selector:
        action: {}
    five_to_three:
      name: From side 5 to side 3
      description: Action to run when cube goes from side 5 to side 3
      default: []
      selector:
        action: {}
    five_to_four:
      name: From side 5 to side 4
      description: Action to run when cube goes from side 5 to side 4
      default: []
      selector:
        action: {}
    five_to_six:
      name: From side 5 to side 6
      description: Action to run when cube goes from side 5 to side 6
      default: []
      selector:
        action: {}
    six_to_one:
      name: From side 6 to side 1
      description: Action to run when cube goes from side 6 to side 1
      default: []
      selector:
        action: {}
    six_to_two:
      name: From side 6 to side 2
      description: Action to run when cube goes from side 6 to side 2
      default: []
      selector:
        action: {}
    six_to_three:
      name: From side 6 to side 3
      description: Action to run when cube goes from side 6 to side 3
      default: []
      selector:
        action: {}
    six_to_four:
      name: From side 6 to side 4
      description: Action to run when cube goes from side 6 to side 4
      default: []
      selector:
        action: {}
    six_to_five:
      name: From side 6 to side 5
      description: Action to run when cube goes from side 6 to side 5
      default: []
      selector:
        action: {}
    one_to_one:
      name: Knock - Side 1
      description: Action to run when knocking on side 1
      default: []
      selector:
        action: {}
    two_to_two:
      name: Knock - Side 2
      description: Action to run when knocking on side 2
      default: []
      selector:
        action: {}
    three_to_three:
      name: Knock - Side 3
      description: Action to run when knocking on side 3
      default: []
      selector:
        action: {}
    four_to_four:
      name: Knock - Side 4
      description: Action to run when knocking on side 4
      default: []
      selector:
        action: {}
    five_to_five:
      name: Knock - Side 5
      description: Action to run when knocking on side 5
      default: []
      selector:
        action: {}
    six_to_six:
      name: Knock - Side 6
      description: Action to run when knocking on side 6
      default: []
      selector:
        action: {}
    slide_on_one:
      name: Slide - Side 1 up
      description: Action to run when slides with Side 1 up
      default: []
      selector:
        action: {}
    slide_on_two:
      name: Slide - Side 2 up
      description: Action to run when slides with Side 2 up
      default: []
      selector:
        action: {}
    slide_on_three:
      name: Slide - Side 3 up
      description: Action to run when slides with Side 3 up
      default: []
      selector:
        action: {}
    slide_on_four:
      name: Slide - Side 4 up
      description: Action to run when slides with Side 4 up
      default: []
      selector:
        action: {}
    slide_on_five:
      name: Slide - Side 5 up
      description: Action to run when slides with Side 5 up
      default: []
      selector:
        action: {}
    slide_on_six:
      name: Slide - Side 6 up
      description: Action to run when slides with Side 6 up
      default: []
      selector:
        action: {}
    cube_wake:
      name: Wake up the cube
      description: Action to run when cube wakes up
      default: []
      selector:
        action: {}
    cube_drop:
      name: Cube drops
      description: Action to run when cube drops
      default: []
      selector:
        action: {}
    cube_shake:
      name: Shake cube
      description: Action to run when you shake the cube
      default: []
      selector:
        action: {}
    rotate_right:
      name: Rotate right
      description: Action to run when cube rotates right
      default: []
      selector:
        action: {}
    rotate_left:
      name: Rotate left
      description: Action to run when cube rotates left
      default: []
      selector:
        action: {}
  source_url: https://community.home-assistant.io/t/zha-aqara-magic-cube-57-actions/297012
mode: restart
max_exceeded: silent
trigger:
- platform: event
  event_type: zha_event
  event_data:
    device_id: !input remote
action:
- variables:
    command: '{{ trigger.event.data.command }}'
    value: '{{ trigger.event.data.args.value | default(0) }}'
    flip_degrees: '{{ trigger.event.data.args.flip_degrees | default(0) }}'
    flip_any: !input flip_any
    flip_90: !input flip_90
    flip_180: !input flip_180
    slide_any_side: !input slide_any_side
    knock_any_side: !input knock_any_side
    flip90: 64
    flip180: 128
    slide: 256
    knock: 512
    shake: 0
    drop: 3
    activated_face: "\n{% if command == \"slide\" or command == \"knock\" %}\n\n  {%
      if trigger.event.data.args.activated_face == 1 %} 1\n\n  {% elif trigger.event.data.args.activated_face
      == 2 %} 5\n\n  {% elif trigger.event.data.args.activated_face == 3 %} 6\n\n
      \ {% elif trigger.event.data.args.activated_face == 4 %} 4\n\n  {% elif trigger.event.data.args.activated_face
      == 5 %} 2\n\n  {% elif trigger.event.data.args.activated_face == 6 %} 3\n\n
      \ {% endif %}\n\n{% elif command == 'flip' %}\n\n  {{ trigger.event.data.args.activated_face
      | int }}\n\n{% endif %}\n"
    deactivated_face: "\n{% if command == \"flip\" and flip_degrees == 90 %}\n\n  {{ ((value
      - flip90 - (trigger.event.data.args.activated_face - 1)) / 8) + 1 | int }}\n\n{%
      endif %}\n"
    relative_degrees: "\n{% if command == \"rotate_right\" or command == \"rotate_left\"
      %}\n\n  {{ trigger.event.data.args.relative_degrees | float }}\n\n{% endif %}\n"
- choose:
  - conditions:
    - '{{ command == ''rotate_right'' }}'
    sequence: !input rotate_right
  - conditions:
    - '{{ command ==  ''rotate_left'' }}'
    sequence: !input rotate_left
  - conditions:
    - '{{ command == ''checkin'' }}'
    sequence: !input cube_wake
  - conditions:
    - '{{ value == shake }}'
    sequence: !input cube_shake
  - conditions:
    - '{{ value == drop }}'
    sequence: !input cube_drop
  - conditions:
    - '{{ command == ''knock'' and knock_any_side }}'
    sequence: !input cube_knock_any
  - conditions:
    - '{{ command == ''slide'' and slide_any_side }}'
    sequence: !input cube_slide_any
  - conditions:
    - '{{ command == ''flip'' and flip_any }}'
    sequence:
    - choose:
      - conditions: '{{ activated_face == 1 }}'
        sequence: !input cube_flip_1
      - conditions: '{{ activated_face == 2 }}'
        sequence: !input cube_flip_2
      - conditions: '{{ activated_face == 3 }}'
        sequence: !input cube_flip_3
      - conditions: '{{ activated_face == 4 }}'
        sequence: !input cube_flip_4
      - conditions: '{{ activated_face == 5 }}'
        sequence: !input cube_flip_5
      - conditions: '{{ activated_face == 6 }}'
        sequence: !input cube_flip_6
  - conditions:
    - '{{ flip_degrees == 90 and flip_90 }}'
    sequence: !input cube_flip_90
  - conditions:
    - '{{ flip_degrees == 180 and flip_180 }}'
    sequence: !input cube_flip_180
  - conditions:
    - '{{ flip_degrees == 90 and activated_face == 1 }}'
    sequence:
    - choose:
      - conditions: '{{ deactivated_face == 2 }}'
        sequence: !input two_to_one
      - conditions: '{{ deactivated_face == 3 }}'
        sequence: !input three_to_one
      - conditions: '{{ deactivated_face == 4 }}'
        sequence: !input four_to_one
      - conditions: '{{ deactivated_face == 5 }}'
        sequence: !input five_to_one
      - conditions: '{{ deactivated_face == 6 }}'
        sequence: !input six_to_one
  - conditions:
    - '{{ flip_degrees == 90 and activated_face == 2 }}'
    sequence:
    - choose:
      - conditions: '{{ deactivated_face == 1 }}'
        sequence: !input one_to_two
      - conditions: '{{ deactivated_face == 3 }}'
        sequence: !input three_to_two
      - conditions: '{{ deactivated_face == 4 }}'
        sequence: !input four_to_two
      - conditions: '{{ deactivated_face == 6 }}'
        sequence: !input six_to_two
  - conditions:
    - '{{ flip_degrees == 90 and activated_face == 3 }}'
    sequence:
    - choose:
      - conditions: '{{ deactivated_face == 1 }}'
        sequence: !input one_to_three
      - conditions: '{{ deactivated_face == 2 }}'
        sequence: !input two_to_three
      - conditions: '{{ deactivated_face == 4 }}'
        sequence: !input four_to_three
      - conditions: '{{ deactivated_face == 5 }}'
        sequence: !input five_to_three
  - conditions:
    - '{{ flip_degrees == 90 and activated_face == 4 }}'
    sequence:
    - choose:
      - conditions: '{{ deactivated_face == 1 }}'
        sequence: !input one_to_four
      - conditions: '{{ deactivated_face == 2 }}'
        sequence: !input two_to_four
      - conditions: '{{ deactivated_face == 3 }}'
        sequence: !input three_to_four
      - conditions: '{{ deactivated_face == 5 }}'
        sequence: !input five_to_four
      - conditions: '{{ deactivated_face == 6 }}'
        sequence: !input six_to_four
  - conditions:
    - '{{ flip_degrees == 90 and activated_face == 5 }}'
    sequence:
    - choose:
      - conditions: '{{ deactivated_face == 1 }}'
        sequence: !input one_to_five
      - conditions: '{{ deactivated_face == 3 }}'
        sequence: !input three_to_five
      - conditions: '{{ deactivated_face == 4 }}'
        sequence: !input four_to_five
      - conditions: '{{ deactivated_face == 6 }}'
        sequence: !input six_to_five
  - conditions:
    - '{{ flip_degrees == 90 and activated_face == 6 }}'
    sequence:
    - choose:
      - conditions: '{{ deactivated_face == 1 }}'
        sequence: !input one_to_six
      - conditions: '{{ deactivated_face == 2 }}'
        sequence: !input two_to_six
      - conditions: '{{ deactivated_face == 4 }}'
        sequence: !input four_to_six
      - conditions: '{{ deactivated_face == 5 }}'
        sequence: !input five_to_six
  - conditions:
    - '{{ value == flip180 + activated_face - 1 }}'
    sequence:
    - choose:
      - conditions: '{{ activated_face == 1 }}'
        sequence: !input four_to_one
      - conditions: '{{ activated_face == 2 }}'
        sequence: !input five_to_two
      - conditions: '{{ activated_face == 3 }}'
        sequence: !input six_to_three
      - conditions: '{{ activated_face == 4 }}'
        sequence: !input one_to_four
      - conditions: '{{ activated_face == 5 }}'
        sequence: !input two_to_five
      - conditions: '{{ activated_face == 6 }}'
        sequence: !input three_to_six
  - conditions:
    - '{{ command == ''knock'' and not knock_any_side }}'
    sequence:
    - choose:
      - conditions: '{{ activated_face == 1 }}'
        sequence: !input one_to_one
      - conditions: '{{ activated_face == 2 }}'
        sequence: !input two_to_two
      - conditions: '{{ activated_face == 3 }}'
        sequence: !input three_to_three
      - conditions: '{{ activated_face == 4 }}'
        sequence: !input four_to_four
      - conditions: '{{ activated_face == 5 }}'
        sequence: !input five_to_five
      - conditions: '{{ activated_face == 6 }}'
        sequence: !input six_to_six
  - conditions:
    - '{{ value == slide + activated_face - 1 }}'
    sequence:
    - choose:
      - conditions: '{{ activated_face == 1 }}'
        sequence: !input slide_on_one
      - conditions: '{{ activated_face == 2 }}'
        sequence: !input slide_on_two
      - conditions: '{{ activated_face == 3 }}'
        sequence: !input slide_on_three
      - conditions: '{{ activated_face == 4 }}'
        sequence: !input slide_on_four
      - conditions: '{{ activated_face == 5 }}'
        sequence: !input slide_on_five
      - conditions: '{{ activated_face == 6 }}'
        sequence: !input slide_on_six

Hope this helps someone! :slight_smile:

Lloyd.

1 Like

Or you can use mine. I keep mine maintained. There will be a release next week for all 20 of mine or sooner with some of the updates from the latest HA release 2024.6.
The input section of blueprints are going to be labeled and collapsed to make things less confusing for users and simpler to use.

1 Like