How to automate based on weather temperature forcast for current day?

So I could use the following:

weather.home //sunny
value_template: "{{ state_attr('weather.home', 'temperature') } //temperature
value_template: "{{ state_attr('weather.home', 'forecast[0].temperature') } //forecast TOMORROW

Unfortunately the 1st entry in forecast is never for today, but only starting from next day. Any chance I could also add the current day here?

It looks like they only have daily forecast. I use openweathermap which should give you want you want.

EDIT

Actually, doesn’t look like they do 12pm, every 3 hours so they jump from 11am to 2pm.

You can check out others here:

Unfortunately openweathermap does not offer the daily forecast in the free plan. I would mostly be interested in daily.temperature.max or something like that. Is there any HA weather integration that offers this?

I also found the default 5-day-3-hour forecast is very very bad for my location. Eg for this midnight, it shows 16°C, whereas current nights are never > 10° and any local forecasts confirm that’s below. So anyways I cannot use openweathermap for my case…

For now I solved it as follows: using yr.no with a 4h weather forecast, and evaluation my conditions at 10am in the automation. Then I will receive the temperature approx at the hottest time of the day (2pm). And if threshold is exceeded, I close my blinders.

  - name: weather_forecast
    platform: yr
    forecast: 4
    scan_interval: 600
    monitored_conditions:
      - temperature
      - cloudiness

No they don’t, but I use sensors to pull that information from here:

I created a day min and max sensor with OWM like this (details in the thread mentioned above):

