Es gibt leider immer unendliche viele Möglichkeiten etwas zu machen. Wenn man keinen ESP32 einsetzt, wie ich z.b. einen Shelly, dann nutzt einem Dein Code ja leider nichts, weil die Fumktionen darin ja Plattformabhängig sind.
Andere verwenden evtl. sogar separate Türkontakt-Devices (Sonoff, Aquara, etc.), da ist es dann wieder ganz anders, weil diese Devices eine integrierte Entprellung haben.
Immer wenn ich denke ich habe was verstanden, bin ich danach wieder total verunsichert. Auch weil einige Beispiele einfach nicht funktionieren wollen… da kommen dann Fehler das z.B. “triggers” innerhalb von “sensor:” nicht erlaubt seien, etc. Man kommt wirklich immer vom Regen in Traufe…
So, jetzt habe ich folgendes gemacht: Das Debounce habe ich über einen virtuellen “binary_sensor” gelöst, welcher sich vom Status her aus dem Original Binary-Sensor versorgt, aber beim Statuswechsel jeweils eine Sekunde Stabilisierungszeit integriert, das funktioniert wunderbar, kein Prellen mehr. Direkt danach erzeuge ich dann den virtuellen Status-Sensor:
template:
# create debounced sensors
- binary_sensor:
- name: garagedoor_open
state: "{{ is_state('binary_sensor.garagedoor_garagedoor_position_opened', 'on') }}"
delay_on: "00:00:01" # Verzögerung beim Einschalten
delay_off: "00:00:01" # Verzögerung beim Ausschalten
- binary_sensor:
- name: garagedoor_closed
state: "{{ is_state('binary_sensor.garagedoor_garagedoor_position_closed', 'on') }}"
delay_on: "00:00:01" # Verzögerung beim Einschalten
delay_off: "00:00:01" # Verzögerung beim Ausschalten
# create status sensor
- sensor:
- name: garagedoor_status
state: >-
{% if is_state('binary_sensor.garagedoor_open', 'on') %}
{{ 'open' }}
{% elif is_state('binary_sensor.garagedoor_closed', 'on') %}
{{ 'closed' }}
{% elif is_state('binary_sensor.garagedoor_open', 'off') and is_state('binary_sensor.garagedoor_closed', 'off') %}
{% if states('sensor.garagedoor_status') == 'open' %}
{{ 'closing' }}
{% else %}
{{ 'opening' }}
{% endif %}
{% else %}
{{ 'unknown' }}
{% endif %}
attributes:
last_changed: "{{ now() }}"
Komisch ist nur, das egal ob ich das Tor auf oder zu fahre, der Status “opening” angezeigt wird. Also scheint die Zeile
{% if states('sensor.garagedoor_status') == 'open' %}
nicht wie erwartet zu funktionieren, spricht der Status wird nicht mit “open” gemeldet. Wie kann ich eigentlich einen solchen Ablauf debuggen?
Meine Vermutung ist das er schon ganz kurz auf “closing” geht, dann aber wieder irgendwie getriggert wird und nun die Bedingung nicht mehr passt und er daher wieder “opening” anzeigt.
Ok, so habe ich es jetzt erstmal gelöst:
- sensor:
- name: garagedoor_status
state: >-
{% if is_state('binary_sensor.garagedoor_open', 'on') %}
{{ 'open' }}
{% elif is_state('binary_sensor.garagedoor_closed', 'on') %}
{{ 'closed' }}
{% elif is_state('binary_sensor.garagedoor_open', 'off') and is_state('binary_sensor.garagedoor_closed', 'off') %}
{% if states('sensor.garagedoor_status') in [ 'open', 'closing' ] %}
{{ 'closing' }}
{% elif states('sensor.garagedoor_status') in [ 'closed', 'opening' ] %}
{{ 'opening' }}
{% endif %}
{% else %}
{{ 'unknown' }}
{% endif %}
attributes:
last_changed: "{{ now() }}"
Natürlich kann ich über meine Sensoren aktuell nicht erkennen ob ich den Antrieb gestoppt habe und er danach dann in die andere Richtung fährt.