Output a spoken weather forecast

Can anyone advise me on how to use the weather integration? I’m trying to set up a simple automation that will speak a simple local weather forecast but, as often with HA, I’m lost. Because the documentation doesn’t include any "how to"s, I’ve managed to add the integration and start to create the automation but am then clueless on how to output the forecast.

When setting up the integration I entered the API key from OpenWeatherMap The documentation says “There is currently support for the following device types within Home Assistant: * Sensor * Weather” but I saw only sensor, the device I don’t want.

I don’t understand what “device” or “area” mean in this context. Is this the device to output the forecast or a sensor that will read the temperature, humidity etc (which I don’t have)? In the context of weather forecasting I would expect area to be my geographical area, but HA is only asking me to enter an area within my house and I can’t see where or how to specify which geographical area forecast is wanted. Presumably I need to add some fields from the forecast structure that OpenWeatherMap returns, but can only see a list of conditions and no way to get a summary, or any other examples of how to use them.

Thanks.

alias: Weather
description: ""
trigger:
  - platform: conversation
    command:
      - What's the weather forecast
      - What's the weather
condition: []
action:
  - service: weather.get_forecast
    data:
      type: daily
    target:
      device_id: c2ab21dd0e3e444c51eb41ed160fc178
      entity_id: weather.openweathermap
    response_variable: W
  - service: tts.speak
    data:
      cache: true
      media_player_entity_id: media_player.all
mode: single

When deleting the integration and adding it again I see the following at the point where I would expect to have to specify the weather device - why does HA ask only for an area?

image

From the docs: “Devices are a logical grouping for one or more entities.” A device may represent a physical device which can have one or more sensors or it may just be a collection of entities provided by a single integration without a physical object.

HA only asks for an area because there are no other user-configurable inputs, everything else is handled by the integration based on the latitude and longitude you already provided. You do not need to assign an Area, it is optional.

By calling the weather.get_forecasts service in the Developer tools > Service tool you can get a YAML representation of the response data. You will need to use Templates to parse and output the desired information.

alias: Weather
description: ""
trigger:
  - platform: conversation
    command:
      - What's the weather forecast
      - What's the weather
condition: []
action:
  - service: weather.get_forecasts
    data:
      type: daily
    target:
      entity_id: weather.openweathermap
    response_variable: w
  - service: tts.speak
    data:
      cache: true
      media_player_entity_id: media_player.all
      message: |-
        {% set next = w['weather.openweathermap'].forecast[0] %}
        The forecast for today is
        {{ next.temperature}} degrees and {{ next.condition }} with a
        {{ next.precipitation_probability }} percent chance of precipitation.
mode: single
For anyone setting up custom sentences and intent scripts

custom_sentences/en/

language: en
intents:
  CustomGetWeather:
    data:
      - sentences:
          - "(what is | what's | whats) {ord_day} local weather"
          - "(what is | what's | whats) the local weather"
          - "(what is | what's | whats) the local weather {ord_day}"
          - "{ord_day} weather report"

lists:
  ord_day:
    values:
      - "today's"
      - "todays"
      - "tomorrow's"
      - "tomorrows"

configuration.yaml

intent_script:
  CustomGetWeather:
    action:
      - service: weather.get_forecasts
        data:
          type: daily
        target:
          entity_id: weather.openweathermap
        response_variable: w
      - stop: ""
        response_variable: w
    speech:
      text: |
        {% set day = 1 if (ord_day is search('tomorrow') or now().hour > 21) else 0 %}
        {% set next = action_response['weather.openweathermap'].forecast[day] %}
        The forecast for {{ 'tomorrow' if day else 'today'}} is high of
        {{ next.temperature}} degrees and {{ next.condition }} with a
        {{ next.precipitation_probability }} percent chance of precipitation.

2024-08-05 EDIT: Updated to show use of weather.get_forecasts service call.

4 Likes

Thanks Drew! That looks very helpful. I’ll give it a go.

Exactly what I needed.

Thanks for this! Got it working using AccuWeather since the OpenWeatherMap API is doing all the crazy error stuff lately. I only had to make one adjustment to the configuration.yml piece:

intent_script:
  CustomGetWeather:
    action:
      - service: weather.get_forecasts
        data:
          type: daily
        target:
          entity_id: weather.home
        response_variable: w
      - stop: ""
        response_variable: w

    speech:
      text: |
        {% set day = 1 if (ord_day is search('tomorrow') or now().hour > 21) else 0 %}
        {% set next = action_response['weather.home'].forecast[day] %}
        The forecast for {{ 'tomorrow' if day else 'today'}} is high of
        {{ next.temperature}} degrees and {{ next.condition }} with a
        {{ next.precipitation_probability }} percent chance of precipitation.

Hello,

When I switched the service to weather.get_forecasts …with an “s” at the end since the weather.get_forecast is now deprecated, the speech does not work anymore. I noticed that when you call the service in developer mode, there is an extra “weather.home” before the “forecast” starts underneath it, if you understand me. I believe the {% set next = w.forecast[0] %} needs to incorporate the “weather.home” somehow, but I do not know how to do this.

Also, the precipitation_probability does not seem to exist as it does not give a value.

Any help would be greatly appreciated, TIA!

Since the weather.get_forecasts service has the ability to return forecasts from multiple weather integrations you need to specify the calendar you want to retrieve values from:

alias: Weather
description: ""
trigger:
  - platform: conversation
    command:
      - What's the weather forecast
      - What's the weather
condition: []
action:
  - service: weather.get_forecasts
    data:
      type: daily
    target:
      entity_id: weather.openweathermap
    response_variable: w
  - service: tts.speak
    data:
      cache: true
      media_player_entity_id: media_player.all
      message: |-
        {% set next = w['weather.openweathermap'].forecast[0] %}
        The forecast for today is
        {{ next.temperature}} degrees and {{ next.condition }} with a
        {{ next.precipitation_probability }} percent chance of precipitation.
mode: single

Thanks so much for the proper syntax!

I was able to get it to work; however, the “precipitation_probability” is still not giving any value.

Regards