Zum Inhalt springen
Alles Automatisch

Garmin - Neue Aktivität protokollieren

Wertet neue Garmin-Aktivitäten aus und schreibt km, Minuten und Sessions in input_number/counter Helfer. Prüft per Activity-ID ob die Aktivität bereits geloggt wurde.

Entitäten:sensorinput_numberinput_textcounter

Themen:GarminFitness

Aktualisiert: 30. April 2026

Was brauchst du dafür?

Geräte
  • Sensor
Helper
  • Input Number Helper
  • Input Text Helper
  • Counter Helper
Garmin - Neue Aktivität protokollieren
# Entity-IDs sind anonymisiert. Ersetze sie durch deine eigenen.
# Beispiel: light.dein_wohnzimmer_licht -> light.wohnzimmer_deckenlampe
# Garmin - Neue Aktivitaet protokollieren
# Verarbeitet ALLE neuen Garmin-Aktivitaeten per Repeat-Schleife.
# Liest die Liste, prueft jede gegen die letzte geloggte ID,
# und akkumuliert km/min/sessions fuer Tennis, Radfahren und Skating.

id: garmin_neue_aktivitaet_protokollieren
alias: "Garmin - Neue Aktivitaet protokollieren"
description: >-
  Verarbeitet ALLE neuen Garmin-Aktivitaeten per Repeat-Schleife. Liest die
  Liste von hinten (neueste zuerst), prueft jede gegen die letzte geloggte ID,
  und akkumuliert km/min/sessions fuer Tennis, Radfahren und Skating.

# Ausloser: Wann wird die Automation gestartet?
triggers:
  # Sensor fuer letzte Aktivitaeten aendert sich
  - entity_id: sensor.last_activities
    attribute: last_activities
    trigger: state

# Bedingungen: Nur ausfuehren wenn...
conditions:
  - condition: template
    alias: Mindestens eine neue Aktivitaet vorhanden
    value_template: >-
      {% set acts = state_attr('sensor.last_activities', 'last_activities') | default([]) %}
      {% set last_id = states('input_text.garmin_last_logged_activity_id') | int(0) %}
      {% set newest_id = acts[-1].activityId | int(0) if acts | length > 0 else 0 %}
      {{ newest_id > last_id }}

