En eventliste med kun detektioner til Home Assistant-kameraer
Logbook-kortet viser både Detected og Cleared for kamera-sensorer. Løsningen: input_text som rullende log, en automation med trigger-id'er og markdown.
Mit overvågnings-view i Home Assistant har en “Recent events”-liste under kameraet — drevet af de fire binary sensors, mit AI-kamera eksponerer: person, bevægelse, dyr og køretøj. Problemet: logbook-kortet viser hver eneste tilstandsændring. Hver “Person Detected” efterfølges af en “Person Cleared” tredive sekunder senere, så halvdelen af listen er støj, og historikken dækker kun det halve tidsrum.
Og nej — logbook-kortet kan ikke filtrere på tilstand. Det tager en entitetsliste og et tidsvindue. Det er det hele.
Mulighederne, og hvorfor jeg fravalgte dem
Trigger-baseret template-sensor med en liste-attribut er den “rigtige” løsning — men den kan ikke oprettes via UI’et og kræver YAML i configuration.yaml. En todo-liste som event-log virker, men renderer klodset og skal beskæres af endnu en automation. Jeg ville have noget, der kunne bygges færdigt via UI/API på fem minutter og overlever genstart.
Løsningen: input_text som rullende log
En input_text-helper er persistent, UI-venlig og kan opdateres fra en automation. Begrænsningen på 255 tegn er reel — men med formatet HH:MM label og en separator er det ca. de 10 seneste hændelser. Til en “Recent events”-liste er det præcis nok.
Automationen trigger kun på on — “Cleared” rører den aldrig:
alias: Sentinel event log
mode: queued
triggers:
- trigger: state
entity_id: binary_sensor.sentinel_person
to: "on"
id: person
- trigger: state
entity_id: binary_sensor.sentinel_motion
to: "on"
id: motion
- trigger: state
entity_id: binary_sensor.sentinel_animal
to: "on"
id: animal
- trigger: state
entity_id: binary_sensor.sentinel_vehicle
to: "on"
id: vehicle
actions:
- action: input_text.set_value
target:
entity_id: input_text.sentinel_event_log
data:
value: >-
{% set m = {'person':'👤 Person','motion':'🏃 Motion',
'animal':'🐾 Animal','vehicle':'🚗 Vehicle'} %}
{% set new = now().strftime('%H:%M') ~ ' ' ~ m[trigger.id] %}
{% set old = states('input_text.sentinel_event_log') %}
{% set items = ([new] + (old.split(' · ')
if old not in ['unknown','unavailable',''] else []))[:10] %}
{{ (items | join(' · '))[:255] }}
Tre detaljer, der bærer det hele: trigger-id’er fungerer som labels via opslagstabellen, så én action håndterer alle fire sensorer. mode: queued sikrer, at to detektioner lige efter hinanden ikke overskriver hinanden. Og [:10]-beskæringen sker på hændelses-niveau før sammenføjningen, så en post aldrig kappes midt over.
Markdown-kortet
Kortet splitter loggen og renderer én linje pr. hændelse — tidspunktet i fed:
type: markdown
content: >-
{% set raw = states('input_text.sentinel_event_log') %}
{% if raw in ['unknown','unavailable',''] %}*No detections logged yet*
{% else %}{% for e in raw.split(' · ') if e %}**{{ e[:5] }}** {{ e[6:] }}
{% endfor %}{% endif %}
Resultatet er listen i billedet øverst: kun detektioner, dobbelt så lang historik på samme plads, ingen “Cleared”-linjer.
Begrænsningerne, ærligt
255 tegn er ca. 10 hændelser, og der er kun klokkeslæt — ingen dato. Ruller en hændelse ud af loggen, er den væk (den fulde historik ligger stadig i logbogen/recorder). Skal du bruge længere historik med datoer, er en trigger-baseret template-sensor med en liste-attribut det rigtige værktøj — prisen er YAML-konfiguration og en genstart.