Hi folks,
I’ve been having pretty good luck with some ideas I got from this thread, using a combination of platinum weather card, weather card, bar card some glance cards, a bunch of custom sensors, and vertical-stack-in card.
The advantage of this approach is that it’s extremely customizable. But you will have to manage some custom sensors and a few cards to make it happen. You’ll probably have to tweak it a bit to get the exact results you want on various sized devices.
There is a little graph for rain that pops up when it’s rainy that I didn’t manage to pciture here:
Here are the sensors:
- platform: template
sensors:
weatherflow_forecast_0:
friendly_name: >-
{% set time = state_attr('weather.weatherflow_hourly_based_forecast','forecast').0.datetime | as_datetime | as_local | default(0,true) %}
{{ time | as_timestamp | timestamp_custom('%-H:00') | replace('M','') | lower }}
# unit_of_measurement: °
value_template: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').0.temperature|int}}"
icon_template: >
{% set array = { 'clear-night':'night',
'cloudy':'cloudy',
'exceptional':'sunny',
'fog':'fog',
'hail':'hail',
'lightning':'lightning',
'lightning-rainy':'lightning-rainy',
'partlycloudy':'partly-cloudy',
'rainy':'rainy',
'snowy':'snowy',
'snowy-rainy':'snowy-rainy',
'sunny':'sunny',
'windy':'windy' } %}
{% set icon = array[state_attr('weather.weatherflow_hourly_based_forecast','forecast').0.condition] %}
mdi:weather-{{ icon }}
weatherflow_forecast_precip_0:
friendly_name: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').0.precipitation_probability }}%"
value_template: >-
{% set amt = state_attr('weather.weatherflow_hourly_based_forecast','forecast').0.precipitation | float(0) + state_attr('weather.weatherflow_hourly_based_forecast','forecast').1.precipitation | float(0) %}
{% set amt = (amt * 100) | int(0) %}
{% if amt > 0 %}
{% if amt < 100 %}.{{amt}}
{% else %}{{ amt / 100 }}
{% endif %}
{% else %}0
{% endif %}
weatherflow_forecast_1:
friendly_name: >-
{% set time = state_attr('weather.weatherflow_hourly_based_forecast','forecast').2.datetime | as_datetime | as_local | default(0,true) %}
{{ time | as_timestamp | timestamp_custom('%-H:00') | replace('M','') | lower }}
# unit_of_measurement: °
value_template: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').2.temperature|int}}"
icon_template: >
{% set array = { 'clear-night':'night',
'cloudy':'cloudy',
'exceptional':'sunny',
'fog':'fog',
'hail':'hail',
'lightning':'lightning',
'lightning-rainy':'lightning-rainy',
'partlycloudy':'partly-cloudy',
'rainy':'rainy',
'snowy':'snowy',
'snowy-rainy':'snowy-rainy',
'sunny':'sunny',
'windy':'windy' } %}
{% set icon = array[state_attr('weather.weatherflow_hourly_based_forecast','forecast').2.condition] %}
mdi:weather-{{ icon }}
weatherflow_forecast_precip_1:
friendly_name: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').2.precipitation_probability }}%"
value_template: >-
{% set amt = state_attr('weather.weatherflow_hourly_based_forecast','forecast').2.precipitation | float(0) + state_attr('weather.weatherflow_hourly_based_forecast','forecast').3.precipitation | float(0) %}
{% set amt = (amt * 100) | int(0) %}
{% if amt > 0 %}
{% if amt < 100 %}.{{amt}}
{% else %}{{ amt / 100 }}
{% endif %}
{% else %}0
{% endif %}
weatherflow_forecast_2:
friendly_name: >-
{% set time = state_attr('weather.weatherflow_hourly_based_forecast','forecast').4.datetime | as_datetime | as_local | default(0,true) %}
{{ time | as_timestamp | timestamp_custom('%-H:00') | replace('M','') | lower }}
# unit_of_measurement: °
value_template: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').4.temperature|int}}"
icon_template: >
{% set array = { 'clear-night':'night',
'cloudy':'cloudy',
'exceptional':'sunny',
'fog':'fog',
'hail':'hail',
'lightning':'lightning',
'lightning-rainy':'lightning-rainy',
'partlycloudy':'partly-cloudy',
'rainy':'rainy',
'snowy':'snowy',
'snowy-rainy':'snowy-rainy',
'sunny':'sunny',
'windy':'windy' } %}
{% set icon = array[state_attr('weather.weatherflow_hourly_based_forecast','forecast').4.condition] %}
mdi:weather-{{ icon }}
weatherflow_forecast_precip_2:
friendly_name: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').4.precipitation_probability }}%"
value_template: >-
{% set amt = state_attr('weather.weatherflow_hourly_based_forecast','forecast').4.precipitation | float(0) + state_attr('weather.weatherflow_hourly_based_forecast','forecast').5.precipitation | float(0) %}
{% set amt = (amt * 100) | int(0) %}
{% if amt > 0 %}
{% if amt < 100 %}.{{amt}}
{% else %}{{ amt / 100 }}
{% endif %}
{% else %}0
{% endif %}
weatherflow_forecast_3:
friendly_name: >-
{% set time = state_attr('weather.weatherflow_hourly_based_forecast','forecast').6.datetime | as_datetime | as_local | default(0,true) %}
{{ time | as_timestamp | timestamp_custom('%-H:00') | replace('M','') | lower }}
# unit_of_measurement: °
value_template: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').6.temperature|int}}"
icon_template: >
{% set array = { 'clear-night':'night',
'cloudy':'cloudy',
'exceptional':'sunny',
'fog':'fog',
'hail':'hail',
'lightning':'lightning',
'lightning-rainy':'lightning-rainy',
'partlycloudy':'partly-cloudy',
'rainy':'rainy',
'snowy':'snowy',
'snowy-rainy':'snowy-rainy',
'sunny':'sunny',
'windy':'windy' } %}
{% set icon = array[state_attr('weather.weatherflow_hourly_based_forecast','forecast').6.condition] %}
mdi:weather-{{ icon }}
weatherflow_forecast_precip_3:
friendly_name: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').6.precipitation_probability }}%"
value_template: >-
{% set amt = state_attr('weather.weatherflow_hourly_based_forecast','forecast').6.precipitation | float(0) + state_attr('weather.weatherflow_hourly_based_forecast','forecast').7.precipitation | float(0) %}
{% set amt = (amt * 100) | int(0) %}
{% if amt > 0 %}
{% if amt < 100 %}.{{amt}}
{% else %}{{ amt / 100 }}
{% endif %}
{% else %}0
{% endif %}
weatherflow_forecast_4:
friendly_name: >-
{% set time = state_attr('weather.weatherflow_hourly_based_forecast','forecast').8.datetime | as_datetime | as_local | default(0,true) %}
{{ time | as_timestamp | timestamp_custom('%-H:00') | replace('M','') | lower }}
# unit_of_measurement: °
value_template: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').8.temperature|int}}"
icon_template: >
{% set array = { 'clear-night':'night',
'cloudy':'cloudy',
'exceptional':'sunny',
'fog':'fog',
'hail':'hail',
'lightning':'lightning',
'lightning-rainy':'lightning-rainy',
'partlycloudy':'partly-cloudy',
'rainy':'rainy',
'snowy':'snowy',
'snowy-rainy':'snowy-rainy',
'sunny':'sunny',
'windy':'windy' } %}
{% set icon = array[state_attr('weather.weatherflow_hourly_based_forecast','forecast').8.condition] %}
mdi:weather-{{ icon }}
weatherflow_forecast_precip_4:
friendly_name: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').8.precipitation_probability }}%"
value_template: >-
{% set amt = state_attr('weather.weatherflow_hourly_based_forecast','forecast').8.precipitation | float(0) + state_attr('weather.weatherflow_hourly_based_forecast','forecast').9.precipitation | float(0) %}
{% set amt = (amt * 100) | int(0) %}
{% if amt > 0 %}
{% if amt < 100 %}.{{amt}}
{% else %}{{ amt / 100 }}
{% endif %}
{% else %}0
{% endif %}
weatherflow_forecast_5:
friendly_name: >-
{% set time = state_attr('weather.weatherflow_hourly_based_forecast','forecast').10.datetime | as_datetime | as_local | default(0,true) %}
{{ time | as_timestamp | timestamp_custom('%-H:00') | replace('M','') | lower }}
# unit_of_measurement: °
value_template: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').10.temperature|int}}"
icon_template: >
{% set array = { 'clear-night':'night',
'cloudy':'cloudy',
'exceptional':'sunny',
'fog':'fog',
'hail':'hail',
'lightning':'lightning',
'lightning-rainy':'lightning-rainy',
'partlycloudy':'partly-cloudy',
'rainy':'rainy',
'snowy':'snowy',
'snowy-rainy':'snowy-rainy',
'sunny':'sunny',
'windy':'windy' } %}
{% set icon = array[state_attr('weather.weatherflow_hourly_based_forecast','forecast').10.condition] %}
mdi:weather-{{ icon }}
weatherflow_forecast_precip_5:
friendly_name: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').10.precipitation_probability }}%"
value_template: >-
{% set amt = state_attr('weather.weatherflow_hourly_based_forecast','forecast').10.precipitation | float(0) + state_attr('weather.weatherflow_hourly_based_forecast','forecast').11.precipitation | float(0) %}
{% set amt = (amt * 100) | int(0) %}
{% if amt > 0 %}
{% if amt < 100 %}.{{amt}}
{% else %}{{ amt / 100 }}
{% endif %}
{% else %}0
{% endif %}
weatherflow_forecast_6:
friendly_name: >-
{% set time = state_attr('weather.weatherflow_hourly_based_forecast','forecast').12.datetime | as_datetime | as_local | default(0,true) %}
{{ time | as_timestamp | timestamp_custom('%-H:00') | replace('M','') | lower }}
# unit_of_measurement: °
value_template: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').12.temperature |int}}"
icon_template: >
{% set array = { 'clear-night':'night',
'cloudy':'cloudy',
'exceptional':'sunny',
'fog':'fog',
'hail':'hail',
'lightning':'lightning',
'lightning-rainy':'lightning-rainy',
'partlycloudy':'partly-cloudy',
'rainy':'rainy',
'snowy':'snowy',
'snowy-rainy':'snowy-rainy',
'sunny':'sunny',
'windy':'windy' } %}
{% set icon = array[state_attr('weather.weatherflow_hourly_based_forecast','forecast').12.condition] %}
mdi:weather-{{ icon }}
weatherflow_forecast_precip_6:
friendly_name: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').12.precipitation_probability }}%"
value_template: >-
{% set amt = state_attr('weather.weatherflow_hourly_based_forecast','forecast').12.precipitation | float(0) + state_attr('weather.weatherflow_hourly_based_forecast','forecast').13.precipitation | float(0) %}
{% set amt = (amt * 100) | int(0) %}
{% if amt > 0 %}
{% if amt < 100 %}.{{amt}}
{% else %}{{ amt / 100 }}
{% endif %}
{% else %}0
{% endif %}
weatherflow_forecast_7:
friendly_name: >-
{% set time = state_attr('weather.weatherflow_hourly_based_forecast','forecast').14.datetime | as_datetime | as_local | default(0,true) %}
{{ time | as_timestamp | timestamp_custom('%-H:00') | replace('M','') | lower }}
# unit_of_measurement: °
value_template: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').14.temperature|int}}"
icon_template: >
{% set array = { 'clear-night':'night',
'cloudy':'cloudy',
'exceptional':'sunny',
'fog':'fog',
'hail':'hail',
'lightning':'lightning',
'lightning-rainy':'lightning-rainy',
'partlycloudy':'partly-cloudy',
'rainy':'rainy',
'snowy':'snowy',
'snowy-rainy':'snowy-rainy',
'sunny':'sunny',
'windy':'windy' } %}
{% set icon = array[state_attr('weather.weatherflow_hourly_based_forecast','forecast').14.condition] %}
mdi:weather-{{ icon }}
weatherflow_forecast_precip_7:
friendly_name: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').14.precipitation_probability }}%"
value_template: >-
{% set amt = state_attr('weather.weatherflow_hourly_based_forecast','forecast').14.precipitation | float(0) + state_attr('weather.weatherflow_hourly_based_forecast','forecast').15.precipitation | float(0) %}
{% set amt = (amt * 100) | int(0) %}
{% if amt > 0 %}
{% if amt < 100 %}.{{amt}}
{% else %}{{ amt / 100 }}
{% endif %}
{% else %}0
{% endif %}
weatherflow_forecast_8:
friendly_name: >-
{% set time = state_attr('weather.weatherflow_hourly_based_forecast','forecast').16.datetime | as_datetime | as_local | default(0,true) %}
{{ time | as_timestamp | timestamp_custom('%-H:00') | replace('M','') | lower }}
# unit_of_measurement: °
value_template: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').16.temperature|int}}"
icon_template: >
{% set array = { 'clear-night':'night',
'cloudy':'cloudy',
'exceptional':'sunny',
'fog':'fog',
'hail':'hail',
'lightning':'lightning',
'lightning-rainy':'lightning-rainy',
'partlycloudy':'partly-cloudy',
'rainy':'rainy',
'snowy':'snowy',
'snowy-rainy':'snowy-rainy',
'sunny':'sunny',
'windy':'windy' } %}
{% set icon = array[state_attr('weather.weatherflow_hourly_based_forecast','forecast').8.condition] %}
mdi:weather-{{ icon }}
weatherflow_forecast_precip_8:
friendly_name: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').16.precipitation_probability }}%"
value_template: >-
{% set amt = state_attr('weather.weatherflow_hourly_based_forecast','forecast').16.precipitation | float(0) + state_attr('weather.weatherflow_hourly_based_forecast','forecast').17.precipitation | float(0) %}
{% set amt = (amt * 100) | int(0) %}
{% if amt > 0 %}
{% if amt < 100 %}.{{amt}}
{% else %}{{ amt / 100 }}
{% endif %}
{% else %}0
{% endif %}
weatherflow_forecast_9:
friendly_name: >-
{% set time = state_attr('weather.weatherflow_hourly_based_forecast','forecast').18.datetime | as_datetime | as_local | default(0,true) %}
{{ time | as_timestamp | timestamp_custom('%-H:00') | replace('M','') | lower }}
# unit_of_measurement: °
value_template: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').18.temperature|int}}"
icon_template: >
{% set array = { 'clear-night':'night',
'cloudy':'cloudy',
'exceptional':'sunny',
'fog':'fog',
'hail':'hail',
'lightning':'lightning',
'lightning-rainy':'lightning-rainy',
'partlycloudy':'partly-cloudy',
'rainy':'rainy',
'snowy':'snowy',
'snowy-rainy':'snowy-rainy',
'sunny':'sunny',
'windy':'windy' } %}
{% set icon = array[state_attr('weather.weatherflow_hourly_based_forecast','forecast').18.condition] %}
mdi:weather-{{ icon }}
weatherflow_forecast_precip_9:
friendly_name: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').18.precipitation_probability }}%"
value_template: >-
{% set amt = state_attr('weather.weatherflow_hourly_based_forecast','forecast').18.precipitation | float(0) + state_attr('weather.weatherflow_hourly_based_forecast','forecast').19.precipitation | float(0) %}
{% set amt = (amt * 100) | int(0) %}
{% if amt > 0 %}
{% if amt < 100 %}.{{amt}}
{% else %}{{ amt / 100 }}
{% endif %}
{% else %}0
{% endif %}
weatherflow_forecast_10:
friendly_name: >-
{% set time = state_attr('weather.weatherflow_hourly_based_forecast','forecast').20.datetime | as_datetime | as_local | default(0,true) %}
{{ time | as_timestamp | timestamp_custom('%-H:00') | replace('M','') | lower }}
# unit_of_measurement: °
value_template: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').20.temperature|int}}"
icon_template: >
{% set array = { 'clear-night':'night',
'cloudy':'cloudy',
'exceptional':'sunny',
'fog':'fog',
'hail':'hail',
'lightning':'lightning',
'lightning-rainy':'lightning-rainy',
'partlycloudy':'partly-cloudy',
'rainy':'rainy',
'snowy':'snowy',
'snowy-rainy':'snowy-rainy',
'sunny':'sunny',
'windy':'windy' } %}
{% set icon = array[state_attr('weather.weatherflow_hourly_based_forecast','forecast').20.condition] %}
mdi:weather-{{ icon }}
weatherflow_forecast_precip_10:
friendly_name: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').20.precipitation_probability }}%"
value_template: >-
{% set amt = state_attr('weather.weatherflow_hourly_based_forecast','forecast').20.precipitation | float(0) + state_attr('weather.weatherflow_hourly_based_forecast','forecast').21.precipitation | float(0) %}
{% set amt = (amt * 100) | int(0) %}
{% if amt > 0 %}
{% if amt < 100 %}.{{amt}}
{% else %}{{ amt / 100 }}
{% endif %}
{% else %}0
{% endif %}
weatherflow_forecast_11:
friendly_name: >-
{% set time = state_attr('weather.weatherflow_hourly_based_forecast','forecast').22.datetime | as_datetime | as_local | default(0,true) %}
{{ time | as_timestamp | timestamp_custom('%-H:00') | replace('M','') | lower }}
# unit_of_measurement: °
value_template: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').22.temperature|int}}"
icon_template: >
{% set array = { 'clear-night':'night',
'cloudy':'cloudy',
'exceptional':'sunny',
'fog':'fog',
'hail':'hail',
'lightning':'lightning',
'lightning-rainy':'lightning-rainy',
'partlycloudy':'partly-cloudy',
'rainy':'rainy',
'snowy':'snowy',
'snowy-rainy':'snowy-rainy',
'sunny':'sunny',
'windy':'windy' } %}
{% set icon = array[state_attr('weather.weatherflow_hourly_based_forecast','forecast').22.condition] %}
mdi:weather-{{ icon }}
weatherflow_forecast_precip_11:
friendly_name: "{{ state_attr('weather.weatherflow_hourly_based_forecast','forecast').22.precipitation_probability }}%"
value_template: >-
{% set amt = state_attr('weather.weatherflow_hourly_based_forecast','forecast').22.precipitation | float(0) + state_attr('weather.weatherflow_hourly_based_forecast','forecast').23.precipitation | float(0) %}
{% set amt = (amt * 100) | int(0) %}
{% if amt > 0 %}
{% if amt < 100 %}.{{amt}}
{% else %}{{ amt / 100 }}
{% endif %}
{% else %}0
{% endif %}