Count wie lange automation noch läuft

Ich hab hier diverse Bewegungs / Päsenzmelder Automationnen welche nach gewisser Zeit wenn keine Bewegung erkannt wird Lichter ausschalten. Gibt es eine Möglichkeit diese Zeit anzeigen zu lassen? Evtl als auf oder absteigender Timer.

Hier der bisherige yaml code vom Bad:

alias: Bad bewegung
description: ""
triggers:
  - entity_id:
      - binary_sensor.bewegungsmelder_bad_occupancy
    to: "on"
    trigger: state
conditions:
  - type: is_illuminance
    condition: device
    device_id: 6b67ed872abb0ac09f879c2486e41afe
    entity_id: 882d8ac66d30fb08080c85d86d6266ac
    domain: sensor
    below: 400
actions:
  - action: switch.turn_on
    metadata: {}
    data: {}
    target:
      entity_id: switch.bad_gesamt
  - wait_for_trigger:
      - entity_id:
          - binary_sensor.bewegungsmelder_bad_occupancy
        to: "off"
        for:
          hours: 0
          minutes: 5
          seconds: 0
        trigger: state
  - action: switch.turn_off
    metadata: {}
    data: {}
    target:
      entity_id: switch.bad_gesamt
mode: restart

sicher geht das, Helper Timer anlegen und dann Aut0mationen mit Triggern dazu

1 „Gefällt mir“

Abgesehen davon, dass ich nicht mit Warten auf Auslöser arbeiten würde. Sondern mit dem zusätzlichen Auslöser Bewegung aus für 5 Minuten. Dann hättest Du nicht die Notwendigkeit die Laufzeit messen zu wollen, das wären dann nämlich nur ms.

Um Auf den Timer zurückzukommen. Diesen willst Du wahrscheinlich haben, weil Dir das Licht plötzlich ausgeht und Du wärst gern vorgewarnt bzw. siehts wann Du Dich spätestens wieder regen musst damit das Licht nicht ausgeht.

Wenn das Licht dimmbar ist und Transition unterstützt, dann würde ich das Licht sanft runter dimmen lassen und nicht hart ausschalten. Oder einfach nach 5 min auf 50% Dimmlevel stellen.

Zum Thema Timer

Erstelle Dir einen Timer (Helfer)

Und starte diesen mit 5 min, wenn Bewegung aus. Stoppe den Timer wenn erneut Bewegung erkannt wurde.

Gruß Osorkon

1 „Gefällt mir“

Hab das ganze über ein Blueprint erstellt. Am yaml code habe ich da nichts geändert.

Fürs Bad trriift das zu. Für andere Räume ist es nur good to know.

Hab mir jetzt einen helper timer angelegt. Wie vorgeschlagen mit Automation und trigger Bewegung Bad. Leider Funktioniert das Attribut verbleibende Zeit nicht als Subbutton bei der Bubble Card. Dort gibt es ein Modul mit dem man die verbleibende Zeit als Fortschrittsbalken auf der Card anzeigen lassen kann. Leider kein Countdown, aber auch ne nette Lösung.

1) Helper anlegen

Einstellungen → Geräte & Dienste → Helfer → + → Timer

  • Name: Bad Licht

  • Entitäts-ID: timer.bad_licht

  • Dauer: 00:05:00

(Du kannst das natürlich auf 2/3/… Minuten ändern.)

2) Automationen (YAML)

A) Bewegung → Licht an + Timer stoppen

alias: Bad – Bewegung erkannt
mode: restart
triggers:
  - platform: state
    entity_id: binary_sensor.bewegungsmelder_bad_occupancy
    to: "on"
conditions:
  - condition: numeric_state
    entity_id: sensor.DEIN_HELLIGKEITS_SENSOR   # z.B. sensor.bad_illuminance
    below: 400
actions:
  - service: switch.turn_on
    target:
      entity_id: switch.bad_gesamt
  - service: timer.cancel
    target:
      entity_id: timer.bad_licht

B) Keine Bewegung → Timer starten (Countdown)

alias: Bad – Keine Bewegung, Countdown starten
mode: restart
triggers:
  - platform: state
    entity_id: binary_sensor.bewegungsmelder_bad_occupancy
    to: "off"
actions:
  - service: timer.start
    target:
      entity_id: timer.bad_licht

C) Timer fertig → Licht aus

alias: Bad – Timer fertig, Licht aus
mode: single
triggers:
  - platform: event
    event_type: timer.finished
    event_data:
      entity_id: timer.bad_licht
actions:
  - service: switch.turn_off
    target:
      entity_id: switch.bad_gesamt

3) Countdown (absteigend) anzeigen

Minimal (ohne Zusatz-Sensor)

Füge timer.bad_licht in eine Entities- oder Tile-Card ein. Der Standard-Timer zeigt den verbleibenden Wert (z. B. 00:03:12).
Mit der Tile-Card kannst du zusätzlich den Status/Fortschritt als Leiste sehen (Kartentyp „Kachel“, Entität timer.bad_licht, Anzeige „Fortschritt“ aktivieren).

