Actual Clouds > The Cloud

One of the biggest lessons I’ve learned while building a modern smart home is this:
good automations start with good data.

If your inputs are unreliable, delayed, or generic, your automations will never be what you promised your SO they would be.

My ‘inside the house’ data is pretty solid, thanks to my EP1’s and EP Pro’s, but my outdoor data was lacking.

Relying on internet-based weather services works… until it doesn’t. Forecasts aren’t local, updates can lag, and they introduce a cloud dependency I’d rather avoid. I wanted real, hyper local weather data, measured at my house, and available entirely offline inside Home Assistant.

That kicked off the search for a home weather station that could integrate locally, without sending my data off to someone else’s servers.

My Choice of Weather Station (and Recommendation)

After a fair bit of research, I landed on a weather station from Ecowitt, specifically the WS90 paired with their GW3000 Ethernet gateway.

What sold me on this setup was the combination of features and philosophy:

  • No moving parts (ultrasonic wind sensor + haptic rain gauge)

  • Measures temperature, humidity, wind speed, rain, UV, and light

  • Uses a local gateway that exposes data directly on my network

  • Works fully offline with Home Assistant — no cloud required

The gateway receives the 433 MHz signal from the outdoor sensor and makes that data available locally over Ethernet. I’ve blocked mine from internet access entirely, and everything continues to work perfectly.

If you’re looking for a weather station specifically to feed automations, dashboards, and logic inside Home Assistant, rather than just display numbers on a screen, this setup has been rock solid for me so far.

Automations

Once you have reliable outdoor data, a lot of everyday decisions suddenly become automatable.

Here are a few examples I’m already using:

Rain alerts

alias: Washing Alert - Rain Started
description: Sends notification when rain starts
triggers:
  - trigger: device
    type: moist
    device_id: a27eef62e58a05f7a4b105d09dc81c53
    entity_id: 9caefa35cd643db044fdd61bc37dc0e8
    domain: binary_sensor
    for:
      hours: 0
      minutes: 2
      seconds: 0
conditions: []
actions:
  - choose:
      - conditions:
          - condition: state
            entity_id: person.britt
            state:
              - home
          - condition: state
            entity_id: person.dillan
            state:
              - home
        sequence:
          - action: notify.mobile_app_dillan_s_phone
            data:
              title: It's started raining
              message: Is there washing on the line?
              data:
                tag: rain_start
                notification_icon: mdi:weather-rainy
          - action: notify.mobile_app_britt_s_phone
            data:
              title: It's started raining
              message: Is there washing on the line?
              data:
                tag: rain_start
                notification_icon: mdi:weather-rainy
        alias: If both home
      - conditions:
          - condition: state
            entity_id: person.britt
            state:
              - not_home
          - condition: state
            entity_id: person.dillan
            state:
              - home
        sequence:
          - action: notify.mobile_app_dillan_s_phone
            data:
              title: It's started raining
              message: Is there washing on the line?
              data:
                tag: rain_start
                notification_icon: mdi:weather-rainy
        alias: If D home
      - conditions:
          - condition: state
            entity_id: person.britt
            state:
              - home
          - condition: state
            entity_id: person.dillan
            state:
              - not_home
        sequence:
          - action: notify.mobile_app_britt_s_phone
            data:
              title: It's started raining
              message: Is there washing on the line?
              data:
                tag: rain_start
                notification_icon: mdi:weather-rainy
        alias: If B home
      - conditions:
          - condition: state
            entity_id: person.britt
            state:
              - not_home
          - condition: state
            entity_id: person.dillan
            state:
              - not_home
        sequence:
          - stop: Nobody home — notification suppressed.
        alias: If nobody home
mode: single

High wind warnings

alias: Wind Alert - High Wind
description: "High wind speed = notification"
triggers:
  - trigger: numeric_state
    entity_id:
      - sensor.gw3000c_wind_speed
    above: 40
conditions: []
actions:
  - choose:
      - conditions:
          - condition: state
            entity_id: person.dillan
            state: home
        sequence:
          - action: notify.mobile_app_dillan_s_phone
            data:
              title: High Winds Detected
              message: >-
                The wind has picked up at home - check for loose objects in the
                yard
    default:
      - stop: Dillan not home — wind alert suppressed.
