Motionblinds Template Cover with opening/closing states

Hi there

I’m using the Motionblinds integration but by design, the Motionblind cover motors via the bridge do not report opening/closing states. But they do report the current position of the cover/blinds. (Specifically, I’m using the CMD-01 bridge with the CMD-02-P motor).
I was surprised that I could not find a template cover for Motionblinds already in this forum, thus I share it here for others.

I created a template sensor and with that, a cover template which will then include the opening/closing states.

  • When opening / closing, the current position is reported for ~5 seconds, seldomly for ~6 seconds before that value is again updated. I gave it 7 seconds to be safe
  • service calls from the dashboard entity card are slightly differently formatted compared to service calls from the dev-tools, which is respected by the sensor
  • Instant state changes when the fully-open / fully-closed position is reached (no waiting for 7 seconds to get the updated state)
  • If covers are open already but the service open_cover is called, the state remains open
    • The same goes for closed state

I have been using it for a while and it works like a charm. If the service-calls would be equal when fired from the dashboard and from the dev-tools, the sensor-triggers could be cut in half. (Suggestions welcome :slight_smile: )

First, create a template sensor in the configuration.yaml. For the entity-id, use your existing cover-name (from the Motionblinds Integration):

template:
  - trigger:
    - platform: event
      event_type: call_service
      event_data:
        service: set_cover_position
        service_data:
          entity_id:
            - cover.blinds_kitchen
      id: "set-position"
    - platform: event
      event_type: call_service
      event_data:
        service: set_cover_position
        service_data:
          entity_id: cover.blinds_kitchen
      id: "set-position"
    - platform: event
      event_type: call_service
      event_data:
        service: close_cover
        service_data:
          entity_id:
            - cover.blinds_kitchen
      id: "closing-cover"
    - platform: event
      event_type: call_service
      event_data:
        service: close_cover
        service_data:
          entity_id: cover.blinds_kitchen
      id: "closing-cover"
    - platform: event
      event_type: call_service
      event_data:
        service: open_cover
        service_data:
          entity_id: cover.blinds_kitchen
      id: "opening-cover"
    - platform: event
      event_type: call_service
      event_data:
        service: open_cover
        service_data:
          entity_id: 
            - cover.blinds_kitchen
      id: "opening-cover"
    - platform: event
      event_type: call_service
      event_data:
        service: stop_cover
        service_data:
          entity_id:
            - cover.blinds_kitchen
      id: "stop-cover"
    - platform: event
      event_type: call_service
      event_data:
        service: stop_cover
        service_data:
          entity_id: cover.blinds_kitchen
      id: "stop-cover"
    - platform: state
      entity_id:
        - cover.blinds_kitchen
      attribute: current_position    
      for:
        seconds: 7
      id: "current-position"
    - platform: numeric_state
      entity_id:
        - cover.blinds_kitchen
      attribute: current_position
      above: 99
      id: "current-position"
    - platform: numeric_state
      entity_id:
        - cover.blinds_kitchen
      attribute: current_position
      below: 1
      id: "current-position"
    sensor:  
    - name: Blinds Kitchen State
      icon: mdi:blinds
      state: >
        {% set entity = 'cover.blinds_kitchen' %}
        {% if (trigger.id == 'set-position' and (state_attr(entity, 'current_position') - trigger.event.data.service_data.position > 0)) %}
          closing
        {% elif (trigger.id == 'closing-cover') %}
          {{ 'close' if state_attr(entity, 'current_position') == 0 else 'closing' }}
        {% elif (trigger.id == 'set-position' and (state_attr(entity, 'current_position') - trigger.event.data.service_data.position < 0)) %}
          opening
        {% elif (trigger.id == 'opening-cover') %}
          {{ 'open' if state_attr(entity, 'current_position') == 100 else 'opening' }}
        {% elif (trigger.id == 'stop-cover' or trigger.id == 'current-position') %}
          {{ 'open' if state_attr(entity, 'current_position') > 0 else 'closed' }}
        {% else %}
          unknown
        {% endif %}

Second, create the cover template in the configuration.yaml. For the entity-id, use your existing cover-name (from the Motionblinds Integration) and for the sensor, use the sensor-entity you created above:

cover:
  - platform: template
    covers:
      blinds_kitchen_mod:
        device_class: shade
        friendly_name: "Blinds Kitchen Mod"
        position_template: "{{ state_attr('cover.blinds_kitchen', 'current_position') }}"
        value_template: "{{ states('sensor.blinds_kitchen_state') }}"
        open_cover:
          action: cover.open_cover
          entity_id: cover.blinds_kitchen
        close_cover:
          action: cover.close_cover
          entity_id: cover.blinds_kitchen
        stop_cover:
          action: cover.stop_cover
          entity_id: cover.blinds_kitchen
        set_cover_position:
          action: cover.set_cover_position
          entity_id: cover.blinds_kitchen
          data:
            position: "{{position}}"

Third, in the dev tools reload the config (template-entities) and the sensor and template-cover will be created.

Thanks! Since motion blinds “work with Home Assistant” they really should report the opening or closing state by default. And support group commands to ensure synchronized opening and closing.