Schön formatiert (Template-Sensor mm:ss)

Falls du die Restzeit separat/kompakt brauchst:

template:
  - sensor:
      - name: "Bad Auto-Aus in"
        unique_id: bad_auto_aus_in
        state: >
          {% set r = state_attr('timer.bad_licht', 'remaining') %}
          {% if r %}
            {% set s = (as_timedelta(r)).seconds %}
            {{ '%02d:%02d' % (s // 60, s % 60) }}
          {% else %}
            --
          {% endif %}

4) Optional: Aufsteigender Timer (seit letzter Bewegung)

Wenn du zusätzlich sehen willst, wie lange seit der letzten Bewegung vergangen ist:

template:
  - trigger:
      - platform: time_pattern
        seconds: "/1"
    sensor:
      - name: "Bad – seit letzter Bewegung"
        unique_id: bad_seit_letzter_bewegung
        state: >
          {% set last = states.binary_sensor.bewegungsmelder_bad_occupancy.last_changed %}
          {% if last %}
            {% set s = (now() - last).seconds %}
            {{ '%02d:%02d' % (s // 60, s % 60) }}
          {% else %}--{% endif %}

Hab mittlerweile die gewünschte Lösung.

  1. Zuerst wie bereits vorgeschlagen den Helfer Timer anlegen.
  2. Dann die Automation zum Bewegungsmelder (aus dem ersten Beitrag) auf den Timer anpassen. Also so das er auslöst wenn raum frei wird und stoppt wenn raum vor ablauf der Zeit wieder belegt ist.
alias: Bad timer
description: >-
  Startet einen Timer, wenn das Bad nicht mehr belegt ist, und beendet ihn bei
  erneuter Belegung.
triggers:
  - entity_id:
      - binary_sensor.bewegungsmelder_bad_occupancy
    to: "off"
    trigger: state
conditions: []
actions:
  - action: timer.start
    metadata: {}
    data: {}
    target:
      entity_id: timer.bad_timer
  - wait_for_trigger:
      - entity_id:
          - binary_sensor.bewegungsmelder_bad_occupancy
        to: "on"
        for:
          hours: 0
          minutes: 0
          seconds: 0
        trigger: state
  - action: timer.finish
    metadata: {}
    data: {}
    target:
      entity_id:
        - timer.bad_timer
mode: restart

  1. Nach langer suche wurde ich mit dem java code snippet für die Bubble Card in dem Bubble Card Repo auf Github fündig. Das die suche so lange gedauert hat lag daran das ich es zuerst mit falschen englischen Suchbegriffen versucht habe :see_no_evil_monkey: Der Code wird bei der Bubble Card unter Syles → Custom styles & JS templates eingetragen.
#Place all the DOM changing stuff on the bottom
${(() => {

  card.timerEntity = hass.states['timer.bad_timer'];
  function UpdateState(){
    try {
          let now = new Date(); 
          let endTime = new Date(card.timerEntity.attributes.finishes_at); 
          let runningTime = Math.round((endTime - now)/1000);
          let hours = Math.floor(runningTime / 3600);
          let minutes = Math.floor((runningTime - (hours * 3600)) / 60);
          let remainingSeconds = runningTime % 60;
          
          card.timerResult =
              (hours > 0 ? (hours + ":") : "") +
              ("0" + minutes).slice(-2) + ":" +
              ("0" + remainingSeconds).slice(-2);
          card.querySelector('.bubble-sub-button-4 .bubble-sub-button-name-container').innerText = card.timerResult;

        } catch (error) {
          card.timerResult =  card.timerEntity.attributes.duration;
          card.querySelector('.bubble-sub-button-4 .bubble-sub-button-name-container').innerText = card.timerResult;
        }
  };
  
  if (card.timer == null && card.timerEntity.state === 'active') {
    card.timer = setInterval(()=>{UpdateState()}, 500);
  }else if (card.timerEntity.state != 'active'){
    clearInterval(card.timer);
    card.timer = null;
    if (card.timerEntity.state !='paused') {
        card.querySelector('.bubble-sub-button-4 .bubble-sub-button-name-container').innerText = card.timerEntity.attributes.duration;
		card.timerResult = card.timerEntity.attributes.duration;
      } else if(card.timerEntity.state==='paused') {
        card.querySelector('.bubble-sub-button-4 .bubble-sub-button-name-container').innerText = card.timerEntity.attributes.remaining;
		card.timerResult = card.timerEntity.attributes.remaining;
    }
  }else{
    card.querySelector('.bubble-sub-button-4 .bubble-sub-button-name-container').innerText = card.timerResult ? card.timerResult : "error" ;
  }
  
 }	
)()}

Eidt: Hab den Beitrag #5 von @Yanee übersehen :frowning: