Timeline Dashboard Card für Kamera-Events

Moin zusammen,
ich habe diese LLM-Vision Timeline card entdeckt: GitHub - valentinfrlch/llmvision-card: Home Assistant Card to display the LLM Vision Timeline

Kennt ihr eine gute Alternative, welche man mit einer normalen Kamera einfach so nutzen kann. Also ich bräuchte so eine Timeline card. Die Events mit den images kann man ja per Automatisierungen selbst machen.

Versteht ihr was ich meine? Wisst ihr wie man soetwas umsetzen könnte?

Viele Grüße

Hat keiner eine Idee? :smile:

Sorry, ich hab keine Cams im HA.
Hab dafür ein eigenes NVR (Unifi)

liebe Grüße
Torben

1 „Gefällt mir“

Habe etwas damit rumgespielt.

Hatte dafür die Automation alle X minuten laufen lassen.
Das Script:

---
#
stream_analyzer:
  fields:
    camera:
      selector:
        entity:
          multiple: true
      name: Camera
      description: Kamera
      required: true
      default:
        - camera.xxx
  sequence:
    - action: llmvision.stream_analyzer
      data:
        remember: true
        use_memory: true
        duration: 15
        max_frames: 3
        include_filename: true
        target_width: 1280
        max_tokens: 100
        temperature: 0.5
        generate_title: true
        expose_images: true
        provider: 01JYKXSJYJ05MF9BQJ6GW4YCNQ
        image_entity: "{{camera}}"
        message: what can you see in this stream?
      response_variable: llm_response
  alias: streamAnalyzer
  description: "Analyze Stream via LLM"
  icon: mdi:camera-wireless-outline

Automation:

---
#
alias: LLMVisionCameraHN
description: ""
id: 7301525b-8f3b-411e-a473-da8c5a4afc57
triggers:
  - trigger: time_pattern
    minutes: /15
conditions: []
actions:
  - action: script.stream_analyzer
    data:
      camera:
        - camera.xxx
mode: single

Achso halt. du willst das selbst machen.
Da wäre doch der einfachste Weg die Timeline card trotzdem zu nutzen, allerdings einfach die Events in einen separaten Template Sensor schreiben. Zumindest wäre das jetzt mal mein Ansatz.

Hätte dann folgende Attribute:

  • events:
  • starts:
  • ends:
  • summaries:
  • key_frames:
  • camera_names:

Beispiel:

events:
  - Event Detected
  - Event Detected
starts:
  - "2025-06-30T17:15:00.126013+02:00"
  - "2025-06-30T17:00:00.126397+02:00"
ends:
  - "2025-06-30T17:16:18.300577+02:00"
  - "2025-06-30T17:01:16.687303+02:00"
summaries:
  - >-
    The camera feed shows a town square with people walking around. A tram is
    present in the square. A police car is parked. A bus drives by.
  - Event Detected
key_frames:
  - /config/www/llmvision/0a0dde62-0.jpg
  - /config/www/llmvision/c8b160da-0.jpg
camera_names:
  - camera.xxx
  - camera.xxx
today_summary: ""
icon: mdi:timeline-outline

ich schau mal ob ich das ggf. demnächst mal ausprobieren kann.

1 „Gefällt mir“

Tatsächlich habe ich es hinbekommen:

Template Sensor (bei mir ist die Config in mehreren Dateien aufgeteilt):

---
# Camera events
- trigger:
    - trigger: event
      event_type: cam_event

  binary_sensor:
    - unique_id: custom_cam_events
      name: "Custom camera events"
      state: "off"
      attributes:
        events: >-
          {% set n = 5 %}
          {% set m = this.attributes.events | count | default(0) %}
          {{ [ trigger.event.data.event ] +
              ( [] if m == 0 else
                this.attributes.events[0:n-1] )
          }}
        starts: >-
          {% set n = 5 %}
          {% set m = this.attributes.starts | count | default(0) %}
          {{ [ trigger.event.data.starts ] +
              ( [] if m == 0 else
                this.attributes.starts[0:n-1] )
          }}
        ends: >-
          {% set n = 5 %}
          {% set m = this.attributes.ends | count | default(0) %}
          {{ [ trigger.event.data.ends ] +
              ( [] if m == 0 else
                this.attributes.ends[0:n-1] )
          }}
        summaries: >-
          {% set n = 5 %}
          {% set m = this.attributes.summaries | count | default(0) %}
          {{ [ trigger.event.data.summary ] +
              ( [] if m == 0 else
                this.attributes.summaries[0:n-1] )
          }}
        key_frames: >-
          {% set n = 5 %}
          {% set m = this.attributes.key_frames | count | default(0) %}
          {{ [ trigger.event.data.key_frame ] +
              ( [] if m == 0 else
                this.attributes.key_frames[0:n-1] )
          }}
        camera_names: >-
          {% set n = 5 %}
          {% set m = this.attributes.camera_names | count | default(0) %}
          {{ [ trigger.event.data.camera ] +
              ( [] if m == 0 else
                this.attributes.camera_names[0:n-1] )
          }}
        icon: mdi:timeline-outline