mode: single

Close blinds for extra insulation

alias: Auto Close Blinds based on thermostat
description: Asks to close blinds when external is +- 12 degrees on thermostat
triggers:
  - alias: Outside temperature changed
    trigger: state
    entity_id: sensor.gw3000c_feels_like_temperature
conditions:
  - condition: template
    value_template: >
      {% set hvac = state_attr('climate.daikinap69199', 'hvac_mode') %} {% set
      setpoint = state_attr('climate.daikinap69199', 'temperature') | float(0)
      %} {% set outside = states('sensor.gw3000c_feels_like_temperature') |
      float(0) %}

      {{
        is_state('climate.daikinap69199', 'on')
        and (
          (hvac == 'cool' and outside >= setpoint + 12)
          or
          (hvac == 'heat' and outside <= setpoint - 12)
        )
      }}
  - condition: state
    entity_id: cover.all_blinds
    state:
      - open
actions:
  - alias: Ask to close blinds
    choose:
      - conditions:
          - condition: state
            entity_id: person.dillan
            state: home
          - condition: state
            entity_id: person.britt
            state: home
        sequence:
          - data:
              title: >-
                The temperature outside is {{
                states('sensor.gw3000c_feels_like_temperature') }} — should I
                close the blinds?
              message: Should I close the blinds?
              data:
                tag: blinds_warning
                actions:
                  - action: CLOSE_BLINDS
                    title: "Yes"
                  - action: NO_THANKS
                    title: No thanks
            action: notify.mobile_app_dillan_s_phone
          - action: notify.mobile_app_britt_s_phone
            data:
              title: >-
                The temperature outside is {{
                states('sensor.gw3000c_feels_like_temperature') }} — should I
                close the blinds?
              message: Should I close the blinds?
              data:
                tag: blinds_warning
                actions:
                  - action: CLOSE_BLINDS
                    title: "Yes"
                  - action: NO_THANKS
                    title: No thanks
        alias: B & D home
      - conditions:
          - condition: state
            entity_id: person.dillan
            state: home
          - condition: state
            entity_id: person.britt
            state: not_home
        sequence:
          - data:
              title: >-
                The temperature outside is {{
                states('sensor.gw3000c_feels_like_temperature') }} — should I
                close the blinds?
              message: Should I close the blinds?
              data:
                tag: blinds_warning
                actions:
                  - action: CLOSE_BLINDS
                    title: "Yes"
                  - action: NO_THANKS
                    title: No thanks
            action: notify.mobile_app_dillan_s_phone
        alias: D home
      - conditions:
          - condition: state
            entity_id: person.britt
            state: home
          - condition: state
            entity_id: person.dillan
            state: not_home
        sequence:
          - action: notify.mobile_app_britt_s_phone
            data:
              title: >-
                The temperature outside is {{
                states('sensor.gw3000c_feels_like_temperature') }} — should I
                close the blinds?
              message: Should I close the blinds?
              data:
                tag: blinds_warning
                actions:
                  - action: CLOSE_BLINDS
                    title: "Yes"
                  - action: NO_THANKS
                    title: No thanks
        alias: B home
      - conditions:
          - condition: state
            entity_id: person.britt
            state:
              - not_home
          - condition: state
            entity_id: person.dillan
            state: not_home
        sequence:
          - stop: nobody home
        alias: Nobody Home
  - delay:
      hours: 2
      minutes: 0
      seconds: 0
      milliseconds: 0
mode: single

And then the automation that handles closing the blinds from the notification event

alias: Close Blinds (from notification)
description: Closes blinds when notification pressed by user
triggers:
  - event_type: mobile_app_notification_action
    trigger: event
    event_data:
      action: CLOSE_BLINDS
      tag: blinds_warning
conditions: []
actions:
  - action: cover.close_cover
    metadata: {}
    data: {}
    target:
      entity_id:
        - cover.kit_blind
        - cover.lr_blind
        - cover.kit_door_blind
        - cover.lr_door_blind
mode: single

Open windows when temperature outside is favourable

alias: Notify to Open Windows
description: >-
  When outside temperature is favourable, ask whoever is home to open the
  windows
