En hændelsesliste med kun registreringer fra kameraer i Home Assistant
Logbogskortet viser både Detected og Cleared for kamerasensorer. Løsningen: en input_text som løbende log, en automation med trigger-id'er og et markdown-kort.
Overvågningsvisningen i min Home Assistant har en liste over seneste hændelser under kameraet. Den bygger på de fire binære sensorer, mit AI-kamera stiller til rådighed: person, bevægelse, dyr og køretøj. Problemet er, at logbogskortet viser hver eneste ændring af tilstand. Hver «Person Detected» efterfølges af en «Person Cleared» tredive sekunder senere, så halvdelen af listen er støj, og historikken dækker kun halvt så lang tid.
Og nej, logbogskortet kan ikke filtrere på tilstand. Det tager en liste over entiteter og et tidsrum. Det er alt.
Mulighederne, og hvorfor jeg valgte dem fra
En trigger-baseret template-sensor med en liste som attribut er den «rigtige» løsning, men den kan ikke oprettes i brugerfladen og kræver YAML i configuration.yaml. En todo-liste kan bruges som log, men ser klodset ud og skal ryddes op af endnu en automation. Jeg ville have noget, der kunne bygges færdigt i brugerfladen eller via API'et på fem minutter og overlever en genstart.
Løsningen: en input_text som løbende log
En input_text-hjælper gemmes permanent, kan oprettes i brugerfladen og kan opdateres fra en automation. Grænsen på 255 tegn er reel, men med formatet HH:MM label og et skilletegn er det cirka de 10 seneste hændelser. Til en liste over seneste hændelser er det lige tilpas.
Automationen reagerer 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 bærer det hele. Trigger-id'er fungerer som etiketter via opslagstabellen, så én handling klarer alle fire sensorer. mode: queued sikrer, at to registreringer lige efter hinanden ikke overskriver hinanden. Og [:10] skærer listen til på hændelsesniveau, før den sættes sammen, så en linje aldrig bliver skåret over på midten.
Markdown-kortet
Kortet deler loggen op og viser én linje pr. hændelse med 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 på billedet øverst: kun registreringer, dobbelt så lang historik på samme plads og ingen «Cleared»-linjer.
Begrænsningerne, ærligt talt
255 tegn er cirka 10 hændelser, og der er kun klokkeslæt, ingen dato. Ryger en hændelse ud af loggen, er den væk herfra (den fulde historik ligger stadig i logbogen og recorderen). Har du brug for længere historik med datoer, er en trigger-baseret template-sensor med en liste som attribut det rigtige værktøj. Prisen er YAML og en genstart.
Nye indlæg direkte i din RSS-læser: følg med via RSS I Google-søgning: vælg szimnau.dk som foretrukken kilde