Aktuell werden nur die letzten 5 Events gespeichert. Das kann erhöht werden durch verändern der „n“ Variable. Geht bestimmt noch etwas schicker.

Event Daten:

event: "test 1213"
starts: "2025-06-30T17:15:00.126013+02:00"
ends: "2025-06-30T17:16:18.300577+02:00"
summary: "Event Detected"
key_frame: /config/www/llmvision/0a0dde62-1.jpg
camera: camera.xxx

Zustand des Sensors:

friendly_name: Custom camera events
events:
  - test 1213
  - test
  - test
  - test
  - test
starts:
  - "2025-06-30T17:15:00.126013+02:00"
  - "2025-06-30T17:15:00.126013+02:00"
  - "2025-06-30T17:15:00.126013+02:00"
  - "2025-06-30T17:15:00.126013+02:00"
  - "2025-06-30T17:15:00.126013+02:00"
ends:
  - "2025-06-30T17:16:18.300577+02:00"
  - "2025-06-30T17:16:18.300577+02:00"
  - "2025-06-30T17:16:18.300577+02:00"
  - "2025-06-30T17:16:18.300577+02:00"
  - "2025-06-30T17:16:18.300577+02:00"
icon: mdi:timeline-outline
summaries:
  - Event Detected
  - Event Detected
  - Event Detected
  - Event Detected
  - Event Detected
key_frames:
  - /config/www/llmvision/0a0dde62-1.jpg
  - /config/www/llmvision/0a0dde62-1.jpg
  - /config/www/llmvision/0a0dde62-0.jpg
  - /config/www/llmvision/0a0dde62-0.jpg
  - /config/www/llmvision/0a0dde62-0.jpg
camera_names:
  - camera.xxx
  - camera.xxx
  - camera.xxx
  - camera.xxx
  - camera.xxx

so müsste es dann gehen :slight_smile:

2 „Gefällt mir“

Wow, vielen Dank für deine Mühe! Das sieht ja super aus :star_struck:
Ich werde es später gleich mal bei mir austesten :))
Viele Grüße

P.S. Herzlich Willkommen in unserer Community :slight_smile:

1 „Gefällt mir“

Ich habe es mal versucht, aber bin leider nicht mehr weiter gekommen :frowning: Sorry, das ist eine blöde Frage, aber wohin muss der code für den template sensor hin geschrieben werden? In die configuration.yaml?

genau in der configuration.yaml und dann unter dem Punkt:
template:

template: 
  - trigger:
      - trigger: event
        event_type: cam_event
  
    binary_sensor:
      - unique_id: custom_cam_events
        name: "Custom camera events"
        state: "off"
        attributes:
          events: >-
            {% set n = 5 %}
            {% set m = this.attributes.events | count | default(0) %}
            {{ [ trigger.event.data.event ] +
                ( [] if m == 0 else
                  this.attributes.events[0:n-1] )
            }}
          starts: >-
            {% set n = 5 %}
            {% set m = this.attributes.starts | count | default(0) %}
            {{ [ trigger.event.data.starts ] +
                ( [] if m == 0 else
                  this.attributes.starts[0:n-1] )
            }}
          ends: >-
            {% set n = 5 %}
            {% set m = this.attributes.ends | count | default(0) %}
            {{ [ trigger.event.data.ends ] +
                ( [] if m == 0 else
                  this.attributes.ends[0:n-1] )
            }}
          summaries: >-
            {% set n = 5 %}
            {% set m = this.attributes.summaries | count | default(0) %}
            {{ [ trigger.event.data.summary ] +
                ( [] if m == 0 else
                  this.attributes.summaries[0:n-1] )
            }}
          key_frames: >-
            {% set n = 5 %}
            {% set m = this.attributes.key_frames | count | default(0) %}
            {{ [ trigger.event.data.key_frame ] +
                ( [] if m == 0 else
                  this.attributes.key_frames[0:n-1] )
            }}
          camera_names: >-
            {% set n = 5 %}
            {% set m = this.attributes.camera_names | count | default(0) %}
            {{ [ trigger.event.data.camera ] +
                ( [] if m == 0 else
                  this.attributes.camera_names[0:n-1] )
            }}
          icon: mdi:timeline-outline

sieht bei mir nur anders aus, weil ich die config aufgesplittet habe:
Splitting up the configuration - Home Assistant

Wenn das auch machen willst kannst auch etwas spickeln:
miggi92/home-assistant-config: Home Assistant Configuration

1 „Gefällt mir“

Vielen Dank für deine Hilfe! Der Sensor funktioniert jetzt :hugs:
Nur wie kann ich jetzt die card nutzen? Ich stehe gerade ein wenig auf dem Schlauch :sweat_smile:

Sehr gut :slight_smile:

Musst in dein Dashboard das so ca. einbauen:

type: custom:llmvision-card
entity: binary_sensor.custom_camera_events
number_of_hours: 24
number_of_events: 5
language: de
header: Kamera Events

Du musst das im YAML modus machen, da auf der Card die Auswahlmöglichkeiten auf „camera“ begrenzt sind.

2 „Gefällt mir“

Vielen Dank! Das hat super geklappt! :slight_smile:

1 „Gefällt mir“