# Aktionen: Was passiert?
actions:
  # Aktivitaetenliste in Variable laden
  - alias: Aktivitaetenliste laden
    variables:
      activities: >-
        {{ state_attr('sensor.last_activities', 'last_activities') | default([]) }}

  # Alle neuen Aktivitaeten per for_each verarbeiten
  - alias: Alle neuen Aktivitaeten verarbeiten
    repeat:
      for_each: "{{ activities }}"
      sequence:
        # Variablen fuer diese Aktivitaet setzen
        - alias: Variablen fuer diese Aktivitaet setzen
          variables:
            activity: "{{ repeat.item }}"
            act_id: "{{ repeat.item.activityId | int(0) }}"
            last_id: "{{ states('input_text.garmin_last_logged_activity_id') | int(0) }}"
            typekey: "{{ repeat.item.activityType | default('') }}"
            km: "{{ (repeat.item.distance | float(0)) / 1000 }}"
            mins: "{{ ((repeat.item.duration | float(0)) / 60) | round(0) }}"

        # Nur verarbeiten wenn ID neuer als letzte geloggte.
        # Ein condition-Step wuerde die gesamte Automation abbrechen,
        # daher wird choose ohne default verwendet (ueberspringt unbekannte Typen).
        - alias: Nur verarbeiten wenn ID neuer als letzte geloggte
          choose:
            - alias: Aktivitaet ist neu
              conditions:
                - condition: template
                  value_template: "{{ act_id > last_id }}"
              sequence:
                # Werte je nach Aktivitaetstyp akkumulieren
                - alias: Werte je nach Aktivitaetstyp akkumulieren
                  choose:
                    # Tennis
                    - alias: Tennis
                      conditions:
                        - condition: template
                          value_template: "{{ typekey == 'tennis_v2' }}"
                      sequence:
                        - action: input_number.set_value
                          target:
                            entity_id: input_number.garmin_tennis_month_km
                          data:
                            value: "{{ (states('input_number.garmin_tennis_month_km') | float(0) + km | float(0)) | round(2) }}"
                        - action: input_number.set_value
                          target:
                            entity_id: input_number.garmin_tennis_year_km
                          data:
                            value: "{{ (states('input_number.garmin_tennis_year_km') | float(0) + km | float(0)) | round(2) }}"
                        - action: input_number.set_value
                          target:
                            entity_id: input_number.garmin_tennis_month_min
                          data:
                            value: "{{ (states('input_number.garmin_tennis_month_min') | float(0) + mins | float(0)) | round(0) }}"
                        - action: input_number.set_value
                          target:
                            entity_id: input_number.garmin_tennis_year_min
                          data:
                            value: "{{ (states('input_number.garmin_tennis_year_min') | float(0) + mins | float(0)) | round(0) }}"
                        - action: counter.increment
                          target:
                            entity_id: counter.garmin_tennis_sessions

                    # Radfahren (cycling oder e_bike_fitness)
                    - alias: Radfahren
                      conditions:
                        - condition: or
                          conditions:
                            - condition: template
                              value_template: "{{ typekey == 'cycling' }}"
                            - condition: template
                              value_template: "{{ typekey == 'e_bike_fitness' }}"
                      sequence:
                        - action: input_number.set_value
                          target:
                            entity_id: input_number.garmin_bike_month_km
                          data:
                            value: "{{ (states('input_number.garmin_bike_month_km') | float(0) + km | float(0)) | round(2) }}"
                        - action: input_number.set_value
                          target:
                            entity_id: input_number.garmin_bike_year_km
                          data:
                            value: "{{ (states('input_number.garmin_bike_year_km') | float(0) + km | float(0)) | round(2) }}"
                        - action: input_number.set_value
                          target:
                            entity_id: input_number.garmin_bike_month_min
                          data:
                            value: "{{ (states('input_number.garmin_bike_month_min') | float(0) + mins | float(0)) | round(0) }}"
                        - action: input_number.set_value
                          target:
                            entity_id: input_number.garmin_bike_year_min
                          data:
                            value: "{{ (states('input_number.garmin_bike_year_min') | float(0) + mins | float(0)) | round(0) }}"
                        - action: counter.increment
                          target:
                            entity_id: counter.garmin_bike_sessions

                    # Skating
                    - alias: Skating
                      conditions:
                        - condition: template
                          value_template: "{{ typekey == 'inline_skating' }}"
                      sequence:
                        - action: input_number.set_value
                          target:
                            entity_id: input_number.garmin_skate_month_km
                          data:
                            value: "{{ (states('input_number.garmin_skate_month_km') | float(0) + km | float(0)) | round(2) }}"
                        - action: input_number.set_value
                          target:
                            entity_id: input_number.garmin_skate_year_km
                          data:
                            value: "{{ (states('input_number.garmin_skate_year_km') | float(0) + km | float(0)) | round(2) }}"
                        - action: input_number.set_value
                          target:
                            entity_id: input_number.garmin_skate_month_min
                          data:
                            value: "{{ (states('input_number.garmin_skate_month_min') | float(0) + mins | float(0)) | round(0) }}"
                        - action: input_number.set_value
                          target:
                            entity_id: input_number.garmin_skate_year_min
                          data:
                            value: "{{ (states('input_number.garmin_skate_year_min') | float(0) + mins | float(0)) | round(0) }}"
                        - action: counter.increment
                          target:
                            entity_id: counter.garmin_skate_sessions

                # Geloggte ID auf diese Aktivitaet setzen
                - alias: Geloggte ID auf diese Aktivitaet setzen
                  action: input_text.set_value
                  target:
                    entity_id: input_text.garmin_last_logged_activity_id
                  data:
                    value: "{{ act_id }}"

mode: single