triggers:
  - trigger: template
    value_template: >-
      {% set mode = states('climate.daikinap69199') %} {% set setpoint =
      state_attr('climate.daikinap69199', 'temperature') | float %} {% set
      outdoor = states('sensor.gw3000c_feels_like_temperature') | float %}

      {{
          (mode == 'heat' and outdoor > setpoint)
          or
          (mode == 'cool' and outdoor < setpoint)
      }}
    for:
      hours: 0
      minutes: 10
      seconds: 0
conditions:
  - condition: numeric_state
    entity_id: sensor.gw3000c_wind_speed
    above: 16
  - condition: device
    type: is_on
    device_id: bb0cd4e60de6d3d241a448902ea1acf0
    entity_id: 80e67908eeab0f5835b4532444a81cb6
    domain: switch
actions:
  - choose:
      - conditions:
          - condition: state
            entity_id: person.dillan
            state:
              - home
          - condition: state
            entity_id: person.britt
            state:
              - home
        sequence:
          - action: notify.mobile_app_dillan_s_phone
            data:
              title: Open the windows?
              message: It's the perfect time to open the windows and turn off the AC.
              data:
                tag: window_open_alert
                notification_icon: mdi:window-open-variant
                actions:
                  - action: WINDOW_DONE
                    title: Done
                  - action: NO_THANKS
                    title: No thanks
          - action: notify.mobile_app_britt_s_phone
            data:
              title: Open the windows?
              message: It's the perfect time to open the windows and turn off the AC.
              data:
                tag: window_open_alert
                notification_icon: mdi:window-open-variant
                actions:
                  - action: WINDOW_DONE
                    title: Done
                  - action: NO_THANKS
                    title: No thanks
        alias: If both B & D Home
      - conditions:
          - condition: state
            entity_id: person.dillan
            state:
              - not_home
          - condition: state
            entity_id: person.britt
            state:
              - home
        sequence:
          - action: notify.mobile_app_britt_s_phone
            data:
              title: Open the windows?
              message: It's the perfect time to open the windows and turn off the AC.
              data:
                tag: window_open_alert
                notification_icon: mdi:window-open-variant
                actions:
                  - action: WINDOW_DONE
                    title: Done
                  - action: NO_THANKS
                    title: No thanks
        alias: If B Home
      - conditions:
          - condition: state
            entity_id: person.dillan
            state:
              - home
          - condition: state
            entity_id: person.britt
            state:
              - not_home
        sequence:
          - action: notify.mobile_app_dillan_s_phone
            data:
              title: Open the windows?
              message: It's the perfect time to open the windows and turn off the AC.
              data:
                tag: window_open_alert
                notification_icon: mdi:window-open-variant
                actions:
                  - action: WINDOW_DONE
                    title: Done
                  - action: NO_THANKS
                    title: No thanks
        alias: If D Home
      - conditions:
          - condition: state
            entity_id: person.dillan
            state:
              - not_home
          - condition: state
            entity_id: person.britt
            state:
              - not_home
        sequence:
          - stop: Nobody home — notification suppressed.
        alias: If B & D not home
  - delay:
      hours: 1
      minutes: 0
      seconds: 0
mode: single

And a seperate automation to handle turning off the AC

alias: Turn off AC when windows opened
description: ""
triggers:
  - event_type: mobile_app_notification_action
    event_data:
      action: WINDOW_DONE
    trigger: event
conditions: []
actions:
  - action: climate.turn_off
    metadata: {}
    target:
      entity_id: climate.daikinap69199
    data: {}
mode: single
 

Unfortunately I don’t have a way to open and close my windows from Home Assistant (yet) so it relies on a human in the loop to handle the opening and closing, but it still removed the need to think about it at all.

Beyond automations, having accurate local weather data on dashboards is just genuinely useful. A quick glance tells me whether I need a jacket, whether the dog does, or whether it’s about to turn nasty outside.

Adding a local weather station has been one of those upgrades that quietly unlocks a lot of capability. It’s not flashy, but it massively expands what’s possible once you start thinking in terms of real inputs driving real decisions.

If you’ve got ideas for automations that could make use of local weather data, I’d love to hear them.

Next
Next

The Tactical Nappy Kit