Garagentor - Lageerfassung - zähe Entwicklung

Das freut mich für dich, wenn der Vibrationssensor bei dir funktioniert. Evtl. hatte ich ein Montagsmodell eingesetzt. Empfangsprobleme habe ich auch nicht, denn wie erwähnt die beiden Magnetsensoren an der gleichen stellen funken tadellos.

wie oben angedeutet, bestimme ich ja auch die Position des Sektionaltors meiner Garage mit den Aqara Vibrationssensoren.
Die Sensoren habe ich von innen auf die oberste (1.) und die zweitunterste (3.) Sektion des Toren mit Hilfe von 3D-gedruckten Sensorhaltern befestigt. U.a. zur Isolation)

Die Position nutze ich dann später, um ein template-cover zu erzeugen, mit all seinen Vorteilen.

Hier mein template sensor.garagentor_position, er enthält viel Defensives, um ungenaue Positionierung oder Nicht-Erreichbarkeit zu tolerieren.

{# ----------------------------- #}
{#   SENSORWERTE ROBUST LADEN   #}
{# ----------------------------- #}

{% set raw1 = states('sensor.vibration_1z_angle_z') %}
{% set raw2 = states('sensor.vibration_2z_angle_z') %}

{% set valid1 = raw1 not in ['unknown', 'unavailable', 'none', None] %}
{% set valid2 = raw2 not in ['unknown', 'unavailable', 'none', None] %}

{% set s1 = (raw1 | float) if valid1 else None %}
{% set s2 = (raw2 | float) if valid2 else None %}

{# ----------------------------- #}
{#   FALLBACK-LOGIK FÜR SENSOR   #}
{# ----------------------------- #}

{% if valid1 and valid2 %}
  {% set angle = ((s1 + s2) / 2) %}
{% elif valid1 %}
  {% set angle = s1 %}
{% elif valid2 %}
  {% set angle = s2 %}
{% else %}
  {{ state_attr('cover.garagentor', 'current_position') | float(0) }}
  {% set angle = None %}
{% endif %}

{# Wenn angle None ist, wurde oben schon ausgegeben #}
{% if angle is not none %}

{# ----------------------------- #}
{#   KONFIGURATION              #}
{# ----------------------------- #}

{% set min_angle = -85 %}   {# vollständig geöffnet #}
{% set max_angle = 14 %}    {# vollständig geschlossen #}

{% set angle_deadband = 2 %}
{% set fully_open_band = 3 %}
{% set fully_closed_band = 3 %}

{% set old_pos = state_attr('cover.garagentor', 'current_position') | float(0) %}

{# ----------------------------- #}
{#   HARTE ERKENNUNG 100% / 0%   #}
{# ----------------------------- #}

{% if angle <= min_angle + fully_open_band %}
  {{ 100 }}

{% elif angle >= max_angle - fully_closed_band %}
  {{ 0 }}

{# ----------------------------- #}
{#   DEAD-BAND GEGEN SCHWANKUNG  #}
{# ----------------------------- #}

{% else %}
  {# alten Winkel aus alter Position rekonstruieren #}
  {% set last_angle = min_angle + (max_angle - min_angle) * (old_pos / 100) %}

  {% if (angle - last_angle) | abs < angle_deadband %}
    {{ old_pos | round(0) }}

  {% else %}
    {# ----------------------------- #}
    {#   NORMALBERECHNUNG            #}
    {# ----------------------------- #}

    {% set clamped = ([max_angle, angle, min_angle] | sort)[1] %}
    {% set internal_pos = ((clamped - min_angle) / (max_angle - min_angle) * 100) %}
    {% set new_pos = internal_pos %}

    {{ new_pos | round(0) }}
  {% endif %}
{% endif %}
{% endif %}

der entscheidende Teil im cover-template:

Und damit ergibt sich dann:

2 „Gefällt mir“