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
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
