Skip to content

Automations & Templates

Michal Zaniewicz edited this page Jul 14, 2026 · 2 revisions

Ideas and snippets for using the sensors in automations, template sensors and notifications. Adjust the sensor.suunto_... prefix to your device (see Sensors).

The integration is read-only - there are no actions/services to call. These examples consume its sensors.


Notify when readiness is low

alias: Suunto - low readiness in the morning
triggers:
  - trigger: time
    at: "07:30:00"
conditions:
  - condition: numeric_state
    entity_id: sensor.suunto_readiness
    below: 40
actions:
  - action: notify.mobile_app_your_phone
    data:
      title: "Take it easy today"
      message: >
        Readiness {{ states('sensor.suunto_readiness') }} -
        HRV {{ states('sensor.suunto_sleep_hrv') }} ms,
        slept {{ states('sensor.suunto_sleep_duration') }} h.

Warn on a spiking ACWR (injury-risk zone)

alias: Suunto - ACWR high
triggers:
  - trigger: numeric_state
    entity_id: sensor.suunto_acwr
    above: 1.5
actions:
  - action: persistent_notification.create
    data:
      title: "Training load spiking"
      message: >
        Acute:chronic load ratio is {{ states('sensor.suunto_acwr') }}
        (sweet spot ~0.8-1.3). Consider an easier day.

Announce a freshly-synced workout

last_workout_start is a timestamp; fire when it changes to a new value.

alias: Suunto - new workout synced
triggers:
  - trigger: state
    entity_id: sensor.suunto_last_workout_start
conditions:
  - "{{ trigger.from_state.state not in ['unknown', 'unavailable'] }}"
actions:
  - action: notify.mobile_app_your_phone
    data:
      message: >
        New {{ states('sensor.suunto_last_activity') }}:
        {{ (states('sensor.suunto_last_distance') | float(0) / 1000) | round(1) }} km,
        {{ states('sensor.suunto_last_duration') }} min,
        TSS {{ states('sensor.suunto_last_tss') }}.

Template sensors

Form (TSB) label

template:
  - sensor:
      - name: Suunto form label
        state: >
          {% set tsb = states('sensor.suunto_form_tsb') | float(0) %}
          {% if tsb > 15 %}Fresh / tapered
          {% elif tsb > 5 %}Fresh
          {% elif tsb > -10 %}Neutral
          {% elif tsb > -30 %}Fatigued
          {% else %}Very fatigued{% endif %}

Sleep efficiency (deep+REM as % of total)

template:
  - sensor:
      - name: Suunto restorative sleep
        unit_of_measurement: "%"
        state: >
          {% set deep = states('sensor.suunto_sleep_deep') | float(0) %}
          {% set rem  = states('sensor.suunto_sleep_rem')  | float(0) %}
          {% set dur  = states('sensor.suunto_sleep_duration') | float(0) * 60 %}
          {{ ((deep + rem) / dur * 100) | round(0) if dur > 0 else none }}

Reading the recent-workouts attribute

sensor.suunto_workouts_recent carries the last 15 sessions in its workouts attribute. Iterate it in templates (also used by the table card in Workouts Calendar & Recent):

{% for w in state_attr('sensor.suunto_workouts_recent', 'workouts') %}
{{ w.activity }} - {{ (w.distance_meters / 1000) | round(1) }} km
{% endfor %}

Inspect the real attribute shape in Developer Tools → States before relying on a specific key.

Clone this wiki locally