A Small but Mighty Wind Card in Home Assistant

As part of refining my Home Assistant dashboards, I wanted a lightweight, dynamic card to show current wind conditions from my Weatherflow Tempest.

Screenshot 2025-09-01 at 12.36.38

There are plenty of ways to visualise weather data, but most are either too large, too basic, or just not very readable. I wanted something compact, clean, and glanceable. A quick read, no fluff, and no wasted screen space.

This is where the Mushroom Template Card really shines. It’s incredibly flexible, looks modern, and lets you pack a surprising amount of intelligence into a small card.

What I Wanted

The goal was simple:

  • Show the wind speed in mph.
  • Display a directional icon based on wind direction.
  • Change the icon colour if wind speed is high.
  • Keep it compact, no charts, no clutter.

All powered by the Tempest sensors I already had in place.

The YAML

Here’s the full YAML I ended up with:

type: custom:mushroom-template-card
entity: sensor.tempest_wind_speed
primary: Wind
secondary: "{{ states('sensor.tempest_wind_speed') | float | round(2) }} mph"

The secondary line uses Jinja2 to pull the wind speed and round it to two decimal places. I like that this keeps it readable without unnecessary decimals.

Directional Icon Logic

The icon is where it gets a bit more clever. If the wind sensor is reporting a valid direction and the wind isn’t zero, we map it to a directional arrow.

icon: >-
  {% set raw_dir = states('sensor.tempest_wind_direction') %}
  {% set raw_speed = states('sensor.tempest_wind_speed') %}
  {% if raw_dir in ['unknown', 'unavailable', 'none', ''] or raw_speed | float == 0 %}
    mdi:compass
  {% else %}
    {% set d_from = ((raw_dir | float) % 360 + 360) % 360 %}
    {% set d_to = (d_from + 180) % 360 %}
    {% set idx = (((d_to + 22.5) % 360) // 45) | int %}
    {% set icons = [
      'mdi:arrow-up-circle-outline',
      'mdi:arrow-top-right-thin-circle-outline',
      'mdi:arrow-right-circle-outline',
      'mdi:arrow-bottom-right-thin-circle-outline',
      'mdi:arrow-down-circle-outline',
      'mdi:arrow-bottom-left-thin-circle-outline',
      'mdi:arrow-left-circle-outline',
      'mdi:arrow-top-left-thin-circle-outline'
    ] %}
    {{ icons[idx] }}
  {% endif %}

Let me break that down:

  • If the direction or speed is unknown or zero, we show a generic compass icon.
  • Otherwise, we:
    • Calculate the direction the wind is going to (not coming from).
    • Convert it into an index between 0–7.
    • Map that to one of eight arrow icons using Material Design Icons (MDI).

This gives a visual indication of direction without needing to read degrees.

Icon Colour Based on Wind Speed

Just for a bit of extra UX, I wanted the icon to go red if the wind is high (10+ mph). Otherwise, it uses the theme’s default colour.

icon_color: >-
  {% set raw_speed = states('sensor.tempest_wind_speed') | float %}
  {% if raw_speed >= 10 %}
    red
  {% else %}
    "var(text-primary-color)"
  {% endif %}

This makes it easy to spot when it’s particularly gusty outside without taking up extra space or alerting.

Final Touch

Finally, I added a tap action to bring up the more-info panel when you tap the card.

tap_action:
  action: more-info

That way, if I want to see the raw data or history graph, it’s just a tap away.

Result

What I ended up with is a sleek little wind tile that blends into my dashboard, gives me useful info at a glance, and doesn’t crowd the interface.

It’s one of those tiny details that makes the whole dashboard feel more alive.

shows a dashboard of weather widgets, wind, rain, temperature

Entire YAML

type: custom:mushroom-template-card
entity: sensor.tempest_wind_speed
primary: Wind
secondary: "{{ states('sensor.tempest_wind_speed') | float | round(2) }} mph"
icon: >-
  {% set raw_dir = states('sensor.tempest_wind_direction') %}
  {% set raw_speed = states('sensor.tempest_wind_speed') %}
  {% if raw_dir in ['unknown', 'unavailable', 'none', ''] or raw_speed | float == 0 %}
    mdi:compass
  {% else %}
    {% set d_from = ((raw_dir | float) % 360 + 360) % 360 %}
    {% set d_to = (d_from + 180) % 360 %}
    {% set idx = (((d_to + 22.5) % 360) // 45) | int %}
    {% set icons = [
      'mdi:arrow-up-circle-outline',
      'mdi:arrow-top-right-thin-circle-outline',
      'mdi:arrow-right-circle-outline',
      'mdi:arrow-bottom-right-thin-circle-outline',
      'mdi:arrow-down-circle-outline',
      'mdi:arrow-bottom-left-thin-circle-outline',
      'mdi:arrow-left-circle-outline',
      'mdi:arrow-top-left-thin-circle-outline'
    ] %}
    {{ icons[idx] }}
  {% endif %}
icon_color: >-
  {% set raw_speed = states('sensor.tempest_wind_speed') | float %}
  {% if raw_speed >= 10 %}
    red
  {% else %}
    "var(text-primary-color)"
  {% endif %}
tap_action:
  action: more-info