# Day min and max temp
- platform: template
  sensors:
    day_max_temp:
      friendly_name: "24 Std. Höchsttemperatur"
      unit_of_measurement: "°C"
      entity_id: weather.openweathermap
      value_template: >
        {#% set start = (now().replace(hour=0,minute=0,second=0).timestamp() * 1000) | int %#}
        {% set start = (now().timestamp() * 1000) | int %}
        {% set end = start + 86400000 %}
        {{ state_attr('weather.openweathermap', 'forecast') | selectattr('datetime', '>=', start) | selectattr('datetime','<=', end) | map(attribute='temperature') | list | max }}

    day_min_temp:
      friendly_name: "24 Std. Tiefsttemperatur"
      unit_of_measurement: "°C"
      entity_id: weather.openweathermap
      value_template: >
        {#% set start = (now().replace(hour=0,minute=0,second=0).timestamp() * 1000) | int %#}
        {% set start = (now().timestamp() * 1000) | int %}
        {% set end = start + 86400000 %}
        {{ state_attr('weather.openweathermap', 'forecast') | selectattr('datetime', '>=', start) | selectattr('datetime','<=', end) | map(attribute='temperature') | list | min }}

Then you can use an automation like this:

- alias: 'Sun protection on sunny days'
  trigger:
    - platform: time
      at: '09:00:00'
  condition:
    condition: and
    conditions:
      - condition: numeric_state
        entity_id: sensor.day_max_temp
        above: 20.0
      - condition: numeric_state
        entity_id: sensor.owm_cloud_coverage
        below: 50
  action:
    - service: notify.telegram
      data:
        message: "Sonnenschutz \U0001F525"
    - service: script.alle_halb_geschlossen

Enjoy!

7 Likes

Which mode did you chose? Did you stick to the default hourly?

Just for reference: I’m not satisfied with the default OWM implementation in HA. Especially as owm provides a daily report that directly gives out the min/max temperatures for a day. So no need for calculations.

I set up my own sensors using a rest_template as follows:

  - name: owm_report
    platform: rest
    resource: 'https://api.openweathermap.org/data/2.5/onecall?units=metric&exclude=minutely,hourly&lat=<lat>&lon=<lon>&appid=<apikey>'
    scan_interval: 600
    value_template: '{{ value_json.current.temp }}'
    unit_of_measurement: '°C'
    json_attributes_path: "$.daily[0]"
    json_attributes:
      - temp
      - clouds
  - platform: template
    sensors: 
      weather_today_max_temp:
        friendly_name: 'Today Max Temp'
        device_class: temperature
        unit_of_measurement: '°C'
        value_template: '{{ state_attr("sensor.owm_report", "temp")["max"] }}'
      weather_today_min_temp:
        friendly_name: 'Today Min Temp'
        device_class: temperature
        unit_of_measurement: '°C'
        value_template: '{{ state_attr("sensor.owm_report", "temp")["min"] }}'
      weather_today_clouds:
        friendly_name: 'Today Cloudiness'
        unit_of_measurement: '%'
        value_template: '{{ state_attr("sensor.owm_report", "clouds") }}'
7 Likes

Much better! Thx a lot!

Maybe it would make sense to ask the maintainer of the OWM platform to include this within the official platform? :thinking:

PS: The OWM One Call API is being implemented (Convert OpenweatherMap Integration to use "one-call-api"). So just be patient… :slightly_smiling_face:

1 Like

I like your solution, but I am a bit confused since temp and temp_min/temp_max are always the same in my installation. Now I found this in the OWM API docs:

Please, do not confuse min/max parameters in our weather APIs.
In Current weather API , Hourly forecast API and 5 day / 3 hour forecast API - temp_min and temp_max are optional parameters mean min / max temperature in the city at the current moment just for your reference. For large cities and megalopolises geographically expanded it might be applicable. In most cases both temp_min and temp_max parameters have the same volume as ‘temp’. Please, use temp_min and temp_max parameters in current weather API optionally.

At least for the free subscription plan this might not be what you want?!

PS: Sorry, my mistake. You are using the new One Call API which indeed does provide day min/max temp (daily.temp.min).

Thanks for your feedback.
So we can hope to switch back to the owm plugin in some weeks?

Hi, many thanks for the code. It´s generally working. Now I have two requests.

  1. How can I round the decimal of the temp, i.e. 26.45 to 26.5
  2. I tried to modify the api code for using the !secrets=myapikey or !secrets:myapikey implementation without success. How is this possible, is there a solution available?
https://api.openweathermap.org/data/2.5/onecall?units=metric&exclude=minutely,hourly&lat=<lat>&lon=<lon>&appid=!secrets=myapikey

I did not move the apikey/appid to secrets. Because, if anybody would get knowledge of it, I don’t care. It’s a free service with no personal information.

If you want it in secrets, you have to move the full url to secrets, and then use resource: !secret openweatherurl

Like this solution. Basic question, the I assume need to be replaced by actual values or are these subsituted by HA? If so: where does the apikey come from?

This works great! Thanks.

Please forgive my question I am a HA beginner, but how do I integrate your template?
First part in the configuration.yaml and the second as manual automation? :face_with_thermometer:

Hi

IMHO you don’t need the template anymore since the OWM integration uses OWM one call API to provide forecast information directly:

https://openweathermap.org/api/one-call-api

Therefore, you can just write something like this in your automations:

conditions:
  - condition: numeric_state
    entity_id: sensor.openweathermap_forecast_temperature
    above: 20.0

The only thing that may be missing is a cloud coverage forecast. But there is a current cloud coverage sensor (sensor.openweathermap_cloud_coverage).

HTH

Thorsten

1 Like

If it helps, here’s how I did it:
First, I have a sensor collecting forecasted temperature 1 day from now:

# Buienradar weather data
# https://www.home-assistant.io/integrations/sensor.buienradar/
- platform: buienradar
  monitored_conditions:
    - temperature_1d

From what I saw, this sensor switches max forecasted temperature around 2am at night.
So I implemented a SQL sensor that queries the max forecasted temperature between current time yesterday and last midnight
(I record my data in a local MariaDB)

# Determine max forecasted temperature for 'today'
- platform: sql
  db_url: !secret mariadb_url
  queries:
    - name: max_temp_fcst_today
      query: >
        SELECT date(date_add(last_updated, INTERVAL 1 DAY)) AS date, MAX(state) AS max_temp
        FROM home_assistant.states
        WHERE entity_id = 'sensor.br_temperature_1d'
        AND last_updated BETWEEN DATE_ADD(NOW(), INTERVAL -1 DAY) AND CURDATE();
      column: max_temp
      unit_of_measurement: °C

In other words: I went back into my history to retrieve the forecasted temperature, rather than trying to collect a forecasted temperature for today when I need it.

Another approach if you’re not comfortable with writing SQL statements would be to use an automation that writes the state or attribute of a (sensor) entity into an input_number entity at a given point of time. You can then use this over a certain interval while the source changes.